# Companies House API: UK Company Search, Accounts and SIC (`boubap/uk-companies-house`) Actor

Search the UK Companies House register by name, SIC code, location, status, type or incorporation date, or look up company numbers. One row per company: registered office, SIC codes, accounts and confirmation statement dates, insolvency and charges flags. No directors or PSC.

- **URL**: https://apify.com/boubap/uk-companies-house.md
- **Developed by:** [Baptiste Bouton](https://apify.com/boubap) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 companies

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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, Accounts and SIC

Query the UK Companies House register by name, SIC code, location, status, type or incorporation date, or look up a
list of company numbers. Each company is one flat row: registered office, SIC codes, status, type, key dates, accounts
and confirmation statement dates, insolvency and charges flags. The data comes live from the Companies House Public
Data API. You pay per company returned. Rows with an error are free.

The output holds company data only: no directors, no persons with significant control (PSC), no shareholders, no
dates of birth, and no addresses of directors or PSC. The address given is the registered office, the public address
of the company on the register; for a small company it can be the home of its owner.

### What you get for each company

- Company number, name, status, type, jurisdiction
- Incorporation and dissolution dates
- Registered office address, postcode, country
- SIC 2007 activity codes
- Last accounts (period end, type: full, small, micro-entity, dormant...) and next accounts due
- Confirmation statement dates and overdue flags
- Insolvency history, charges and liquidation flags
- Optional: the last 5 accounts filings (date, period end, type, pages)

### Use cases

- B2B lead lists: every active bakery in Leeds, every software company (SIC 62012) incorporated last month.
- New company feeds: schedule a weekly run on `incorporatedFrom` and `incorporatedTo` to list new incorporations.
- KYB and supplier checks: confirm that a company exists, is active, files its accounts on time and has no insolvency history.
- CRM enrichment: add SIC codes, registered office and accounts dates to a list of company numbers.
- Distress signals: list companies in liquidation or administration, or with overdue accounts, in a sector or a town.
- AI agents: call the Actor through the Apify MCP server to look up a UK company on request.

### Input

Search by name and filters:

```json
{
  "query": "bakery",
  "location": "Leeds",
  "sicCodes": ["10710"],
  "companyStatus": ["active"],
  "companyTypes": ["ltd"],
  "incorporatedFrom": "2020-01-01",
  "maxResults": 500
}
```

Or look up company numbers:

```json
{ "companyNumbers": ["00445790", "SC123456"], "includeFilings": true }
```

| Field | Description | Default |
|---|---|---|
| `query` | Words the company name must contain | |
| `companyNumbers` | Company numbers to look up; the search filters are then ignored | |
| `location` | Town, county or postcode of the registered office | |
| `sicCodes` | SIC 2007 codes, 5 digits (several combine with OR) | |
| `companyStatus` | `active`, `dissolved`, `liquidation`, `administration`... Empty list for any status | `["active"]` |
| `companyTypes` | `ltd`, `plc`, `llp`... | any |
| `incorporatedFrom`, `incorporatedTo` | Incorporation date range, YYYY-MM-DD | |
| `fullProfile` | Accounts, confirmation statement and flags (one extra request per company) | `true` |
| `includeFilings` | Last 5 accounts filings of each company (one extra request per company) | `false` |
| `maxResults` | Maximum number of companies | `100` |
| `apiKey` | Your own Companies House API key (optional, stored encrypted) | |

Set at least one of `query`, `companyNumbers`, `location`, `sicCodes`, `companyTypes` or an incorporation date.
Filters combine with AND.

Without `apiKey`, the Actor uses a shared key: at most 1,000 companies per run and 5,000 API requests per day for your
account. With your own free key (create an application on the Companies House developer hub), `maxResults` goes up
to 10,000. For very large extractions, split the search by SIC code, location or incorporation date.

### Integrations and recipes

- Make, Zapier, n8n: run the Actor on a schedule and send each row to Google Sheets, Airtable or your CRM. A weekly run with `incorporatedFrom` set to last Monday gives a feed of new UK companies.
- Apify MCP server: an AI agent can call this Actor to check a UK company by name or number.
- Companies House SIC code list: set `sicCodes` to `["62012"]` and `location` to `London` for software companies in London.
- Companies in liquidation by town: set `companyStatus` to `["liquidation"]` and `location` to a town.
- Company number lookup in bulk: paste your list in `companyNumbers` and export to CSV or Excel.

### Speed

Companies House allows 600 requests per 5 minutes per key. With `fullProfile` on (the default), each company takes one
request, and `includeFilings` adds one more. On the shared key, which all users share, the Actor makes at most one
request every 1.2 seconds: about 50 companies a minute, 25 with `includeFilings`. If Companies House still answers
"too many requests" twice in a run, the run stops and keeps the companies already returned. With your own key, it makes
one request every 0.6 seconds: about 100 companies a minute. With `fullProfile` off, the search fields come in pages of
500 companies, so 1,000 companies take a few seconds.

### Output

One row per company. Real output for Tesco PLC with `includeFilings` on, from a run on 23 October 2026 (filings
shortened to one of five):

```json
{
  "companyNumber": "00445790",
  "name": "TESCO PLC",
  "status": "active",
  "statusDetail": null,
  "type": "plc",
  "subtype": null,
  "jurisdiction": "england-wales",
  "incorporationDate": "1947-11-27",
  "dissolutionDate": null,
  "address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA, United Kingdom",
  "addressLine1": "Tesco House, Shire Park",
  "addressLine2": "Kestrel Way",
  "locality": "Welwyn Garden City",
  "region": null,
  "postalCode": "AL7 1GA",
  "country": "United Kingdom",
  "sicCodes": ["47110"],
  "accountingReferenceDate": "26-02",
  "lastAccountsMadeUpTo": "2026-02-28",
  "lastAccountsType": "group",
  "nextAccountsMadeUpTo": "2027-02-26",
  "nextAccountsDue": "2027-08-26",
  "accountsOverdue": false,
  "lastConfirmationStatement": "2026-06-18",
  "nextConfirmationStatementDue": "2027-07-02",
  "confirmationStatementOverdue": false,
  "hasInsolvencyHistory": false,
  "hasCharges": false,
  "hasBeenLiquidated": false,
  "registeredOfficeInDispute": false,
  "undeliverableRegisteredOffice": false,
  "filings": [
    { "date": "2026-07-25", "madeUpTo": "2026-02-28", "accountsType": "group", "formType": "AA", "pages": 236 }
  ],
  "url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
  "error": null
}
```

With `fullProfile` off, the accounts, confirmation statement and flag fields are `null`. A company number that is not
on the register gives a row with only `companyNumber`, `url` and `error`, and is not charged.

### Pricing

You pay per company returned (event `company`), no subscription. Rows with an error and searches with no result cost
nothing. `fullProfile` and `includeFilings` add requests but no cost.

### FAQ

**Do I need a Companies House account?** No. The shared key covers runs up to 1,000 companies. For more, create a
free API key on the Companies House developer hub and set `apiKey`.

**Does it return directors or persons with significant control?** No. The Actor never calls the officers, PSC or
shareholder endpoints. It also leaves out the "care of" name of the registered office and any "c/o" part of
the address lines, and reads only accounts filings. You get company-level data only.

**How many results can one run return?** Up to 1,000 companies with the shared key and 10,000 with your own key. For
larger extractions, split the search by SIC code, location or incorporation date.

**How fresh is the data?** The Actor queries Companies House live on every run.

**Does it download the accounts documents?** No. `includeFilings` lists the accounts filings (date, period end, type,
page count); the documents themselves can be opened from the company page linked in `url`.

### Related Actors

Other Actors from the same account, all pay per result:

- [French Company Search](https://apify.com/boubap/france-companies-scraper): Same kind of data for French companies (SIREN, SIRET, NAF code, revenue).
- [UK Tenders Scraper](https://apify.com/boubap/uk-tenders-scraper): UK public tenders from Find a Tender, to match buyers and suppliers with their company records.
- [Tech Stack Detector](https://apify.com/boubap/tech-stack-detector): Detect the technologies used on the websites of the companies you found.
- [Career Site Jobs Scraper](https://apify.com/boubap/ats-jobs-scraper): Read the open jobs of companies that use Workday, Greenhouse, Lever or Ashby.

# Actor input Schema

## `query` (type: `string`):

Words the company name must contain, for example bakery or Tesco. Leave empty to search by the other filters only. Set at least one of: this field, company numbers, SIC codes, location, company types or an incorporation date.

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

Companies House numbers to look up, one per line, for example 00445790 or SC123456. Short numbers are padded with zeros. When set, the search filters below are ignored and each number gives one row.

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

Town, county or postcode of the registered office, for example Leeds, Kent or EC1A. Matched by Companies House against the registered office address.

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

SIC 2007 activity codes, 5 digits, one per line. Examples: 10710 (bakeries), 62012 (software development), 41100 (property development), 56101 (restaurants). Several codes combine with OR.

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

Statuses to keep. Default: active. Clear the list to get any status. Pick liquidation or administration to find companies in insolvency.

## `companyTypes` (type: `array`):

Legal forms to keep, for example Ltd and PLC. Leave empty for any type.

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

Keep companies incorporated on or after this date (YYYY-MM-DD). Use it with the next field to list new companies of a month.

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

Keep companies incorporated on or before this date (YYYY-MM-DD).

## `fullProfile` (type: `boolean`):

Adds accounts dates and type, confirmation statement, jurisdiction and the insolvency, charges and liquidation flags. Costs one extra request per company: about 50 companies a minute on the shared key, 100 with your own key. Turn it off for fast lists with name, status, address, SIC codes and dates only. Always on for company numbers.

## `includeFilings` (type: `boolean`):

Adds the last 5 accounts filings of each company: date filed, period end, accounts type, form and page count. No document is downloaded. One extra request per company, same price.

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

Upper limit of companies returned and charged. Default 100. Up to 1,000 per run with the shared key, up to 10,000 with your own API key. For more, split the search by SIC code, location or date.

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

Optional. Your own REST API key from developer.company-information.service.gov.uk (free). Use it for runs above 1,000 companies or more than 5,000 requests a day (the shared key allows 1,000 companies per run and 5,000 requests a day per account). It is stored encrypted and never written to the logs or the dataset.

## Actor input object example

```json
{
  "query": "bakery",
  "location": "Leeds",
  "companyStatus": [
    "active"
  ],
  "fullProfile": true,
  "includeFilings": false,
  "maxResults": 100
}
```

# Actor output Schema

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

Dataset items of the run: one item per company, with the fields described in the dataset schema.

# 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 = {
    "query": "bakery",
    "location": "Leeds"
};

// Run the Actor and wait for it to finish
const run = await client.actor("boubap/uk-companies-house").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 = {
    "query": "bakery",
    "location": "Leeds",
}

# Run the Actor and wait for it to finish
run = client.actor("boubap/uk-companies-house").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 '{
  "query": "bakery",
  "location": "Leeds"
}' |
apify call boubap/uk-companies-house --silent --output-dataset

```

## MCP server setup

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

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/FFwXEfGp3VDwbmksB/builds/zdWyrVVcsxkhG3dZe/openapi.json
