# Norway Company Financials: Annual Accounts (Brreg) (`nordicdata/no-annual-accounts`) Actor

Norwegian company financial statements (regnskap) from Brønnøysundregistrene's Regnskapsregisteret: revenue, operating profit, equity, total assets and cash, joined with Enhetsregisteret NACE code, municipality and employees. Up to 3 years per company, no API key needed.

- **URL**: https://apify.com/nordicdata/no-annual-accounts.md
- **Developed by:** [Mikkel Jeppesen Juhl](https://apify.com/nordicdata) (community)
- **Categories:** Business, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 annual account with figures

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Norway Company Financials: Annual Accounts (Brreg)

Get Norwegian company financials from annual accounts (regnskap) as clean JSON. One row per annual account, up to three years per company, from the open Regnskapsregisteret data published by Brønnøysundregistrene (Brreg). No API key needed.

Give it organization numbers, a register filter, or both. The filter searches Enhetsregisteret by municipality, NACE code, organization form, employees and registration date. The actor then reads each company's accounts and joins them with the company name, NACE code, municipality and employee count.

### Use cases

- Look up revenue, profit, equity and total assets for Norwegian companies by organization number (orgnr).
- Build industry or municipality datasets with NACE code and employee filters from Enhetsregisteret.
- Screen Norwegian companies for credit checks, due diligence or lead lists.
- Feed parsed Norwegian financial statements to analysis tools or AI agents.

### What you get

| Field | Meaning |
| --- | --- |
| `orgnr` | Norwegian organization number, 9 digits |
| `companyName`, `organizationForm` | Name and form (AS, ASA, SA and so on) from Enhetsregisteret |
| `naceCode`, `naceDescription` | Main industry code (næringskode 1) |
| `municipalityNumber`, `municipality` | Business address municipality |
| `employees` | Registered employees in Enhetsregisteret today, not for the account year |
| `lastFiledYear`, `bankrupt`, `underLiquidation` | Register status today |
| `accountType` | `company` (selskap) or `group` (konsern) |
| `periodStart`, `periodEnd`, `fiscalYear` | Financial year |
| `currency` | Reporting currency (NOK, USD, EUR and so on) |
| `statementLayout`, `accountingRules`, `smallCompany` | Oppstillingsplan, IFRS or the Accounting Act, small company rules |
| `auditExempt`, `notAudited` | The company opted out of audit, or the accounts are not audited |
| `revenue` | Sum driftsinntekter (total operating income) |
| `salesRevenue` | Salgsinntekter |
| `operatingExpenses`, `staffCosts` | Sum driftskostnader, lønnskostnad |
| `operatingProfit` | Driftsresultat |
| `netFinancialItems` | Netto finans |
| `profitBeforeTax`, `taxExpense` | Ordinært resultat før skattekostnad, skattekostnad |
| `profitForTheYear` | Årsresultat |
| `totalComprehensiveIncome` | Totalresultat, when reported |
| `fixedAssets`, `currentAssets`, `inventories`, `receivables`, `cash` | Balance sheet items, end of year |
| `totalAssets` | Sum eiendeler |
| `equity` | Sum egenkapital |
| `totalLiabilities`, `shortTermLiabilities`, `longTermLiabilities` | Gjeld |
| `equityRatio` | equity / totalAssets, computed by the actor |
| `accountId`, `journalNumber`, `sourceUrl` | Ids in Regnskapsregisteret and the API link |
| `parseError` | Why a row has no figures, else null |

Figures are in whole currency units. A figure is null when the account does not contain it.

The output has no person names. The actor never reads roles, board members or auditors. It skips sole proprietorships (ENK), because their names are often a person's name.

### Input

```json
{
  "organizationNumbers": ["923609016"],
  "municipalityNumbers": ["0301"],
  "naceCodes": ["62"],
  "organizationForms": ["AS"],
  "minEmployees": 5,
  "registeredFrom": "2018-01-01",
  "registeredTo": "2022-12-31",
  "maxCompanies": 1000,
  "maxItems": 3000,
  "accountTypes": ["company", "group"],
  "latestYearOnly": false,
  "includeCompaniesWithoutAccounts": false,
  "requestIntervalSeconds": 0.4
}
```

- Use organization numbers, the filter, or both. With both, the listed companies come first.
- A NACE code is a prefix: `62` matches `62.100` and `62.200`.
- Enhetsregisteret serves at most 10,000 companies per filter. Split a large search by municipality or NACE code.
- `minEmployees` from 2 to 4 is applied after the search, because the register only accepts 0, 1 or 5 and up.
- Bankrupt companies are skipped unless `includeBankrupt` is on.

### Coverage

Measured on 2026-10-21. Details: `raw/2026-10-21-no-annual-accounts-test-run.md` in the company repository.

| Field | 200 AS with 5+ employees (604 rows) | 10 large companies (45 rows) |
| --- | --- | --- |
| company data, period, currency | 100% | 100% |
| revenue | 100% | 100% |
| operatingProfit | 100% | 100% |
| profitBeforeTax | 99% | 100% |
| profitForTheYear | 100% | 100% |
| equity, totalAssets | 100% | 100% |
| cash | 99% | 100% |
| staffCosts | 100% | 62% |

Spot checks: 6 rows matched the source JSON on every figure, and 2 rows matched the filed PDF accounts.

### Limits of the source

- The open API returns the three newest filed years per company. Older years are not served.
- Banks, insurers and pension funds are not served. Their rows come back with a `parseError` such as "oppstillingsplan som ikke er stottet (BANK)" and are not charged.
- Brønnøysundregistrene describes the API as a preview with no service guarantee. It may change or stop.
- `employees` is today's figure from Enhetsregisteret, not the average for the account year.

### Run it locally

No Apify account is needed. You need `uv`.

```bash
cd apps/apify-no-annual-accounts
uv sync
./run_local.sh input.example.json
uv run python test/coverage.py storage/datasets/default
uv run python test/spotcheck.py storage/datasets/default 5
```

Run stats land in `storage/key_value_stores/default/RUN_STATS`.

### Source and license

Contains data under the Norwegian licence for Open Government data (NLOD) 2.0 distributed by Brønnøysundregistrene. License: https://data.norge.no/nlod/en/2.0. Sources: https://data.brreg.no/regnskapsregisteret/regnskap and https://data.brreg.no/enhetsregisteret/api. This actor has changed the information: it renames the fields to English, joins the accounts with Enhetsregisteret data and computes `equityRatio`. Brønnøysundregistrene does not endorse this actor. The legally valid accounts are the ones filed with Regnskapsregisteret.

### Pricing

Pay per event: 0.005 USD per annual account row with figures (5 USD per 1,000). A company with three years of accounts costs 0.015 USD. Set `latestYearOnly` to pay for one year only. Rows with a `parseError` are free. No start fee.

# Actor input Schema

## `organizationNumbers` (type: `array`):

Norwegian organization numbers (9 digits). Leave empty to use the register filter below.

## `municipalityNumbers` (type: `array`):

Filter companies by municipality number (4 digits), for example 0301 for Oslo or 4601 for Bergen.

## `naceCodes` (type: `array`):

Industry codes (næringskode). A prefix matches all codes below it, for example 62 or 62.100.

## `organizationForms` (type: `array`):

For example AS, ASA, SA, ANS. Only some forms file accounts. Most rows come from AS.

## `minEmployees` (type: `integer`):

Keep companies with at least this many registered employees.

## `registeredFrom` (type: `string`):

Earliest registration date in Enhetsregisteret, YYYY-MM-DD.

## `registeredTo` (type: `string`):

Latest registration date in Enhetsregisteret, YYYY-MM-DD.

## `includeBankrupt` (type: `boolean`):

The filter skips companies flagged as bankrupt unless this is on.

## `maxCompanies` (type: `integer`):

Stop reading the register filter after this many companies. The register serves at most 10,000 per filter, so split large searches by municipality or NACE code.

## `maxItems` (type: `integer`):

Stop after this many rows.

## `accountTypes` (type: `array`):

company: the legal entity's own accounts (selskap). group: consolidated accounts (konsern), filed by parent companies.

## `latestYearOnly` (type: `boolean`):

Return only the newest account per company and type. Off returns up to 3 years.

## `includeCompaniesWithoutAccounts` (type: `boolean`):

Add a row with null figures for companies that have no accounts in the open register. These rows are not charged.

## `requestIntervalSeconds` (type: `number`):

Pause between requests to data.brreg.no. Minimum 0.3.

## Actor input object example

```json
{
  "organizationNumbers": [
    "923609016"
  ],
  "includeBankrupt": false,
  "maxCompanies": 1000,
  "maxItems": 100,
  "accountTypes": [
    "company",
    "group"
  ],
  "latestYearOnly": false,
  "includeCompaniesWithoutAccounts": false,
  "requestIntervalSeconds": 0.4
}
```

# Actor output Schema

## `results` (type: `string`):

One row per annual account with key figures, NACE code, municipality and employees.

## `runStats` (type: `string`):

Summary counts for the run, such as how many rows were written.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "organizationNumbers": [
        "923609016"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nordicdata/no-annual-accounts").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "organizationNumbers": ["923609016"] }

# Run the Actor and wait for it to finish
run = client.actor("nordicdata/no-annual-accounts").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "organizationNumbers": [
    "923609016"
  ]
}' |
apify call nordicdata/no-annual-accounts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nordicdata/no-annual-accounts"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gB4GdFXCEtgLKl3pP/builds/Pm2rvAljoy5I6WWE3/openapi.json
