Timeregistrering via API
Før timer i Native X direkte fra egne verktøy, script og integrasjoner – med en personlig API-nøkkel.
Kom i gang
- Logg inn og gå til Konto → API.
- Gi nøkkelen et navn (f.eks. «Min laptop») og trykk Lag nøkkel.
- Kopier nøkkelen med en gang – den vises bare én gang. Den ser slik ut:
nx_live_… - Hent prosjekt-ID-ene dine med
GET /projects, og send inn timer medPOST /time-entries. Rett opp medPUTellerDELETE.
Base-URL for alle kall:
https://nativex.no/api/v1Alle forespørsler og svar er JSON (Content-Type: application/json). Vellykkede svar ligger under data, feil under error.
Autentisering
Send API-nøkkelen i Authorization-headeren på hvert kall:
Authorization: Bearer nx_live_DIN_NØKKELNøkkelen er personlig og knyttet til din konsulentprofil: alt du fører via API-et føres på deg, og du ser bare dine egne timer og prosjekter. Du kan ha inntil 5 aktive nøkler, og trekke dem tilbake når som helst under Konto → API. Mangler nøkkelen, er den ugyldig eller trukket tilbake, får du 401 unauthorized.
POST /time-entries
Registrerer én timeføring. Antall timer beregnes fra start- og sluttid, akkurat som i appen.
| Felt | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
| date | string | Ja | Dato i formatet YYYY-MM-DD. |
| startTime | string | Ja | Starttid, 24-timers HH:MM – f.eks. 09:00. |
| endTime | string | Ja | Sluttid, HH:MM. Må være etter startTime (samme dag). |
| projectId | string | Nei | ID fra GET /projects. Uten prosjekt føres timene som interntid (ikke fakturerbar). |
| description | string | Nei | Hva du jobbet med. Maks 1000 tegn. |
| externalId | string | Nei | Din egen unike ID for føringen. Gjør kallet trygt å gjenta – se Regler. Maks 200 tegn. |
Eksempel
curl -X POST https://nativex.no/api/v1/time-entries \
-H "Authorization: Bearer nx_live_DIN_NØKKEL" \
-H "Content-Type: application/json" \
-d '{
"date": "2026-09-21",
"startTime": "09:00",
"endTime": "16:30",
"projectId": "clx123abc",
"description": "Utvikling av kundeportal",
"externalId": "jira-NX-142-2026-09-21"
}'Svar – 201 Created
{
"data": {
"id": "cm1f8k2p40001abcd",
"date": "2026-09-21",
"startTime": "09:00",
"endTime": "16:30",
"hours": 7.5,
"projectId": "clx123abc",
"projectName": "Kundeportal",
"description": "Utvikling av kundeportal",
"externalId": "jira-NX-142-2026-09-21",
"billable": true
}
}Finnes det allerede en føring med samme externalId, får du den eksisterende føringen tilbake med 200 OK – ingenting nytt opprettes.
GET /time-entries
Lister dine egne timeføringer, nyeste først. Uten filter får du de siste 30 dagene.
| Felt | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
| from | string | Nei | Fra og med dato, YYYY-MM-DD. |
| to | string | Nei | Til og med dato, YYYY-MM-DD. |
| projectId | string | Nei | Bare føringer på dette prosjektet. |
| limit | number | Nei | Maks antall føringer, 1–500. Standard 100. |
curl "https://nativex.no/api/v1/time-entries?from=2026-09-01&to=2026-09-30" \
-H "Authorization: Bearer nx_live_DIN_NØKKEL"Svaret er { "data": [ … ] } med samme felter som over.
Én enkelt føring hentes med GET /time-entries/{id}.
PUT /time-entries/{id}
Erstatter en av dine egne føringer. Send hele føringen – samme felter som ved registrering. Valgfrie felter du utelater (projectId, description) blir tømt. Timer og fakturerbarhet beregnes på nytt. externalId kan ikke endres og ignoreres.
curl -X PUT https://nativex.no/api/v1/time-entries/cm1f8k2p40001abcd \
-H "Authorization: Bearer nx_live_DIN_NØKKEL" \
-H "Content-Type: application/json" \
-d '{
"date": "2026-09-21",
"startTime": "09:00",
"endTime": "17:00",
"projectId": "clx123abc",
"description": "Utvikling av kundeportal + code review"
}'Svar 200 OK med den oppdaterte føringen.
DELETE /time-entries/{id}
Sletter en av dine egne føringer. Svar 204 No Content uten innhold. Sletting kan ikke angres.
curl -X DELETE https://nativex.no/api/v1/time-entries/cm1f8k2p40001abcd \
-H "Authorization: Bearer nx_live_DIN_NØKKEL"GET /projects
Lister prosjektene du er medlem av – altså de du kan føre timer på. Bruk id som projectId.
curl https://nativex.no/api/v1/projects \
-H "Authorization: Bearer nx_live_DIN_NØKKEL"{
"data": [
{ "id": "clx123abc", "name": "Kundeportal", "status": "Active", "clientName": "Eksempel AS" }
]
}Regler
- Prosjektmedlemskap: du kan bare føre timer på prosjekter du er medlem av (
403 not_project_member). - Låste perioder: når en måned er fakturert og låst for kunden, kan timer i den verken føres, endres eller slettes (
409 period_locked). Ta kontakt med Native Software hvis noe må rettes. - Fakturerte og utbetalte timer: en føring som står på en faktura eller er utbetalt kan ikke endres eller slettes (
409 entry_locked). - Bare egne timer: andres føringer oppfører seg som om de ikke finnes (
404 not_found). - Tid:
endTimemå være etterstartTime. Føringer over midnatt deles i to. - Idempotens: send med en
externalIdsom er unik per føring hos deg. Da kan du trygt gjenta et kall som feilet (f.eks. ved nettverksbrudd) uten å få dobbeltføring. - Rimelig bruk: API-et er laget for timeføring, ikke massekall. Hold deg til noen få kall i sekundet.
Feilkoder
Feil har alltid denne formen. code er stabil og kan brukes i kode; message er en lesbar forklaring.
{
"error": {
"code": "validation_error",
"message": "'date' is required and must be a valid date in the format YYYY-MM-DD."
}
}| Status | Kode | Betydning |
|---|---|---|
| 400 | validation_error | Ugyldig JSON, manglende felt, feil format, eller sluttid før starttid. |
| 401 | unauthorized | API-nøkkel mangler, er ugyldig eller trukket tilbake. |
| 403 | not_project_member | Du er ikke medlem av prosjektet. |
| 404 | not_found | Føringen finnes ikke (eller er ikke din). |
| 404 | project_not_found | Prosjektet finnes ikke. |
| 409 | period_locked | Perioden er fakturert og låst. |
| 409 | entry_locked | Føringen er fakturert eller utbetalt og kan ikke endres. |
Kodeeksempler
JavaScript / TypeScript
const res = await fetch("https://nativex.no/api/v1/time-entries", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NATIVEX_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
date: "2026-09-21",
startTime: "09:00",
endTime: "16:30",
projectId: "clx123abc",
description: "Utvikling av kundeportal",
}),
});
const json = await res.json();
if (!res.ok) throw new Error(`${json.error.code}: ${json.error.message}`);
console.log("Førte", json.data.hours, "timer");Python
import os
import requests
res = requests.post(
"https://nativex.no/api/v1/time-entries",
headers={"Authorization": f"Bearer {os.environ['NATIVEX_API_KEY']}"},
json={
"date": "2026-09-21",
"startTime": "09:00",
"endTime": "16:30",
"projectId": "clx123abc",
"description": "Utvikling av kundeportal",
},
timeout=10,
)
body = res.json()
if not res.ok:
raise SystemExit(f"{body['error']['code']}: {body['error']['message']}")
print("Førte", body["data"]["hours"], "timer")Sikkerhet
- Behandle nøkkelen som et passord. Lagre den i en miljøvariabel eller secrets-manager – aldri i kildekode eller git.
- Bruk én nøkkel per verktøy, så kan du trekke tilbake én uten å påvirke resten.
- Tror du en nøkkel er på avveie? Trekk den tilbake under Konto → API og lag en ny. Den slutter å virke med en gang.
- Bruk alltid HTTPS.