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
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.
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.
Avstem prognoser for bomkostnad mot fakturerte beløp med samme calculationId som økonomisystemet allerede lagrer.
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.
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 (medbatchIdogstatusUrl), men et senere steg feilet? Da bekrefter du utfallet viastatusUrlfø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:
| Felt | Betydning |
|---|---|
routeSource | Rutemotoren 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). |
crossesBorder | Om ruten krysser en riksgrense (relevant for NO↔SE/DK-ruter og valutahåndtering). |
GET /toll-stations → syncedAt | Tidsstempel per stasjon for siste vellykkede NVDB-katalogsynk — bruk dette til å vise hvor fersk referansedataen din er. |
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:
| Status | Betydning |
|---|---|
400 | Valideringsfeil — svaret inkluderer en errors-oppslagstabell som mapper feltnavn → meldinger. |
401 / 403 | Manglende/ugyldig/uautorisert bearer-token. |
409 | En Idempotency-Key ble gjentatt med et annet forespørselsinnhold. |
429 | Ratebegrenset — trekk deg tilbake ved hjelp av Retry-After. |
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.