# UK Companies House Company Data (Official Monthly Bulk File) (`busy_courtyard/companies-house-bulk`) Actor

Filter the UK Companies House register of live companies by name, SIC code, status, type, incorporation date and postcode, using the official free monthly bulk file. Company-level data only.

- **URL**: https://apify.com/busy_courtyard/companies-house-bulk.md
- **Developed by:** [Cole Cassel](https://apify.com/busy_courtyard) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 (Official Monthly Bulk File)

Filter the UK's register of **live companies** by name, SIC code, status, company type, incorporation date, postcode or post town. The data comes from the **free monthly "Basic Company Data" snapshot that Companies House publishes** for download, not from the Companies House website or its API.

Pricing: **$0.001 per company** saved, plus **$0.03 per part of the file read**. The snapshot comes in 7 parts. A name-prefix search usually reads 1 part; other filters read all 7.

### Compliance first

- **Official source only.** The actor reads the `BasicCompanyData-…-partN_7.zip` files listed on [download.companieshouse.gov.uk/en_output.html](https://download.companieshouse.gov.uk/en_output.html), the "Free Company Data Product". It doesn't use the Companies House website search, the API, or any login. That server's `robots.txt` allows all automated access (`User-agent: *` / `Disallow:` with nothing after it).
- **What GOV.UK says about this data** ([Companies House data products](https://www.gov.uk/guidance/companies-house-data-products), quoted 2026-10-18):
  - "The company data product is a free monthly snapshot of information for live companies on the public register."
  - "We impose no rules or requirements on how the information on the public register is used, and we're not responsible for your use of the company data. You are responsible for complying with any applicable data protection, copyright and other legislation and regulations."
- **Company-level fields only.** This file holds no officers, directors, or people with significant control, and the actor doesn't add any. The one column that can contain a person's name, `RegAddress.CareOf` ("care of"), is **dropped**. There is no enrichment of any kind: no emails, phone numbers, websites or social profiles.
- **Note on addresses.** A small company's registered office can be someone's home, because some owners register at home. It is public register data, but please handle it with UK GDPR in mind if you contact or profile the businesses.

### Reliable by design

- **Official bulk files, not scraped pages.** No browser, no proxies, nothing breaks when a web page changes.
- **Fails loudly instead of returning an empty "success".** The run fails with a clear error code if:
  - the download page changed or lists fewer than all parts: `INDEX_CHANGED`, `INDEX_INCOMPLETE`;
  - the newest snapshot is older than `maxSnapshotAgeDays` (45 by default): `SNAPSHOT_STALE`;
  - a zip is cut short or corrupt. The actor checks every part against its built-in CRC-32 checksum and stated size: `ZIP_TRUNCATED`, `ZIP_CORRUPT`;
  - the CSV columns change: `COLUMNS_CHANGED`;
  - a part holds far fewer companies than normal, or many damaged rows: `CSV_EMPTY`, `CSV_MALFORMED`;
  - a file is replaced mid-download: `SOURCE_CHANGED`;
  - a name-prefix search finds a part that is no longer sorted by name, so skipping parts would be unsafe: `NOT_SORTED`.
- **A part is charged only after it passes those checks.**
- **Streams and resumes.** Each 50–74 MB zip is unzipped as it downloads, never fully in memory. After a dropped connection the download resumes from the last byte, with the file's version tag checked.
- **Skips what it doesn't need.** The parts are sorted by company name, so with `companyNameStartsWith` the actor reads only the part(s) that can contain those names. It finds them by reading the first few KB of each part, and remembers that index for the month. Each part is read at most once per run.

### How fresh is the data? (Monthly)

**This is a monthly snapshot, not live data.** GOV.UK: "The snapshot contents are compiled up to the end of the previous month and made available for download within 5 working days of the previous month end." The snapshot used on 2026-10-18 is dated **2026-10-01**. Every row has `snapshotDate`. Companies formed, renamed or dissolved since then won't show the change until the next snapshot. The file lists **live companies only**, so dissolved companies aren't in it. Running more than once a month returns the same data; a monthly schedule around the 8th of each month is enough.

### Use cases

- **Market maps.** For example, every active IT consultancy (SIC 62020) incorporated this year.
- **Local prospect lists by business.** Companies in a postcode district or post town, filtered by industry.
- **Data checks.** Confirm a company's number, status, registered office, accounts dates and previous names in bulk.
- **Watch new formations.** Run monthly with `incorporatedFrom` set to the previous month.

### Input

```json
{
  "sicCodes": ["62020"],
  "statuses": ["Active"],
  "incorporatedFrom": "2026-01-01",
  "maxResults": 1000
}
```

| Field | Default | Notes |
|---|---|---|
| `companyNameStartsWith` | none | **Cheapest filter**: usually reads 1 of 7 parts |
| `companyNameContains` | none | Any of the words, not case-sensitive. Reads all parts. |
| `sicCodes` | none | Prefix match on any of a company's up to 4 SIC codes: `62` matches 62011, 62012, 62020 |
| `statuses` | none | e.g. Active; Active - Proposal to Strike off; Liquidation; In Administration |
| `companyTypes` | none | e.g. Private Limited Company; Public Limited Company; Limited Liability Partnership |
| `incorporatedFrom` / `incorporatedTo` | none | YYYY-MM-DD |
| `postcodePrefixes` | none | Area (`M`), district (`SW1A`) or sector (`SW1A 1`). `M1` doesn't match `M11`. |
| `postTowns` | none | Exact post town, e.g. `MANCHESTER` |
| `maxResults` | 1000 | Up to 500,000 |
| `maxSnapshotAgeDays` | 45 | Fail rather than return an out-of-date snapshot |
| `selfTest` | `false` | Health check: ignores other fields, fetches 5 active companies, fails if key fields are empty |

All filters must match (AND); within one filter, any value can match (OR).

### Output

A real row from a local run on 2026-10-18 (ET), searching names starting with `GREEN` in post town `BRISTOL` with status Active:

```json
{
  "companyNumber": "09702488",
  "companyName": "GREEN ACORN HOLIDAY HOMES LTD",
  "status": "Active",
  "companyType": "Private Limited Company",
  "incorporationDate": "2015-07-24",
  "dissolutionDate": null,
  "countryOfOrigin": "United Kingdom",
  "registeredOffice": {
    "poBox": null,
    "addressLine1": "27-29 NEWMINSTER HOUSE",
    "addressLine2": "BALDWIN STREET",
    "postTown": "BRISTOL",
    "county": null,
    "country": "ENGLAND",
    "postcode": "BS1 1LT"
  },
  "sicCodes": [
    {
      "code": "55100",
      "description": "Hotels and similar accommodation"
    }
  ],
  "accounts": {
    "category": "MICRO ENTITY",
    "referenceDay": 31,
    "referenceMonth": 8,
    "nextDueDate": "2027-05-31",
    "lastMadeUpDate": "2025-08-31"
  },
  "confirmationStatement": {
    "nextDueDate": "2027-08-05",
    "lastMadeUpDate": "2026-07-22"
  },
  "mortgages": {
    "charges": 0,
    "outstanding": 0,
    "partSatisfied": 0,
    "satisfied": 0
  },
  "previousNames": [
    {
      "name": "GREEN ACORN PROPERTY PONTYPRIDD LTD",
      "changedOn": "2017-01-19"
    }
  ],
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/09702488",
  "uri": "http://business.data.gov.uk/id/company/09702488",
  "snapshotDate": "2026-10-01",
  "sourceFile": "BasicCompanyData-2026-10-01-part3_7.zip"
}
```

A `RUN_SUMMARY` record in the key-value store lists the parts read, companies checked and saved, MB downloaded and seconds taken.

**Measured locally on 2026-10-18 (ET), snapshot 2026-10-01:**

- **SIC 62020 + Active + incorporated since 2026-01-01:** 22,530 companies out of 5,704,711 checked. All 7 parts were read (494 MB) and all 7 checksums passed. About 84 s.
- **Name starts with GREEN + BRISTOL + Active:** 144 companies, part 3 only (73.6 MB, 850,000 companies checked, name order confirmed), about 14 s.

### Pricing

| Event | Price |
|---|---|
| `company`, one company saved | $0.001 |
| `part-scanned`, one of the 7 parts read, charged after it passes its checks | $0.03 |

From the runs above:

- the GREEN/BRISTOL search cost 1 × $0.03 + 144 × $0.001 = **$0.174**;
- the SIC 62020 search cost 7 × $0.03 + 22,530 × $0.001 = **$22.74**. Use `maxResults` to cap it.

Apify's own small start fee also applies. If `maxResults` is reached partway through a part, that part is still charged once.

### Limits and honest caveats

- **Monthly data**, see above. Not a substitute for a live register check before a legal or financial decision. Use `companiesHouseUrl` for that.
- **Live companies only.** Dissolved companies aren't in this snapshot.
- **No people data.** If you need officers or owners, this actor deliberately doesn't provide them.
- **Part skipping relies on the files being sorted by name.** That was checked on the 2026-10-01 snapshot (all 5.7 million rows in order). Every name-prefix run re-checks the order of each row it reads and fails with `NOT_SORTED` if it breaks. A run that stops early at `maxResults` checks only the rows it read.
- This actor isn't affiliated with Companies House. Contains public sector information from Companies House.

# Actor input Schema

## `companyNameContains` (type: `array`):

A company matches if its name contains ANY of these (not case-sensitive). This needs every part of the file to be read.

## `companyNameStartsWith` (type: `array`):

The fastest and cheapest filter: the files are sorted by name, so only the parts that can hold these names are downloaded (often 1 of 7).

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

Nature-of-business codes, matched by prefix: 62 matches 62011, 62012, 62020 and so on. A company matches if any of its up to 4 codes match.

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

Exact values from the file, not case-sensitive. Common ones: Active; Active - Proposal to Strike off; Liquidation; In Administration. Leave empty for all. (The file contains live companies only, so dissolved companies are never included.)

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

Exact values, not case-sensitive, for example: Private Limited Company; Public Limited Company; Limited Liability Partnership; Community Interest Company; Charitable Incorporated Organisation; Overseas Entity.

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

A date (YYYY-MM-DD).

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

A date (YYYY-MM-DD).

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

An area (M, SW), a district (M1, SW1A) or a sector (SW1A 1). 'M1' matches M1 1AE but not M11.

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

Exact post town, not case-sensitive, e.g. MANCHESTER or LEEDS.

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

Stop after this many matching companies. Each company is billed, and so is each part of the file that is read.

## `maxSnapshotAgeDays` (type: `integer`):

Companies House publishes a new snapshot every month. If the newest one is older than this, the run fails rather than return out-of-date data.

## `maxRetries` (type: `integer`):

How many times to resume a download after a network error.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for the server before retrying.

## `selfTest` (type: `boolean`):

Ignore the other fields, fetch 5 active companies whose names start with A, and fail the run if key fields are empty or a personal field appears. Meant for a daily health-check schedule.

## Actor input object example

```json
{
  "sicCodes": [
    "62020"
  ],
  "statuses": [
    "Active"
  ],
  "incorporatedFrom": "2026-01-01",
  "maxResults": 1000,
  "maxSnapshotAgeDays": 45,
  "maxRetries": 3,
  "requestTimeoutSecs": 120,
  "selfTest": false
}
```

# Actor output Schema

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

One row per result in the default dataset.

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

Snapshot date, parts read, companies checked and saved.

# 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 = {
    "sicCodes": [
        "62020"
    ],
    "statuses": [
        "Active"
    ],
    "incorporatedFrom": "2026-01-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("busy_courtyard/companies-house-bulk").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 = {
    "sicCodes": ["62020"],
    "statuses": ["Active"],
    "incorporatedFrom": "2026-01-01",
}

# Run the Actor and wait for it to finish
run = client.actor("busy_courtyard/companies-house-bulk").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 '{
  "sicCodes": [
    "62020"
  ],
  "statuses": [
    "Active"
  ],
  "incorporatedFrom": "2026-01-01"
}' |
apify call busy_courtyard/companies-house-bulk --silent --output-dataset

```

## MCP server setup

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

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/kxQnx2d6ue5ebDGSi/builds/lysDvxOGaSN1nOP8L/openapi.json
