# UK Companies House Accounts: Company Financials (`nordicdata/uk-annual-accounts`) Actor

UK company financial statements from Companies House accounts (iXBRL): equity, net assets, total assets, cash, current assets, employees, and turnover and profit when filed. Reads the official daily bulk files, no API key. One JSON row per set of accounts, with the prior year.

- **URL**: https://apify.com/nordicdata/uk-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 accounts 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

## UK Companies House Accounts: Company Financials

Get UK company financials from Companies House accounts as clean JSON. One row per set of accounts, with the prior year, parsed from the iXBRL documents that companies file at Companies House.

No API key is needed. The actor reads the official Companies House Accounts Data Product, a free daily bulk file that holds every set of accounts filed electronically on that day. That is about 7,000 to 15,000 accounts a day, roughly 75% of all UK accounts.

### Use cases

- Look up equity, net assets, total assets and cash for UK companies by company number.
- Build lead lists of newly filed accounts, filtered by size, employees and accounts type.
- Fill a database or data warehouse with daily Companies House financial statements.
- Feed parsed UK company accounts to credit checks, due diligence or AI agents.

### Two modes

- **Latest filings** (`latestFilings`) reads the newest daily files. Use it to build lead lists by size, to watch new filings on a schedule, or to fill a database. Filter by equity, total assets, employees and accounts type.
- **Company lookup** (`companyLookup`) takes a list of company numbers and reads the newest electronic accounts of each from the public Companies House filing history.

### What you get

| Field | Meaning |
| --- | --- |
| `companyNumber`, `companyName` | Company number (8 characters) and the name in the accounts |
| `periodStart`, `periodEnd`, `balanceSheetDate` | Financial period |
| `accountsType` | full, abridged, filleted or micro-entity accounts |
| `auditStatus` | audited, audit exempt with or without accountants report |
| `accountingStandard` | micro-entities, small entities, FRS 102, FRS 101 and so on |
| `legalForm`, `dormant` | As tagged in the accounts |
| `currency` | Reporting currency, nearly always GBP |
| `averageEmployees` | Average number of employees in the period |
| `turnover`, `grossProfit`, `operatingProfit`, `profitBeforeTax`, `profitLoss`, `staffCosts` | Profit and loss figures, when the company files them |
| `fixedAssets`, `currentAssets`, `cash`, `debtors` | Balance sheet items |
| `netCurrentAssets`, `totalAssetsLessCurrentLiabilities`, `netAssets` | Balance sheet subtotals |
| `equity` | Total equity. Falls back to net assets when equity is not tagged (`equityFromNetAssets` is true) |
| `totalAssets` | Total assets. Most small companies do not tag it, so the actor adds fixed and current assets (`totalAssetsComputed` is true) |
| `equityRatio` | equity / totalAssets, computed by the actor |
| `turnoverPriorYear`, `profitLossPriorYear`, `equityPriorYear`, `netAssetsPriorYear`, `averageEmployeesPriorYear`, `priorYearEnd` | Comparative figures from the same accounts |
| `filedOn` | Filing date (company lookup mode) |
| `bulkFileDate`, `sourceFile`, `sourceUrl`, `companyUrl` | Where the row came from |
| `parseError` | Why a row has no figures, else null |

Figures are in whole currency units. A figure is null when the accounts do not contain it. The output has no person names: the actor skips director and signatory facts.

#### Why turnover is often empty

Most UK companies are small or micro entities. The law lets them file a balance sheet only, without a profit and loss account. In a daily file of 14,714 accounts on 2026-10-20, 12,224 were not dormant. Of those, equity was present in 99%, total assets in 91%, average employees in 100%, and turnover in only 1%. Among companies with 50 or more employees, turnover was present in 23% and profit in 42%. Set `requireTurnover` to keep only accounts with turnover.

### Input

```json
{
  "mode": "latestFilings",
  "daysBack": 1,
  "minEmployees": 10,
  "minEquity": 100000,
  "accountsTypes": ["full accounts"],
  "excludeDormant": true,
  "maxItems": 1000
}
```

```json
{
  "mode": "companyLookup",
  "companyNumbers": ["03373762", "SC123456"],
  "accountsPerCompany": 2
}
```

- `daysBack` reads the newest N daily files. Companies House keeps the last 60 working days. Use `dateFrom` and `dateTo` for a fixed range.
- Daily files appear Tuesday to Saturday and hold the accounts filed the working day before.
- In company lookup mode, companies whose newest accounts are paper or PDF only get a row with a `parseError` and are not charged.

### Sample row

```json
{
  "companyNumber": "03373762",
  "companyName": "CEPAC LIMITED",
  "balanceSheetDate": "2025-12-31",
  "accountsType": "full accounts",
  "currency": "GBP",
  "averageEmployees": 450,
  "turnover": 111182376,
  "profitLoss": 647575,
  "equity": 63683641,
  "totalAssets": 83368322,
  "equityPriorYear": 64855985,
  "filedOn": "2026-08-06"
}
```

### Source and license

Source: Companies House, Accounts Data Product (https://download.companieshouse.gov.uk/en_accountsdata.html) and the public filing history (https://find-and-update.company-information.service.gov.uk). Companies House says it imposes no rules or requirements on how the information on the public register is used. Users must still follow data protection, copyright and other law. Contains public sector information from Companies House. The actor renames tags to plain field names, picks the undimensioned company totals, and computes `totalAssets` and `equityRatio` where noted. Companies House does not endorse this actor and does not check the accuracy of filed information.

### Pricing

Pay per event: 0.005 USD per set of accounts with figures (5 USD per 1,000). Rows with a `parseError` are free. No start fee.

### Run it locally

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

# Actor input Schema

## `mode` (type: `string`):

latestFilings reads the Companies House daily bulk files, which hold every set of accounts filed electronically on that day. companyLookup reads the newest accounts of the companies you list.

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

UK company numbers, for example 00445790 or SC123456. Required for companyLookup. In latestFilings mode the list keeps only these companies.

## `daysBack` (type: `integer`):

latestFilings: how many of the newest daily files to read. Each holds about 7,000 to 15,000 accounts. Companies House keeps the last 60.

## `dateFrom` (type: `string`):

Optional. First daily file date, YYYY-MM-DD. Overrides daysBack.

## `dateTo` (type: `string`):

Optional. Last daily file date, YYYY-MM-DD.

## `accountsTypes` (type: `array`):

Keep only these accounts types. Leave empty for all.

## `excludeDormant` (type: `boolean`):

Skip accounts that the company marks as dormant.

## `requireTurnover` (type: `boolean`):

Keep only accounts that publish turnover. Most small companies file a balance sheet only, so this keeps about 1 in 100.

## `minEquity` (type: `integer`):

Keep accounts with at least this equity (or net assets).

## `minTotalAssets` (type: `integer`):

Keep accounts with at least this total assets.

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

Keep accounts with at least this average number of employees.

## `accountsPerCompany` (type: `integer`):

companyLookup: how many of the newest electronic accounts to read per company.

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

Stop after this many rows.

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

Pause between requests to Companies House. At least 0.5.

## Actor input object example

```json
{
  "mode": "latestFilings",
  "daysBack": 1,
  "excludeDormant": true,
  "requireTurnover": false,
  "accountsPerCompany": 1,
  "maxItems": 1000,
  "requestIntervalSeconds": 1
}
```

# Actor output Schema

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

One row per set of accounts with key figures, accounts type and the prior year.

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

Summary counts for the run, such as how many rows were written and which daily files were read.

# 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 = {
    "mode": "latestFilings"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nordicdata/uk-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 = { "mode": "latestFilings" }

# Run the Actor and wait for it to finish
run = client.actor("nordicdata/uk-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 '{
  "mode": "latestFilings"
}' |
apify call nordicdata/uk-annual-accounts --silent --output-dataset

```

## MCP server setup

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