# UK Companies House Search & Company Data (`rod_analytics/uk-companies-house`) Actor

Search UK companies by name, number, SIC code, incorporation date, status or location in the official Companies House API. Status, SIC labels, address, accounts and confirmation due dates, filings, PSC, charges and officers in one schema for KYB, due diligence and leads.

- **URL**: https://apify.com/rod\_analytics/uk-companies-house.md
- **Developed by:** [Rod Services](https://apify.com/rod_analytics) (community)
- **Categories:** Lead generation, Business
- **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 Companies House Search & Company Data do?

**UK Companies House Search & Company Data** pulls **official UK company data** from the [Companies House](https://www.gov.uk/government/organisations/companies-house) public data API and returns it in **one clean, normalized schema**. Search companies **by name**, look them up **by company number**, or run an **advanced search by SIC code, incorporation date, status and location**. Add **filing history**, **persons with significant control (PSC)**, **charges** and, if you need them, **officers**.

It is built for **KYB (Know Your Business)**, **due diligence**, **B2B lead generation**, **CRM enrichment** and **AI agents** that need verified UK company data.

You use **your own free Companies House API key**. It takes about 2 minutes to get one (see below). Without a key the Actor still looks up **company numbers** with basic data from the public Companies House URI service, so you can try it right away: the prefilled input looks up Tesco PLC keyless and searches "tesco" when a key is set.

Running on Apify gives you an API, scheduling, webhooks, integrations (Google Sheets, Make, Zapier, n8n, Slack), monitoring, and an MCP tool for AI agents.

### Why use this UK company data tool?

- **KYB and onboarding.** Check that a UK customer or supplier exists, is active, and is not in liquidation or administration. See insolvency history and outstanding charges.
- **Due diligence.** Accounts and confirmation statement due dates and overdue flags, filing history with readable descriptions and PDF links, PSC (beneficial owners), charges with lenders.
- **Lead generation.** Find every active company with a given **SIC code** in a town, or all companies incorporated last month. Get name, SIC labels, registered address and incorporation date.
- **CRM enrichment.** Add status, type, SIC codes with labels and address to company numbers you already have.
- **AI agents and LLM tools.** Stable field names and ISO dates work well as a tool call through the Apify MCP server.
- **Respects the rules.** Uses the official REST API only, never scrapes the Find and update website, and stays under the 600 requests per 5 minutes limit.
- **GDPR-aware.** Officers are **off by default**. When on, only name, role, appointment date and nationality are kept.

### How to get a free Companies House API key (2 minutes)

1. Open the [Companies House Developer Hub](https://developer.company-information.service.gov.uk/) and sign in or register. It is free.
2. Go to **Your applications** and create an application. Choose the **Live** environment.
3. Click **Create new key** and pick **REST**. Leave the IP address and JavaScript domain fields empty (Apify IPs change).
4. Copy the key and paste it into the **Companies House API key** field. It is stored encrypted and never logged.

### How to search UK companies

1. Open the Actor and go to the **Input** tab.
2. Paste your **API key**.
3. Enter **company names** in "Search by company name", **company numbers** in "Look up by company number", or fill any **advanced search** filter.
4. Pick the extra sections you need: PSC, filings, charges, officers.
5. Click **Start**. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

### Input

All fields are on the Input tab. The main ones:

| Field                                                | What it does                                                                  |
| ---------------------------------------------------- | ----------------------------------------------------------------------------- |
| `apiKey`                                             | Your free Companies House REST API key (secret)                               |
| `searchQueries`                                      | Company names or keywords, e.g. `tesco`                                       |
| `maxResultsPerSearch`                                | Max companies per name search (1 to 1,000)                                    |
| `companyNumbers`                                     | Company numbers, e.g. `00445790`, `SC045551`, `OC300001`. Works without a key |
| `advancedSicCodes`                                   | SIC 2007 codes, e.g. `62012`                                                  |
| `advancedIncorporatedFrom`, `advancedIncorporatedTo` | Incorporation date range                                                      |
| `advancedStatus`, `advancedCompanyType`              | Status and type filters                                                       |
| `advancedLocation`                                   | Town, county or postcode, e.g. `Manchester`                                   |
| `fetchFullProfile`                                   | Complete search hits with the full profile (on by default)                    |
| `includePsc`, `includeFilings`, `includeCharges`     | Extra sections                                                                |
| `includeOfficers`                                    | Officers, off by default (personal data)                                      |
| `requestsPer5Minutes`                                | Your rate-limit budget, default 550 of the 600 allowed                        |

Example: active software companies in Manchester incorporated in 2025, with PSC.

```json
{
    "apiKey": "YOUR-KEY",
    "advancedSicCodes": ["62012", "62020"],
    "advancedLocation": "Manchester",
    "advancedStatus": ["active"],
    "advancedIncorporatedFrom": "2025-01-01",
    "advancedIncorporatedTo": "2025-12-31",
    "maxResultsAdvanced": 500,
    "includePsc": true
}
```

### Output

One item per company. Nested sections are `null` unless requested. Example (shortened):

```json
{
    "companyNumber": "00445790",
    "name": "TESCO PLC",
    "status": "active",
    "statusLabel": "Active",
    "type": "plc",
    "typeLabel": "Public limited company",
    "incorporationDate": "1947-11-27",
    "dissolutionDate": null,
    "sicCodes": [
        {
            "code": "47110",
            "label": "Retail sale in non-specialised stores with food, beverages or tobacco predominating"
        }
    ],
    "registeredAddress": {
        "addressLine1": "Tesco House, Shire Park",
        "locality": "Welwyn Garden City",
        "postalCode": "AL7 1GA",
        "full": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA, United Kingdom"
    },
    "accountsNextDue": "2027-08-26",
    "confirmationStatementNextDue": "2027-07-02",
    "hasInsolvencyHistory": false,
    "hasCharges": true,
    "filings": [
        {
            "date": "2026-06-30",
            "type": "CS01",
            "description": "Confirmation statement made on 2026-06-18 with no updates"
        }
    ],
    "dataSource": "api",
    "url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
    "source": "UK Companies House",
    "licence": "Open Government Licence v3.0",
    "attribution": "Contains public sector information licensed under the Open Government Licence v3.0. ...",
    "fetchedAt": "2026-09-27T12:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Output tab has four views: **Overview**, **KYB and compliance**, **Lead generation**, and **Officers, PSC, filings and charges**. A `SUMMARY` record in the key-value store lists counts, not-found numbers, errors and the licence.

### Data fields

| Field                                                          | Description                                                  |
| -------------------------------------------------------------- | ------------------------------------------------------------ |
| `companyNumber`, `name`                                        | 8-character company number and registered name               |
| `status`, `statusLabel`, `statusDetail`                        | Active, dissolved, liquidation, administration and more      |
| `type`, `typeLabel`, `subtype`, `jurisdiction`                 | ltd, plc, llp, CIC and more; England/Wales, Scotland, NI     |
| `incorporationDate`, `dissolutionDate`                         | ISO dates                                                    |
| `sicCodes`                                                     | SIC 2007 codes with labels                                   |
| `registeredAddress`                                            | Registered office, split and as one line                     |
| `accountsNextDue`, `accountsOverdue`, `accountsLastMadeUpTo`   | Accounts filing status                                       |
| `confirmationStatementNextDue`, `confirmationStatementOverdue` | Confirmation statement status                                |
| `hasInsolvencyHistory`, `hasCharges`                           | Risk flags                                                   |
| `previousNames`                                                | Former company names with dates                              |
| `psc`                                                          | Persons with significant control and natures of control      |
| `filings`, `filingsTotal`                                      | Filing history with readable descriptions and document links |
| `charges`, `chargesSummary`                                    | Charges with lenders, and outstanding and satisfied counts   |
| `officers`, `officersActiveCount`                              | Name, role, appointed date, nationality only                 |
| `dataSource`                                                   | `api`, `search-index` (search hit only) or `keyless-uri`     |
| `url`, `source`, `licence`, `attribution`, `fetchedAt`         | Provenance for every record                                  |

### How much does it cost to get UK Companies House data?

Pay per result. No monthly rental.

- **$3 per 1,000 companies.**
- **$1 per 1,000** for each extra section per company (officers, PSC, filings, charges).
- **$0.001** per run start.

A KYB check of 200 suppliers with PSC and charges costs about $1. 5,000 leads by SIC code cost about $15. The Companies House API itself is free. The Apify free plan covers about 1,600 companies a month.

### Tips and advanced options

- **Fast, cheap name lists:** turn off "Fetch full company profile". Search hits then need no extra request, but have no SIC codes or due dates.
- **Rate limit:** Companies House allows 600 requests per 5 minutes per key. Each company profile is one request, and each extra section at least one more. The Actor waits by itself when the budget is used up and reads the rate-limit headers, so other apps on the same key are respected. Lower `requestsPer5Minutes` if you share the key.
- **Large advanced searches:** up to 5,000 companies per API call, so 10,000 hits without profiles take a few seconds.
- **Keyless mode:** without a key only company-number lookups run, with basic data from the official public Companies House URI service (`data.companieshouse.gov.uk`). It has no insolvency flag, overdue flags, jurisdiction or sections. Name search and advanced search are skipped with a message on how to get a key. If nothing can run without a key, the run still succeeds with one free help item in the dataset, and only the $0.001 start is charged.
- **Not found and invalid numbers:** each one gets a **free row** in the dataset, so a CRM import keeps one row per input: `companyNumber` as you gave it, `normalizedNumber`, `found: false` and `error` (`not-found` or `invalid-number`). These rows are never charged. Company records have `found: true`. The numbers are also listed in the log and in `SUMMARY`. The keyless service leaves out many companies dissolved years ago. The API with a key finds more of them.
- **Maximum cost per run:** set it on the run to cap spending. The Actor checks the budget before each company and stops cleanly when the next company would go over it.

### Licence, GDPR and FAQ

**Licence.** Companies House data is published under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Every record carries the required attribution: "Contains public sector information licensed under the Open Government Licence v3.0".

**GDPR note.** Officers and individual PSCs are natural persons. Their data is personal data under UK GDPR, even though it is on a public register. This Actor minimises it: officers get only name, role, appointment date and nationality. Individual PSCs get only name, natures of control, notified and ceased dates and nationality. Home and service addresses, dates of birth, occupations and country of residence are never copied. Officers are off by default. Filing descriptions can contain officer names, as on the public register. When you process this data, **you are the data controller**. You need a lawful basis and must follow UK GDPR, for example for direct marketing to individuals.

**Does it scrape the Companies House website?** No. It uses the official REST API and the official public URI service only.

**Why do I need my own key?** The rate limit is per key. Your own key gives you the full 600 requests per 5 minutes and keeps your usage separate.

**What happens if my input is invalid?** The run still ends **SUCCEEDED** and you pay only the $0.001 start fee. No company is charged. The dataset gets one help row, and the run status message says the same:

```json
{
    "error": true,
    "errorCode": "EMPTY_INPUT",
    "message": "Give at least one search query, company number, or advanced search filter.",
    "howToFix": "Add a company number to \"companyNumbers\" ..."
}
```

Codes: `EMPTY_INPUT` (nothing to look up), `INVALID_INPUT` (a wrong company number, SIC code, date, status or limit), `API_KEY_REQUIRED` (only keyed features were asked for and no key was given), `INVALID_API_KEY` (Companies House rejected the key) and `NO_RESULTS` (nothing matched). Company numbers that are not found or not valid still get their own free row with `error` set to `not-found` or `invalid-number`. If every Companies House call fails because the service is down, the run fails instead.

**Something missing or broken?** Open an issue on the Issues tab. Custom solutions, such as bulk snapshot processing or monitoring for new filings, are available on request.

# Actor input Schema

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

Your free Companies House REST API key. Get one in about 2 minutes: register at https://developer.company-information.service.gov.uk/, create an application (Live), click "Create new key", choose REST, leave IP and domain restrictions empty. The key is stored encrypted and never logged. Without a key only company-number lookups run, with basic data from the public Companies House URI service.

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

Company names or keywords, e.g. "tesco" or "acme software". Uses the Companies House search index (needs an API key). Each query returns up to "Max results per search" companies.

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

Maximum companies saved per name search. The Companies House index returns at most about 1,000 hits per query.

## `onlyActive` (type: `boolean`):

Restrict name search results to active companies.

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

UK company numbers, e.g. 00445790 (Tesco PLC), SC045551, OC300001. Short numbers are padded to 8 characters. Works without an API key in basic keyless mode.

## `advancedNameIncludes` (type: `string`):

Advanced search: name must contain this text.

## `advancedNameExcludes` (type: `string`):

Advanced search: name must not contain this text. Only used together with another filter.

## `advancedSicCodes` (type: `array`):

SIC 2007 codes, e.g. 62012 (business and domestic software development), 56101 (licensed restaurants). Any match counts.

## `advancedIncorporatedFrom` (type: `string`):

Earliest incorporation date, YYYY-MM-DD.

## `advancedIncorporatedTo` (type: `string`):

Latest incorporation date, YYYY-MM-DD.

## `advancedDissolvedFrom` (type: `string`):

Earliest dissolution date, YYYY-MM-DD.

## `advancedDissolvedTo` (type: `string`):

Latest dissolution date, YYYY-MM-DD.

## `advancedStatus` (type: `array`):

Only companies with one of these statuses.

## `advancedCompanyType` (type: `array`):

Only companies of these types.

## `advancedLocation` (type: `string`):

Town, county or postcode in the registered office address, e.g. "Manchester" or "EC1A".

## `maxResultsAdvanced` (type: `integer`):

Maximum companies saved from the advanced search.

## `fetchFullProfile` (type: `boolean`):

Search results only carry name, status, type, dates and address. With this on, each result is completed with SIC codes, accounts and confirmation statement due dates, insolvency and charges flags (one extra request per company). Turn off for fast, cheap name lists.

## `includePsc` (type: `boolean`):

Beneficial owners: name, kind, natures of control, notified and ceased dates. For individuals only nationality is added, never address or date of birth. Extra charge per company.

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

Latest filings with date, category, type, readable description and document link. Extra charge per company.

## `maxFilings` (type: `integer`):

Most recent filings first.

## `filingCategories` (type: `array`):

Only these filing categories. Empty means all.

## `includeCharges` (type: `boolean`):

Registered charges with status, dates, persons entitled and particulars, plus a summary of outstanding and satisfied charges. Extra charge per company.

## `maxCharges` (type: `integer`):

Maximum charges listed per company.

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

Directors, secretaries and LLP members. GDPR: officers are natural persons, so only name, role, appointment date and nationality are returned. Home addresses, birth dates and occupations are never copied. You become a data controller for this data under UK GDPR. Extra charge per company.

## `includeResignedOfficers` (type: `boolean`):

By default only current officers are kept.

## `maxOfficers` (type: `integer`):

Maximum officer records read per company (current and resigned).

## `requestsPer5Minutes` (type: `integer`):

Companies House allows 600 requests per 5 minutes per key. The default leaves headroom. Lower it if other apps use the same key. Raise it only if Companies House granted you a higher limit.

## `includeRaw` (type: `boolean`):

Keep the original company profile JSON in the raw field. Officer and PSC raw data is never kept.

## Actor input object example

```json
{
  "searchQueries": [
    "tesco"
  ],
  "maxResultsPerSearch": 10,
  "onlyActive": false,
  "companyNumbers": [
    "00445790"
  ],
  "maxResultsAdvanced": 100,
  "fetchFullProfile": true,
  "includePsc": false,
  "includeFilings": false,
  "maxFilings": 25,
  "includeCharges": false,
  "maxCharges": 25,
  "includeOfficers": false,
  "includeResignedOfficers": false,
  "maxOfficers": 50,
  "requestsPer5Minutes": 550,
  "includeRaw": false
}
```

# Actor output Schema

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

No description

## `compliance` (type: `string`):

No description

## `leads` (type: `string`):

No description

## `details` (type: `string`):

No description

## `summary` (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 = {
    "searchQueries": [
        "tesco"
    ],
    "maxResultsPerSearch": 10,
    "companyNumbers": [
        "00445790"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("rod_analytics/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 = {
    "searchQueries": ["tesco"],
    "maxResultsPerSearch": 10,
    "companyNumbers": ["00445790"],
}

# Run the Actor and wait for it to finish
run = client.actor("rod_analytics/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 '{
  "searchQueries": [
    "tesco"
  ],
  "maxResultsPerSearch": 10,
  "companyNumbers": [
    "00445790"
  ]
}' |
apify call rod_analytics/uk-companies-house --silent --output-dataset

```

## MCP server setup

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