API v1

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

  1. Logg inn og gå til Konto → API.
  2. Gi nøkkelen et navn (f.eks. «Min laptop») og trykk Lag nøkkel.
  3. Kopier nøkkelen med en gang – den vises bare én gang. Den ser slik ut: nx_live_…
  4. Hent prosjekt-ID-ene dine med GET /projects, og send inn timer med POST /time-entries. Rett opp med PUT eller DELETE.

Base-URL for alle kall:

https://nativex.no/api/v1

Alle 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ØKKEL

Nø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.

FeltTypePåkrevdBeskrivelse
datestringJaDato i formatet YYYY-MM-DD.
startTimestringJaStarttid, 24-timers HH:MM – f.eks. 09:00.
endTimestringJaSluttid, HH:MM. Må være etter startTime (samme dag).
projectIdstringNeiID fra GET /projects. Uten prosjekt føres timene som interntid (ikke fakturerbar).
descriptionstringNeiHva du jobbet med. Maks 1000 tegn.
externalIdstringNeiDin 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.

FeltTypePåkrevdBeskrivelse
fromstringNeiFra og med dato, YYYY-MM-DD.
tostringNeiTil og med dato, YYYY-MM-DD.
projectIdstringNeiBare føringer på dette prosjektet.
limitnumberNeiMaks 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: endTime må være etter startTime. Føringer over midnatt deles i to.
  • Idempotens: send med en externalId som 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."
  }
}
StatusKodeBetydning
400validation_errorUgyldig JSON, manglende felt, feil format, eller sluttid før starttid.
401unauthorizedAPI-nøkkel mangler, er ugyldig eller trukket tilbake.
403not_project_memberDu er ikke medlem av prosjektet.
404not_foundFøringen finnes ikke (eller er ikke din).
404project_not_foundProsjektet finnes ikke.
409period_lockedPerioden er fakturert og låst.
409entry_lockedFø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.