# UK Companies House: Company Data, SIC Search & Change Monitor (`yourevenings/uk-companies-house`) Actor

UK company data for all 5.7M live companies from Companies House's free monthly Basic Company Data. Look up by number or name, search by SIC code, postcode and status, or get a monthly change feed. No director or PSC personal data.

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

## Pricing

from $2.40 / 1,000 company returneds

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

## UK Companies House: Company Data, SIC Search & Change Monitor

**UK Companies House** gives you company data for every live UK company: status, type, incorporation date, SIC codes, accounts and confirmation statement dates and overdue flags, charges, previous names, and registered office post town and postcode. Look companies up by number or name, search the whole register with filters, or get a typed feed of what changed since last month.

Use it for a **Companies House search** across the whole register: a **UK company search** by number or name, a **SIC code search** by area and status, or a monthly change feed, with rows you can export as CSV, JSON or Excel and no **Companies House API** key to manage.

> **Not an official Companies House product.** This Actor is independent and is not affiliated with or endorsed by Companies House. It uses the free monthly data snapshot Companies House publishes for reuse.

### Why this one

- **Typed month-over-month changes.** Each monthly snapshot is compared with the one before, so you get one row per change with a `changeType`: new on the register, left the register, status changed (liquidation, administration, proposal to strike off), name, SIC or company type changed, registered office moved, accounts or confirmation statement now overdue or newly filed, new or changed charges. `previous` holds the old values.
- **A monitor for your own list.** `monitorMode` saves your companies as a free baseline, then each later run returns only what changed since then. Schedule it monthly for suppliers, customers or prospects.
- **Search all 5.7 million live companies** by SIC code (prefix), status, company type, incorporation date, post town, postcode area or district, overdue accounts or confirmation statement, outstanding charges and name keywords.
- **No director, officer or PSC data, and no street addresses.** Rows describe companies only. The registered office is output as post town, postcode and country; street lines, care-of names and PO boxes are dropped when the data is loaded.
- **Filters before you pay, and free status rows.** Filtered-out companies, numbers not on the register, unmatched names (with up to 3 similar names), duplicates and "nothing new yet" rows cost nothing.
- **Pre-built snapshot.** The snapshot is stored as compact shards, so a lookup by number reads only the shards it needs. Our test lookup of three companies on 26 October 2026 took 8 seconds; a search reads the whole register, so it takes longer.

**Data from:** Companies House, Free Company Data Product (monthly snapshot)

**Runs on** <img src="https://yourevenings.com/logos/apify-logo-dark.svg" alt="Apify" height="20"> Apify. Use it from Make, Zapier, <img src="https://yourevenings.com/logos/n8n-logo-black.svg" alt="n8n" height="16"> n8n or the Apify API.

<sub>Product names belong to their owners. Your Evenings is not affiliated with or endorsed by them.</sub>

### Where the data comes from

| Source | What | How |
|---|---|---|
| [Companies House Free Company Data Product](https://download.companieshouse.gov.uk/en_output.html) | Basic company data for all live companies (5,704,711 in the 1 October 2026 snapshot) | Downloaded once a month by the maintainer, at normal speed, one file at a time, and stored in compact form. Your runs read that copy, not Companies House. |

**How fresh is it?** Companies House compiles the snapshot to the end of the previous month and publishes it within 5 working days of month end. Every row has `dataAsOf` (the snapshot date) and `dataSource: monthly-snapshot`. If the newest snapshot is over 40 days old, the run adds a free `stale_data` row and a warning. For today's position, each row's `sourceUrl` links to the company's page on the Companies House service.

Overdue flags (`accountsOverdue`, `confirmationStatementOverdue`) are worked out against the snapshot date.

### Attribution and licences

Source: Companies House, Free Company Data Product. Companies House states that it "imposes no rules or requirements on how the information on the public register is used" ([public task and copyright](https://www.gov.uk/government/publications/companies-house-accreditation-to-information-fair-traders-scheme/public-task-copyright-and-crown-copyright)). Register information is supplied under the Copyright, Designs and Patents Act 1988 and the Database Regulations and is not released under the Open Government Licence. Companies House asks reusers to take their own advice on third-party copyright in filed information and not to reproduce the Crown insignia; this Actor does not use it. Every row carries a `licence` note crediting Companies House. Fields are renamed and normalised by this Actor.

### Personal data

The source file has no officer, director or PSC data, and this Actor never adds any. Registered office street lines, care-of names, PO boxes and county are dropped when the snapshot is loaded; rows keep only post town, postcode and country. Some very small companies use a home address as their registered office, which is why street lines are left out. Please don't use this Actor to build lists of people.

### Who it's for

- **B2B sales and marketing teams** building lists of UK companies by sector, area and age.
- **Credit, finance and procurement teams** checking customers and suppliers for strike-off, liquidation or overdue accounts.
- **Researchers and data teams** who need company-level data from the register in a clean table.

### Use cases

1. **New company lists.** Companies new on the register last month in SIC 62 (IT) in Manchester (postcode area M): set `changeTypes` to `new_on_register`, `sicCodes` to `62` and `postcodes` to `M`.
2. **Supplier and customer checks.** Look up status, overdue accounts and charges for a list of company numbers, then run `monitorMode` monthly to hear about strike-off proposals, liquidation or late accounts.
3. **Market sizing.** Search all live companies by SIC code, post town and incorporation date and count them with `countAllMatches`.
4. **Accountants.** A monthly due-date sweep across a client list (confirm with the live register before chasing).

### Quick start

Press **Start** with the prefilled input, or paste this into the **JSON** view of the Input tab:

```json
{
  "companyNumbers": ["00445790", "00185647", "07524813"]
}
```

It looks up Tesco PLC, J Sainsbury PLC and Rolls-Royce Holdings PLC. In our test run on 26 October 2026 it returned 3 company rows from the 1 October 2026 snapshot, which costs about $0.01 (see Pricing).

### Output sample

Two of the Quick start rows and other rows from our test runs (a name lookup, and a changes run for SIC 62 in postcode area M), October 2026 snapshot:

| Record | Change | Company | Status | Incorporated | SIC (first) | Post town |
|---|---|---|---|---|---|---|
| company | – | TESCO PLC | Active | 1947-11-27 | Retail sale in non-specialised stores with food, beverages or tobacco predominating | WELWYN GARDEN CITY |
| company | – | J SAINSBURY PLC | Active | 1922-11-10 | Retail sale in non-specialised stores with food, beverages or tobacco predominating | LONDON |
| company | – | MARKS AND SPENCER GROUP P.L.C. | Active | 2001-07-23 | Other retail sale in non-specialised stores | LONDON |
| change | new_on_register | PIONEER INSIGHT RESEARCH TECH LTD | Active | 2026-09-05 | Business and domestic software development | MANCHESTER |
| change | status_changed | GLOBINA LIMITED | Active - Proposal to Strike off | 2025-06-17 | Information technology consultancy activities | MANCHESTER |

Two rows as JSON, from runs on 30 October 2026 (1 October 2026 snapshot): a lookup of Tesco PLC (build 0.1.9) and a `new_on_register` change from the SIC 62 / postcode area M changes run (build 0.1.8). Some fields are left out to keep it short, and the change row's postcode is left out of this sample. The full list is under Output.

```json
{
  "recordType": "company",
  "companyNumber": "00445790",
  "companyName": "TESCO PLC",
  "companyStatus": "Active",
  "companyType": "Public Limited Company",
  "countryOfOrigin": "United Kingdom",
  "incorporatedOn": "1947-11-27",
  "sicCodes": [
    "47110"
  ],
  "sicDescriptions": [
    "Retail sale in non-specialised stores with food, beverages or tobacco predominating"
  ],
  "registeredOffice": {
    "postTown": "WELWYN GARDEN CITY",
    "postcode": "AL7 1GA",
    "country": "UNITED KINGDOM"
  },
  "accountsNextDue": "2027-08-26",
  "accountsOverdue": false,
  "lastAccountsMadeUpTo": "2026-02-28",
  "lastAccountsType": "GROUP",
  "confirmationStatementNextDue": "2027-07-02",
  "confirmationStatementOverdue": false,
  "lastConfirmationStatementMadeUpTo": "2026-06-18",
  "charges": {
    "total": 9,
    "outstanding": 2,
    "partSatisfied": 0,
    "satisfied": 7
  },
  "hasCharges": true,
  "hasOutstandingCharges": true,
  "previousNames": [],
  "sourceUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790",
  "dataAsOf": "2026-10-01",
  "dataSource": "monthly-snapshot",
  "licence": "Source: Companies House, Free Company Data Product (public register information, https://download.companieshouse.gov.uk/en_output.html). Companies House places no restriction on reuse of register information; it is not released under the Open Government Licence. Normalised by this Actor; not endorsed by Companies House."
}
```

```json
{
  "recordType": "change",
  "changeType": "new_on_register",
  "companyNumber": "17485002",
  "companyName": "ZOA DIGITAL LTD",
  "companyStatus": "Active",
  "companyType": "Private Limited Company",
  "incorporatedOn": "2026-09-28",
  "sicCodes": [
    "62012"
  ],
  "sicDescriptions": [
    "Business and domestic software development"
  ],
  "registeredOffice": {
    "postTown": "MANCHESTER",
    "country": "ENGLAND"
  },
  "accountsNextDue": "2028-06-28",
  "accountsOverdue": false,
  "confirmationStatementNextDue": "2027-10-11",
  "hasCharges": false,
  "previousNames": [],
  "sourceUrl": "https://find-and-update.company-information.service.gov.uk/company/17485002",
  "dataAsOf": "2026-10-01",
  "previousDataAsOf": "2026-09-01"
}
```

### Input examples

Paste any of these into the **JSON** view of the Input tab. Each one is the input of a ready-made example task.

#### UK company lookup by company number

```json
{
  "mode": "lookup",
  "companyNumbers": ["00445790", "00185647", "07524813"],
  "maxResults": 25
}
```

#### SIC code search: new UK software companies (SIC 62012)

```json
{
  "mode": "search",
  "sicCodes": ["62012"],
  "companyStatus": ["active"],
  "incorporatedWithinDays": 60,
  "maxResults": 100
}
```

#### Monthly changes for IT companies in Manchester (SIC 62, postcode area M)

```json
{
  "mode": "changes",
  "sicCodes": ["62"],
  "postcodes": ["M"],
  "changeTypes": ["new_on_register", "status_changed"],
  "maxResults": 100
}
```

### Input

All fields are optional. With no input it looks up three example companies (Tesco PLC, J Sainsbury PLC, Rolls-Royce Holdings PLC).

| Field | What it does |
|---|---|
| `mode` | `auto` (default), `lookup`, `search`, `changes` or `monitor`. Auto picks lookup when you give numbers or names, changes when you pick change types, otherwise search. |
| `companyNumbers` | Company numbers. Short numbers are zero-padded; SC, NI, OC and other prefixes work. In changes mode, a watchlist. |
| `companyNames` | Up to 1,000 names, matched `exact` or `normalised` (case, punctuation, & / and, Limited / Ltd, PLC forms). Rows show `matchConfidence`. No match gives a free `not_found` row with up to 3 similar names. |
| `sicCodes` | 2 to 5 digits, prefix match. |
| `companyStatus` | `active`, `proposal to strike off`, `liquidation`, `administration`, `receivership`, `voluntary arrangement`, or an exact published status. |
| `companyTypes` | Phrase match on the published type, e.g. "Limited Liability Partnership". |
| `incorporatedFrom`, `incorporatedTo`, `incorporatedWithinDays` | Incorporation date range. |
| `postTowns`, `postcodes` | Registered office post town; postcode area (M), district (M1) or postcode (M1 1AE). |
| `nameKeywords` | Whole words or phrases in the name. |
| `accountsOverdue`, `confirmationStatementOverdue`, `hasOutstandingCharges` | Only companies with that flag. |
| `changeTypes` | Changes mode: which change types to return. |
| `monitorMode`, `stateStoreName` | Monitor your list; one state store per watchlist. |
| `dataMonth` | Use an older snapshot (the last 3 months are kept). |
| `maxResults` | Maximum charged rows (default 25; 0 = no limit). |
| `countAllMatches` | Keep counting after `maxResults` for the run summary (no extra charge). |

### Output

One row per company (`recordType: company`) or per change (`recordType: change`), plus free `status` rows.

Company fields: `companyNumber`, `companyName`, `companyStatus`, `companyType`, `countryOfOrigin`, `incorporatedOn`, `dissolvedOn`, `sicCodes`, `sicDescriptions`, `registeredOffice` {`postTown`, `postcode`, `country`}, `accountingReferenceDate`, `accountsNextDue`, `accountsOverdue`, `accountsDaysOverdue`, `lastAccountsMadeUpTo`, `lastAccountsType`, `confirmationStatementNextDue`, `confirmationStatementOverdue`, `lastConfirmationStatementMadeUpTo`, `charges` {total, outstanding, partSatisfied, satisfied}, `hasCharges`, `hasOutstandingCharges`, `previousNames`, `sourceUrl`, `dataAsOf`, `dataSource`, `licence`, `retrievedAt`. Name lookups add `companyNameQuery`, `matchConfidence`.

Change rows add `changeType`, `changedFields`, `previous` (old values) and `previousDataAsOf`.

Status rows (free): `not_found`, `not_on_live_register` (left the register this month), `invalid_number`, `duplicate`, `baseline_saved`, `no_new_snapshot`, `no_changes`, `no_matches`, `stale_data`, `error`, `no_company_numbers`, `too_many_numbers`, `too_many_names`.

The run's `SUMMARY` record shows companies read, matched and returned, and why the rest were filtered out.

### Changes and monitor mode

The October 2026 snapshot had 1,307,278 changes against September across all types, so filter the feed (`changeTypes`, SIC, postcode, status) or give a watchlist. Change types: `new_on_register`, `removed_from_register`, `status_changed`, `name_changed`, `sic_changed`, `type_changed`, `registered_office_moved`, `accounts_now_overdue`, `accounts_filed`, `confirmation_statement_now_overdue`, `confirmation_statement_filed`, `new_charge`, `charges_changed`.

`removed_from_register` means a company was in last month's file and not this one, which usually means it was dissolved. The snapshot lists live companies only.

In monitor mode, the first run saves a baseline (free). A run before the next snapshot is out returns a free `no_new_snapshot` row. Once a newer snapshot is available, you get one change row per change since your baseline.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Company row | $0.003 |
| Change row | $0.005 |
| Actor start | $0.00005 |

Status rows, filtered-out companies, unmatched names and duplicates are free. Example: a monthly monitor of 500 suppliers with 12 changes costs 12 × $0.005 = $0.06 plus the start event. Set a maximum charge per run and the Actor stops before going over it.

### FAQ

**Can I get directors or shareholders?** No. This Actor outputs company data only.

**Can I check confirmation statement and accounts due dates for my client list?** Yes. Use `lookup` mode with your clients' company numbers in `companyNumbers`. Each row has `confirmationStatementNextDue`, `confirmationStatementOverdue`, `accountsNextDue` and `accountsOverdue`, worked out against the monthly snapshot date. Because the data is monthly, a client who filed after the snapshot can still show as due. Check the live Companies House record before you send a client a reminder.

**Why is a company I just registered missing?** The snapshot is compiled to the end of the previous month. Companies registered since then appear in the next one.

**Why `not_found` for a real number?** The file lists live companies only. Companies dissolved before the earliest month kept don't appear; those dissolved this month get `not_on_live_register`.

**How do I search Companies House by SIC code?**
Use `mode: "search"` with `sicCodes` (a full 5-digit code such as `62012`, or a prefix such as `62`). Add `companyStatus`, `postTowns`, `postcodes` or `incorporatedWithinDays` to narrow it, and `countAllMatches` to count every match.

**Can I do a UK company search by name?**
Yes. Use `mode: "lookup"` with `companyNames`. Names are matched exactly or after normalising case, punctuation and Ltd / Limited forms; a name with no match comes back as a free `not_found` row with up to 3 similar names.

**Do I need a Companies House API key?**
No. The Actor reads its own copy of Companies House's free monthly snapshot, so there's no key to register.

### Feedback

Found a row that looks wrong? Open an issue on the Actor's Issues tab with the company number.

# Changelog

This Actor's version history is a separate document: https://apify.com/yourevenings/uk-companies-house/changelog.md

# Actor input Schema

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

Auto picks lookup when you give company numbers, names or a dataset ID; changes when you pick change types; otherwise search.

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

8-character Companies House numbers. Short numbers are zero-padded (445790 = 00445790); SC, NI, OC and other prefixes are accepted. In changes mode this is a watchlist.

## `companyNames` (type: `array`):

Matched against current registered names: exact, or normalised (case, punctuation, & / and, Limited / Ltd, PLC forms). Each row shows matchConfidence. No match gives a free not_found row with up to 3 similar names. Up to 1,000 names.

## `tenderDatasetId` (type: `string`):

ID of a dataset from your own Apify account whose items list company numbers in awards\[].supplierCompanyNumber. Each number is looked up as if you had entered it under Company numbers, and the matching dataset details are added to that company's row.

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

2 to 5 digits; prefix match (62 = all IT, 62012 = software development).

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

active, proposal to strike off, liquidation, administration, receivership, voluntary arrangement, or an exact status as published.

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

Phrase match on the published category, e.g. "Private Limited Company", "Limited Liability Partnership", "Community Interest Company".

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

YYYY-MM-DD.

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

YYYY-MM-DD.

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

Counted back from today. The newest companies in the data are from the end of the month before the snapshot date.

## `postTowns` (type: `array`):

Registered office post town, e.g. MANCHESTER.

## `postcodes` (type: `array`):

Area (EC, M), district (EC1V, M1) or a full or partial postcode (M1 1AE).

## `nameKeywords` (type: `array`):

Whole words or phrases in the company name.

## `accountsOverdue` (type: `boolean`):

Next accounts due date before the snapshot date.

## `confirmationStatementOverdue` (type: `boolean`):

Next confirmation statement due date before the snapshot date.

## `hasOutstandingCharges` (type: `boolean`):

Only companies with at least one outstanding charge (mortgage or other security) registered.

## `changeTypes` (type: `array`):

Changes mode: which month-over-month changes to return. Leave empty for all (in monitor mode all are always returned).

## `monitorMode` (type: `boolean`):

Compare your company numbers with your last run. The first run saves a free baseline; later runs return one change row per change once a newer monthly snapshot is out. Schedule it monthly.

## `stateStoreName` (type: `string`):

Named key-value store in your account that holds the monitor baseline. Use a different name per watchlist.

## `dataMonth` (type: `string`):

YYYY-MM-01 to use an older snapshot (the last 3 months are kept). Leave empty for the newest.

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

Maximum charged rows. 0 = no limit. Status rows are free and don't count.

## `countAllMatches` (type: `boolean`):

Keep reading after maxResults so the run summary has the full match count (no extra charge).

## Actor input object example

```json
{
  "mode": "auto",
  "companyNumbers": [
    "00445790",
    "00185647",
    "07524813"
  ],
  "accountsOverdue": false,
  "confirmationStatementOverdue": false,
  "hasOutstandingCharges": false,
  "monitorMode": false,
  "stateStoreName": "uk-companies-house-monitor",
  "maxResults": 25,
  "countAllMatches": false
}
```

# Actor output Schema

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

No description

## `changes` (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 = {
    "companyNumbers": [
        "00445790",
        "00185647",
        "07524813"
    ]
};

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

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

```

## MCP server setup

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