# UK Companies House Scraper (`parsebird/uk-companies-house-scraper`) Actor

Stream the full UK Companies House data snapshot and filter 5M+ companies by SIC code, status, location, and incorporation date. Fast, free, server-side filtering at scale.

- **URL**: https://apify.com/parsebird/uk-companies-house-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### UK Companies House Scraper

**UK Companies House Scraper** streams the official [Companies House](https://find-and-update.company-information.service.gov.uk/) free company data snapshot — 5 million+ UK companies — and filters it server-side by SIC code, company status, legal type, postcode, county, and incorporation date, so you never have to download or parse the raw 500 MB file yourself.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Filter the entire UK company register by up to ten criteria at once — SIC code prefix, SIC keyword, status, legal type, postcode/town/county/country, and incorporation date range — and get clean, structured JSON back in minutes.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Actor ID `parsebird/uk-companies-house-scraper` on Apify. Call it with the `ApifyClient` (`from apify_client import ApifyClient; client = ApifyClient("<APIFY_TOKEN>"); run = client.actor("parsebird/uk-companies-house-scraper").call(run_input={"companyStatuses": ["Active"], "sicCodePrefixes": ["62", "63"], "postTowns": ["LONDON"], "maxResults": 5000}); items = client.dataset(run["defaultDatasetId"]).list_items().items`) — key inputs are `snapshotMonth` (string, default latest), `companyStatuses` (array, default `["Active"]`), `companyCategories` (array), `sicCodePrefixes` (array of strings, e.g. `["62","63"]`), `sicKeywords` (array of strings), `nameContains` (string), `postCodePrefixes`/`postTowns`/`counties`/`countries` (arrays), `incorporatedSince`/`incorporatedBefore` (YYYY-MM-DD), and `maxResults` (integer, `0` = unlimited); each output record has `companyName`, `companyNumber`, `status`, `category`, `incorporationDate`, `address`, `sicCodes`, `accounts`, `mortgages`, `previousNames`, `confirmationStatement`, `url`, and `apiUrl`; API docs at `https://apify.com/parsebird/uk-companies-house-scraper/api` and a token at `https://console.apify.com/settings/integrations`.

### What does UK Companies House Scraper do?

Companies House publishes a free bulk snapshot of every live UK company, but it's a single ~500 MB ZIP containing a ~2 GB CSV with 5 million+ rows — not something you can filter by hand, and the [Companies House REST API](https://developer-specs.company-information.service.gov.uk/) only supports per-company lookups, so scanning a whole industry sector means one HTTP request per company.

This actor solves both problems. It streams the ZIP straight from Companies House, decompresses and parses the CSV on the fly, applies your filters row-by-row, and stops as soon as it has enough matches — so a narrow query (a SIC code plus a city) can finish in a couple of minutes without ever downloading the full snapshot.

- 🔍 Filter by **SIC code prefix or free-text keyword** — industry classification down to the sub-code
- 📍 Filter by **postcode prefix, post town, county, or country** — from a single postcode district to all of Scotland
- 🏢 Filter by **company status and legal type** (Ltd, PLC, LLP, CIC, and 15+ others)
- 📅 Filter by **incorporation date range** — find newly registered companies or long-established ones
- 📛 Filter by **company name substring**
- ⚡ **Stops early** once `maxResults` is reached instead of always scanning the full register
- 📊 Full company profiles: registered address, SIC codes, accounts and confirmation statement dates, mortgage/charge counts, and previous company names
- 🔗 Direct links to each company's [Companies House](https://find-and-update.company-information.service.gov.uk/) page and REST API endpoint
- 📅 Runs on Apify's **scheduler** for recurring extracts, with full **API access** and export to JSON, CSV, or Excel

### What data can you extract from Companies House?

| Field | Description |
|-------|-------------|
| `companyName` | Registered company name |
| `companyNumber` | Unique Companies House registration number |
| `status` | e.g. `Active`, `Liquidation`, `In Administration` |
| `category` | Legal type, e.g. `Private Limited Company`, `Limited Liability Partnership` |
| `incorporationDate` | Date of incorporation (YYYY-MM-DD) |
| `dissolutionDate` | Dissolution date, if applicable |
| `address` | Registered office address (line 1/2, post town, county, country, postcode) |
| `sicCodes` | Up to 4 SIC industry classification codes with descriptions |
| `accounts` | Accounts filing category, reference date, next/last due dates |
| `returns` / `confirmationStatement` | Annual return / confirmation statement due dates |
| `mortgages` | Counts of charges (total, outstanding, part-satisfied, satisfied) |
| `previousNames` | Prior company names with the date each change took effect |
| `url` / `apiUrl` | Direct links to the public register page and the Companies House REST API |

### How to use UK Companies House Scraper

1. Open the actor's **Input** tab on Apify.
2. Choose your filters — for example, set **SIC code prefixes** to `62,63` for IT companies and **Post towns** to `LONDON`.
3. Set **Company status** to `Active` (the default) to skip liquidated or dissolved-in-progress companies.
4. Set **Max results** — start low (e.g. `1000`) to preview matches before running an unlimited extraction.
5. Click **Start** and watch the run log for scan progress.
6. Open the **Dataset** tab and export your results as JSON, CSV, or Excel — or pull them via the [Apify API](https://docs.apify.com/api/v2).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| snapshotMonth | string | No | latest | Snapshot month, format `YYYY-MM`. Companies House only keeps the current month online; an unavailable month throws an error listing what's actually available. |
| companyStatuses | array | No | `["Active"]` | Keep only these statuses. Empty = all statuses. |
| companyCategories | array | No | `[]` | Keep only these legal types. Empty = all types. |
| sicCodePrefixes | array | No | `[]` | OR-matched SIC code prefixes, e.g. `["62","63"]`. |
| sicKeywords | array | No | `[]` | OR-matched, case-insensitive substrings in SIC descriptions. |
| nameContains | string | No | `""` | Case-insensitive substring match on company name. |
| postCodePrefixes | array | No | `[]` | OR-matched UK postcode outward-code prefixes, e.g. `["EC","SW1"]`. |
| postTowns | array | No | `[]` | Exact (case-insensitive) match on registered post town. |
| counties | array | No | `[]` | Substring match on registered county. |
| countries | array | No | `[]` | Substring match on registered country (`ENGLAND`, `SCOTLAND`, `WALES`, `NORTHERN IRELAND`). |
| incorporatedSince | string | No | `""` | Only companies incorporated on/after this date, `YYYY-MM-DD`. |
| incorporatedBefore | string | No | `""` | Only companies incorporated on/before this date, `YYYY-MM-DD`. |
| maxResults | integer | No | `0` | Stop after this many matches. `0` = scan the full snapshot. |
| logEveryNRows | integer | No | `100000` | How often to log scan progress. |

All filters other than `companyStatuses`/`companyCategories` combine with **AND** logic; values *within* an array filter (e.g. multiple SIC prefixes) combine with **OR** logic.

### Output example

```json
{
  "companyName": "ACME TECHNOLOGIES LIMITED",
  "companyNumber": "12345678",
  "status": "Active",
  "category": "Private Limited Company",
  "incorporationDate": "2020-06-01",
  "dissolutionDate": null,
  "address": {
    "line1": "10 Fintech Square",
    "line2": null,
    "postTown": "LONDON",
    "county": null,
    "country": "UNITED KINGDOM",
    "postCode": "EC2A 1AB"
  },
  "sicCodes": ["62012 - Business and domestic software development"],
  "accounts": {
    "referenceDay": "30",
    "referenceMonth": "6",
    "nextDueDate": "2025-03-31",
    "lastMadeUpDate": "2024-06-30",
    "category": "TOTAL EXEMPTION FULL"
  },
  "mortgages": { "numCharges": 0, "numOutstanding": 0, "numPartSatisfied": 0, "numSatisfied": 0 },
  "previousNames": [],
  "confirmationStatement": { "nextDueDate": "2026-06-14", "lastMadeUpDate": "2025-06-01" },
  "url": "https://find-and-update.company-information.service.gov.uk/company/12345678",
  "apiUrl": "https://api.company-information.service.gov.uk/company/12345678"
}
```

### Use cases

- **Sales prospecting** — pull every active company in a target industry (SIC prefix) and city for cold outreach or CRM import
- **Market sizing** — count how many companies of a given legal type or sector exist in a region
- **New-business monitoring** — filter by `incorporatedSince` to find recently registered companies before competitors reach them
- **Investor and compliance research** — list all active PLCs, LLPs, or CICs nationwide
- **Data enrichment** — cross-reference a list of company names or postcodes against the full register
- **Academic and journalistic research** — analyze company formation and dissolution trends by sector or region

### How it works

1. **Snapshot discovery** — the actor reads the Companies House [download index page](https://download.companieshouse.gov.uk/en_output.html) and resolves the requested (or latest) `BasicCompanyDataAsOneFile-YYYY-MM-DD.zip` snapshot.
2. **Streaming download** — the ZIP is streamed directly from Companies House; nothing is written to disk.
3. **Streaming decompression** — the CSV inside is decompressed on the fly, in lockstep with the download, so the actor can start emitting matches before the ZIP has finished downloading.
4. **Row-by-row filtering** — each row is tested against every active filter (status, category, SIC, name, postcode, town, county, country, incorporation date) as it's parsed.
5. **Batch dataset writes** — matching rows are normalized and pushed to the Apify dataset in batches of 500.
6. **Early stop** — once `maxResults` matches are saved, the actor closes the download immediately instead of scanning the remaining rows.

Because filtering happens while streaming, a narrow query (a SIC code plus a postcode prefix, for example) can finish in a couple of minutes. An unfiltered run has to scan and save every one of the 5 million+ rows on the register, which can take up to 20+ minutes and produce a multi-million-row dataset — start with a low `maxResults` to preview your filter first.

### How much does it cost to scrape Companies House data?

This actor uses the [Pay-Per-Event](https://docs.apify.com/platform/actors/publishing/monetize#pay-per-event-pricing-model) model — you're charged only for company records actually saved to your dataset, not for rows scanned.

| Event | Price per event | Price per 1,000 |
|-------|----------------|-----------------|
| `company-extracted` | from $0.001 | from **$1.00** |

Pricing scales down with your Apify plan tier (Free, Bronze, Silver, Gold — see the actor's Pricing tab for exact tier rates). Pulling 5,000 active IT companies in London, for example, costs roughly $5–7 depending on your plan. Apify's [platform usage credits](https://apify.com/pricing) apply on top of any plan you're already on.

### Is it legal to scrape Companies House data?

Yes. Companies House publishes this data specifically as a free, open [bulk data product](https://download.companieshouse.gov.uk/en_output.html) under the [Open Government Licence](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/), intended for exactly this kind of bulk reuse. This actor reads only that public snapshot — no login, scraping of rendered pages, or bypassing of access controls is involved. For general web scraping legality, see Apify's [guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/). Always comply with UK GDPR and your own applicable data protection obligations when using extracted data for marketing or outreach.

### Related Actors

- [Pappers.fr Company Scraper](https://apify.com/parsebird/pappers-scraper) — the French company registry equivalent (SIREN, directors, NAF codes)
- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — pull emails, phone numbers, and social profiles once you have a list of companies
- [Shopify Store Leads Scraper](https://apify.com/parsebird/shopify-store-leads-scraper) — find e-commerce leads to combine with Companies House filters

### FAQ

**How often does the snapshot update?**
Companies House republishes the full snapshot around the 1st of each month. This actor always resolves to whichever snapshot is currently live unless you set `snapshotMonth`.

**Can I get dissolved companies?**
No — the Companies House bulk snapshot only contains companies still on the live register, so there's no "Dissolved" status to filter by. For a specific dissolved company's history, use the Companies House REST API directly.

**Why is my run scanning millions of rows even with a low `maxResults`?**
The actor has to scan from the start of the file in company-name order, so a very narrow or rare filter combination (an obscure SIC code with rare status/location combinations) can require scanning further before finding enough matches. Broaden a filter or raise the log frequency to monitor progress.

**Can I schedule recurring runs?**
Yes — use Apify's [scheduler](https://docs.apify.com/platform/schedules) to re-run this actor daily, weekly, or monthly and catch newly incorporated companies automatically.

**Can I access this via API?**
Yes — every run, dataset, and input is available through the [Apify API](https://docs.apify.com/api/v2) and official client libraries for [Python](https://docs.apify.com/api/client/python/) and [JavaScript](https://docs.apify.com/api/client/js/).

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("parsebird/uk-companies-house-scraper").call(run_input={
    "companyStatuses": ["Active"],
    "sicCodePrefixes": ["62", "63"],
    "postTowns": ["LONDON"],
    "maxResults": 5000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["companyName"], item["companyNumber"])
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('parsebird/uk-companies-house-scraper').call({
    companyStatuses: ['Active'],
    sicCodePrefixes: ['62', '63'],
    postTowns: ['LONDON'],
    maxResults: 5000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Found an issue or have a feature request? Use the actor's **Issues** tab on Apify — feedback shapes what gets built next.

# Actor input Schema

## `snapshotMonth` (type: `string`):

Which monthly Companies House snapshot to use, format YYYY-MM. Leave blank to use the latest available snapshot. Companies House only keeps the current month's snapshot online — an older value throws an error listing which snapshot dates are actually available.

## `companyStatuses` (type: `array`):

Keep only companies with these statuses (exact values used by Companies House — this snapshot only contains companies still on the register, so there is no 'Dissolved' status). 'Active' is almost always the right choice for lead generation. Leave empty to include every status.

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

Keep only these legal entity types (exact values used by Companies House). Leave empty to include every type.

## `sicCodePrefixes` (type: `array`):

Filter by SIC industry code prefix, matched against the numeric start of each company's SIC codes (up to 4 per company). Multiple values are OR-ed, e.g. \["62", "63"] for IT and information services. Leave empty to skip. See the README for a full prefix reference.

## `sicKeywords` (type: `array`):

Case-insensitive substring match against the SIC description text (e.g. 'software', 'consulting'). Multiple values are OR-ed. Combines with SIC code prefixes using AND logic. Leave empty to skip.

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

Case-insensitive substring match on the registered company name, e.g. 'TECH' or 'GROUP'. Leave blank to include all names.

## `postCodePrefixes` (type: `array`):

Filter by UK postcode outward-code prefix, e.g. \["EC", "SW1"] for parts of London, or \["M"] for all of Manchester. Multiple values are OR-ed. Leave empty to skip.

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

Exact (case-insensitive) match on the registered post town, e.g. \["LONDON"] or \["MANCHESTER", "SALFORD"]. Leave empty to skip.

## `counties` (type: `array`):

Case-insensitive substring match on the registered county, e.g. \["GREATER LONDON"]. Leave empty to skip.

## `countries` (type: `array`):

Case-insensitive substring match on the registered country: England, Scotland, Wales, or Northern Ireland. Leave empty to skip.

## `incorporatedSince` (type: `string`):

Only keep companies incorporated on or after this date, format YYYY-MM-DD. Useful for finding new businesses. Leave blank for no lower bound.

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

Only keep companies incorporated on or before this date, format YYYY-MM-DD. Useful for finding established businesses. Leave blank for no upper bound.

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

Stop once this many matching companies have been saved. The actor still has to scan the snapshot from the start, so a low value here also makes the run finish faster. Set to 0 to scan the full snapshot and save every match (can be 3,000,000+ rows with no filters — expect 15-25 minutes).

## `logEveryNRows` (type: `integer`):

How often (in CSV rows scanned) to log progress to the run console. The snapshot has 5M+ rows; lower values give more frequent updates but noisier logs.

## Actor input object example

```json
{
  "snapshotMonth": "",
  "companyStatuses": [
    "Active"
  ],
  "companyCategories": [],
  "sicCodePrefixes": [
    "62",
    "63"
  ],
  "nameContains": "",
  "incorporatedSince": "",
  "incorporatedBefore": "",
  "maxResults": 50,
  "logEveryNRows": 100000
}
```

# Actor output Schema

## `dataset` (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 = {
    "snapshotMonth": "",
    "companyStatuses": [
        "Active"
    ],
    "sicCodePrefixes": [
        "62",
        "63"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/uk-companies-house-scraper").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 = {
    "snapshotMonth": "",
    "companyStatuses": ["Active"],
    "sicCodePrefixes": [
        "62",
        "63",
    ],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/uk-companies-house-scraper").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 '{
  "snapshotMonth": "",
  "companyStatuses": [
    "Active"
  ],
  "sicCodePrefixes": [
    "62",
    "63"
  ],
  "maxResults": 50
}' |
apify call parsebird/uk-companies-house-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/jbqguZL55IHyuc8TG/builds/8fowy3BZuBOYTtfAw/openapi.json
