# UK Companies House Company Lookup API (`crawlwren/uk-companies-house`) Actor

UK company data from the official Companies House API: status, SIC codes, registered office, incorporation and dissolution dates, accounts and confirmation-statement due dates and overdue flags, filings, charges and insolvency. Search, bulk lookup or advanced search. No personal data. $1.50/1,000.

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

## Pricing

from $1.50 / 1,000 company records

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 company data from the official Companies House API, as clean JSON, CSV or Excel.** You get one company-level record per company: status, SIC codes, registered office, incorporation and dissolution dates, accounts and confirmation-statement due dates with overdue flags, recent filings, a charges summary, insolvency cases, and corporate shareholders and officers. Search by name, look up company numbers in bulk, or run an advanced search by SIC code, status, incorporation date and location.

Use it to:

- **Check suppliers, customers and counterparties (KYB).** Is the company active? Are its accounts or confirmation statement overdue? Does it have outstanding charges or insolvency history?
- **Build lead lists.** For example, every active software company (SIC 62012) incorporated in Manchester this year.
- **Feed AI agents.** One flat schema, callable as a tool from Claude, Cursor or any MCP client (see below).

### Why this actor

| | This actor | Typical approach |
|---|---|---|
| Access | Official Companies House public data API. **No key needed** (ours is used), or bring your own | Register, get a key, write code for several endpoints |
| Record | Profile, filings, charges, insolvency, corporate officers and PSCs **joined into one record** | One endpoint at a time |
| Due dates | `daysUntilDue` and `overdue` for accounts and confirmation statements | Raw dates only |
| Personal data | **None.** Individual directors, secretaries and PSCs are never output (only counted) | Names, birth dates and addresses included |
| Politeness | Paced within Companies House's limit of 600 requests per 5 minutes per key, pausing when the allowance runs low | Varies |
| Price | **$1.50 per 1,000 company records**. Numbers that don't exist are free | |

### Modes

| Mode | Input | Output |
|---|---|---|
| `search` | `queries`: company names | Top `resultsPerQuery` matches per name, each as a full record |
| `lookup` | `companyNumbers`: e.g. `00445790`, `SC123456`, `OC301234` (leading zeros added) | One record per existing company; unknown numbers are listed in `RUN_STATS.notFound` and are free |
| `advanced` | `sicCodes`, `statuses`, `incorporatedFrom` / `incorporatedTo`, `location`, `nameIncludes`, `companyTypes` | Every match, up to `maxResults` |

#### Input example

```json
{
  "mode": "advanced",
  "sicCodes": ["62012"],
  "statuses": ["active"],
  "incorporatedFrom": "2026-01-01",
  "location": "Manchester",
  "maxResults": 200
}
```

### How fast is it?

Each record takes up to six requests: profile, filings, officers and PSCs, plus charges and insolvency only when the company has them. Companies House allows 600 requests per 5 minutes per key, and that allowance is shared by everyone using our key. The actor sends at most one request per second, and pauses when the key's remaining allowance runs low. Expect about 15–25 records a minute.

For large or frequent pulls, add **your own free Companies House API key** in `apiKey`. It's stored as a secret input and never logged. You then get your own allowance and about twice the speed. Turning off filings, officers and PSCs speeds things up too.

### Use it from Claude, Cursor or other MCP clients

Apify's MCP server exposes this actor as a tool. Add it to your client's MCP configuration (replace the token with your Apify API token):

```json
{
  "mcpServers": {
    "uk-companies-house": {
      "url": "https://mcp.apify.com/?actors=crawlwren/uk-companies-house",
      "headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
    }
  }
}
```

Then ask, for example: *"Is company 00445790 active, and are its accounts overdue?"* or *"List active fintech companies incorporated in London since June."* Each tool call is a normal run, billed per company record.

### Output

Here is a sample from a real run (public, company-level data):

```json
[
  {
    "companyNumber": "00445790",
    "companyName": "TESCO PLC",
    "status": "active",
    "statusDetail": null,
    "type": "plc",
    "subtype": null,
    "jurisdiction": "england-wales",
    "incorporatedOn": "1947-11-27",
    "dissolvedOn": null,
    "sicCodes": [
      "47110"
    ],
    "registeredOffice": {
      "premises": null,
      "line1": "Tesco House, Shire Park",
      "line2": "Kestrel Way",
      "locality": "Welwyn Garden City",
      "region": null,
      "postalCode": "AL7 1GA",
      "country": "United Kingdom",
      "poBox": null
    },
    "registeredOfficeUndeliverable": false,
    "registeredOfficeInDispute": false,
    "previousNames": [
      {
        "name": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY",
        "from": "1981-12-14",
        "to": "1983-08-25"
      },
      {
        "name": "TESCO STORES (HOLDINGS) LIMITED",
        "from": "1947-11-27",
        "to": "1981-12-14"
      }
    ],
    "accounts": {
      "lastMadeUpTo": "2026-02-28",
      "lastType": "group",
      "nextMadeUpTo": "2027-02-26",
      "nextDue": "2027-08-26",
      "daysUntilDue": 317,
      "overdue": false
    },
    "confirmationStatement": {
      "lastMadeUpTo": "2026-06-18",
      "nextMadeUpTo": "2027-06-18",
      "nextDue": "2027-07-02",
      "daysUntilDue": 262,
      "overdue": false
    },
    "hasCharges": false,
    "hasInsolvencyHistory": false,
    "hasBeenLiquidated": false,
    "filings": {
      "totalCount": 8372,
      "latest": [
        {
          "date": "2026-09-16",
          "category": "capital",
          "type": "SH03",
          "description": "capital-return-purchase-own-shares",
          "transactionId": "MzU0MzY3ODg5MGFkaXF6a2N4",
          "pages": 4
        },
        {
          "date": "2026-08-26",
          "category": "capital",
          "type": "SH06",
          "description": "capital-cancellation-shares",
          "transactionId": "MzUzOTMzNzQ1OWFkaXF6a2N4",
          "pages": 4
        },
        {
          "date": "2026-08-26",
          "category": "capital",
          "type": "SH06",
          "description": "capital-cancellation-shares",
          "transactionId": "MzUzOTMzNzMyN2FkaXF6a2N4",
          "pages": 4
        }
      ]
    },
    "charges": {
      "total": 0,
      "satisfied": null,
      "partSatisfied": null,
      "outstanding": 0,
      "latestCreatedOn": null,
      "outstandingClassifications": []
    },
    "insolvencyCases": null,
    "officers": {
      "activeCount": 11,
      "resignedCount": 63,
      "individualOfficersWithheld": 74,
      "corporate": []
    },
    "pscs": {
      "activeCount": 0,
      "ceasedCount": 0,
      "individualPscsWithheld": 0,
      "corporate": []
    },
    "url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
    "dataSource": "companies_house_api",
    "licence": "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House. Not affiliated with or endorsed by Companies House.",
    "licenceUrl": "https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
    "scrapedAt": "2026-10-13T17:15:13+00:00"
  },
  {
    "companyNumber": "05888957",
    "companyName": "TESCO AQUA (FINCO2) LIMITED",
    "status": "dissolved",
    "statusDetail": null,
    "type": "ltd",
    "subtype": null,
    "jurisdiction": "england-wales",
    "incorporatedOn": "2006-07-27",
    "dissolvedOn": "2025-11-12",
    "sicCodes": [
      "70100"
    ],
    "registeredOffice": {
      "premises": null,
      "line1": "1 More London Place",
      "line2": null,
      "locality": "London",
      "region": null,
      "postalCode": "SE1 2AF",
      "country": null,
      "poBox": null
    },
    "registeredOfficeUndeliverable": false,
    "registeredOfficeInDispute": false,
    "previousNames": [],
    "accounts": {
      "lastMadeUpTo": "2024-02-24",
      "lastType": "dormant",
      "nextMadeUpTo": null,
      "nextDue": null,
      "daysUntilDue": null,
      "overdue": false
    },
    "confirmationStatement": {
      "lastMadeUpTo": "2024-06-08",
      "nextMadeUpTo": null,
      "nextDue": null,
      "daysUntilDue": null,
      "overdue": false
    },
    "hasCharges": false,
    "hasInsolvencyHistory": true,
    "hasBeenLiquidated": false,
    "filings": {
      "totalCount": 88,
      "latest": [
        {
          "date": "2025-11-12",
          "category": "gazette",
          "type": "GAZ2",
          "description": "gazette-dissolved-liquidation",
          "transactionId": "MzQ4ODM1MzE1OGFkaXF6a2N4",
          "pages": 1
        },
        {
          "date": "2025-08-12",
          "category": "insolvency",
          "type": "LIQ13",
          "description": "liquidation-voluntary-members-return-of-final-meeting",
          "transactionId": "MzQ3NjM3MDUxMWFkaXF6a2N4",
          "pages": 12
        },
        {
          "date": "2025-05-02",
          "category": "insolvency",
          "type": "600",
          "description": "liquidation-voluntary-appointment-of-liquidator",
          "transactionId": "MzQ2MzgzMDE5MWFkaXF6a2N4",
          "pages": 11
        }
      ]
    },
    "charges": {
      "total": 0,
      "satisfied": null,
      "partSatisfied": null,
      "outstanding": 0,
      "latestCreatedOn": null,
      "outstandingClassifications": []
    },
    "insolvencyCases": [
      {
        "type": "members-voluntary-liquidation",
        "number": "1",
        "dates": [
          {
            "type": "wound-up-on",
            "date": "2025-02-27"
          },
          {
            "type": "dissolved-on",
            "date": "2025-11-12"
          }
        ]
      }
    ],
    "officers": {
      "activeCount": 0,
      "resignedCount": 11,
      "individualOfficersWithheld": 11,
      "corporate": [
        {
          "name": "TESCO SECRETARIES LIMITED",
          "role": "corporate-secretary",
          "appointedOn": "2013-10-15",
          "resignedOn": null,
          "identification": {
            "type": "uk-limited-company",
            "registrationNumber": "08730224",
            "placeRegistered": null,
            "countryRegistered": null,
            "legalForm": null,
            "legalAuthority": null
          }
        },
        {
          "name": "TESCO SERVICES LIMITED",
          "role": "corporate-director",
          "appointedOn": "2014-08-04",
          "resignedOn": null,
          "identification": {
            "type": "uk-limited-company",
            "registrationNumber": "7600956",
            "placeRegistered": null,
            "countryRegistered": null,
            "legalForm": null,
            "legalAuthority": null
          }
        },
        {
          "name": "PAILEX SECRETARIES LIMITED",
          "role": "corporate-secretary",
          "appointedOn": "2006-07-27",
          "resignedOn": "2006-07-27",
          "identification": null
        }
      ]
    },
    "pscs": {
      "activeCount": 1,
      "ceasedCount": 0,
      "individualPscsWithheld": 0,
      "corporate": [
        {
          "name": "Tesco Property Holdings (No. 2) Limited",
          "kind": "corporate-entity-person-with-significant-control",
          "notifiedOn": "2016-04-06",
          "ceasedOn": null,
          "naturesOfControl": [
            "ownership-of-shares-75-to-100-percent",
            "voting-rights-75-to-100-percent",
            "right-to-appoint-and-remove-directors"
          ],
          "identification": {
            "type": null,
            "registrationNumber": "05888922",
            "placeRegistered": "Companies House",
            "countryRegistered": "England",
            "legalForm": "Limited By Shares",
            "legalAuthority": "United Kingdom (England)"
          }
        }
      ]
    },
    "url": "https://find-and-update.company-information.service.gov.uk/company/05888957",
    "dataSource": "companies_house_api",
    "licence": "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House. Not affiliated with or endorsed by Companies House.",
    "licenceUrl": "https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
    "scrapedAt": "2026-10-13T17:15:12+00:00"
  }
]
```

Key fields: `companyNumber`, `companyName`, `status`, `type`, `jurisdiction`, `incorporatedOn`, `dissolvedOn`, `sicCodes`, `registeredOffice`, `accounts` (`nextDue`, `daysUntilDue`, `overdue`, last accounts type), `confirmationStatement`, `hasCharges`, `hasInsolvencyHistory`, `filings`, `charges` (counts only), `insolvencyCases` (types and dates), `officers.corporate`, `pscs.corporate`, `url`, `licence`.

### Personal data

Companies House publishes personal details of directors and people with significant control. This actor deliberately leaves them out:

- Individual officers and individual PSCs are never output: no names, birth dates, nationalities or addresses. Only their counts are given (`individualOfficersWithheld`, `individualPscsWithheld`).
- Lender names on charges and insolvency practitioner names aren't output.
- The registered office is a company address. Its "care of" line is dropped.

### Pricing

Pay-per-event: you pay per company record delivered.

| Event | Price | What it is |
|---|---|---|
| Run start | $0.0005 | Charged once per run (covers start-up compute). |
| Company record | $0.0015 ($1.50 per 1,000) | One company-level record delivered to the dataset. Company numbers that don't exist are free. |

**Examples:**

- Checking 1,000 suppliers by company number costs about **$1.50**.
- A weekly list of 50 new companies in your SIC codes costs about **$0.08** a week.

### Data source and licence

The data comes from the Companies House public data API. It contains public sector information licensed under the Open Government Licence v3.0, and every record carries this attribution in its `licence` field. This actor is not affiliated with or endorsed by Companies House.

### FAQ

**Do I need a Companies House API key?** No. Ours is used by default. Add your own for big jobs or more speed.

**Why aren't directors' names included?** Our rule is to keep personal data out of results. You get company-level facts and corporate officers and shareholders only. If you need individuals' details, use the official register directly and make sure you have a lawful basis.

**How current is the data?** It's live from the Companies House API at run time.

**What counts as overdue?** It's Companies House's own `overdue` flag. `daysUntilDue` is negative when the due date has passed.

**Why is a company number not found?** It doesn't exist, or it was dissolved long enough ago that it has been removed from the register. Not-found numbers are listed in `RUN_STATS.notFound` and are not charged.

**Can I check EU or global companies?** Use our sibling actor [GLEIF LEI Lookup](https://apify.com/crawlwren/gleif-lei-lookup) for any company with an LEI.

### Support

Found a bug or need a field? Open an issue on the actor's **Issues** tab or email hello@crawlwren.com. Built and maintained by **Crawlwren**.

# Actor input Schema

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

What to fetch.

## `queries` (type: `array`):

One search per name, ranked by Companies House.

## `resultsPerQuery` (type: `integer`):

How many search hits to turn into records for each name.

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

e.g. 00445790, SC123456, OC301234. Leading zeros are added. Numbers that don't exist are listed in RUN_STATS and are free.

## `nameIncludes` (type: `string`):

Word that must appear in the company name.

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

5-digit SIC 2007 codes, e.g. 62012 (business and domestic software development).

## `statuses` (type: `array`):

Empty = any status.

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

Companies House type codes, e.g. ltd, plc, llp.

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

YYYY-MM-DD

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

YYYY-MM-DD

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

Registered office town, county or postcode area, e.g. Manchester or SW1.

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

Filing history metadata (date, type, description). One extra request per company.

## `filingsCount` (type: `integer`):

Most recent filings to include.

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

Counts of outstanding and satisfied charges (one extra request, only for companies with charges). Lender names are not included.

## `includeInsolvency` (type: `boolean`):

Case types and dates (one extra request, only for companies with insolvency history). Practitioner names are not included.

## `includeCorporateOfficers` (type: `boolean`):

Officers that are companies (e.g. corporate directors or secretaries) with their registration details. Individual officers are never output, only counted.

## `includeCorporatePscs` (type: `boolean`):

Persons with significant control that are companies or legal persons, with natures of control. Individual PSCs are never output, only counted.

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

Stop after this many company records (you're charged per record).

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

Optional. Leave empty to use ours. Add your own free key (from the Companies House Developer Hub) for large or frequent pulls: it gets its own 600-requests-per-5-minutes allowance and runs about twice as fast.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "Tesco"
  ],
  "resultsPerQuery": 20,
  "includeFilings": true,
  "filingsCount": 5,
  "includeCharges": true,
  "includeInsolvency": true,
  "includeCorporateOfficers": true,
  "includeCorporatePscs": true,
  "maxResults": 50
}
```

# Actor output Schema

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

Company-level records from Companies House, one row per company, each with its OGL v3.0 licence. No individual officers or PSCs.

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

JSON summary: records delivered, company numbers not found, individuals withheld, rate-limit pauses and any errors.

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

// Run the Actor and wait for it to finish
const run = await client.actor("crawlwren/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 = { "queries": ["Tesco"] }

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

```

## MCP server setup

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