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.
Kunskap
Alla guiderDigital körjournalBranscher
Tjänstebil och förmånsbilHantverkare och serviceÅkeri, transport och entreprenadEnskild firmaHemtjänst och hemsjukvårdAlla branscherHårdvara
All hårdvaraOBD-enhetFast monterad enhetTunga fordonBatterimonterad enhetFältenhetSpårsändareMer
Cartracker AIPaketPriserÅterförsäljareSupportKontaktKom igångLö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_…"{
"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…"
}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.
Hämta resor som JSON eller CSV till Power BI, Excel eller ert datalager. Synka bara det som ändrats med updated_since.
Klassa resor från ert CRM eller affärssystem, eller låt Zapier, Make och n8n reagera på nya resor via webhooks.
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.
curl https://api.cartracker.se/v1/me -H "Authorization: Bearer ck_live_…"GET /v1/trips?from=2026-09-01&to=2026-10-01POST /v1/webhooks
{"url": "https://ert-system.se/cartracker", "events": ["resa_skapad","resa_klassad","period_lastad"]}/v1/me(ingen)Nyckelns organisation, behörigheter och gränser/v1/tripstrips:readLista resor. Filter: from, to, vehicle_id, driver_id, type, locked, updated_since. format=csv ger CSV/v1/trips/{id}trips:readEn resa/v1/trips/{id}trips:writeKlassa: type, purpose, visited. Stöder Idempotency-Key/v1/trips/{id}/routeroutes:readResans färdväg (tom för privata resor)/v1/vehiclesvehicles:read/v1/vehicles/{id}vehicles:read/v1/driversdrivers:readNamn och anställningsnummer/v1/drivers/{id}drivers:readNamn och anställningsnummer/v1/zoneszones:read/v1/livelive:readSenaste position per fordon. Fordon i privatläge visas utan position/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/v1/webhookswebhooks:write/v1/webhookswebhooks:write/v1/webhooks/{id}webhooks:write/v1/webhooks/{id}webhooks:write/v1/webhooks/{id}webhooks:write/v1/webhooks/{id}/rotate-secretwebhooks:write/v1/webhooks/{id}/testwebhooks:write/v1/webhooks/{id}/deliverieswebhooks:write/v1/webhooks/deliveries/{id}/redeliverwebhooks:writeHela beskrivningen med alla fält finns som OpenAPI 3.1 — läs in den i Postman, Insomnia eller er kodgenerator. openapi.json
| Värde | Betydelse |
|---|---|
tjanst | Tjänsteresa |
privat | Privat resa |
resa_till_arbetet | Resa mellan bostad och arbete |
oklassad | Inte klassad än |
Värdena är Skatteverkets begrepp och är desamma i API:t, i webhooks och i exporterna.
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…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ändelse | När |
|---|---|
resa_skapad | En ny resa har registrerats |
resa_klassad | En resa har klassats eller fått ärende eller besökt plats ändrat — i appen, på webben eller via API:t |
period_lastad | En månad har låsts och underlaget är slutligt |
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.
{
"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));
}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.
Fordonens position just nu kräver behörigheten live:read, som administratören väljer till uttryckligen.
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 svarar med application/problem+json (RFC 9457) och en maskinläsbar kod. Ange request_id om ni kontaktar oss.
| HTTP | Kod | Betydelse |
|---|---|---|
| 400 | invalid_parameter | En parameter har fel format |
| 400 | invalid_cursor | Markören är ogiltig; använd next_cursor från föregående svar |
| 400 | range_too_large | Intervallet är längre än 400 dagar |
| 401 | missing_api_key | Nyckel saknas |
| 401 | invalid_api_key | Nyckeln finns inte |
| 401 | revoked_api_key | Nyckeln är återkallad |
| 401 | expired_api_key | Nyckeln har gått ut |
| 403 | insufficient_scope | Nyckeln saknar behörigheten som krävs (står i required_scope) |
| 404 | not_found | Resursen finns inte i er organisation |
| 409 | trip_locked | Resan ligger i en låst period |
| 409 | limit_reached | Högst 20 webhooks per organisation |
| 415 | unsupported_media_type | Skicka kroppen som application/json |
| 422 | validation_failed | Kroppen klarade inte valideringen (fältet står i field) |
| 429 | rate_limited | För många anrop; vänta så många sekunder som Retry-After anger |
| 500 | internal_error | Fel hos oss |
{
"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.
Ge varje system bara det det behöver. Ett lönesystem behöver reports:read och drivers:read — inte live:read.
| Behörighet | Ger |
|---|---|
vehicles:read | Läsa fordon |
drivers:read | Läsa förare och anställningsnummer |
trips:read | Läsa resor |
trips:write | Klassa resor |
routes:read | Läsa färdväg |
live:read | Fordonens position just nu |
reports:read | Rapporter |
zones:read | Arbetsplatser |
webhooks:write | Hantera webhooks |
Vi hjälper er med första integrationen.