# Companies House API: UK Company Data & Financials (`datatools_studio/uk-company-data`) Actor

Companies House API data on UK companies. Look up by number or name, or find new companies by SIC code, location and incorporation date: status, address, owners and accounts figures (net assets, cash, employees; turnover and profit when filed). Pay per company found, plus per company with figures.

- **URL**: https://apify.com/datatools_studio/uk-company-data.md
- **Developed by:** [mohamad](https://apify.com/datatools_studio) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

### What does UK Company Data & Financials do?

Give it UK company numbers or names, or search filters, and it returns each company's official record from the **Companies House API**, the **key figures from its latest filed accounts**, and the **companies that own it**.

- **Company record:** name, number, status, type, incorporation date and age, SIC codes and industry, registered office, previous names, accounts and confirmation statement dates (and whether they are overdue), charges and insolvency history.
- **Key figures from the latest accounts:** turnover, profit, fixed and current assets, cash, debtors, creditors, net assets, equity and average employees, with the previous year for comparison. They are read from accounts filed digitally (inline XBRL), as most small and medium companies file them; many large companies still file on paper, and then there are no figures.
- **Company owners:** parent companies and other legal entities with significant control, with their share and voting bands and their own company number. People with significant control are counted, never named.
- **Find companies:** search the register by words in the name, SIC code, town or postcode, incorporation date, status and type. For example: every software company incorporated in Bristol in the last 7 days. When more companies match than your maximum, the newest are kept.
- **Change tracking:** run it on a schedule and see which companies changed status, address, owners or figures since your last run.
- **Pay per company found**, with a second fee when key figures were read, plus Apify's small start fee per run. Companies listed from the search results only cost less. Numbers and names that are not on the register, duplicates and failed lookups cost nothing extra.

### What can you use it for?

- **Lead generation:** a weekly list of newly incorporated companies in your industry and area.
- **Supplier, customer and credit checks:** status, overdue accounts, charges, insolvency history, net assets and parent company in one row.
- **CRM enrichment:** industry, size (employees, turnover, assets), age and address for the UK companies in your CRM.
- **Market research:** compare the companies of an industry by their filed figures.
- **Monitoring:** watch customers, suppliers or competitors and hear when they enter liquidation, move, change owners or file new accounts.
- **AI agents:** one row per company with labels in words, ready for a prompt or a spreadsheet.

### How to use it

1. Put company numbers (`00445790`, `SC123456`; leading zeros may be left out), exact company names or Companies House links into **Companies**, one per line. Or leave it empty and fill in **Find companies**.
2. Turn **accounts figures** and **company owners** on or off.
3. Click **Start**. Download the results as CSV, Excel or JSON, or read them through the Apify API.

### Input

| Field | What it does | Default |
| --- | --- | --- |
| Companies | Company numbers, exact names or Companies House links | (empty) |
| Matching company names | Exact name only, or best guess when no name matches | exact |
| Read key figures from the latest accounts | Figures from digitally filed accounts | on |
| List company owners | Companies and legal entities with significant control; people only counted | on |
| Name contains | Find companies whose name contains these words | (empty) |
| SIC codes (industry) | Find companies with any of these UK SIC 2007 codes | (empty) |
| Location | Find companies by town, city or postcode, anywhere in the registered office address | (empty) |
| Incorporated on or after / on or before | A date, or a time before the run such as `7 days` | (empty) |
| Company status | Only these statuses when searching | active |
| Company type | Only these types when searching | all |
| Maximum companies found | Most companies one search adds to the run, 1 to 10,000; when more match, the newest are kept | 100 |
| List search results only | Write the search details without opening each company (fast) | off |
| Report changes since the last run | Compare each company with your previous run | off |
| Storage name for change tracking | Key-value store in your account that keeps the last known facts | `uk-company-data-monitor` |
| Your Companies House API key | Optional; see **Speed** below | (built-in key) |

### Output

One row per company. Example (a made-up company, shortened):

```json
{
  "input": "00000001",
  "status": "ok",
  "companyNumber": "00000001",
  "companyName": "EXAMPLE SOFTWARE LIMITED",
  "companyStatus": "active",
  "companyStatusLabel": "Active",
  "companyTypeLabel": "Private limited company",
  "jurisdiction": "England/Wales",
  "incorporatedOn": "2015-04-01",
  "companyAgeYears": 11.6,
  "sicCodes": [{ "code": "62012", "description": "Business and domestic software development" }],
  "industry": "Business and domestic software development",
  "registeredOfficeText": "Unit 4 High Street, Bristol, BS1 1AA, England",
  "accounts": {
    "accountingReferenceDate": "31 March",
    "lastMadeUpTo": "2025-03-31",
    "lastAccountsTypeLabel": "Micro Entity",
    "nextDue": "2026-12-31",
    "overdue": false
  },
  "confirmationStatement": { "lastMadeUpTo": "2025-04-01", "nextDue": "2026-04-15", "overdue": false },
  "hasCharges": false,
  "hasInsolvencyHistory": false,
  "financials": {
    "status": "ok",
    "statusDetail": "14 figures from the accounts for the period ending 2025-03-31, filed on 2025-06-20.",
    "periodStart": "2024-04-01",
    "periodEnd": "2025-03-31",
    "currency": "GBP",
    "turnover": 3456,
    "profitAfterTax": 456,
    "currentAssets": 1040,
    "cash": 936,
    "creditorsDueWithinOneYear": 786,
    "netAssets": 254,
    "employees": 2,
    "previousPeriod": { "periodEnd": "2024-03-31", "turnover": 5678, "netAssets": -200, "employees": 1 },
    "documentUrl": "https://find-and-update.company-information.service.gov.uk/company/00000001/filing-history/.../document?format=pdf&download=0"
  },
  "owners": {
    "status": "ok",
    "statusDetail": "One company or legal entity with significant control, and 1 person (not named).",
    "companies": [
      { "name": "EXAMPLE HOLDINGS LIMITED", "kind": "company", "companiesHouseNumber": "00000002", "sharesOwned": "75-100%", "votingRights": "75-100%" }
    ],
    "individualCount": 1
  },
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/00000001",
  "changes": null,
  "checkedAt": "2026-10-21T08:00:00.000Z"
}
```

Every figure is in the row even when it is empty (`null`), so spreadsheets line up. The dataset has ready-made views: Overview, Accounts figures, Filing deadlines, Owners and Changes. A run summary (counts, accounts results, search totals, billed events, requests made) is saved as **SUMMARY** in the key-value store.

**Status of each row**

- `ok`: the company was found. Billed.
- `not-found`: no company has this number, or no company has exactly this name (`nameMatch.otherCandidates` lists the closest names). Not charged.
- `duplicate`: the same company was already listed from another line of your input. Not charged.
- `failed`: the input could not be read, or Companies House did not answer. The `error` field has a code and a plain explanation. Not charged.

**Accounts figures** (`financials.status`): `ok`, `no-accounts` (none filed yet), `paper-filed` (accounts filed on paper have no readable figures), `not-available` (no digital version), `too-large`, `no-figures` (no key figures tagged, or fewer than 5 numbers tagged in accounts other than dormant ones) or `failed`. Only `ok` is charged the accounts-figures fee.

### Speed and your own API key

Companies House allows **600 requests per 5 minutes** for each registered application (API key). The Actor uses at most 80% of that, follows the remaining count Companies House reports back, and waits when the limit is reached instead of failing.

A company takes one request for its record, one each for the accounts list and the accounts document, and one for its owners (one more when you give a name instead of a number). That makes about **1,400 companies an hour with all details**, about 5,700 an hour with the record only, and thousands a minute with **List search results only** (1,000 companies took 10 seconds in a test run).

The built-in key is shared by everyone using the Actor, so runs slow down when it is busy. For the full speed to yourself, get a free key: register at the [Companies House Developer Hub](https://developer.company-information.service.gov.uk/), create a live application, select **Create new key** with the client type **API key**, and paste the key into **Your Companies House API key**. It is stored encrypted and only sent to Companies House.

### Change tracking

Turn on **Report changes since the last run** and run the Actor on a schedule (for example weekly). Each company row gets a `changes` field listing what changed since the previous run, with the value before and after: name, status, registered office, SIC codes, accounts dates, overdue flags, charges, insolvency history, the latest figures (turnover, profit, net assets, cash, employees) and the company owners. Changed companies are also listed together in the **CHANGES** record. The first run for each company saves the starting point. The facts are kept in a key-value store in your own Apify account; use a different storage name for each watch list.

### How much does it cost?

You pay a small fee for each company found (`company-record`), and a second one when key figures were read from its accounts (`accounts-figures`), plus Apify's small fee for starting a run. Companies written with **List search results only** are charged a smaller fee instead (`company-listed`). Companies that are not found, duplicates and failed lookups are not charged. See the **Pricing** tab for current prices. You can set a maximum cost for a run; the Actor stops before going over it.

### Limitations

- **Figures only from digital accounts.** Accounts filed on paper (Companies House holds a scanned copy) and accounts only available as PDF have no readable figures; many large companies still file this way. Accounts that tag fewer than 5 numbers, as some large companies' filings do, are not read either, because so few tags give misleading figures.
- **Small companies show less.** Micro and small companies may leave the profit and loss account out of the accounts they file, so turnover and profit are often empty for them; balance sheet figures (assets, cash, creditors, net assets) are usually there.
- **Group accounts:** the Actor reads the figures the filing tags without a breakdown. Check `documentUrl` to see whether they are the group's or the parent company's figures when it matters.
- **Figures are as filed.** They come from the tags in the company's own filing and are not checked or adjusted, with two exceptions for filing errors seen in real accounts. Some filings tag a loss or net liabilities without the minus sign while the accounts show the amount in brackets: such profit and net figures are given as negative, as the accounts show them, and are listed in `financials.signsFromBrackets`. Some filings tag the number of employees at a hundredth of the number shown (653 shown, 6.53 tagged): the number shown is used.
- **One accounts filing:** the latest annual accounts and the comparison year in them. Older years are not read.
- **Owners:** up to 50 company owners per company; companies exempt from the register (such as some listed companies) have none.
- **Name lookup needs the registered name.** Use the company number when you have it.
- **Location matches anywhere in the address.** Companies House searches the whole registered office address, so `Bristol` also finds companies on a Bristol Road in other towns.

### Data, licence and privacy

All data comes from the public register through the official Companies House API. Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). This Actor is not made, endorsed or checked by Companies House.

**Company facts only.** The Actor does not read directors or other officers, never names people with significant control (they are only counted), leaves out "care of" names in addresses, and reads only numbers from accounts, never the text (such as the names of directors who signed them). Note that the registered office of a small company can be a home address. You are responsible for using the results lawfully, for example under UK GDPR and the marketing rules when you contact companies.

### Use it from code or AI agents

Run it through the [Apify API](https://docs.apify.com/api/v2) or the Apify clients for JavaScript and Python, or connect it to Make, Zapier, n8n and other tools through Apify integrations.

### Support

Found a company whose figures look wrong or are missing? Open an issue on the **Issues** tab with the company number and what you expected. This Actor is built and maintained with the help of AI (Claude), and replies to issues are AI-assisted.

# Changelog

This Actor's version history is a separate document: https://apify.com/datatools_studio/uk-company-data/changelog.md

# Actor input Schema

## `companies` (type: `array`):

UK company numbers (for example <code>00445790</code> or <code>SC123456</code>), exact company names, or Companies House links, one per line. Leading zeros may be left out. Up to 50,000 per run; duplicates are skipped. Leave empty to use only <b>Find companies</b> below.

## `nameMatching` (type: `string`):

For lines with a company name. <b>Exact name</b> uses the company whose registered name matches (ignoring case, punctuation and "Limited" versus "Ltd"); if none does, the row is not found and lists the closest names, and is not charged. <b>Best guess</b> uses the first search result when no name matches. A company number is always exact.

## `includeFinancials` (type: `boolean`):

Read turnover, profit, assets, cash, creditors, net assets and employees from the company's latest accounts, with the year before for comparison. Works when the accounts were filed digitally (inline XBRL), as most small and medium companies do; accounts filed on paper, as many large companies still do, have no readable figures. Small companies often leave turnover and profit out of the accounts they file. Companies with figures are charged an extra accounts-figures event.

## `includeOwners` (type: `boolean`):

Read the register of persons with significant control. Owners that are companies or other legal entities are listed with their share and voting bands; people are only counted, never named.

## `searchCompanyName` (type: `string`):

Find companies whose registered name contains these words, for example <code>coffee roasters</code>.

## `searchSicCodes` (type: `array`):

Five-digit UK SIC 2007 codes, for example <code>62012</code> (software development) or <code>56101</code> (licensed restaurants). Companies with any of the codes are found.

## `searchLocation` (type: `string`):

Town, city or postcode of the registered office address, for example <code>Bristol</code> or <code>BS1</code>. Companies House matches it anywhere in the address, so <code>Bristol</code> also finds companies on a Bristol Road in other towns.

## `searchIncorporatedFrom` (type: `string`):

A date (YYYY-MM-DD), or a time before the run such as <code>7 days</code> or <code>3 months</code>, so a scheduled run always finds the newest companies.

## `searchIncorporatedTo` (type: `string`):

A date (YYYY-MM-DD), or a time before the run such as <code>1 day</code>.

## `searchCompanyStatus` (type: `array`):

Only companies with one of these statuses. Leave empty for all.

## `searchCompanyType` (type: `array`):

Only companies of these types. Leave empty for all.

## `maxSearchResults` (type: `integer`):

The most companies one search adds to the run. When more companies match, the newest (by incorporation date) are kept. The total number of matches is in the run summary.

## `searchResultsOnly` (type: `boolean`):

Write the details the search itself returns (name, number, status, type, incorporation date, SIC codes, address) without opening each company. Much faster for long lists: one request returns up to 5,000 companies, instead of about four requests per company. Accounts figures and owners are left out. Each company listed this way is charged the smaller company-listed fee instead of company-record.

## `monitorChanges` (type: `boolean`):

Remember key facts of each company in a named key-value store in your own account (status, name, address, accounts dates and figures, company owners) and report what changed since your previous run. Use it with a schedule.

## `monitorStoreName` (type: `string`):

Name of the key-value store (in your account) that keeps each company's last known facts. Use different names to keep separate watch lists. The Actor creates this storage on the first run and can only use storages it created itself.

## `companiesHouseApiKey` (type: `string`):

Leave empty to use the built-in key, which all users share (about 100 requests a minute in total). With your own free key, your runs get the full Companies House limit to themselves: register at developer.company-information.service.gov.uk, create a live application, create a new key of the type "API key" and paste it here. It is stored encrypted.

## Actor input object example

```json
{
  "companies": [
    "SC028747",
    "10188849",
    "06763257",
    "Tesco PLC"
  ],
  "nameMatching": "exact",
  "includeFinancials": true,
  "includeOwners": true,
  "searchSicCodes": [],
  "searchCompanyStatus": [
    "active"
  ],
  "searchCompanyType": [],
  "maxSearchResults": 100,
  "searchResultsOnly": false,
  "monitorChanges": false,
  "monitorStoreName": "uk-company-data-monitor"
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

## `changes` (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 = {
    "companies": [
        "SC028747",
        "10188849",
        "06763257",
        "Tesco PLC"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datatools_studio/uk-company-data").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 = { "companies": [
        "SC028747",
        "10188849",
        "06763257",
        "Tesco PLC",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("datatools_studio/uk-company-data").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 '{
  "companies": [
    "SC028747",
    "10188849",
    "06763257",
    "Tesco PLC"
  ]
}' |
apify call datatools_studio/uk-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datatools_studio/uk-company-data"
        }
    }
}
```

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/7UBDtKvVFbo1h7JGy/builds/2A02CBAI2VwL4MCLh/openapi.json
