# Company Financials API: UK, Denmark & Norway accounts + LEI (`bosco_labs/company-accounts`) Actor

Company financials (revenue, profit, equity, assets, cash, employees) of private and public companies from official accounts: UK Companies House (all digital years), Denmark (all years), Norway Brønnøysund (last 3 years). Look up by company number, CVR or org number; adds LEI and a source per value.

- **URL**: https://apify.com/bosco_labs/company-accounts.md
- **Developed by:** [Bosco Labs](https://apify.com/bosco_labs) (community)
- **Categories:** Business, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $40.00 / 1,000 company-year of financials

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

## Company Financials API: UK, Denmark & Norway accounts + LEI

Get **normalized financials of UK, Danish and Norwegian companies, including private ones**,
straight from the official accounts they file with **Companies House** (UK),
**Erhvervsstyrelsen** (Denmark) and the **Brønnøysund Register of Company Accounts** (Norway):
revenue, gross profit, operating profit, net income, equity, net assets, current assets, cash,
creditors and employees. Every number comes with **the exact fact or field it was taken from**,
so you can audit any value. Each row also gets the company's **LEI** from GLEIF when it has one.
Look up companies by company number, CVR or organisation number, or get the newest filings. For credit checks, KYB, M\&A and lead research, and for AI agents.

**Pricing (pay per event):** $0.04 per company-year ($40 per 1,000 rows). Rows where the
filing tags no figures at all (e.g. some dormant companies) are skipped and not charged. The
Actor stops at your max charge limit.

These registers publish machine-readable accounts of millions of limited companies, not just
listed ones. This Actor reads those filings and returns one clean row per company per fiscal
year, in the same format for every country. No scraping, no logins, no API keys.

### What you get

One row per company per fiscal year:

```json
{
  "country": "GB",
  "company_number": "03117531",
  "company_name": "MNM Property Services Limited",
  "lei": null,
  "lei_status": null,
  "period_end": "2026-03-31",
  "fiscal_year_start": "2025-04-01",
  "currency": "GBP",
  "revenue": 12961072,
  "gross_profit": 4267732,
  "operating_profit": 1386710,
  "net_income": 952557,
  "current_assets": 4342436,
  "cash_and_equivalents": 1011336,
  "total_equity": 1345970,
  "current_liabilities": 3339068,
  "employees": 98,
  "metrics_found": 13,
  "sources": {
    "revenue": {
      "concept": "ns5:TurnoverRevenue",
      "fact_id": null,
      "context_ref": "FY_31_03_2026",
      "period": "2025-04-01/2026-03-31",
      "unit": "iso4217:GBP",
      "decimals": 0
    }
  },
  "registry_url": "https://find-and-update.company-information.service.gov.uk/company/03117531/filing-history",
  "source_document": "Prod223_4344_03117531_20260331.html",
  "source_url": "https://download.companieshouse.gov.uk/Accounts_Bulk_Data-2026-11-05.zip",
  "retrieved_at": "2026-11-05T15:23:16+00:00"
}
```

Real output (shortened). Danish rows have `cvr` instead of `company_number`, a `report_url` to
the published annual report, and figures in the reporting currency (usually DKK).

A Norwegian row, with its LEI (real output, shortened). For Norway, `sources` names the field
in the register's JSON record at `source_url`:

```json
{
  "country": "NO",
  "org_number": "923609016",
  "company_name": "EQUINOR ASA",
  "lei": "OW6OFBNCKXC4US5C7523",
  "lei_status": "ISSUED",
  "period_end": "2025-12-31",
  "fiscal_year_start": "2025-01-01",
  "currency": "USD",
  "revenue": 61999000000,
  "operating_profit": 5563000000,
  "net_income": 5731000000,
  "total_assets": 103432000000,
  "total_equity": 39182000000,
  "current_liabilities": 36924000000,
  "employees": null,
  "metrics_found": 12,
  "sources": {
    "total_equity": {
      "concept": "egenkapitalGjeld.egenkapital.sumEgenkapital",
      "period": "2025-01-01/2025-12-31",
      "unit": "iso4217:USD"
    }
  },
  "report_url": "https://data.brreg.no/regnskapsregisteret/regnskap/aarsregnskap/kopi/923609016/2025",
  "registry_url": "https://virksomhet.brreg.no/nb/oppslag/enheter/923609016",
  "source_url": "https://data.brreg.no/regnskapsregisteret/regnskap/923609016/7192427"
}
```

All figure fields: `revenue`, `gross_profit`, `operating_profit`, `profit_before_tax`,
`net_income`, `total_assets`, `fixed_assets`, `current_assets`, `cash_and_equivalents`,
`total_equity`, `net_assets`, `net_current_assets`, `total_liabilities`,
`current_liabilities` (UK: creditors due within one year), `noncurrent_liabilities` (UK:
creditors due after one year), `employees`. A field is `null` when the company didn't tag it.
Identifier fields: `company_number` (UK), `cvr` (DK), `org_number` (NO), `enterprise_number`
(BE), plus `lei` and `lei_status` (GLEIF registration status, e.g. `ISSUED` or `LAPSED`).
Nothing is estimated, except `total_liabilities`, which is total assets minus total equity when
it isn't tagged; `sources` then says `{"derived": "total_assets - total_equity"}`.

### Input

```json
{ "countries": ["GB", "DK", "NO"], "companyNumbers": ["03117531"], "cvrNumbers": ["24256790"], "orgNumbers": ["923609016"], "maxResults": 10 }
```

| Field | Meaning |
|---|---|
| `countries` | Any of `GB`, `DK`, `NO`, `BE`, for the newest-filings mode. Default `GB`, `DK`, `NO`. Ignored when you pass numbers: then only the numbers' countries are read |
| `companyNumbers` | UK company numbers (e.g. `03117531`, `SC123456`) |
| `cvrNumbers` | Danish CVR numbers (e.g. `24256790`) |
| `orgNumbers` | Norwegian organisation numbers (e.g. `923609016`) |
| `enterpriseNumbers` | Belgian enterprise numbers (e.g. `0403.170.701`), see Coverage |
| `maxResults` | Max company-years per country, newest filings first. Default 5 |
| `enrichLei` | Look up each company's LEI at GLEIF. Default on |

Running without input returns the 5 newest UK filings, the 5 newest Danish filings, and the
latest accounts of 5 Norwegian companies whose accounts were registered in the last 2 days.

### Coverage: what to expect

- **UK:** by company number, accounts of **any year** filed electronically (iXBRL), newest
  first, from the Companies House API (about 75% of all accounts are filed electronically).
  Paper or PDF-only filings (mostly older ones) are skipped and cost nothing. Without company
  numbers, the newest filings come from Companies House's free daily files (last ~60 days).
  Most small UK companies file *filleted* or micro-entity accounts **without a profit and loss
  account**, so expect balance-sheet figures (net assets, equity, current assets, creditors,
  employees) for them and revenue/profit only for companies that publish a P\&L.
- **Denmark:** every annual report filed digitally with Erhvervsstyrelsen, **all years**. Small
  (class B) companies may publish gross profit instead of revenue. Listed companies are read
  from their IFRS (ESEF) filing.
- **Norway:** the **last 3 fiscal years** of every company that files accounts with the
  Brønnøysund Register (Regnskapsregisteret), from its open API. These are the company's own
  accounts, not group accounts, and the register's key figures only: revenue (sales revenue),
  operating profit, profit before tax, net income, assets, cash, equity and debt. The data has
  no employee count and no gross profit. Sole proprietorships (ENK) are skipped, as their
  accounts are a person's. Contains data under the Norwegian licence for Open Government data
  (NLOD) made available by Brønnøysundregistrene.
- **Belgium:** the National Bank of Belgium only publishes filed accounts as data through web
  services that need a subscription key. BE works only when the Actor owner has set one up,
  needs `enterpriseNumbers`, and is skipped otherwise.
- **LEI:** looked up at [GLEIF](https://www.gleif.org) by registration number and country.
  Most small companies have no LEI, so `lei` is usually `null` for them.

### Use cases

- **KYB, credit and supplier checks:** latest filed equity, net assets, cash and creditors of
  private companies, by company number, CVR or org number, with the LEI where there is one.
- **Lead lists and market maps:** the newest filings every day, with size indicators
  (employees, net assets, revenue where published).
- **Data pipelines:** schedule the Actor daily and export to CSV, Excel, Sheets or your
  warehouse.
- **AI agents:** small, predictable JSON with a source for every value.

### Use with AI agents (MCP)

Agents can call this Actor as a tool through the
[Apify MCP server](https://github.com/apify/apify-mcp-server). Add this server URL to your MCP
client (Claude, Cursor, VS Code, ...):

```text
https://mcp.apify.com?tools=bosco_labs/company-accounts
```

It loads this Actor as a tool, plus the tools that read its results (`get-actor-run`,
`get-dataset-items`). The hosted server signs you in with OAuth, or accepts your Apify token as
`Authorization: Bearer <APIFY_TOKEN>`. On the default server (`https://mcp.apify.com`), agents
can also find this Actor with `search-actors` and run it with `call-actor`.

Example prompts this Actor answers:

- *"What were Novo Nordisk's revenue and equity in its latest Danish annual report?"*
- *"Get the last three years of Equinor ASA's own accounts from the Norwegian register."*
- *"What is the LEI and the latest net assets of UK company 03117531?"*

For the first one, the agent passes:

```json
{"cvrNumbers": ["24256790"], "maxResults": 1}
```

**Output for agents:** stable, typed JSON, one row per company per fiscal year. Every row has `schema_version` and a `source_url` pointing to the official filing or register record (plus `registry_url` and a `sources` entry per value), so the agent can cite its source. With registration numbers, only
their countries are read, so a lookup never returns other companies; bad numbers fail at once
with a valid example.

**Cost:** $0.04 per company-year, billed to the Apify account the MCP server is signed in with.

### FAQ

**Are the numbers in thousands?** No. All values are in full currency units: the Actor applies
each fact's scale and sign as tagged.

**Why is `revenue` empty?** The company didn't publish it (common for small UK and Danish
companies, see above), or tagged it with a non-standard concept. `metrics_found` tells you how
complete a row is.

**Can I get older UK accounts?** Yes, by company number: every year with digital (iXBRL)
accounts. Older paper or PDF-only filings have no data to read and are skipped.

**Why is `lei` null?** The company has no LEI (most small companies don't), or GLEIF has it
under a different registration number. `lei_status` shows whether an LEI found is still
`ISSUED` or e.g. `LAPSED` (not renewed).

**Are Norwegian figures consolidated?** No: rows hold the company's own accounts. Equinor's
row, for example, is the parent company, not the group.

**Is Belgium supported?** Only when the Actor owner has configured access to the National
Bank of Belgium's web services; otherwise BE is skipped with a log message and costs nothing.

**Personal data?** Rows contain company-level figures and the company name only. Names of
directors, board members, auditors or meeting chairs, addresses and free-text notes are never
output. Norwegian sole proprietorships are skipped.

**Legal basis?** The accounts are public register filings. See LEGAL.md in the source for the
terms checked.

# Actor input Schema

## `countries` (type: `array`):

Registers to read, as codes: GB (Companies House), DK (Erhvervsstyrelsen), NO (Brønnøysund Regnskapsregisteret), BE (National Bank of Belgium; needs enterprise numbers and NBB access set up by the Actor owner). Default \["GB", "DK", "NO"]. Used only when no numbers are given (it then returns each country's newest filings); with numbers, the countries of those numbers are read and this is ignored.

## `companyNumbers` (type: `array`):

UK Companies House numbers, e.g. \["03117531", "SC123456"] (shorter numbers are zero-padded to 8). Accounts of any year filed digitally (iXBRL), newest first; paper/PDF-only filings are skipped. Empty = the newest UK filings (last ~60 days).

## `cvrNumbers` (type: `array`):

Danish CVR numbers, 8 digits, e.g. \["24256790"]. All years are available, newest first. Empty = the newest Danish filings.

## `orgNumbers` (type: `array`):

Norwegian organisation numbers, 9 digits, e.g. \["923609016"]. The last 3 fiscal years are available, newest first. Empty = companies whose accounts were registered in the last 2 days.

## `enterpriseNumbers` (type: `array`):

Belgian KBO/BCE enterprise numbers, 10 digits with or without dots, e.g. \["0403.170.701"]. Required for BE (there is no "newest filings" mode for Belgium), which works only when the Actor owner has set up NBB access.

## `enrichLei` (type: `boolean`):

true (default) = look up each company's Legal Entity Identifier at GLEIF by its registration number and add `lei` and `lei_status` (null when the company has no LEI). false = skip the lookup.

## `maxResults` (type: `integer`):

Maximum company-years per country, newest filings first, e.g. 1 for a company's latest accounts. Default 5. One row per company per fiscal year.

## Actor input object example

```json
{
  "countries": [
    "GB",
    "DK"
  ],
  "cvrNumbers": [
    "24256790"
  ],
  "enrichLei": true,
  "maxResults": 2
}
```

# Actor output Schema

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

No description

# 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 = {
    "countries": [
        "GB",
        "DK"
    ],
    "cvrNumbers": [
        "24256790"
    ],
    "maxResults": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("bosco_labs/company-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 = {
    "countries": [
        "GB",
        "DK",
    ],
    "cvrNumbers": ["24256790"],
    "maxResults": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("bosco_labs/company-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 '{
  "countries": [
    "GB",
    "DK"
  ],
  "cvrNumbers": [
    "24256790"
  ],
  "maxResults": 2
}' |
apify call bosco_labs/company-accounts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bosco_labs/company-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/CHA3lo0riQ3yGRqpg/builds/p10gR58C1hssKDuzV/openapi.json
