# UK Companies House Search: New Companies & Status Checks (`jp-data-lab/uk-companies-house`) Actor

Verify UK companies by number or list new incorporations by SIC code, location and date from the official Companies House API: status, overdue accounts, insolvency flags. Fast, no browser. No director names or street addresses.

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

## Pricing

from $2.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.

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 Companies House Search: New Companies & Status Checks

Verify UK companies by number, or list new incorporations by industry, location and date, from the official [Companies House](https://www.gov.uk/government/organisations/companies-house) public data API. No browser, no web scraping, and no Companies House account needed: run it and get the data.

Use it to check that a customer or supplier exists and is active, to spot overdue accounts and insolvency history, to build a feed of newly incorporated companies in your sector, or to give an AI agent a way to answer "is this UK company active?". This is a list of companies, not of people: it has no director names, no PSC data, no street addresses, no phones and no emails.

### Two ways to use it

**Verify numbers.** Put up to 1,000 company numbers in `companyNumbers`. All other filters are ignored, every status is included, and each result has the full set of accounts and risk fields:

```json
{ "companyNumbers": ["00000006", "SC123456"] }
```

Numbers with no match are listed under `numbersNotFound` in `RUN_SUMMARY` and are not charged.

**List companies.** Leave `companyNumbers` empty and filter by name, SIC code, industry word, location, status, type or date:

```json
{ "industryKeywords": ["software"], "location": "Manchester", "incorporatedWithinDays": 30, "maxItems": 200 }
```

For a daily feed, schedule the run with `onlyNew: true`. It skips companies this account already received with the same filters, so you pay only for new ones.

### Output

One item per company. With `includeDetails`, or when verifying numbers:

```json
{
  "id": "uk-company:12345678",
  "source": "Companies House",
  "companyNumber": "12345678",
  "name": "ACME WIDGETS LIMITED",
  "nameConfirmed": true,
  "status": "active",
  "statusDetail": "active-proposal-to-strike-off",
  "companyType": "ltd",
  "companySubtype": null,
  "incorporatedOn": "2020-01-15",
  "ceasedOn": null,
  "sicCodes": [{ "code": "62012", "description": "Business and domestic software development" }],
  "locality": "Manchester",
  "region": "Greater Manchester",
  "country": "England",
  "postcodeArea": "M1",
  "detailsIncluded": true,
  "jurisdiction": "england-wales",
  "previousNames": [{ "name": "OLD ACME LTD", "from": "2020-01-15", "to": "2021-01-01" }],
  "lastAccountsMadeUpTo": "2025-01-31",
  "lastAccountsType": "micro-entity",
  "nextAccountsDue": "2026-12-31",
  "accountsOverdue": true,
  "confirmationStatementLastMadeUpTo": "2026-01-01",
  "confirmationStatementNextDue": "2027-01-15",
  "confirmationStatementOverdue": false,
  "hasCharges": true,
  "hasInsolvencyHistory": false,
  "hasBeenLiquidated": false,
  "registeredOfficeInDispute": false,
  "registeredOfficeUndeliverable": false,
  "attribution": "Source: Companies House public register. Not affiliated with or endorsed by Companies House.",
  "scrapedAt": "2026-11-02T09:00:00+00:00"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable key. Use it to remove repeats between runs |
| `companyNumber` | The 8-character number on the register |
| `name` | The registered name. `null` when `nameConfirmed` is `false`, see "Personal data" |
| `status`, `statusDetail` | The register's own codes, such as `active`, `dissolved`, `liquidation`, and `active-proposal-to-strike-off`, which means the company is on its way to being struck off |
| `companyType`, `companySubtype` | The register's codes, such as `ltd`, `plc`, `llp`, and `community-interest-company` |
| `incorporatedOn`, `ceasedOn` | Dates, as YYYY-MM-DD |
| `sicCodes` | Each code with its official SIC 2007 description. `description` is `null` for older codes that are not in the current list |
| `locality`, `region`, `country` | Registered office. A value that looks like part of a street address is `null` |
| `postcodeArea` | The first half of the postcode only |
| `detailsIncluded` | `true` if the fields below this one are present |
| `previousNames` | Earlier registered names, with the dates they applied |
| `lastAccountsMadeUpTo`, `lastAccountsType` | The latest filed accounts |
| `nextAccountsDue`, `accountsOverdue` | When the next accounts are due, and whether they are late |
| `confirmationStatementLastMadeUpTo`, `confirmationStatementNextDue`, `confirmationStatementOverdue` | The same for the confirmation statement |
| `hasCharges`, `hasInsolvencyHistory`, `hasBeenLiquidated` | Flags from the register. Details of charges and insolvency cases are not included |
| `registeredOfficeInDispute`, `registeredOfficeUndeliverable` | Flags that the registered office may not be reliable |
| `attribution` | The credit line to keep when you pass the data on |
| `scrapedAt` | When this run produced the item |

### Input

| Field | Default | |
|---|---|---|
| `companyNumbers` | none | Up to 1,000 numbers. Other filters are then ignored |
| `nameContains`, `nameExcludes` | none | Text in the registered name |
| `sicCodes` | none | Five-digit SIC 2007 codes |
| `industryKeywords` | none | Words looked up in the official SIC descriptions. `software` adds every code whose description contains it. Up to 60 codes in total |
| `location` | none | Town, city or postcode area of the registered office, such as `Manchester` or `M1`. It matches anywhere in the address, so `Manchester` also finds Altrincham addresses that mention Manchester |
| `statuses` | `active` | Company status |
| `companyTypes` | all | Company types |
| `incorporatedWithinDays` | 7 | Incorporated in the last N days, including today. 0 means no date limit, see "Limitations" |
| `incorporatedFrom`, `incorporatedTo` | none | Dates as YYYY-MM-DD. They take priority over `incorporatedWithinDays` |
| `includeDetails` | `false` | Adds accounts dates, overdue flags, risk flags and previous names. Limited to 2,000 companies a run, at about 2 companies a second |
| `onlyNew` | `false` | For schedules. Skips companies this account already received with the same filters |
| `maxItems` | 100 | Total for the run. You pay per result. Not used when verifying numbers |

### Personal data

The Companies House register and website show directors, PSCs and their details. This Actor leaves all of that out:

- **No people.** It never calls the officer or PSC parts of the API, so it has no director names, dates of birth, nationalities or addresses.
- **No street addresses.** A small company's registered office is often a home, so street lines, premises, care-of names and PO boxes are never read, and location stops at locality, region, country and the first half of the postcode. A full postcode can point to a handful of homes.
- **No links to record pages.** The official company pages list directors. To see a record, search the company number on the Companies House website.
- **Names must be a company's.** Most company types are enough to confirm this. Partnerships and uncategorised types can carry a person's name, so they need a legal word such as `LP` or `Limited`. A name that itself contains a person's name, such as `JANE DOE LIMITED`, is still returned as the registered name of the company.
- **Lists leave out unconfirmed names**, counted as `nameNotConfirmed` in `RUN_SUMMARY`. **Lookups keep the status only**: `name`, `locality`, `region`, `country` and `postcodeArea` are `null`, with `nameConfirmed: false`.

You are responsible for complying with data protection and copyright law when you use the data.

### Limitations

- **A search reads at most 10,000 companies.** That is the API's limit. With dates, the Actor searches one day at a time, newest first, so this rarely matters up to 120 days. Ranges longer than 120 days are searched in wider steps. Without dates, the results come in the register's own order, not newest first. When companies were left unread, `RUN_SUMMARY` shows `truncated: true`.
- **Registered companies only.** Sole traders and ordinary partnerships are not on this register. A missing number is not proof that a business does not exist.
- **Not for director or ownership research.** If you need officers or beneficial owners, this is the wrong Actor.
- **No financial figures.** The accounts fields are dates, types and overdue flags, not turnover or profit.
- **The register is what companies filed.** Companies House does not verify everything it receives. Confirm with the source before relying on a status for a legal or payment decision.
- If Companies House keeps limiting requests, the run stops and keeps the results so far. `RUN_SUMMARY` then shows `stoppedEarly: true`, and for lookups `numbersNotChecked`. The run fails only if it produced nothing.
- Not affiliated with or endorsed by Companies House or the UK Government.

### Data source and attribution

Source: [Companies House](https://www.gov.uk/government/organisations/companies-house) public register, through the [Public Data API](https://developer.company-information.service.gov.uk/). Companies House [states](https://www.gov.uk/government/publications/companies-house-accreditation-to-information-fair-traders-scheme/public-task-copyright-and-crown-copyright) that it imposes no rules or requirements on how the information on the public register is used. SIC descriptions are from the [Companies House condensed list](https://www.gov.uk/government/publications/standard-industrial-classification-of-economic-activities-sic), published on GOV.UK.

***

### 日本語

英国の企業登記 Companies House の公式 API から、会社の情報を取得します。会社番号での照合と、業種・地域・設立日での一覧の 2 通りで使えます。Web ページの巡回はしません。出力は会社名・状態・種類・設立日・SIC コード・地域・郵便番号の前半までで、決算の期限切れや倒産手続きの履歴も取得できます。役員や実質的支配者の氏名、番地、メール、電話は出力しません。

# Actor input Schema

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

Optional, up to 1,000. For example 00000006 or SC123456. When set, the filters below are ignored and every status is included. Numbers with no match are listed in RUN_SUMMARY and are not charged.

## `nameContains` (type: `string`):

Keep companies whose registered name contains this text.

## `nameExcludes` (type: `string`):

Leave out companies whose registered name contains this text.

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

Five-digit SIC 2007 codes, for example 62012 for business and domestic software development.

## `industryKeywords` (type: `array`):

Words to look up in the official SIC descriptions, for example software or restaurants. Each word adds every SIC code whose description contains it. Up to 60 codes in total.

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

Town, city or postcode area of the registered office. For example Manchester or M1. It matches anywhere in the address, so Manchester also finds Altrincham addresses that mention Manchester.

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

Leave empty for active companies only.

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

Leave empty for all types.

## `incorporatedWithinDays` (type: `integer`):

Only companies incorporated in the last N days, including today. 0 = no date limit, which reads at most 10,000 companies in the register's own order. Ignored if the dates below are set.

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

Start date, as YYYY-MM-DD.

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

End date, as YYYY-MM-DD.

## `includeDetails` (type: `boolean`):

Adds accounts and confirmation statement dates, overdue flags, charges, insolvency history and previous names. Each company takes half a second, so a run is limited to 2,000 companies. Always on when verifying numbers.

## `onlyNew` (type: `boolean`):

For scheduled runs. Skips companies this account already received with the same filters. The first run returns everything that matches.

## `maxItems` (type: `integer`):

Total for the run, newest first when a date filter is set. You are charged per result. Not used when verifying numbers.

## Actor input object example

```json
{
  "companyNumbers": [],
  "sicCodes": [],
  "industryKeywords": [],
  "statuses": [
    "active"
  ],
  "companyTypes": [],
  "incorporatedWithinDays": 7,
  "includeDetails": false,
  "onlyNew": false,
  "maxItems": 100
}
```

# Actor output Schema

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

One item per company: number, name, status, type, incorporation date, SIC codes with descriptions, locality, region and postcode area, plus accounts and risk flags when details are included.

## `runSummary` (type: `string`):

Matches, results, companies left out because the name could not be confirmed, and any numbers that were not found.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("jp-data-lab/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 = {}

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

```

## MCP server setup

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