CARTRACKER API

Koppla körjournalen till allt

Lön, ekonomi, BI, CRM eller egna system. Läs resor, klassa dem, hämta körsträckor per förare och få en notis i samma sekund något händer — med samma integritetsregler som i appen.

curl https://api.cartracker.se/v1/trips?from=2026-09-01&to=2026-10-01 \
  -H "Authorization: Bearer ck_live_…"
Svar
{
  "data": [{
    "id": "7b1c…",
    "registration": "ABC123",
    "driver": { "name": "Anna Ek", "employment_number": "1042" },
    "start_ts": "2026-09-02T06:12:00Z",
    "distance_km": 28.4,
    "type": "tjanst",
    "purpose": "Kundbesök",
    "visited": "Byggfirman AB",
    "locked": false
  }],
  "has_more": true,
  "next_cursor": "eyJrIjoi…"
}

Lön

Körsträckor per förare och månad med anställningsnummer, klara för milersättning. Webhooken period_lastad säger till när månaden är slutlig.

Ekonomi och BI

Hämta resor som JSON eller CSV till Power BI, Excel eller ert datalager. Synka bara det som ändrats med updated_since.

Egna system

Klassa resor från ert CRM eller affärssystem, eller låt Zapier, Make och n8n reagera på nya resor via webhooks.

Kom igång

Igång på fem minuter

  1. 1

    Skapa en nyckel

    Administratören går till Inställningar → Integrationer → API-nycklar i Cartracker och väljer vad nyckeln får göra. Nyckeln visas en gång.

  2. 2

    Testa anslutningen

    curl https://api.cartracker.se/v1/me -H "Authorization: Bearer ck_live_…"
  3. 3

    Hämta resor

    GET /v1/trips?from=2026-09-01&to=2026-10-01
  4. 4

    Prenumerera på händelser

    POST /v1/webhooks
    {"url": "https://ert-system.se/cartracker", "events": ["resa_skapad","resa_klassad","period_lastad"]}
Referens

Alla anrop i v1

Konto

GET/v1/me(ingen)Nyckelns organisation, behörigheter och gränser

Resor

GET/v1/tripstrips:readLista resor. Filter: from, to, vehicle_id, driver_id, type, locked, updated_since. format=csv ger CSV
GET/v1/trips/{id}trips:readEn resa
PATCH/v1/trips/{id}trips:writeKlassa: type, purpose, visited. Stöder Idempotency-Key
GET/v1/trips/{id}/routeroutes:readResans färdväg (tom för privata resor)

Fordon

GET/v1/vehiclesvehicles:read
GET/v1/vehicles/{id}vehicles:read

Förare

GET/v1/driversdrivers:readNamn och anställningsnummer
GET/v1/drivers/{id}drivers:readNamn och anställningsnummer

Platser

GET/v1/zoneszones:read

Live

GET/v1/livelive:readSenaste position per fordon. Fordon i privatläge visas utan position

Rapporter

GET/v1/reports/mileage?month=2026-09&group_by=driver|vehiclereports:readTjänste-, privat-, pendlings- och oklassade km, antal dagar med privat körning, uppskattad trängselskatt, om perioden är låst. format=csv

Webhooks

GET/v1/webhookswebhooks:write
POST/v1/webhookswebhooks:write
GET/v1/webhooks/{id}webhooks:write
PATCH/v1/webhooks/{id}webhooks:write
DELETE/v1/webhooks/{id}webhooks:write
POST/v1/webhooks/{id}/rotate-secretwebhooks:write
POST/v1/webhooks/{id}/testwebhooks:write
GET/v1/webhooks/{id}/deliverieswebhooks:write
POST/v1/webhooks/deliveries/{id}/redeliverwebhooks:write

Hela beskrivningen med alla fält finns som OpenAPI 3.1 — läs in den i Postman, Insomnia eller er kodgenerator. openapi.json

Resans typer

Fyra värden för type

VärdeBetydelse
tjanstTjänsteresa
privatPrivat resa
resa_till_arbetetResa mellan bostad och arbete
oklassadInte klassad än

Värdena är Skatteverkets begrepp och är desamma i API:t, i webhooks och i exporterna.

Sidindelning och synk

Håll era system i takt

Listor sidindelas med en markör. Skicka next_cursor som cursor tills has_more är false. För att hålla ett system i takt: spara tidpunkten när ni började hämta, och fråga nästa gång med updated_since. Då får ni nya resor och alla som klassats om sedan dess.

GET /v1/trips?updated_since=2026-09-25T06:00:00Z&cursor=eyJrIjoi…
Webhooks

Notiser när något händer

Vi skickar en POST med JSON till er adress när något händer. Svara med 2xx inom fem sekunder. Svarar ni inte försöker vi igen efter 1 minut, 5 minuter, 30 minuter, 2, 6 och 12 timmar. Varje försök syns i leveransloggen och kan skickas om.

HändelseNär
resa_skapadEn ny resa har registrerats
resa_klassadEn resa har klassats eller fått ärende eller besökt plats ändrat — i appen, på webben eller via API:t
period_lastadEn månad har låsts och underlaget är slutligt

Verifiera signaturen

Varje notis har huvudet X-Cartracker-Signature-V1: t=<unix-tid>,v1=<hex>. v1 är HMAC-SHA256 med webhookens hemlighet över t + "." + kroppen. Avvisa notiser där t är äldre än fem minuter, och använd X-Cartracker-Delivery för att känna igen dubbletter vid omförsök.

Exempel på kropp

{
  "id": "5f0c…",
  "event": "resa_klassad",
  "sent_at": "2026-09-26T07:41:12.004Z",
  "organization_id": "17e3…",
  "data": {
    "trip_id": "7b1c…",
    "registration": "ABC123",
    "type": "tjanst",
    "previous_type": "oklassad",
    "purpose": "Kundbesök",
    "visited": "Byggfirman AB"
  }
}
import crypto from "node:crypto";

export function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map(p => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
Integritet

Integritet inbyggd

Privat är privat

En privat resa lämnas aldrig ut med koordinater, adresser, platser, ärende eller besökt plats — oavsett nyckelns behörighet. Samma sak gäller i webhooks.

Live kräver eget val

Fordonens position just nu kräver behörigheten live:read, som administratören väljer till uttryckligen.

Nycklar vi inte kan läsa

Nyckeln visas en gång och sparas bara som en SHA-256-hash. Varje anrop och varje ändring bokförs med vilken nyckel som gjorde den, och administratören kan återkalla en nyckel direkt.

En låst månad går inte att ändra via API:t. Rättelser görs i appen med ändringsverifikat, så att körjournalen håller vid en granskning.

Fel och gränser

Felkoder

Fel svarar med application/problem+json (RFC 9457) och en maskinläsbar kod. Ange request_id om ni kontaktar oss.

HTTPKodBetydelse
400invalid_parameterEn parameter har fel format
400invalid_cursorMarkören är ogiltig; använd next_cursor från föregående svar
400range_too_largeIntervallet är längre än 400 dagar
401missing_api_keyNyckel saknas
401invalid_api_keyNyckeln finns inte
401revoked_api_keyNyckeln är återkallad
401expired_api_keyNyckeln har gått ut
403insufficient_scopeNyckeln saknar behörigheten som krävs (står i required_scope)
404not_foundResursen finns inte i er organisation
409trip_lockedResan ligger i en låst period
409limit_reachedHögst 20 webhooks per organisation
415unsupported_media_typeSkicka kroppen som application/json
422validation_failedKroppen klarade inte valideringen (fältet står i field)
429rate_limitedFör många anrop; vänta så många sekunder som Retry-After anger
500internal_errorFel hos oss

Exempel på felsvar

{
  "type": "https://cartracker.se/api#fel-insufficient_scope",
  "title": "Forbidden",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "Nyckeln saknar behörigheten trips:read",
  "required_scope": "trips:read",
  "request_id": "req_4f1a…"
}

Gräns: 600 anrop per minut och nyckel med tillfälliga toppar på 120. Varje svar har RateLimit-Limit, RateLimit-Remaining och RateLimit-Reset.

Behörigheter

Ge varje nyckel rätt behörighet

Ge varje system bara det det behöver. Ett lönesystem behöver reports:read och drivers:read — inte live:read.

BehörighetGer
vehicles:readLäsa fordon
drivers:readLäsa förare och anställningsnummer
trips:readLäsa resor
trips:writeKlassa resor
routes:readLäsa färdväg
live:readFordonens position just nu
reports:readRapporter
zones:readArbetsplatser
webhooks:writeHantera webhooks
Vanliga frågor

Frågor om API:t

Vad kostar API:t?
Kontakta oss så berättar vi vad som gäller för ert avtal.
Var ligger datan?
API:t körs i Stockholm och data lagras inom EU.
Kan vi använda API:t från en webbläsare?
Nej. Nycklar hör hemma på en server; API:t tillåter inte anrop direkt från webbsidor.
Fungerar det med Fortnox, Visma och Hogia?
Lönefilen PAXml och SIE4 finns redan som export i appen. API:t är för er som vill automatisera flödet eller koppla egna system.
Hur ofta uppdateras resorna?
En resa finns i API:t när den avslutats, normalt inom ett par minuter efter att tändningen slagits av.

Behöver ni hjälp att koppla ihop?

Vi hjälper er med första integrationen.