TollCalculation API
For integrasjoner mot flåte, refusjon og regnskap
API som produkt

Bygg reviderbare, forklarbare bomkostnader inn i arbeidsflyten for flåte, refusjon eller regnskap

TollCalculation eksponerer den samme rute- og bomstasjonsmotoren som driver vår offentlige kalkulator, som et REST-API — enkeltberegninger, batcher på opptil 10 000 forespørsler, og en live-synkronisert norsk bomstasjonskatalog — bygget for regnskapsførere, flåteoperatører og transport-/logistikkintegratorer som trenger en etterprøvbar kostnad per passering, ikke bare en totalsum.

Hvem dette er for

Flåte og logistikk

Bomestimater før tur per kjøretøy/rute, batchet på tvers av en hel dags kjøreplan, med AutoPASS- og tungbilregler (takstgruppe) anvendt automatisk.

Utleggsrefusjon for ansatte

Legg ved en kostnadsspesifikasjon per passering og per stasjon til et utleggskrav i stedet for et rundt estimat — hver linje kan spores til en reell NVDB-bomstasjon.

Regnskap / ERP

Avstem prognoser for bomkostnad mot fakturerte beløp med samme calculationId som økonomisystemet allerede lagrer.

Ruteplanleggingsverktøy

Sammenlign bomkostnad på tvers av rutealternativer (alternatives[]) før du beslutter rutevalg.

Autentisering

API-et autentiserer hver forespørsel med et Entra ID (Azure AD) bearer-token i standard Authorization-forespørselshode, hentet via en OAuth2 client-credentials-grant mot din egen Entra-appregistrering, avgrenset til dette API-et. Dette er foreløpig ikke selvbetjent registrering: i dag er den eneste klargjorte kalleren kalkulatorens egen backend-for-frontend (BFF), som autentiserer på tjenersiden (managed identity i Azure) og kaller API-et gjennom APIM, slik at nettleseren aldri ser et token eller en nøkkel. For å integrere direkte, ta kontakt — vi klargjør en dedikert Entra-appregistrering (eller godtar din managed identity) avgrenset til å kalle API-et, slik at systemet ditt autentiserer uavhengig av vår web-frontend.

# Eksempel: hente et token via client-credentials (illustrerende — dine tenant-/scope-verdier er andre)
curl -s -X POST "https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token" \
  -d "grant_type=client_credentials" \
  -d "client_id=<din-client-id>" \
  -d "client_secret=<din-client-secret>" \
  -d "scope=api://<api-app-id>/.default"

Beregn én bomkostnad Verifisert live 13.08.2026

POST /api/toll-calculation/calculations — startpunkt, endepunkt, inntil 3 mellompunkter, en kjøretøyprofil og et avreisetidspunkt. vehicle.class er en to-nivås enum (small / large) — tungbiler i takstgruppe 2 mappes til large.

# Forespørsel
POST /api/toll-calculation/calculations
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: 3fae9f2e-1c2b-4e9a-9b1a-8e0f6c1d2a77

{
  "origin": { "lat": 59.9139, "lon": 10.7522, "label": "Oslo" },
  "destination": { "lat": 60.3913, "lon": 5.3221, "label": "Bergen" },
  "waypoints": [],
  "vehicle": { "class": "small", "fuelType": "petrol", "autopassAgreement": true },
  "departureTime": "2026-08-20T10:00:00Z",
  "hourlyRuleEnabled": true,
  "rushHourEnabled": true
}

# Svar — 201 Created (200 OK ved en Idempotency-Key-replay av samme forespørsel)
{
  "calculationId": "01KZXHDJE9ZNEJR9JJ2BA38SW8",
  "totalAmount": 729.0,
  "currency": "NOK",
  "crossesBorder": false,
  "passageCount": 14,
  "routeSource": "OSRM_PUBLIC",
  "warnings": [],
  "createdAt": "2026-08-13T12:26:15Z",
  "route": {
    "distanceMeters": 463000,
    "durationSeconds": 21600,
    "polyline": [ { "lat": 59.9139, "lon": 10.7522 } /* … ett koordinatobjekt per rutepunkt */ ]
  },
  "alternatives": [ "… inntil 2 alternative ruter, samme form som hovedresultatet …" ],
  "passages": [
    {
      "index": 0,
      "tollStationNvdbId": "929790703",
      "tollStationName": "Dronning Blancas vei",
      "bompengeprosjektKey": "FJELLINJEN_OSLORINGEN",
      "country": "NO",
      "timestamp": "2026-08-20T12:03:53+02:00",
      "basePrice": 42.0,
      "appliedPeriod": "OFF_PEAK",
      "finalAmount": 42.0,
      "currency": "NOK",
      "suppressedByHourlyRule": false
    }
  ]
}

Idempotency-Key

Send en klientgenerert UUID som Idempotency-Key på hver POST /calculations. Å gjenta samme nøkkel med identisk innhold returnerer det opprinnelige resultatet (200 OK, samme calculationId) i stedet for å opprette et duplikat — trygt å prøve på nytt etter et nettverkstidsavbrudd. Å gjenbruke samme nøkkel med et annet innhold returnerer 409 Conflict, så generer alltid en fersk nøkkel per distinkt forespørsel, ikke per nytt forsøk. (Merk at dette gjelder enkeltberegninger — batch-innsending er foreløpig ikke idempotent, se neste seksjon.)

Batch-beregninger (opptil 10 000 forespørsler) Verifisert live 13.08.2026

For en hel dags kjøreplan eller en samlet refusjonskjøring: send mange forespørsler i ett kall og poll for fullføring i stedet for å gjøre tusenvis av synkrone kall.

# 1. Send inn — 202 Accepted
POST /api/toll-calculation/calculation-batches
Authorization: Bearer <token>
Content-Type: application/json

{ "requests": [ { "origin": { "...": "..." }, "destination": { "...": "..." }, "waypoints": [], "vehicle": { "class": "small", "fuelType": "petrol" }, "departureTime": "2026-08-20T10:00:00Z" } /* … opptil 10 000 */ ] }

{
  "batchId": "01KZXHEE6W67RRB4JSHG0X2CGQ",
  "acceptedAt": "2026-08-13T12:27:10Z",
  "statusUrl": "/api/toll-calculation/calculation-batches/01KZXHEE6W67RRB4JSHG0X2CGQ",
  "estimatedCompletionSeconds": 2
}

# 2. Poll statusUrl til status ikke lenger er RUNNING
GET /api/toll-calculation/calculation-batches/01KZXHEE6W67RRB4JSHG0X2CGQ
Authorization: Bearer <token>

{
  "batchId": "01KZXHEE6W67RRB4JSHG0X2CGQ",
  "status": "RUNNING",
  "totalRequests": 2,
  "completed": 0,
  "failed": 0,
  "results": [],
  "errors": [],
  "updatedAt": "2026-08-13T12:27:11Z"
}
# status: RUNNING → COMPLETED (eller PARTIALLY_COMPLETED). results[] inneholder ett
# CalculateTollResponse per vellykket forespørsel (samme form som enkeltkall-endepunktet
# over); errors[] inneholder { requestIndex, code, message } for hver forespørsel i
# batchen som feilet.
Batch-innsending er foreløpig ikke idempotent.
I motsetning til POST /calculations deduperer ikke POST /calculation-batches på Idempotency-Key i dag: to identiske innsendinger med samme nøkkel gir to distinkte batchId-er (verifisert live 13.08.2026 — begge svarte 202 med ulik batchId). Et blindt nytt forsøk etter et tidsavbrudd kan derfor sette i kø et duplikat av en batch på inntil 10 000 beregninger. Slik håndterer du et tidsavbrudd:
  • Rakk du å motta 202-svaret (med batchId og statusUrl), men et senere steg feilet? Da bekrefter du utfallet via statusUrl før du foretar deg noe mer.
  • Fikk du aldri svaret (et ekte innsendingstidsavbrudd)? Da har du ingen batchId/statusUrl å slå opp, og API-et tilbyr foreløpig ingen mekanisme for å slå opp eller deduplisere innsendingen. Unngå automatisk nytt forsøk i dette tilfellet — det kan opprette et duplikat. Trenger integrasjonen din garantert «nøyaktig én gang», ta kontakt for en tjenersides oppslags-/deduperingsrutine.

Dataferskhet og resultatsemantikk

Hva du kan stole på i dag, verifisert mot det utrullede TEST-miljøet:

FeltBetydning
routeSourceRutemotoren som produserte ruten (f.eks. OSRM_PUBLIC) — lar deg skille en demo-/reserverute fra en fullt rutet.
warnings[]Ikke-fatale forhold, f.eks. NO_TOLL_STATIONS_ON_ROUTE (beregningen returnerer fortsatt et gyldig totalAmount: 0, dette er ikke en feil).
crossesBorderOm ruten krysser en riksgrense (relevant for NO↔SE/DK-ruter og valutahåndtering).
GET /toll-stations → syncedAtTidsstempel per stasjon for siste vellykkede NVDB-katalogsynk — bruk dette til å vise hvor fersk referansedataen din er.
Kjent mangel (ikke tilgjengelig ennå):
CalculateTollResponse inneholder foreløpig ikke en eksplisitt konfidensscore per passering eller en datakildeindikator på beregningsnivå (live vs. bufret/demo-katalog). Dette er planlagt for en kommende versjon av API-kontrakten. Inntil det lander, bruk routeSource + bomstasjonens syncedAt (fra GET /toll-stations) som det beste tilgjengelige ferskhetssignalet.

Rategrenser og feil

Nåværende grense i TEST-miljøet: 60 forespørsler/minutt per kaller, fast vindu; et 429-svar inkluderer et Retry-After-hint. Produksjonsgrenser avtales per integrasjon når tilgang klargjøres — spør når du ber om tilgang.

Feil følger RFC7807 application/problem+json:

StatusBetydning
400Valideringsfeil — svaret inkluderer en errors-oppslagstabell som mapper feltnavn → meldinger.
401 / 403Manglende/ugyldig/uautorisert bearer-token.
409En Idempotency-Key ble gjentatt med et annet forespørselsinnhold.
429Ratebegrenset — trekk deg tilbake ved hjelp av Retry-After.
Om Swagger-lenken:
lenkene på denne siden peker direkte til API-verten (app-tollcalculationapi-test.azurewebsites.net/swagger). Den samme-opprinnelses stien via web-appen (/api/toll-calculation/swagger/index.html) svarer for øyeblikket 404 i TEST — Swagger-UI-en serveres på API-vertens egen rot, ikke bak web-app-proxyen. Bruk lenkene over.

Få tilgang

Dette API-et er foreløpig ikke selvbetjent. For å få en dedikert Entra-appregistrering (eller registrere din managed identity) klargjort for din integrasjon mot flåte, refusjon eller regnskap, ta kontakt med din AutoSync-kontaktperson eller TollCalculation-produktteamet — referer til dette API-et og bruksområdet (flåte, refusjon eller regnskap) slik at vi kan avgrense riktig tilgang og rategrense for integrasjonen din.