Skip to content
Apier

How do I access Norwegian annual accounts (årsregnskap) data via API?

Annual accounts are filed to Regnskapsregisteret at Brønnøysund, and the open tier is readable as structured data through /api/v1/company/{org}/accounts. You get a tri-state filing status, the most recent accounting year, and a small set of key figures for that year: currency, presentation basis, total assets, operating result, annual result, and total equity and liabilities. Version 1 is a current snapshot, so there is no year parameter and no multi-year history.

The response shape for GET /api/v1/company/{org}/accounts, drawn as an outer box containing three stacked field rows: has_filed_annual_accounts, last_accounts_year and key_figures. An arrow points to a highlighted box beside it reading current snapshot, with no year parameter and no history.GET /api/v1/company/{org}/accountshas_filed_annual_accountslast_accounts_yearkey_figuresCurrent snapshotno year parameter, no history
The limitation is part of the contract rather than a gap to work around silently. One accounting year is returned, so a series over time is something you accumulate on your side by recording each snapshot as you read it.

What is in a Norwegian årsregnskap?

A filed årsregnskap is a full financial statement: a profit and loss account, a balance sheet, notes, and depending on the entity a directors' report and an auditor's report. Norwegian companies required to file send it to Regnskapsregisteret, and what arrives there becomes publicly available. That openness is the reason a Norwegian AS can be assessed from open data to a degree that surprises people used to private-company opacity elsewhere.

What most API consumers actually want is narrower than the full statement. The recurring questions are whether the company filed at all, how recent the filing is, and a handful of figures big enough to support a credit or onboarding decision. The endpoint is sized for exactly that: key_figures carries the currency, the presentation basis, total assets, the operating result, the annual result, and total equity and liabilities for the most recent year.

Two things people expect here are worth naming because they are not in this response. Employee count is not an accounts field; it sits in the gated commercial tier on /api/v1/company/{org}/context as employee_count and needs a delegation from the company. Audit status is not returned by this endpoint at all, so its absence means the endpoint does not answer that question rather than that the accounts were unaudited.

How current is the most recent filing?

Less current than newcomers expect, and designing around that matters more than any field on the response. Accounts describe a completed accounting year, and they are filed some months after that year ends, then take further time to appear in the register. So the most recent available figures routinely describe a period that closed well over a year ago. last_accounts_year tells you which year you are looking at, and reading it is not optional.

The practical consequence is that accounts are the wrong instrument for anything time-sensitive. A company that failed last month looks healthy in accounts filed for the year before. For current condition, the registration status and distress flags covered in the guide on checking whether a company is active move far faster and are the right first signal. Accounts tell you about scale and history; the status flags tell you about now.

The read is best-effort against the open tier, so an upstream that is unavailable degrades the response rather than failing the call. Check _meta.data_freshness to see when the data was last established, and treat has_filed_annual_accounts as genuinely tri-state: true, false, and null for could-not-determine. Collapsing null into false turns a temporary gap in an upstream into a claim that a company did not file.

How do I track whether a company has filed on time?

Combine two readings rather than looking for a single field. The accounts endpoint tells you what has been filed and for which year. The deadline side tells you what should have been filed by when: /api/v1/public/deadlines is zero-auth and returns the canonical Norwegian business deadlines for a requested year, including the årsregnskap deadline for an AS. Comparing the two gives you lateness without either endpoint having to guess at the other.

Watch for the same trap the whole domain sets. A missing filing is not automatically a late filing: the entity may not be required to file, may be newly registered without a completed accounting year, or the open tier may simply not have answered. Read entity_type before drawing a conclusion, because an ENK generally sits outside this regime and will look permanently delinquent to a check written for an AS.

For ongoing tracking, watch the change archive rather than polling this endpoint on a schedule. A new filing shows up as a change row, which is cheaper than re-reading a portfolio and gives you the moment the fact became observable. That timing is what a reviewer asks about later, and it is covered in the guide on fetching updated company data.

Make the first call

The sandbox request returns the accounts shape with no key. The TypeScript snippet handles the tri-state filing status explicitly, which is the branch most implementations get wrong.

# Zero-auth sandbox: the accounts snapshot shape, synthetic company.
curl -s https://www.apier.no/api/v1/sandbox/public/company/999999999/accounts
// Filing status is tri-state. Treat null as unknown, never as "no".
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("Filing status could not be determined from the open tier.");
} 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("as of", _meta.data_freshness);

Frequently asked questions

Are Norwegian annual accounts public?
For the entities required to file them, yes. Annual accounts are filed to Regnskapsregisteret at Brønnøysund and the open tier is available programmatically, which is why a Norwegian AS is unusually transparent compared with private companies in many other countries. A sole proprietorship generally sits outside that regime, so far less is public.
Which figures does the accounts endpoint return?
The most recent accounting year plus a minimal set of key figures for it: currency, presentation basis, total assets, operating result, annual result, and total equity and liabilities. It is a summary rather than a full financial statement, and it is sized for a decision such as whether to extend credit rather than for financial analysis.
Can I get several years of accounts from the API?
Not in v1. The endpoint answers a current snapshot with no year parameter and no multi-year history, so a trend over time is not something this call can give you. If you need a series, record each snapshot as you read it and build the history on your side.
Does the API tell me whether the accounts were audited?
No. Audit status is not among the fields this endpoint returns, so treat its absence as absence rather than as a negative answer. Note also that many smaller Norwegian companies may opt out of audit, so the question is a real one rather than a formality, and it needs a different source.
How do I know whether a company has filed at all?
Read has_filed_annual_accounts, and handle it as three states rather than two. True means a filing was found, false means one was not, and null means the open tier could not answer. Mapping null onto false converts a gap in the data into an accusation of non-compliance.