# UK Companies House Bulk Company Data - No API Key (`jpopendata/uk-companies-house-bulk`) Actor

Every live UK company from the official Companies House monthly snapshot: name, number, type, status, incorporation date, SIC, accounts/confirmation due dates, charges. Filter by name, SIC, status, type, town, postcode, date or number. No API key. Unofficial; not affiliated with Companies House.

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

## Pricing

from $1.50 / 1,000 results

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 Bulk Company Data (No API Key)

Search and export **every live UK company** from the official **Companies House Free Company Data Product** — the free monthly bulk snapshot that Companies House publishes for download. No Companies House account, no API key, no scraping of the Companies House website.

Filter by company name, SIC code, status, company type, incorporation date, post town, postcode district or company number, and get clean JSON/CSV/Excel rows with SIC descriptions, accounts and confirmation statement due dates, overdue flags, charge counts and a link to each company's Companies House page.

### What you get

- **About 5.7 million live companies** (private and public limited companies, LLPs, limited partnerships, CICs, CIOs, overseas entities, registered societies and more).
- One row per company: number, name, type, status, incorporation date, country of origin, up to 4 **SIC codes with descriptions**, registered office **post town and postcode district**, accounts category, accounting reference date, last accounts date, **next accounts due date**, **confirmation statement due date**, overdue flags, mortgage charge counts, number of previous names, and the Companies House URL.
- The **snapshot date** on every row, so you always know how fresh the data is.
- Stops early: the snapshot is streamed and filtered on the fly, and the run stops as soon as it has what you asked for (the Quick start takes about 2 seconds). Searches that must read the whole snapshot take longer — see [Speed and cost](#how-it-works-speed-and-cost).

### Quick start — verified input

```json
{
  "maxItems": 20
}
```

An empty input does the same: the first 20 companies of the current snapshot (company-name order), in a few seconds.

#### More examples

Active software companies with a London registered office:

```json
{
  "sicCodes": ["62012"],
  "statuses": ["active"],
  "postTowns": ["London"],
  "maxItems": 500
}
```

Companies incorporated in September 2026 in food and drink service activities (SIC division 56):

```json
{
  "sicCodes": ["56"],
  "incorporatedFrom": "2026-09",
  "incorporatedTo": "2026-09",
  "maxItems": 5000
}
```

Look up a list of companies by number (the run stops as soon as all are found):

```json
{
  "companyNumbers": ["00445790", "SC668770", "OC333419"],
  "maxItems": 100
}
```

Companies in liquidation or administration in the Manchester postcode area:

```json
{
  "statuses": ["liquidation", "administration"],
  "postcodeDistricts": ["M"],
  "maxItems": 1000
}
```

### Input

All fields are optional. Different filters combine with **AND**; values inside one filter are alternatives (**OR**).

| Field | What it does | Example |
|---|---|---|
| `companyNameKeywords` | Words or phrases in the company name (whole words, any case). End a word with `*` for a prefix. | `["bakery", "tech*"]` |
| `sicCodes` | UK SIC 2007 codes or prefixes (2-5 digits). Matches any of a company's up to 4 SIC codes. | `["62012", "6201", "56"]` |
| `statuses` | `active`, `proposal-to-strike-off`, `liquidation`, `administration`, `receivership`, `voluntary-arrangement`, `other`; also `insolvency` (all four insolvency statuses). | `["active"]` |
| `companyTypes` | `ltd`, `plc`, `guarantee`, `unlimited`, `cic`, `llp`, `lp`, `scottish-partnership`, `cio`, `overseas-entity`, `registered-society`, `icvc`, `royal-charter`, `eeig`, `se`, `other`; plain words like `limited` or `partnership` work too. | `["ltd", "llp"]` |
| `incorporatedFrom` / `incorporatedTo` | Incorporation date range: `YYYY-MM-DD`, UK `DD/MM/YYYY`, a month `YYYY-MM` or a year `YYYY`. | `"2026-09"` |
| `postTowns` | Post town of the registered office (case, dots and hyphens ignored). | `["London", "St Albans"]` |
| `postcodeDistricts` | First half of the registered office postcode (`M1`, `RG1`, `SW1A`); `SW1` also covers `SW1A`..`SW1Y`; 1-2 letters (`M`, `LS`) match a whole postcode area. | `["M", "EC2V"]` |
| `companyNumbers` | Company numbers to look up (leading zeros optional), up to 50,000. | `["00445790"]` |
| `maxItems` | Stop after this many companies (1 to 1,000,000). Default 20. | `5000` |
| `proxyConfiguration` | Not needed (the download site answers Apify datacenter IPs). | off |

### Output

```json
{
  "companyNumber": "17339898",
  "companyName": "THE PULL GROUP LTD",
  "companyType": "Private Limited Company",
  "companyTypeCode": "ltd",
  "companyStatus": "Active",
  "companyStatusCode": "active",
  "incorporationDate": "2026-07-14",
  "dissolutionDate": null,
  "countryOfOrigin": "United Kingdom",
  "sicCodes": ["62012"],
  "sicDescriptions": ["Business and domestic software development"],
  "registeredOfficePostTown": "LONDON",
  "registeredOfficePostcodeDistrict": "EC1V",
  "registeredOfficeCountry": "UNITED KINGDOM",
  "accountsCategory": "NO ACCOUNTS FILED",
  "accountingReferenceDay": 31,
  "accountingReferenceMonth": 7,
  "accountsLastMadeUpDate": null,
  "accountsNextDueDate": "2028-04-14",
  "accountsOverdue": false,
  "confirmationStatementLastMadeUpDate": null,
  "confirmationStatementNextDueDate": "2027-07-27",
  "confirmationStatementOverdue": false,
  "mortgageChargesTotal": 0,
  "mortgageChargesOutstanding": 0,
  "mortgageChargesPartSatisfied": 0,
  "mortgageChargesSatisfied": 0,
  "limitedPartnershipGeneralPartners": 0,
  "limitedPartnershipLimitedPartners": 0,
  "previousNamesCount": 0,
  "lastNameChangeDate": null,
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/17339898",
  "snapshotDate": "2026-10-01",
  "matchedKeywords": [],
  "source": "Companies House Free Company Data Product (monthly BasicCompanyData snapshot of live companies)",
  "sourceUrl": "https://download.companieshouse.gov.uk/en_output.html",
  "license": "Public register information; source: Companies House. ...",
  "retrievedAt": "2026-10-13T00:00:00.000Z"
}
```

Field notes:

- **Dates** are ISO `YYYY-MM-DD`. `accountsOverdue` / `confirmationStatementOverdue` compare the due date with the snapshot date (true = the due date had passed when the snapshot was taken; the company may have filed since).
- The **accounting reference date** (year end) is `accountingReferenceDay` / `accountingReferenceMonth`; the next accounts are made up to that day following `accountsLastMadeUpDate`.
- `companyType` / `companyStatus` are the texts as published; `companyTypeCode` / `companyStatusCode` are stable codes for filtering.
- `sicCodes[i]` belongs to `sicDescriptions[i]`. Companies with "None Supplied" have empty lists. A few older companies still carry 4-digit SIC 2003 codes.
- `dissolutionDate` is always null: the product lists live companies only.
- The **RUN_SUMMARY** record in the run's key-value store holds the snapshot date, how many parts and bytes were read, why the run stopped, and (for company-number lookups) the numbers that were not found.

### How it works, speed and cost

Companies House publishes the snapshot as 7 ZIP files (about 490 MB; about 2.8 GB of CSV; 5.7 million companies) in **company-name order**, within 5 working days of each month end; it covers the register up to the end of the previous month. This Actor reads the product page, then streams the ZIP files in order, decompresses and filters them in memory (nothing is stored), pushes the matching companies, and **closes the download as soon as `maxItems` companies are found** (or all requested company numbers).

- **Searches that reach `maxItems` early finish in seconds** and download only the start of the first file (the Quick start: about 2 seconds, 2 requests, 0.1 MB). Broad filters often stop inside the first file, e.g. active software companies in London with `maxItems` up to a few thousand.
- **Searches that must look at every company take about 20-30 minutes**: company-number lookups where a number is missing, narrow filters (a rare SIC code in one postcode district) and large exports. Measured in October 2026 at the default 256 MB: two whole-snapshot reads took 24 and 26 minutes, because most files download from the Companies House CDN to Apify at only about 0.3 MB/s. The Actor mostly waits during that time, so platform usage stays small (about 0.1 compute units for a full read).
- Put many lookups in one run (up to 50,000 numbers) rather than many runs: one full read serves them all.
- The run keeps going for up to its timeout (default 1 hour) and stops 90 seconds before it with the rows found so far (`complete: false` in RUN_SUMMARY), so a short timeout never loses what was already found.
- Results come in company-name order. If you want "the newest" companies, filter by `incorporatedFrom` instead of relying on order.

### Empty results?

- **Dissolved companies are not in the snapshot.** It lists live companies only (active, proposal to strike off, liquidation, administration, receivership, voluntary arrangement).
- **Very new companies appear once a month**: the snapshot covers incorporations up to the end of the month before its date (see `snapshotDate`).
- **Post towns are free text** typed by the filer. If `postTowns` finds little, use `postcodeDistricts` (e.g. `"M1"` or the area `"M"`).
- All filters must match together. Remove one and try again.
- Keywords match whole words: `"tech"` does not match `TECHNOLOGY`; use `"tech*"`.

### Common input mistakes

| Wrong | Right | Why |
|---|---|---|
| `"sicCodes": ["software"]` | `"sicCodes": ["62012"]` or `"companyNameKeywords": ["software"]` | SIC codes are numbers |
| `"postcodeDistricts": ["London"]` | `"postTowns": ["London"]` | towns and postcodes are separate filters |
| `"postTowns": ["SW1A 1AA"]` | `"postcodeDistricts": ["SW1A"]` | only the district (first half) is compared |
| `"statuses": ["dissolved"]` | (not available) | the snapshot lists live companies only |
| `"incorporatedFrom": "09/01/2026"` meaning 1 September | `"incorporatedFrom": "2026-09-01"` | slash dates are read as UK day/month/year |
| `"companyNumbers": ["ACME LTD"]` | `"companyNameKeywords": ["acme"]` | numbers look like `00445790` / `SC668770` |

### Privacy: what is deliberately left out

- **No officers, no PSCs** (persons with significant control), no contact details: the product contains none, and this Actor never requests any officer or PSC source.
- **The registered office is reduced to the post town and the postcode district** (e.g. `LONDON`, `EC1V`). Street address lines, care-of names, PO boxes, counties and full postcodes are dropped, because a small company's registered office is often a director's home. Post towns that contain a house number or a street name are cut down or left empty.
- Previous company names are counted (`previousNamesCount`), not listed.

### Legal and attribution

- **Unofficial tool, not affiliated with or endorsed by Companies House.** It uses only the publicly downloadable Free Company Data Product (`https://download.companieshouse.gov.uk/en_output.html`, robots.txt allows all paths).
- Source: **Companies House**. Companies House states: *"Companies House imposes no rules or requirements on how the information on the public register is used."* Its re-use guidance also says customers must take their own legal advice on possible third-party copyright, must not reproduce the Crown insignia, and must credit Companies House as the source when using information from its guidance, website, publications or statistics. Every row carries `source`, `sourceUrl` and `license` for attribution.
- Company register data is public, but you are responsible for how you use it, including UK GDPR / the Data Protection Act 2018 and the PECR rules on electronic marketing. Company names can contain personal names (e.g. a sole director's company); treat them accordingly.
- The data is a monthly snapshot and is provided "as is"; Companies House does not verify the information companies file. Check the Companies House page (`companiesHouseUrl`) for the latest filings before relying on a record.

### Issues and feedback

Found a problem or need another filter? Open an issue on the Issues tab with the run ID.

# Actor input Schema

## `companyNameKeywords` (type: `array`):

Optional. Words or phrases in the company name (whole words, any case), e.g. "bakery", "property management", "b\&q". End a word with \* to match any word starting with it: "tech\*" finds TECH, TECHNOLOGY, TECHNICAL. A company matches if its name contains ANY of them.

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

Optional. UK SIC 2007 codes or prefixes (2 to 5 digits), e.g. "62012" (business and domestic software development), "6201" (every code starting 6201), "56" (food and beverage service activities), "41" (construction of buildings). A company matches if ANY of its up to 4 SIC codes starts with one of them.

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

Optional. active, proposal-to-strike-off, liquidation, administration, receivership, voluntary-arrangement, other. Words such as "strike off" or "insolvency" (= liquidation + administration + receivership + voluntary-arrangement) also work. The snapshot lists LIVE companies only: dissolved companies are never in it. Empty = every status.

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

Optional. ltd, plc, guarantee (limited by guarantee), unlimited, cic, llp, lp, scottish-partnership, cio (charitable incorporated organisation), overseas-entity, registered-society, icvc, royal-charter, eeig, se, other (incl. overseas companies). Plain words such as "limited", "public" or "partnership" also work. Empty = every type.

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

Optional. Earliest incorporation date: YYYY-MM-DD ("2026-09-01"), UK DD/MM/YYYY ("01/09/2026"), a month ("2026-09" = from 1 September) or a year ("2025"). The snapshot covers companies registered up to the end of the month before its date, so new incorporations appear once a month.

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

Optional. Latest incorporation date (inclusive), same forms as above; a month ("2026-09") means up to its last day.

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

Optional. Post town of the registered office as written in the register, e.g. "London", "Manchester", "St Albans", "Newcastle upon Tyne" (case, dots and hyphens are ignored). Counties and countries are not post towns. If a town gives few results, try postcode districts instead.

## `postcodeDistricts` (type: `array`):

Optional. The first half of the registered office postcode (outward code), e.g. "M1", "RG1", "EC2V", "SW1A"; a district ending in a digit such as "SW1" also covers SW1A..SW1Y. Postcode areas (1-2 letters such as "M", "LS" or "SW") match every district in the area. A full postcode is reduced to its district; full postcodes are never output.

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

Optional. Companies House numbers to look up, e.g. "00445790", "SC668770", "OC333419" (leading zeros may be left out). The run stops as soon as all of them are found; if any is missing (dissolved companies, or registered after the snapshot date) the whole snapshot is read (about 25 minutes) and the missing numbers are listed in the RUN_SUMMARY record. Up to 50,000 numbers per run.

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

Stop after this many companies (1..1,000,000). Rows come in company-name order, so a small number returns the first matches alphabetically and usually finishes in seconds. A search that never reaches this number has to read the whole snapshot (about 490 MB of ZIP files), which took about 25 minutes in October 2026 because the files download slowly from the Companies House CDN.

## `proxyConfiguration` (type: `object`):

Not needed: the Companies House download site answers Apify datacenter IPs directly. Leave off unless you have a reason to route the download through a proxy (one sticky session per run, no rotation).

## Actor input object example

```json
{
  "companyNameKeywords": [],
  "sicCodes": [],
  "statuses": [],
  "companyTypes": [],
  "incorporatedFrom": "",
  "incorporatedTo": "",
  "postTowns": [],
  "postcodeDistricts": [],
  "companyNumbers": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (type: `string`):

One row per company in company-name order, with the snapshot date and the attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "companyNameKeywords": [],
    "sicCodes": [],
    "statuses": [],
    "companyTypes": [],
    "incorporatedFrom": "",
    "incorporatedTo": "",
    "postTowns": [],
    "postcodeDistricts": [],
    "companyNumbers": [],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/uk-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 = {
    "companyNameKeywords": [],
    "sicCodes": [],
    "statuses": [],
    "companyTypes": [],
    "incorporatedFrom": "",
    "incorporatedTo": "",
    "postTowns": [],
    "postcodeDistricts": [],
    "companyNumbers": [],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/uk-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 '{
  "companyNameKeywords": [],
  "sicCodes": [],
  "statuses": [],
  "companyTypes": [],
  "incorporatedFrom": "",
  "incorporatedTo": "",
  "postTowns": [],
  "postcodeDistricts": [],
  "companyNumbers": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jpopendata/uk-companies-house-bulk --silent --output-dataset

```

## MCP server setup

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