Hopp til innhold

Hvordan får jeg tilgang til norske årsregnskapsdata via API?

Årsregnskap leveres til Regnskapsregisteret i Brønnøysund, og den åpne flaten er lesbar som strukturerte data gjennom /api/v1/company/{org}/accounts. Du får en innleveringsstatus med tre tilstander, det seneste regnskapsåret, og et lite sett nøkkeltall for det året: valuta, presentasjonsgrunnlag, sum eiendeler, driftsresultat, årsresultat og sum egenkapital og gjeld. Versjon 1 er et øyeblikksbilde, så det finnes ingen årsparameter og ingen flerårig historikk.

Responsformen for GET /api/v1/company/{org}/accounts, tegnet som en ytre boks som inneholder tre stablede feltrader: has_filed_annual_accounts, last_accounts_year og key_figures. En pil peker mot en uthevet boks ved siden av som sier øyeblikksbilde, uten årsparameter og uten historikk.GET /api/v1/company/{org}/accountshas_filed_annual_accountslast_accounts_yearkey_figuresØyeblikksbildeingen årsparameter, ingen historikk
Begrensningen er en del av kontrakten og ikke et hull du stilltiende jobber deg rundt. Ett regnskapsår returneres, så en serie over tid er noe du samler opp på din side ved å lagre hvert øyeblikksbilde etter hvert som du leser det.

Hva inneholder et norsk årsregnskap?

Et levert årsregnskap er et fullt regnskap: resultatregnskap, balanse, noter, og avhengig av enheten en årsberetning og en revisjonsberetning. Norske selskaper med leveringsplikt sender det til Regnskapsregisteret, og det som kommer inn der blir offentlig tilgjengelig. Den åpenheten er grunnen til at et norsk AS kan vurderes fra åpne data i en grad som overrasker folk vant til at private selskaper er lukkede andre steder.

Det de fleste API-brukere faktisk vil ha, er snevrere enn hele regnskapet. De tilbakevendende spørsmålene er om selskapet leverte i det hele tatt, hvor ferskt det er, og en håndfull tall store nok til å bære en kreditt- eller onboardingbeslutning. Endepunktet er dimensjonert for nettopp det: key_figures bærer valuta, presentasjonsgrunnlag, sum eiendeler, driftsresultat, årsresultat og sum egenkapital og gjeld for det seneste året.

To ting folk venter seg her er verdt å nevne, fordi de ikke ligger i denne responsen. Ansatteantall er ikke et regnskapsfelt; det ligger i det lukkede kommersielle nivået på /api/v1/company/{org}/context som employee_count og krever en delegering fra selskapet. Revisjonsstatus returneres ikke av dette endepunktet i det hele tatt, så fraværet betyr at endepunktet ikke svarer på det spørsmålet, ikke at regnskapet var urevidert.

Hvor ferskt er det seneste regnskapet?

Mindre ferskt enn nykommere venter, og å designe rundt det betyr mer enn noe enkeltfelt på responsen. Et regnskap beskriver et avsluttet regnskapsår, og det leveres noen måneder etter at året er omme, og bruker deretter ytterligere tid på å dukke opp i registeret. Så de ferskeste tilgjengelige tallene beskriver rutinemessig en periode som ble avsluttet godt over et år siden. last_accounts_year forteller hvilket år du ser på, og å lese det er ikke valgfritt.

Den praktiske konsekvensen er at regnskap er feil instrument for noe tidskritisk. Et selskap som gikk over ende forrige måned ser sunt ut i et regnskap levert for året før. For dagens tilstand beveger registerstatusen og konkursflaggene dekket i veiledningen om å sjekke om et selskap er aktivt seg langt raskere og er riktig første signal. Regnskapet forteller om størrelse og historikk; statusflaggene forteller om nå.

Oppslaget gjøres etter beste evne mot den åpne flaten, så en kilde som er utilgjengelig degraderer responsen i stedet for å feile kallet. Sjekk _meta.data_freshness for å se når dataene sist ble fastslått, og behandle has_filed_annual_accounts som reelt tredelt: true, false, og null for kunne-ikke-avgjøres. Å slå null sammen med false gjør et midlertidig hull hos en kilde om til en påstand om at et selskap ikke leverte.

Hvordan følger jeg med på om et selskap har levert i tide?

Kombiner to avlesninger i stedet for å lete etter ett enkelt felt. Regnskapsendepunktet forteller hva som er levert og for hvilket år. Fristsiden forteller hva som skulle vært levert når: /api/v1/public/deadlines er nøkkelløst og returnerer de kanoniske norske forretningsfristene for et gitt år, inkludert årsregnskapsfristen for et AS. Å sammenligne de to gir deg forsinkelse uten at noen av endepunktene må gjette om det andre.

Se opp for samme felle som hele dette området setter. En manglende innlevering er ikke automatisk en for sen innlevering: enheten kan mangle leveringsplikt, kan være nyregistrert uten et avsluttet regnskapsår, eller den åpne flaten kan rett og slett ikke ha svart. Les entity_type før du trekker en konklusjon, for et ENK faller stort sett utenfor denne ordningen og vil se permanent forsømmelig ut for en kontroll skrevet for et AS.

For løpende oppfølging: følg endringsarkivet i stedet for å polle dette endepunktet etter en timeplan. En ny innlevering dukker opp som en endringsrad, som er billigere enn å lese en portefølje på nytt og gir deg øyeblikket faktumet ble observerbart. Den tidfestingen er det en kontrollør spør om senere, og den er dekket i veiledningen om å hente oppdaterte selskapsdata.

Gjør det første kallet

Sandkasseforespørselen returnerer regnskapsformen uten nøkkel. TypeScript-snutten håndterer den tredelte innleveringsstatusen eksplisitt, og det er den grenen de fleste implementasjoner får feil.

# Nøkkelløs sandkasse: formen på regnskapsbildet, syntetisk selskap.
curl -s https://www.apier.no/api/v1/sandbox/public/company/999999999/accounts
// Innleveringsstatus har tre tilstander. Regn null som ukjent, aldri som «nei».
const res = await fetch(
  "https://www.apier.no/api/v1/company/999999999/accounts",
  { headers: { Authorization: `Bearer ${process.env.APIER_API_KEY}` } },
);

if (!res.ok) {
  const { error_code, explanation } = await res.json();
  throw new Error(`${error_code}: ${explanation.summary}`);
}

const { data, _meta } = await res.json();

if (data.has_filed_annual_accounts === null) {
  console.warn("Innleveringsstatus kunne ikke avgjøres fra den åpne flaten.");
} else if (data.has_filed_annual_accounts) {
  const k = data.key_figures;
  console.log(data.last_accounts_year, k.currency, k.sum_assets,
    k.operating_result, k.annual_result, k.equity_and_liabilities);
}

console.log("per", _meta.data_freshness);

Ofte stilte spørsmål

Er norske årsregnskap offentlige?
For de enhetene som har plikt til å levere dem, ja. Årsregnskap leveres til Regnskapsregisteret i Brønnøysund, og den åpne flaten er tilgjengelig programmatisk, og det er derfor et norsk AS er uvanlig gjennomsiktig sammenlignet med private selskaper i mange andre land. Et enkeltpersonforetak faller stort sett utenfor den ordningen, så langt mindre er offentlig.
Hvilke tall returnerer regnskapsendepunktet?
Det seneste regnskapsåret pluss et minimalt sett nøkkeltall for det: valuta, presentasjonsgrunnlag, sum eiendeler, driftsresultat, årsresultat og sum egenkapital og gjeld. Det er et sammendrag og ikke et fullt årsregnskap, og det er dimensjonert for en beslutning som å gi kreditt, ikke for finansiell analyse.
Kan jeg få flere år med regnskap fra API-et?
Ikke i v1. Endepunktet svarer med et øyeblikksbilde uten årsparameter og uten flerårig historikk, så en utvikling over tid er ikke noe dette kallet kan gi deg. Trenger du en serie, lagre hvert øyeblikksbilde etter hvert som du leser det og bygg historikken på din side.
Sier API-et om regnskapet var revidert?
Nei. Revisjonsstatus er ikke blant feltene dette endepunktet returnerer, så regn fraværet som fravær og ikke som et negativt svar. Merk også at mange mindre norske selskaper kan velge bort revisjon, så spørsmålet er reelt og ikke en formalitet, og det trenger en annen kilde.
Hvordan vet jeg om et selskap har levert i det hele tatt?
Les has_filed_annual_accounts, og håndter det som tre tilstander og ikke to. True betyr at en innlevering ble funnet, false at den ikke ble det, og null at den åpne flaten ikke kunne svare. Å gjøre null om til false forvandler et hull i dataene til en anklage om manglende etterlevelse.