Hvordan får jeg tilgang til data fra Brønnøysundregistrene gjennom et REST-API?
Enhetsregisteret er åpent tilgjengelig over REST og publisert under NLOD, så det finnes ingen legitimasjon å skaffe og ingen kommersiell lisens å forhandle. Å få tak i dataene er ikke den vanskelige delen. Arbeidet ligger i å normalisere registerets feltnavn inn i din egen modell, mellomlagre ansvarlig, vite hvor ferskt et gitt felt er, og oppdage når noe har endret seg. Apier svarer med de samme faktaene som et normalisert selskapsobjekt, med ferskhet og kilde oppgitt på hver respons.
Hvordan slår jeg opp et organisasjonsnummer programmatisk?
Organisasjonsnummeret er en 9-sifret identifikator tildelt av Brønnøysund, og det er koblingsnøkkelen for nesten hvert norske selskapsspørsmål. Har du allerede ett, er et oppslag én enkelt GET. Har du et selskapsnavn i stedet, løs det opp først: kall /api/v1/company/search med et navn, og du får maksimalt ti kandidater med navn, organisasjonsnummer, organisasjonsform, kommune og status.
Slå opp, ikke konstruer. Nummeret bærer et MOD-11-kontrollsiffer, noe som betyr at en verdi du finner på har rimelig sjanse for å være strukturelt gyldig og tilhøre et helt annet selskap. Et søk uten treff svarer 404 med et hint om å utvide navnet, i stedet for å returnere et tomt vellykket svar, og det betyr noe når klienten er en agent som ellers ville lest en tom liste som «dette selskapet finnes ikke».
For porteføljer heller enn enkeltselskaper: bruk det nøkkelløse samleendepunktet. /api/v1/public/company-status tar inntil 100 organisasjonsnumre i ett kall og returnerer én statusrad per unike nummer, med en lookup_status per rad slik at et nummer som ikke lar seg slå opp rapporteres som nettopp det i stedet for å forsvinne fra responsen. Det krever ingen API-nøkkel i det hele tatt, og er dermed den raskeste måten å sjekke om en kundeliste fortsatt er aktuell.
Hvilke felter returnerer Enhetsregisteret egentlig?
Den åpne flaten svarer på identitetsspørsmålene: juridisk navn, organisasjonsform som AS eller ENK, registerstatus, registreringsdato, kommune, NACE-koder, om enheten er MVA-registrert, og konkursflaggene som noterer konkurs, avvikling og tvangsavvikling. Rolledataene er også åpne, og det er nettopp derfor signaturrett lar seg avklare uten en delegering.
Det den åpne flaten ikke gir deg, er det kommersielle bildet. Ansatteantall, omsetning og balansesummer ligger bak en delegering fra selskapet selv, og på /api/v1/company/{org}/context kommer de som en egen tier_2-blokk med data_tier som forteller hvilket nivå responsen faktisk bar. Forgren på det feltet i stedet for å sjekke om en verdi tilfeldigvis er null, som blander sammen «ikke tillatt» og «finnes ikke».
Årsregnskap er igjen et eget åpent register, Regnskapsregisteret, tilgjengelig gjennom /api/v1/company/{org}/accounts og dekket i veiledningen om norske årsregnskapsdata. Å behandle Brønnøysund som én ensartet flate er den vanligste modelleringsfeilen her: det er flere registre med ulikt innhold, ulik oppdateringsrytme og ulike tilgangsregler, som deler ett organisasjonsnummer som nøkkel.
Hvor ferske er registerdataene, og hvordan oppdager jeg endringer?
Ferskhet er en egenskap ved svaret, så den hører hjemme på svaret. Hver respons bærer _meta.data_freshness og _meta.served_from, som skiller et mellomlagret oppslag fra et direkte. Oppslag innenfor et 24-timers vindu serveres fra mellomlager; forbi det henter tjenesten fra Brønnøysund og lagrer resultatet. Er Brønnøysund utilgjengelig og en fersk nok kopi finnes, sier responsen fra i stedet for å feile helt, slik at du kan avgjøre om litt gammelt slår ingenting.
Å oppdage endring er et annet problem enn å lese nåværende tilstand, og å hente hvert selskap på nytt etter en timer er den dyre måten å løse det på. Endringsarkivet på /api/v1/changes returnerer oppdagede endringshendelser med markørpaginering, filtrerbart på kilde, enhetstype, enhets-id og endringstype, slik at du poller én strøm i stedet for å lese en portefølje på nytt.
Hver rad noterer hva som faktisk flyttet seg: en field_path, verdiene før og etter, og et tidspunkt i detected_at. Det er nok til å drive en arbeidsflyt direkte, i stedet for at du selv sammenligner to øyeblikksbilder og slutter deg til hva som skjedde imellom. Pollemønstrene, inkludert hvordan du holder på en markør over omstarter, er dekket i veiledningen om å hente oppdaterte selskapsdata.
| Hensyn | Direkte kall mot Brønnøysund | Gjennom Apier |
|---|---|---|
| Tilgang | Åpent og NLOD-lisensiert. Ingen legitimasjon nødvendig for den åpne flaten. | Åpen samlet status er fortsatt nøkkelløs. Oppslag per selskap krever nøkkel fordi de navngir rolleinnehavere. |
| Feltnavn | Registerets feltnavn og struktur, som du oversetter til din egen modell og oversetter på nytt når de endres. | Ett normalisert selskapsobjekt med stabile navn på tvers av alle kilder. |
| Ferskhet | Ikke oppgitt på responsen. Du sporer selv når du sist hentet, felt for felt. | data_freshness og served_from på hver respons, så mellomlagret og direkte lar seg skille. |
| Navneoppslag | Fritekstsøk som returnerer registerets fulle nyttelast per treff. | Maksimalt ti kandidater, fem felter hver, 404 i stedet for et tomt vellykket svar. |
| Endringsdeteksjon | Hent på nytt og sammenlign, eller bygg en poller per register og avstem resultatene. | Én markørpaginert endringsstrøm med feltsti og verdier før og etter. |
Gjør det første kallet
Forespørselen om samlet status under er reelt nøkkelløs, ikke et sandkassespeil. TypeScript-snutten løser et navn opp til et organisasjonsnummer, og det er kallet du bør gripe etter først.
# Nøkkelløst: samlet status for inntil 100 organisasjonsnumre.
curl -s "https://www.apier.no/api/v1/public/company-status?org_numbers=999999999"// Navn inn, organisasjonsnummer ut. Aldri gjett et nummer.
const res = await fetch(
"https://www.apier.no/api/v1/company/search?name=Nordic%20Widgets",
{ headers: { Authorization: `Bearer ${process.env.APIER_API_KEY}` } },
);
if (res.status === 404) {
throw new Error("Ingen treff. Utvid navnet i stedet for å prøve på nytt.");
}
if (!res.ok) {
const { error_code, explanation } = await res.json();
throw new Error(`${error_code}: ${explanation.summary}`);
}
const { data } = await res.json();
// Maksimalt ti kandidater, fem felter hver.
for (const c of data.candidates) {
console.log(c.org_number, c.name, c.org_form, c.municipality, c.status);
}Ofte stilte spørsmål
- Er data fra Brønnøysundregistrene gratis å bruke?
- Enhetsregisteret er åpent tilgjengelig og publisert under NLOD, den norske lisensen for offentlige data, som tillater gjenbruk også i kommersielle produkter. Tilgang er ikke den vanskelige delen av å jobbe med det. Normalisering, mellomlagring, ferskhetssporing og endringsdeteksjon er der utviklingstiden går.
- Trenger jeg API-nøkkel for å slå opp et norsk selskap?
- Ikke for samlet status. Det nøkkelløse endepunktet /api/v1/public/company-status tar inntil 100 organisasjonsnumre i ett kall og returnerer registerstatus, organisasjonsform, MVA-registrering, konkursflaggene og innleveringsstatus for årsregnskap. Rikere oppslag per selskap gjennom /api/v1/company/ krever nøkkel, fordi de responsene inneholder rolleinnehavere.
- Hvordan finner jeg et selskap når jeg bare har navnet?
- Kall /api/v1/company/search med en name-parameter. Den returnerer maksimalt ti kandidater med fem felter hver, og svarer 404 når ingenting matcher i stedet for et tomt vellykket svar. Bruk den i stedet for å konstruere et organisasjonsnummer: en 9-sifret verdi som består kontrollsifferet treffer et reelt selskap, bare ikke det du mente.
- Hvor ferske er selskapsdataene bak API-et?
- Hver respons sier det selv. _meta-blokken bærer data_freshness og served_from, så du kan skille et mellomlagret svar fra et direkte oppslag på selve responsen. Oppslag innenfor et 24-timers ferskhetsvindu serveres fra mellomlager; utover det henter tjenesten fra Brønnøysund og lagrer resultatet.
- Hva er et organisasjonsnummer?
- Den 9-sifrede identifikatoren Brønnøysund tildeler en registrert enhet, og koblingsnøkkelen for praktisk talt alle norske selskapsoppslag. Det bærer et MOD-11-kontrollsiffer, så et feiltastet nummer feiler som regel validering i stedet for stille å treffe et annet selskap, men ikke alltid.