# Companies House API: UK Company Search & Data (Official API) (`terracotta_hauyne/uk-companies-house-company-data`) Actor

Official Companies House API for UK company data: look up by company number, search by name, or list new companies by SIC code, location and incorporation date. Status, address, SIC, accounts due dates; directors, PSC, filings optional. Try with no API key (10 per run). $2 per 1,000.

- **URL**: https://apify.com/terracotta_hauyne/uk-companies-house-company-data.md
- **Developed by:** [Kevin](https://apify.com/terracotta_hauyne) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 company saveds

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

## Companies House API: UK Company Search & Data (Official API)

Look up any UK company on the **official Companies House API**: by company number, by name, or as a
list of companies filtered by **SIC code, location, status and incorporation date** (great for new-company
lead lists). Get status, registered office address, SIC codes, accounts and confirmation-statement due
dates, and optionally directors, PSC (beneficial owners) and filing history with PDF links.

**No API key needed to try it:** leave the key empty and the run saves up to **10 companies** (trial mode).
Add your own free Companies House key (about 2 minutes) for unlimited runs. **$2 per 1,000 companies**, all
details included.

- **Official API, no scraping, no proxies.** The data comes from the same live register as the
  Companies House website, as stable JSON.
- **One flat price per company.** Officers, PSC and filings are included at no extra cost.
- **Live UK company data**, not a monthly snapshot. The API rate limit is respected automatically.
- Built for KYB / KYC checks, supplier onboarding, due diligence, CRM enrichment and UK B2B lead lists.

Not affiliated with or endorsed by Companies House.

### How to use

1. Click **Start**. Leave the API key empty for a trial run (up to 10 companies), or
   paste your own free key (see below).
2. Fill in **one** of the inputs below (or combine them).
3. Run, then export the dataset as CSV, Excel or JSON, or connect it to your CRM via the Apify API.

**Example 1: company number lookup** (KYB, CRM enrichment). Numbers or Companies House page URLs:

```json
{
  "companyNumbers": ["00000006", "SC123456", "https://find-and-update.company-information.service.gov.uk/company/OC301234"]
}
```

**Example 2: UK company search by name**, with directors and filing history:

```json
{
  "searchQueries": ["bakery manchester"],
  "searchActiveCompaniesOnly": true,
  "maxResultsPerSearch": 50,
  "includeOfficers": true,
  "includeFilingHistory": true
}
```

**Example 3: new companies by SIC code + location + incorporation date** (lead list), e.g. software
companies (SIC 62012) in Leeds incorporated in October 2026:

```json
{
  "apiKey": "<your key>",
  "sicCodes": ["62012"],
  "location": "Leeds",
  "companyStatus": ["active"],
  "incorporatedFrom": "2026-10-01",
  "incorporatedTo": "2026-10-31",
  "maxResultsPerSearch": 500
}
```

Without a key, examples 2 and 3 still run but stop after 10 companies.

### Official API vs. scraping-based actors

| | This actor | Scraping-based alternatives |
|---|---|---|
| Data source | Official Companies House Public Data API (JSON) | Companies House website pages (HTML) or the monthly bulk file |
| Breaks when the website layout changes | No | Can |
| Proxies needed | No | Usually (website scraping) |
| Data freshness | Live register on every run | Live (website) or up to a month old (bulk file) |
| API key | Optional: trial with no key (10 companies/run), own free key for unlimited runs | Usually none |
| Price | Flat $0.002 per company, officers/PSC/filings included | Often per company plus extra per officer or section |
| Personal data | Off by default, flagged per item, no email/phone enrichment | Varies |

### Try it without a key

Leave the API key empty to try the actor right away: it runs in **trial mode** and saves at most
**10 companies per run** (same price per company). For bigger runs, add your own free key.

### Get your free Companies House API key (about 2 minutes)

1. Go to the [Companies House Developer Hub](https://developer.company-information.service.gov.uk/)
   and register or sign in (free).
2. Open [Your applications](https://developer.company-information.service.gov.uk/manage-applications)
   and **create an application**. Choose the **live** environment (not test).
3. In the application, **create a new key** and choose the **REST** key type (an "API key"; not a
   stream key or OAuth client).
4. Leave the IP/domain restrictions empty: Apify runs on changing servers, so an IP-restricted key
   returns `401`.
5. Copy the key into the actor's **Companies House API key** field. Apify stores it encrypted (secret
   input). It is sent only to `api.company-information.service.gov.uk`, never written to the dataset
   or logs.

The labels on the Developer Hub may change over time. Companies House documents the key in its
[authorisation guide](https://developer-specs.company-information.service.gov.uk/guides/authorisation).

### What data do you get?

One dataset item per company:

| Field | Example |
|---|---|
| `companyNumber`, `companyName` | `12345678`, `EXAMPLE BAKERY LTD` |
| `companyStatus`, `companyStatusDetail` | `active` |
| `companyType`, `companySubtype`, `jurisdiction` | `ltd`, `england-wales` |
| `incorporationDate`, `cessationDate` | `2015-03-02` |
| `registeredOfficeAddress` (one line) + `registeredOfficePremises`, `...AddressLine1`, `...Locality`, `...Region`, `...PostalCode`, `...Country` | `1 High Street, Unit 4, Manchester, M1 1AA, England` |
| `sicCodes`, `sicDescriptions` | `["10710"]`, `["Manufacture of bread; manufacture of fresh pastry goods and cakes"]` |
| `lastAccountsMadeUpTo`, `lastAccountsType`, `nextAccountsDue`, `accountsOverdue`, `accountingReferenceDate` | `2026-12-31`, `false` |
| `confirmationStatementLastMadeUpTo`, `confirmationStatementNextDue`, `confirmationStatementOverdue` | `2027-03-15` |
| `previousCompanyNames` | `[{"name": "EXAMPLE CAKES LTD", "effectiveFrom": "2015-03-02", "ceasedOn": "2018-07-01"}]` |
| `hasCharges`, `hasInsolvencyHistory`, `hasBeenLiquidated`, `registeredOfficeIsInDispute` | `true` |
| `companiesHouseUrl`, `apiUrl` | link to the company page on the Companies House website |
| `officers` *(optional)* | name, role, appointed/resigned dates, nationality, occupation, country of residence, service address |
| `personsWithSignificantControl` *(optional)* | name, kind, natures of control, notified/ceased dates, nationality, country of residence, service address, corporate legal form / registration number |
| `filingHistory` *(optional)* | date, type (e.g. `AA`, `CS01`), category, description, pages, **PDF link** |
| `matchedBy`, `retrievedAt`, `containsPersonalData`, `source`, `licence` | provenance and licence attribution |

SIC descriptions come from the official
[Companies House condensed SIC 2007 list](https://www.gov.uk/government/publications/standard-industrial-classification-of-economic-activities-sic)
(Open Government Licence v3.0). Codes not on that list get `null`; no description is invented.

### Input

| Field | What it does |
|---|---|
| **Companies House API key** (recommended) | Your own free key (see above). Without it the actor runs in **trial mode**: at most 10 companies per run. |
| Company numbers | Bulk lookup: `00000006`, `SC123456`, `OC301234`, or Companies House page URLs. Short numbers are padded with zeros, duplicates removed. |
| Search by company name | One or more name searches, like the Companies House search box. |
| Filter search | SIC codes, location, company status, company type, name includes/excludes, incorporated from/to, dissolved from/to. Filters are combined (AND). |
| Max companies per search | Default 100, up to 5,000. |
| Searches: active companies only | Skip dissolved and other non-active companies in search results. |
| Include officers / PSC | **Off by default.** Personal data, see "Personal data and UK GDPR". |
| Also include resigned officers and ceased PSCs | Off by default. |
| Include month and year of birth | Off by default, even when officers or PSC are on. |
| Include filing history / Max filings per company | Off by default; latest 25 filings when on. |
| Max companies in total | Optional overall cap. |
| Max API requests per 5 minutes | Default 575 (Companies House allows 600 per key). Lower it if another app uses the same key. |

See **How to use** above for input examples.

### Output example

```json
{
  "companyNumber": "12345678",
  "companyName": "EXAMPLE BAKERY LTD",
  "companyStatus": "active",
  "companyType": "ltd",
  "jurisdiction": "england-wales",
  "incorporationDate": "2015-03-02",
  "cessationDate": null,
  "registeredOfficeAddress": "1 High Street, Unit 4, Manchester, Greater Manchester, M1 1AA, England",
  "registeredOfficePostalCode": "M1 1AA",
  "sicCodes": ["10710", "47240"],
  "sicDescriptions": [
    "Manufacture of bread; manufacture of fresh pastry goods and cakes",
    "Retail sale of bread, cakes, flour confectionery and sugar confectionery in specialised stores"
  ],
  "lastAccountsMadeUpTo": "2025-03-31",
  "lastAccountsType": "micro-entity",
  "nextAccountsDue": "2026-12-31",
  "accountsOverdue": false,
  "confirmationStatementNextDue": "2027-03-15",
  "confirmationStatementOverdue": false,
  "previousCompanyNames": [{"name": "EXAMPLE CAKES LTD", "effectiveFrom": "2015-03-02", "ceasedOn": "2018-07-01"}],
  "hasCharges": true,
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/12345678",
  "filingHistory": [
    {
      "date": "2026-03-10",
      "type": "CS01",
      "category": "confirmation-statement",
      "descriptionText": "Confirmation statement with no updates",
      "pages": 3,
      "documentUrl": "https://find-and-update.company-information.service.gov.uk/company/12345678/filing-history/MzQ1Njc4OTAxMmFkaXF6a2N4/document?format=pdf&download=0"
    }
  ],
  "containsPersonalData": false,
  "matchedBy": {"type": "companyNumber", "value": "12345678"},
  "retrievedAt": "2026-10-31T04:40:00+00:00",
  "source": "Companies House Public Data API",
  "licence": "Contains public sector information licensed under the Open Government Licence v3.0 (Companies House)."
}
```

(Illustrative values. Some fields are shortened here; every item contains all fields listed above.)

The run summary is saved as `OUTPUT` in the key-value store: companies saved, numbers not found or
invalid, results per search, failures, API requests used, rate-limit waits and the licence attribution.

### Pricing

This actor uses **pay-per-event** pricing. You pay only for each company saved to the dataset.
**Apify platform usage is included in that price**: under pay-per-event the actor's creator pays it,
not you.

| Event | Price |
|---|---|
| Company saved to the dataset (Apify's standard "dataset item" event) | **$0.002** (= $2 per 1,000 companies) |

Officers, PSC and filing history are included in this price. Companies that are not found, invalid
numbers and failed requests cost nothing. Set **Maximum cost per run** to cap spending. When that
limit is reached, the run stops cleanly: it keeps everything already saved, makes no further API
requests, and reports the skipped inputs in `OUTPUT` (`stoppedByChargeLimit: true`).

**Speed:** Companies House allows 600 requests per 5 minutes per key, about 2 per second. A profile
needs 1 request, and each optional section adds at least 1 more. Expect about 1,000 companies in
\~9 minutes with profiles only, or ~35 minutes with officers, PSC and filings.

### Use cases

- **KYB / supplier onboarding:** check status, registered office, overdue accounts and insolvency flags
  for a list of company numbers.
- **Due diligence:** previous names, charges flag, filing history with PDF links, PSC (beneficial owners).
- **CRM enrichment:** add SIC codes, incorporation date and address to your accounts by company number.
- **Market mapping and lead lists:** all active companies by SIC code and location, or new
  incorporations in a date range.
- **Compliance calendars:** upcoming accounts and confirmation-statement deadlines for a client portfolio.

### Licence and attribution

Company data is © Crown copyright, from Companies House, and is reused under the
[Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
Every item has a `licence` field, and `OUTPUT` has `attribution` and `licenceUrl`. If you publish or
redistribute the data, keep the attribution:
*"Contains public sector information licensed under the Open Government Licence v3.0."*
Using the API is also subject to Companies House's developer terms and
[guidelines](https://developer.company-information.service.gov.uk/developer-guidelines), including the
rate limit. The actor respects that limit and never rotates keys to get around it.

### Personal data and UK GDPR

Company profiles are company-level data. **Officers and PSC are personal data** even though they are
on a public register. Officers, PSC and birth month/year are **off by default**, and items that include
them are marked `containsPersonalData: true`.

If you turn these options on, **you are the controller of the personal data in your copy** under UK GDPR
(and EU GDPR where it applies). You need a lawful basis and a specific purpose (for example KYC/AML
checks or due diligence), must keep only what you need, must honour data subject rights, and must
not use the data for unsolicited direct marketing to individuals where the law forbids it. Companies
House's [personal information charter](https://www.gov.uk/government/organisations/companies-house/about/personal-information-charter)
explains why it publishes this data.

The actor outputs only what Companies House publishes. It **never enriches personal data**: no email,
phone or social-media lookups, no matching across sources, and never a day of birth (the API
publishes only month and year, and even those are off by default). Residential addresses are not
available from the API; only service (correspondence) addresses are output.

### FAQ

**Can I try it without an API key?** Yes. Leave the key empty: trial mode saves up to 10 companies per
run (same price per company). Add your own free key to remove the cap.

**Is the API key really free?** Yes. Companies House gives REST API keys free of charge to anyone who
registers on its Developer Hub. See "Get your free Companies House API key" above.

**Can I find newly incorporated companies?** Yes. Use the filter search with `incorporatedFrom` /
`incorporatedTo`, optionally with SIC codes and a location (example 3). Schedule the run weekly or monthly
on Apify to get a fresh list.

**Can I export to Excel or CSV?** Yes. The address and due dates are flat fields, so the Apify dataset
export to CSV/Excel works well in spreadsheets. Nested lists (officers, PSC, filings) are JSON arrays.

**Does it cover Scotland and Northern Ireland?** Yes: all companies on the Companies House register,
including `SC`, `NI`, `OC` (LLP) and other prefixes.

**Why use my own API key?** Each key has its own limit of 600 requests per 5 minutes. With your own
free key there is no 10-company cap, your runs never compete with other users for a shared quota, and you
use the official API under Companies House's terms.

**I get "Companies House rejected the API key (HTTP 401)".** Check that you copied a **REST** key from
a **live** application, without spaces, and that the key has no IP restriction.

**The run was slower than expected.** The actor paces itself to stay under the key's limit. If another
application uses the same key at the same time, the actor waits for the window to reset (you will see
this in the log). This is safer than getting the key banned for exceeding the limit.

**Does it include financial figures (turnover, profit)?** No. The public API has no parsed accounts.
Use the PDF links in `filingHistory` to open the filed accounts.

**How fresh is the data?** It is live: every run reads the current register. It is not a monthly bulk snapshot.

### Changelog

- **1.1** (2026-10-31): trial mode without an API key (up to 10 companies per run).
- **1.0** (2026-10-31): company numbers, name search and filter search (SIC, location, status, type,
  dates); optional officers, PSC, filing history; SIC descriptions; rate limiting with 429 handling;
  pay-per-event with clean charge-limit stop.

# Actor input Schema

## `apiKey` (type: `string`):

Optional. Leave empty to try the Actor in trial mode (at most 10 companies per run). With your own free REST API key there is no cap. To get one (about 2 minutes), register at https://developer.company-information.service.gov.uk/, then go to 'Your applications' (https://developer.company-information.service.gov.uk/manage-applications), create an application for the live environment and add a key of type 'REST' (API key). Paste the key only, without spaces. Do not restrict the key to an IP address, because Apify runs on changing servers. The key is stored encrypted and used only for requests to Companies House.

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

Company number lookup: Companies House company numbers, e.g. 00000006, SC123456, OC301234. Short numbers are padded with zeros and Companies House page URLs are accepted.

## `searchQueries` (type: `array`):

UK company search by name (same as the search box on the Companies House website), e.g. 'bakery manchester'. Each matching company is fetched in full.

## `maxResultsPerSearch` (type: `integer`):

Maximum companies taken from each name search and from the filter search below.

## `searchActiveCompaniesOnly` (type: `boolean`):

Skip dissolved, liquidated and other non-active companies in search results.

## `sicCodes` (type: `array`):

5-digit SIC 2007 codes, e.g. 10710 (bread and cakes), 62012 (software development).

## `location` (type: `string`):

Town, city or postcode area in the registered office address, e.g. Manchester or M1.

## `companyStatus` (type: `array`):

Only companies with one of these statuses.

## `companyType` (type: `array`):

Companies House company type codes, e.g. ltd, plc, llp, private-limited-guarant-nsc.

## `companyNameIncludes` (type: `string`):

Only companies whose name contains this text.

## `companyNameExcludes` (type: `string`):

Skip companies whose name contains this text.

## `incorporatedFrom` (type: `string`):

Incorporated on or after this date (YYYY-MM-DD). Use with 'Incorporated to' for a new-companies list.

## `incorporatedTo` (type: `string`):

Incorporated on or before this date (YYYY-MM-DD).

## `dissolvedFrom` (type: `string`):

Dissolved on or after this date (YYYY-MM-DD).

## `dissolvedTo` (type: `string`):

Dissolved on or before this date (YYYY-MM-DD).

## `includeOfficers` (type: `boolean`):

Add directors, secretaries and LLP members: name, role, appointment dates, nationality, occupation, country of residence and service (correspondence) address. This is personal data: enable it only if you have a lawful basis under UK GDPR; you are the controller of your copy. One extra API request per 100 officers.

## `includePersonsWithSignificantControl` (type: `boolean`):

Add PSCs (beneficial owners): name, kind, natures of control, notified/ceased dates, nationality, country of residence, service address; for corporate PSCs legal form and registration number. Personal data: see 'Include officers'.

## `includeResignedOfficersAndCeasedPsc` (type: `boolean`):

By default only current officers and PSCs are output.

## `includeBirthMonthYear` (type: `boolean`):

Off by default (data minimisation). Companies House publishes only month and year of birth; the day is never output.

## `includeFilingHistory` (type: `boolean`):

Add the latest filings: date, type, category, description and a link to the PDF document on the Companies House website.

## `maxFilingHistoryItems` (type: `integer`):

Latest filings to include per company (one API request per 100 filings).

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

Stop after this many companies (each company is one result). Leave empty for no limit other than your maximum cost per run.

## `requestsPerFiveMinutes` (type: `integer`):

Companies House allows 600 requests per 5 minutes per key. The actor paces itself to this number (default 575). Lower it if other applications use the same key at the same time.

## Actor input object example

```json
{
  "companyNumbers": [
    "00000006"
  ],
  "searchQueries": [
    "bakery manchester"
  ],
  "maxResultsPerSearch": 100,
  "searchActiveCompaniesOnly": false,
  "sicCodes": [
    "10710"
  ],
  "includeOfficers": false,
  "includePersonsWithSignificantControl": false,
  "includeResignedOfficersAndCeasedPsc": false,
  "includeBirthMonthYear": false,
  "includeFilingHistory": false,
  "maxFilingHistoryItems": 25,
  "requestsPerFiveMinutes": 575
}
```

# Actor output Schema

## `companies` (type: `string`):

One item per UK company saved (default dataset).

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

Run summary: lookups found/not found, searches, API request count, charge-limit status.

# 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 = {
    "companyNumbers": [
        "00000006"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("terracotta_hauyne/uk-companies-house-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 = { "companyNumbers": ["00000006"] }

# Run the Actor and wait for it to finish
run = client.actor("terracotta_hauyne/uk-companies-house-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 '{
  "companyNumbers": [
    "00000006"
  ]
}' |
apify call terracotta_hauyne/uk-companies-house-company-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,terracotta_hauyne/uk-companies-house-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/5gb0UE3Xsw4OgIzQr/builds/M1wZjeFEH06BZSkKo/openapi.json
