API-referanse
Basis-URL: https://graveinfo.no/api/v1
Autentisering og nøkler
Alle endepunkter unntatt GET /organizations/search krever en API-nøkkel i Authorization-headeren:
Authorization: Bearer gv_live_<64 hex-tegn>Nøkler opprettes under API-nøkler i dashbordet av en administrator hos organisasjonen (ledningseier) eller entreprenørprofilen. Nøkkelen tilhører den organisasjonen eller entreprenøren som opprettet den, og alle kall skjer på dens vegne. Nøkkelen vises kun én gang ved opprettelse.
En entreprenør som også er registrert som ledningseier (samme organisasjonsnummer) kan bruke én og samme nøkkel mot både gravemelding- og innboks-endepunktene.
Scopes
Nøkler tildeles scopes ved opprettelse. Søk og kommunedekning krever ikke scope. Manglende scope gir HTTP 403.
gravemeldinger:writePOST /gravemeldinger og POST /gravemeldinger/{id}/sendgravemeldinger:readGET /gravemeldinger og GET /gravemeldinger/{id}innboks:readGET /innboksinnboks:writePOST /innboks/{recipientId}/svarRate limiting
Grensene er per API-nøkkel og per minutt (fast vindu). Ved overskridelse svarer API-et med HTTP 429. Det sendes ingen X-RateLimit-*-headere.
GET /organizations/search20 per IP uten nøkkel, 100 med nøkkelGET /coverageIngen grenseGET /gravemeldinger60POST /gravemeldinger10GET /gravemeldinger/{id}Ingen grensePOST /gravemeldinger/{id}/send5GET /innboks60POST /innboks/{recipientId}/svar30Feilformat
Alle feil returneres som JSON med et error-objekt. code er en maskinlesbar SCREAMING_SNAKE_CASE-streng. field (søk) eller fields (gravemeldinger) følger med ved valideringsfeil.
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"fields": {
"plannedStart": "Må være i fremtiden"
}
}
}Merk: 401- og 429-kodene varierer mellom endepunktgruppene (INVALID_API_KEY / UNAUTHORIZED, RATE_LIMIT_EXCEEDED / RATE_LIMIT). Sjekk HTTP-statusen, ikke koden, for disse to tilfellene.
Koordinater
Alle polygoner i API-et er GeoJSON i EPSG:4326 (WGS84) med [lengdegrad, breddegrad]. Graveinfo konverterer selv til og fra sitt interne UTM-system. Et polygon i UTM-koordinater treffer ingen kommune og gir NO_MUNICIPALITIES_FOUND.
/Rotendepunkt for tjenesteoppdagelse. Returnerer navn, versjon, lenke til dokumentasjonen og en liste over de offentlige endepunktene. Krever ikke API-nøkkel.
Eksempel
GET /api/v1Responsskjema (200 OK)
{
"name": "Graveinfo API",
"version": "v1",
"documentation": "https://graveinfo.no/for-utviklere/api-referanse",
"endpoints": [
{
"method": "GET",
"path": "/api/v1/organizations/search",
"description": "Søk etter infrastruktureiere og entreprenører."
},
{
"method": "GET",
"path": "/api/v1/coverage",
"description": "Infrastruktureiere registrert i en gitt kommune."
},
{
"method": "POST",
"path": "/api/v1/gravemeldinger",
"description": "Opprett en gravemelding som utkast (autoSend: true sender den)."
}
]
}Listen er forkortet. Hvert element i endpoints har method, path og description.
/organizations/searchSøker etter ledningseiere og/eller entreprenører på navn eller organisasjonsnummer. Støtter kommunefilter og paginering. Kan kalles uten API-nøkkel (20 kall/minutt per IP) eller med nøkkel (100 kall/minutt). Krever ikke scope.
Eksempel
GET /api/v1/organizations/search?q=Elvia&type=owner&limit=5
Authorization: Bearer gv_live_... (valgfritt)Query-parametere
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
q | string | Nei* | Fritekst - delstrengsøk i navn og org.nr. |
orgnr | string | Nei* | Eksakt org.nr.-oppslag (9 siffer). Er både q og orgnr satt, brukes orgnr. |
type | enum | Nei | "owner" (standard), "contractor" eller "all". |
municipality | string | Nei | 4-sifret kommunenummer. Begrenser ledningseiere til de som er registrert i kommunen. Påvirker ikke entreprenører. |
limit | integer | Nei | Maks resultater per side. Standard: 20, maks: 100. |
offset | integer | Nei | Hopp over N resultater. Brukes for paginering. Standard: 0. |
* Uten q eller orgnr returneres en tom liste.
Responsskjema (200 OK)
{
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Elvia AS",
"orgnr": "920415523",
"type": "owner",
"address": "Postboks 853, 0104 Oslo",
"email": "gravemelding@elvia.no",
"phone": null,
"website": "https://www.elvia.no",
"gravemottak": "api",
"claimed": true
}
],
"meta": {
"total": 1,
"limit": 5,
"offset": 0
}
}Feltbeskrivelser - data[]
iduuid
namestring
orgnrstring
type"owner" | "contractor"
addressstring | null
emailstring | null
phonestring | null
websitestring | null
gravemottak"api" | "email" | "none" | null
claimedboolean
Feilkoder
400INVALID_PARAMETERUgyldig verdi på ett av parameterne. Feltet er oppgitt i error.field.401INVALID_API_KEYNøkkel oppgitt, men ugyldig.429RATE_LIMIT_EXCEEDEDFor mange kall. Vent til neste minutt.{
"error": {
"code": "INVALID_PARAMETER",
"message": "type must be one of: owner, contractor, all",
"field": "type"
}
}/coverageReturnerer alle ledningseiere registrert i den oppgitte kommunen, med infrastrukturtyper og gravemottak. Nyttig for å bygge oversikter og for å finne hvem som er mottakere av gravemeldinger i et område. Krever API-nøkkel, men ikke scope. Ingen rate limit.
Eksempel
GET /api/v1/coverage?municipality=0301
Authorization: Bearer gv_live_...Query-parametere
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
municipality | string | Ja | 4-sifret kommunenummer (f.eks. 0301 for Oslo). |
type | string | Nei | Bare ledningseiere med denne infrastrukturtypen (samme vokabular som workTypes, f.eks. vann_avlop). |
Responsskjema (200 OK)
{
"municipality": {
"number": "0301",
"name": "Oslo"
},
"owners": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Oslo kommune VAV",
"orgnr": "991765887",
"infrastructureTypes": ["vann_avlop"],
"gravemottak": "api",
"email": "gravemelding@vav.oslo.kommune.no"
},
{
"id": "7cb5ab12-8901-4de5-b3fc-1a234d56e78f",
"name": "Elvia AS",
"orgnr": "920415523",
"infrastructureTypes": ["lavspenning", "hoyspenning"],
"gravemottak": "api",
"email": "gravemelding@elvia.no"
}
],
"total": 2
}Feltbeskrivelser - owners[]
iduuid
namestring
orgnrstring
infrastructureTypesstring[]
gravemottak"api" | "email" | "none"
emailstring | null
Feilkoder
400MISSING_PARAMETERmunicipality-parameteret er ikke oppgitt.400INVALID_PARAMETERmunicipality er ikke et 4-sifret tall.401UNAUTHORIZEDManglende eller ugyldig API-nøkkel.404MUNICIPALITY_NOT_FOUNDKommunenummeret finnes ikke i Graveinfo.500INTERNAL_ERRORIntern feil. Prøv igjen om noen sekunder./gravemeldingerLister gravemeldinger som tilhører entreprenøren nøkkelen er knyttet til, nyeste først. Krever scope gravemeldinger:read. Rate limit: 60 kall/minutt.
Eksempel
GET /api/v1/gravemeldinger?status=sent&limit=10
Authorization: Bearer gv_live_...Query-parametere
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
status | enum | Nei | "draft", "sent", "in_progress" eller "completed". |
from | ISO 8601 | Nei | Opprettet fra og med (dato eller tidspunkt). |
to | ISO 8601 | Nei | Opprettet til og med (dato eller tidspunkt). |
limit | integer | Nei | Maks resultater per side. Standard: 20, maks: 100. |
offset | integer | Nei | Hopp over N resultater. Standard: 0. |
Responsskjema (200 OK)
{
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"status": "sent",
"title": "Graving Storgata 12",
"plannedStart": "2026-10-01",
"plannedEnd": "2026-10-14",
"createdAt": "2026-09-15T10:00:00.000Z",
"sentAt": "2026-09-15T10:00:01.000Z",
"summary": {
"total": 2,
"responded": 1,
"pending": 1,
"hasConflicts": false
}
}
],
"meta": {
"total": 42,
"limit": 10,
"offset": 0
}
}Feltbeskrivelser - data[]
iduuid
referenceNumberstring | null
statusenum
titlestring
plannedStartdate
plannedEnddate | null
createdAtISO 8601 | null
sentAtISO 8601 | null
summaryobject
Statuskoder
draftOpprettet, ikke sendt.sentSendt, venter på svar.in_progressAlle har svart, eller saken venter på kommunen.completedGravemeldingen er klar eller arkivert.Feilkoder
400INVALID_PARAMETERUgyldig verdi på ett av parameterne.401INVALID_API_KEYManglende eller ugyldig API-nøkkel.403FORBIDDENNøkkelen mangler scope gravemeldinger:read.403MISSING_CONTRACTORNøkkelen er ikke knyttet til en registrert entreprenør.429RATE_LIMIT_EXCEEDEDFor mange kall. Maks 60 per minutt./gravemeldingerOppretter en gravemelding som utkast for entreprenøren nøkkelen tilhører, og finner ledningseierne som dekker polygonet. Kommunen utledes fra polygonet. Utkastet sendes med POST /gravemeldinger/{id}/send, eller umiddelbart med autoSend: true.
Krever scope gravemeldinger:write. Nøkkelen må tilhøre, eller dele organisasjonsnummer med, en registrert entreprenør; ellers MISSING_CONTRACTOR.
Rate limit: 10 kall per minutt. Sending via /send har egen grense på 5 per minutt. Design systemet ditt for å spre sendingene over tid.
Polygon-koordinater: location er GeoJSON i WGS84 (EPSG:4326) med [lengdegrad, breddegrad]. Første og siste punkt i ringen skal være like. UTM-koordinater gir NO_MUNICIPALITIES_FOUND. Se guiden for sending av gravemeldinger.
Eksempel
POST /api/v1/gravemeldinger
Authorization: Bearer gv_live_...
Content-Type: application/json
{
"title": "Graving Storgata 12",
"description": "Legging av fiberkabel langs Storgata 12-18",
"workTypes": ["telekommunikasjon", "grunnarbeid"],
"location": {
"type": "Polygon",
"coordinates": [
[
[10.7522, 59.9139],
[10.7535, 59.9139],
[10.7535, 59.9150],
[10.7522, 59.9150],
[10.7522, 59.9139]
]
]
},
"plannedStart": "2026-10-01",
"plannedEnd": "2026-10-14",
"contactPerson": {
"name": "Ola Nordmann",
"phone": "91234567"
},
"autoSend": false
}Request body-felt
titlestring (påkrevd)
locationGeoJSON Polygon (påkrevd)
plannedStartdate (påkrevd)
plannedEnddate (påkrevd)
workTypesstring[] (påkrevd)
contactPersonobject (påkrevd)
descriptionstring (valgfritt)
autoSendboolean (valgfritt)
Responsskjema (201 Created)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"status": "draft",
"recipients": [
{
"organizationId": "7cb5ab12-8901-4de5-b3fc-1a234d56e78f",
"name": "Elvia AS",
"status": "pending"
},
{
"organizationId": "9ab12cd3-4567-8ef9-a0bc-1d234e56f78a",
"name": "Oslo kommune VAV",
"status": "pending"
}
],
"createdAt": "2026-09-15T10:00:00.000Z",
"_links": {
"self": "/api/v1/gravemeldinger/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"send": "/api/v1/gravemeldinger/3fa85f64-5717-4562-b3fc-2c963f66afa6/send"
}
}Feltbeskrivelser - respons
iduuid
referenceNumberstring | null
status"draft"
recipientsobject[]
createdAtISO 8601
_linksobject
_warningsobject[] (kun ved autoSend)
Respons med autoSend og feilet sending
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"status": "draft",
"recipients": [],
"createdAt": "2026-09-15T10:00:00.000Z",
"_links": { "self": "...", "send": ".../send" },
"_warnings": [
{
"code": "AUTO_SEND_FAILED",
"message": "Draft created but auto-send failed. Use the /send endpoint to retry.",
"detail": {
"error": {
"code": "NO_RECIPIENTS_FOUND",
"message": "Ingen ledningseiere funnet i det angitte området"
}
}
}
]
}Feilkoder
400INVALID_JSONKroppen er ikke gyldig JSON.400VALIDATION_ERROREtt eller flere felt mangler eller er ugyldige. Feilmelding per felt i error.fields (title, location.coordinates, location.type, plannedStart, plannedEnd, workTypes, contactPerson.name, contactPerson.phone).400NO_MUNICIPALITIES_FOUNDPolygonet treffer ingen norsk kommune (typisk feil koordinatsystem).401INVALID_API_KEYManglende eller ugyldig API-nøkkel.403INSUFFICIENT_SCOPENøkkelen mangler scope gravemeldinger:write.403MISSING_CONTRACTORNøkkelen er ikke knyttet til en registrert entreprenør.429RATE_LIMIT_EXCEEDEDFor mange kall. Maks 10 per minutt.500SERVER_ERRORIntern feil. Prøv igjen om noen sekunder.{
"error": {
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"fields": {
"location.coordinates": "Required",
"plannedStart": "Required"
}
}
}/gravemeldinger/{id}Returnerer full status for én gravemelding, inkludert mottakerliste og svar fra hver ledningseier. Gravemeldinger som tilhører andre gir 404. Krever scope gravemeldinger:read. Ingen rate limit.
Eksempel
GET /api/v1/gravemeldinger/3fa85f64-5717-4562-b3fc-2c963f66afa6
Authorization: Bearer gv_live_...Responsskjema (200 OK)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"status": "sent",
"title": "Graving Storgata 12",
"location": {
"type": "Polygon",
"coordinates": [
[[10.7522, 59.9139], [10.7535, 59.9139], [10.7535, 59.9150],
[10.7522, 59.9150], [10.7522, 59.9139]]
]
},
"plannedStart": "2026-10-01",
"plannedEnd": "2026-10-14",
"createdAt": "2026-09-15T10:00:00.000Z",
"sentAt": "2026-09-15T10:00:01.000Z",
"recipients": [
{
"organizationId": "7cb5ab12-8901-4de5-b3fc-1a234d56e78f",
"name": "Elvia AS",
"status": "responded",
"response": "no_conflict",
"responseNote": "Ingen kabler i dette området.",
"respondedAt": "2026-09-15T14:30:00.000Z",
"hasKartblad": true,
"kartbladUrl": "https://storage.graveinfo.no/kartblad/...?signature=..."
},
{
"organizationId": "9ab12cd3-4567-8ef9-a0bc-1d234e56f78a",
"name": "Oslo kommune VAV",
"status": "pending",
"response": null,
"responseNote": null,
"respondedAt": null,
"hasKartblad": false,
"kartbladUrl": null
}
],
"summary": {
"total": 2,
"responded": 1,
"pending": 1,
"hasConflicts": false
}
}Feltbeskrivelser - recipients[]
organizationIduuid
namestring | null
status"pending" | "responded"
response"no_conflict" | "conflict" | "needs_meeting" | null
responseNotestring | null
respondedAtISO 8601 | null
hasKartbladboolean
kartbladUrlstring | null
Feilkoder
401INVALID_API_KEYManglende eller ugyldig API-nøkkel.403FORBIDDENNøkkelen mangler scope gravemeldinger:read.404NOT_FOUNDGravemeldingen finnes ikke, eller tilhører en annen entreprenør./gravemeldinger/{id}/sendSender et utkast til mottakerne: varsler ledningseierne, setter frister og endrer status fra draft til sent. Ingen request body. Kan bare kalles én gang per gravemelding.
Krever scope gravemeldinger:write. Rate limit: 5 kall/minutt.
Eksempel
POST /api/v1/gravemeldinger/3fa85f64-5717-4562-b3fc-2c963f66afa6/send
Authorization: Bearer gv_live_...Responsskjema (200 OK)
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"status": "sent",
"sentAt": "2026-09-15T10:00:01.000Z",
"recipients": [
{
"organizationId": "7cb5ab12-8901-4de5-b3fc-1a234d56e78f",
"name": "Elvia AS",
"status": "pending"
},
{
"organizationId": "9ab12cd3-4567-8ef9-a0bc-1d234e56f78a",
"name": "Oslo kommune VAV",
"status": "pending"
}
],
"emailResults": [
{ "recipientId": "a1b2c3d4-5678-90ab-cdef-1234567890ab", "success": true },
{ "recipientId": "b2c3d4e5-6789-01bc-def0-234567890abc", "success": true }
],
"_links": {
"self": "/api/v1/gravemeldinger/3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
}Feltbeskrivelser - respons
status"sent"
sentAtISO 8601
recipientsobject[]
emailResultsobject[]
_linksobject
Feilkoder
400VALIDATION_ERRORUtkastet mangler påkrevde felt.400NO_RECIPIENTS_FOUNDIngen ledningseiere i området.400INVALID_PLANGravemeldingen har kostnadsfri plan og kan ikke sendes via API.401INVALID_API_KEYManglende eller ugyldig API-nøkkel.403INSUFFICIENT_SCOPENøkkelen mangler scope gravemeldinger:write.403MISSING_CONTRACTORNøkkelen er ikke knyttet til en registrert entreprenør.403CONTRACTOR_NOT_FOUNDEntreprenøren nøkkelen viser til finnes ikke lenger.403FORBIDDENGravemeldingen tilhører en annen entreprenør.404NOT_FOUNDGravemeldingen finnes ikke.409INVALID_STATUSGravemeldingen er allerede sendt, eller er ikke et utkast.409PRACTICE_NOT_SENDABLEGravemeldingen er en onboarding-øvelse og kan ikke sendes.429RATE_LIMIT_EXCEEDEDFor mange kall. Maks 5 per minutt.500SERVER_ERRORIntern feil. Prøv igjen om noen sekunder.{
"error": {
"code": "INVALID_STATUS",
"message": "Kan kun sende utkast"
}
}/innboksFor ledningseiere: gravemeldinger der organisasjonen nøkkelen tilhører er mottaker, nyeste først. Utkast og gravemeldinger med kostnadsfri plan vises ikke. Bruk recipientId til å svare med POST /innboks/{recipientId}/svar.
Krever scope innboks:read. Nøkkelen må være knyttet til en organisasjon; ellers MISSING_ORGANIZATION. Rate limit: 60 kall/minutt.
Eksempel
GET /api/v1/innboks?status=pending&limit=20
Authorization: Bearer gv_live_...Query-parametere
| Parameter | Type | Påkrevd | Beskrivelse |
|---|---|---|---|
status | enum | Nei | "pending", "responded" eller "all" (standard). |
limit | integer | Nei | Maks resultater per side. Standard: 20. Verdier utenfor 1-100 klippes til grensen. |
offset | integer | Nei | Hopp over N resultater. Standard: 0. |
Responsskjema (200 OK)
{
"data": [
{
"recipientId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"gravemelding": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"referenceNumber": "GI-2026-00042",
"title": "Graving Storgata 12",
"plannedStart": "2026-10-01",
"plannedEnd": "2026-10-14",
"location": {
"type": "Polygon",
"coordinates": [
[[10.7522, 59.9139], [10.7535, 59.9139], [10.7535, 59.9150],
[10.7522, 59.9150], [10.7522, 59.9139]]
]
},
"workTypes": ["telekommunikasjon", "grunnarbeid"],
"description": "Legging av fiberkabel langs Storgata 12-18",
"contractor": {
"name": "Graving AS",
"orgnr": "987654321",
"contactPerson": "Ola Nordmann",
"phone": "91234567",
"email": "post@graving.no"
}
},
"status": "pending",
"receivedAt": "2026-09-15T10:00:01.000Z"
}
],
"meta": {
"total": 1,
"limit": 20,
"offset": 0
}
}Feltbeskrivelser - data[]
recipientIduuid
gravemeldingobject
gravemelding.contractorobject | null
status"pending" | "responded"
receivedAtISO 8601
Feilkoder
400BAD_REQUESTUgyldig verdi for status.401UNAUTHORIZEDManglende eller ugyldig API-nøkkel.403FORBIDDENNøkkelen mangler scope innboks:read.403MISSING_ORGANIZATIONNøkkelen er ikke knyttet til en organisasjon.429RATE_LIMITFor mange kall. Maks 60 per minutt. Svaret har Retry-After: 60./innboks/{recipientId}/svarFor ledningseiere: registrerer svar på en mottatt gravemelding. Et nytt kall på samme recipientId overskriver forrige svar og varsler entreprenøren på nytt hvis note er satt.
Krever scope innboks:write. Rate limit: 30 kall/minutt.
Eksempel
POST /api/v1/innboks/a1b2c3d4-5678-90ab-cdef-1234567890ab/svar
Authorization: Bearer gv_live_...
Content-Type: application/json
{
"response": "no_conflict",
"note": "Ingen ledninger i dette området."
}Request body-felt
responseenum (påkrevd)
notestring (valgfritt)
attachmentUrlstring | null (valgfritt)
Responsskjema (200 OK)
{
"recipientId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"status": "responded",
"respondedAt": "2026-09-15T14:30:00.000Z"
}Feilkoder
400BAD_REQUESTUgyldig JSON eller ugyldig verdi for response.401UNAUTHORIZEDManglende eller ugyldig API-nøkkel.403FORBIDDENNøkkelen mangler scope innboks:write, eller mottakeren tilhører en annen organisasjon.404NOT_FOUNDrecipientId finnes ikke.429RATE_LIMITFor mange kall. Maks 30 per minutt. Svaret har Retry-After: 60.500INTERNAL_ERRORIntern feil. Prøv igjen om noen sekunder.Fullstendig maskinlesbar OpenAPI-spesifikasjon er publisert på https://graveinfo.no/openapi.yaml. Følg med på endringsloggen for nye tillegg.