# UK Companies House Search – New Companies, SIC & Postcode (`gazidev/uk-companies-house-search`) Actor

Search all 5.6M+ live UK companies from the official Companies House bulk data: filter by SIC code, postcode, post town, status, category and incorporation date, or bulk-look-up company numbers. Address, accounts & confirmation due dates, mortgages, previous names. $1 per 1,000.

- **URL**: https://apify.com/gazidev/uk-companies-house-search.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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, SIC Codes & Postcode Leads

Search and export **all 5.7 million live UK companies** from the official **Companies House** bulk register (Free Company Data Product). Filter by **SIC code**, **postcode area/district**, **post town**, **company status**, **company type** and **incorporation date**, or **bulk-look-up company numbers**. Each record has the registered office address, SIC codes, accounts and confirmation statement due dates (with an overdue flag), mortgage/charge counts and up to 10 previous names.

No API key, no login and no Companies House rate limits. You pay **$1 per 1,000 companies**.

### What you can do

- **New company leads**: companies incorporated in the last 30 days in Cambridge (`CB`), Manchester (`M`) or anywhere, newest first.
- **Industry lists by SIC code**: every active IT consultancy (`62020`), restaurant (`56101`), dental practice (`86230`) or builder (`41`) in a postcode area or post town.
- **Accountants' prospect lists**: companies with **overdue accounts** (`onlyAccountsOverdue`).
- **KYB / CRM enrichment**: paste thousands of company numbers (`08209948`, `SC123456`, `NI012345`, `OC301234`) and get status, address and SIC codes back.
- **Monthly monitoring**: schedule a saved search with `onlyNew` to get only companies you have not received before.

### How it works (fast and cheap)

Companies House publishes the full register as a 494 MB zip once a month. This Actor keeps a pre-built copy of each monthly snapshot split into compressed shards by postcode area (newest companies first) plus a company-number index. A run downloads only the shards it needs:

| Search | Data read | Typical run time |
|---|---|---|
| Postcode area + last 30 days (the prefill) | ~2 MB | 2–5 s |
| Post town + SIC + date | 10–30 MB | 5–15 s |
| 1–100 company numbers | a few shards | 5–20 s |
| SIC code only, whole UK | all shards (~330 MB) | ~1 min |

If the cache is not yet updated for a new monthly snapshot, the run reads the official zip directly instead (same results, about 3–4 minutes).

### Input example

```json
{
  "incorporatedWithinDays": 31,
  "postcodePrefixes": ["CB"],
  "statuses": ["active"],
  "sicCodes": ["62"],
  "maxResults": 500
}
```

- `incorporatedWithinDays` counts back from the **snapshot date** (the file is compiled to the end of the previous month), so "31" means "incorporated in the last month of the snapshot".
- `postcodePrefixes`: `CB` = area, `SW1A` / `M1` = exact district, `EC1V 2` = longer prefix.
- `companyNumbers`: bulk lookup; other filters are ignored.

### Output example

```json
{
  "companyNumber": "17492746",
  "companyName": "GROWCYBER LTD",
  "status": "Active",
  "category": "Private Limited Company",
  "incorporationDate": "2026-09-30",
  "addressLine1": "5 COURTLAND AVENUE",
  "postTown": "CAMBRIDGE",
  "postcode": "CB1 7AT",
  "sicCodes": ["62020"],
  "sicDescriptions": ["62020 - Information technology consultancy activities"],
  "accountsNextDueDate": "2028-06-30",
  "accountsOverdue": false,
  "confirmationStatementNextDueDate": "2027-10-13",
  "mortgageCharges": 0,
  "previousNames": [],
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/17492746",
  "dataSnapshot": "2026-10-01"
}
```

Export as JSON, CSV, Excel or via API. The run summary (`OUTPUT` record) shows rows scanned, shards read, the data snapshot and company numbers that were not found.

### Pricing

| Actor | Price per company | Notes |
|---|---|---|
| **This Actor** | **$0.001** | full register filters, bulk lookup, newest first, monitoring |
| logiover/uk-companies-house-bulk-scraper | $0.0015 | bulk-file approach |
| pradio/companies-house | $0.0032 | |
| scrapesage/companies-house-scraper | $0.004 (+$0.002/officer) | live API |

Prices checked on the Apify Store in October 2026. Error rows are free. The run stops cleanly when your maximum total charge is reached.

### FAQ

**How fresh is the data?** Companies House rebuilds the Basic Company Data file monthly (compiled to the previous month end and published within 5 working days). Each row has `dataSnapshot`. For same-day changes use the Companies House service via the `companiesHouseUrl` link.

**Are dissolved companies included?** No. The bulk file covers live companies (active, proposal to strike off, liquidation, administration, etc.).

**Directors / persons with significant control (PSC)?** Not in this version. PSC (owners) data is planned for a later version.

**Is this legal to use?** Yes. The data is published by Companies House for reuse under the Open Government Licence v3.0 (data.gov.uk lists Basic Company Data as Creative Commons Attribution). The download site's robots.txt allows everything. Attribution: *Contains public sector information licensed under the Open Government Licence v3.0, Companies House.* Registered office addresses can identify sole directors' homes; if you use the data for marketing, you are the data controller and need a lawful basis under UK GDPR / PECR.

**Why did a company number come back as "not found"?** It is dissolved (not in the file), mistyped, or newer than the snapshot.

### Use with AI agents (Apify MCP)

Add this Actor to Claude, ChatGPT or Cursor through the [Apify MCP server](https://mcp.apify.com) and ask, for example: *"List 50 software companies incorporated in Manchester last month with their registered addresses"* or *"Check the status of these 200 company numbers"*. The agent fills in `postTowns`, `sicCodes`, `incorporatedWithinDays` or `companyNumbers` and gets structured JSON back.

# Actor input Schema

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

New-company leads: only companies incorporated in the N days before the monthly data snapshot date (the snapshot is compiled to the end of the previous month). 0 = any date.

## `incorporatedAfter` (type: `string`):

YYYY-MM-DD. Overrides *last N days*.

## `incorporatedBefore` (type: `string`):

YYYY-MM-DD. Optional upper bound.

## `postcodePrefixes` (type: `array`):

Registered office postcode. An area (`CB`, `M`, `EC`), a district (`SW1A`, `M1` - exact outward code) or a longer prefix (`EC1V 2`). Only the shards for these areas are read, so postcode searches are the fastest.

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

Exact post town of the registered office, case-insensitive, e.g. `Cambridge`, `Leeds`, `London`.

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

SIC 2007 codes or prefixes: `62020` (IT consultancy), `6201` or `62` (all IT/software), `56` (food & drink service), `41` (construction of buildings). A company matches if any of its up to 4 SIC codes starts with one of these.

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

Empty = all statuses in the file. The bulk file contains live companies only (dissolved companies are not included).

## `companyCategories` (type: `array`):

Empty = all company types.

## `nameContains` (type: `array`):

Words or phrases matched at word start, case-insensitive, e.g. `solar`, `dental`, `property`. Any one keyword is enough.

## `excludeDormant` (type: `boolean`):

Skip companies whose SIC code is 99999 (dormant company).

## `onlyAccountsOverdue` (type: `boolean`):

Only companies whose next accounts due date is before the snapshot date (useful for accountants' lead lists).

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

Look up specific companies, e.g. `08209948`, `SC123456`, `NI012345`, `OC301234`. Leading zeros can be omitted. When given, the filters above are ignored.

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

Stop after this many companies (0 = no limit). You pay only for companies saved.

## `sortNewestFirst` (type: `boolean`):

Return the most recently incorporated matches first (for up to 50,000 results). Off = file order, slightly faster.

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

Skip companies this saved search already returned in an earlier run (stored in your key-value store `uk-companies-house-search-state`). Schedule monthly to get only new companies.

## `stateKey` (type: `string`):

Name for the onlyNew memory, so different saved searches don't share it.

## Actor input object example

```json
{
  "incorporatedWithinDays": 31,
  "postcodePrefixes": [
    "CB"
  ],
  "statuses": [
    "active"
  ],
  "excludeDormant": false,
  "onlyAccountsOverdue": false,
  "maxResults": 20,
  "sortNewestFirst": true,
  "onlyNew": false,
  "stateKey": "default"
}
```

# Actor output Schema

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

No description

## `results` (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 = {
    "incorporatedWithinDays": 31,
    "postcodePrefixes": [
        "CB"
    ],
    "statuses": [
        "active"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/uk-companies-house-search").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 = {
    "incorporatedWithinDays": 31,
    "postcodePrefixes": ["CB"],
    "statuses": ["active"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/uk-companies-house-search").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 '{
  "incorporatedWithinDays": 31,
  "postcodePrefixes": [
    "CB"
  ],
  "statuses": [
    "active"
  ],
  "maxResults": 20
}' |
apify call gazidev/uk-companies-house-search --silent --output-dataset

```

## MCP server setup

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

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/0nkyBcIJypEnijnvN/builds/kTJNN9koNwxH1tKvY/openapi.json
