# UK Company Register (Companies House bulk data) (`delfielectronics/uk-company-register`) Actor

All live UK companies from the official Companies House monthly snapshot: filter by SIC code, postcode, town, status, type, incorporation date. No API key, no proxy, no officers.

- **URL**: https://apify.com/delfielectronics/uk-company-register.md
- **Developed by:** [Artur Flamandzki](https://apify.com/delfielectronics) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 Company Register (Companies House bulk data)

Get **every live UK company** as clean JSON, straight from the official **Companies House Free Company Data
Product**: the monthly snapshot of the whole register (about 5.6 million companies). No API key, no login, no
proxy and no browser. Filter by **SIC code, postcode area/district/sector, post town, company status, company
type, incorporation date and name keywords**.

Every company becomes one record: company number, name, status, type, country of origin, incorporation and
dissolution date, registered office address, up to four **SIC codes with their descriptions**, accounts
(reference date, next due, last made up, category), confirmation statement dates, mortgage and partnership
counts, previous names and the link to the company's page on the Companies House service.

### What you can use it for

- **New-company leads**: companies incorporated in the last 30 days in your industry (SIC) and region; run it
  monthly with **Only companies not returned before** to get only the new ones.
- **Market sizing and territory planning**: count companies by SIC code, postcode area and type.
- **Accounts and compliance services**: companies with accounts or confirmation statements due soon.
- **CRM enrichment and AI agents**: structured company data via the Apify API, integrations or MCP.

### How it works

1. The actor reads the Companies House download page and picks the newest complete monthly snapshot (published
   within 5 working days of each month end, split into about 7 zip parts of 50-70 MB).
2. Each part is downloaded, checked and read row by row; your filters run on every row, so the whole register is
   scanned in a few minutes.
3. When **Max companies** is reached, the remaining parts are neither downloaded nor charged.

### Input

| Field | What it does |
|---|---|
| SIC codes | Prefixes of 1-5 digits on any of a company's four SIC codes, e.g. `62` (IT), `4110`, `56101` |
| Postcodes | Area `M` (not `ME`), district `M1` (not `M14`) or sector `EC1A 1` of the registered office |
| Post towns | Exact town, case and accents ignored |
| Company statuses | Active by default; also proposal to strike off, liquidation, administration, receivership |
| Company types | e.g. Private Limited Company, LLP, Community Interest Company; empty = all |
| Incorporated in the last N days | Counted back from the snapshot date; or set **Incorporated from** / **to** dates |
| Name keywords | Whole words or phrases in the current company name |
| Include previous names | Former names with the date they changed (on by default) |
| Only companies not returned before + Memory name | Monthly lead feeds; one memory name per feed |
| Max companies | Stop after this many |

### Output example

```json
{
  "companyNumber": "17511052",
  "name": "THE PROSPECT LAB LTD",
  "status": "Active",
  "category": "Private Limited Company",
  "countryOfOrigin": "United Kingdom",
  "incorporationDate": "2026-10-09",
  "dissolutionDate": null,
  "registeredAddress": {"poBox": null, "line1": "FLAT 5 FRISTON HOUSE 52-53", "line2": "THE BROADWAY",
                        "postTown": "LONDON", "county": null, "country": "ENGLAND", "postcode": "W5 5JN"},
  "sicCodes": [{"code": "62020", "text": "Information technology consultancy activities"}],
  "accounts": {"refDay": 31, "refMonth": 10, "nextDue": "2028-07-09", "lastMadeUp": null,
               "category": "NO ACCOUNTS FILED"},
  "confirmationStatement": {"nextDue": "2027-10-22", "lastMadeUp": null},
  "mortgages": {"charges": 0, "outstanding": 0, "partSatisfied": 0, "satisfied": 0},
  "limitedPartnership": {"generalPartners": 0, "limitedPartners": 0},
  "previousNames": [],
  "uri": "http://business.data.gov.uk/id/company/17511052",
  "url": "https://find-and-update.company-information.service.gov.uk/company/17511052",
  "snapshotDate": "2026-11-01",
  "source": "Contains Companies House data (Creative Commons Attribution)"
}
```

The run also writes a **SUMMARY** record to its key-value store: snapshot date, parts read, rows read and
skipped, rows with replaced characters, invalid dates, companies matched and saved, status or type values new to
the actor, bytes downloaded and why the run stopped.

### Pricing

Pay per event, no subscription. The prices are on the **Pricing** tab; you are charged for two events:

| Event | When |
|---|---|
| File part (`file-part`) | once per snapshot part read (about 7 for the whole register), after the part is downloaded and checked |
| Company (`company`) | once per company saved to the dataset |

- A run starts only when your remaining budget covers one file part and one company; otherwise nothing is
  downloaded. The same check runs before every next part, so no part is downloaded or charged that your budget
  cannot pay together with at least one company. A part that fails to download is not charged.
- The form starts with **Max companies** = 100 for a cheap first run; the API default is 100000.
- Set a maximum cost per run in Apify and the actor stops cleanly when it is reached.

### Data and privacy

Source: **Companies House**, the UK registrar of companies. The actor uses only the Free Company Data Product
that Companies House publishes for download; it does not call the Companies House API and does not scrape the
website. The dataset is listed on data.gov.uk under the Creative Commons Attribution licence; credit:
*Contains Companies House data*.

The register is public by law. Company names and registered office addresses are company data. The actor
**drops the "care of" field** (it often names a person) and the legacy annual return dates, and it reads **no
officers, persons with significant control or contact data**.

### Known limits

- The snapshot holds **live companies only** (no dissolved ones) and is refreshed monthly, so the newest
  incorporations appear up to about a month later than on the Companies House service.
- Rows are sorted by company name, so every run with filters scans the whole register (about 400 MB of zip files);
  the filters do not reduce the parts downloaded, only **Max companies** does.
- Status and company type values are the ones Companies House publishes; a value new to the actor is listed in
  the SUMMARY and cannot be selected until the actor is updated.

# Actor input Schema

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

Keep companies with any of their (up to 4) SIC codes starting with these 1-5 digits (e.g. 62 = IT and computer programming, 4110 = property development, 56101 = restaurants). Empty = all.

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

Registered office postcode: an area (letters only, e.g. M = Manchester, not ME), a district (outward code, e.g. M1, not M14) or a sector or longer prefix after the space (e.g. EC1A 1). Empty = everywhere.

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

Registered office post town, exact (case and accents ignored, e.g. Leeds). Empty = all.

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

Keep companies with these statuses. Empty = all live companies (the snapshot holds no dissolved ones).

## `categories` (type: `array`):

Keep these company types (as published by Companies House). Empty = all.

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

Companies incorporated on the last day of the window and the N days before it; the window ends on 'Incorporated to', else on the snapshot date (the snapshot is published monthly). 0 = no lower limit. Ignored when 'Incorporated from' is set.

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

First incorporation date to keep (YYYY-MM-DD). Overrides 'Incorporated in the last N days'.

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

Last incorporation date to keep (YYYY-MM-DD). Empty = no upper limit.

## `keywords` (type: `array`):

Keep companies whose current name contains any of these whole words or phrases (case and accents ignored, e.g. solar, property management). Empty = all.

## `includePreviousNames` (type: `boolean`):

Add the company's previous names with the dates they changed.

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

Return only companies this actor has not returned to you before under the same memory name and filters (memory kept 400 days): run it monthly for new-company leads.

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

Name of the 'Only companies not returned before' memory (1-50 letters, digits, - or \_). Use different names for separate lead feeds.

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

Stop after saving this many companies; the remaining file parts are then neither downloaded nor charged. The form starts at 100 for a cheap first run; the API default is 100000.

## Actor input object example

```json
{
  "sicCodes": [
    "62"
  ],
  "postcodePrefixes": [],
  "postTowns": [],
  "statuses": [
    "Active"
  ],
  "categories": [],
  "incorporatedWithinDays": 30,
  "keywords": [],
  "includePreviousNames": true,
  "onlyNew": false,
  "stateKey": "default",
  "maxItems": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

The run's companies in the Store table view.

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

Every field of every company record.

# 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": [
        "62"
    ],
    "incorporatedWithinDays": 30,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("delfielectronics/uk-company-register").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": ["62"],
    "incorporatedWithinDays": 30,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("delfielectronics/uk-company-register").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": [
    "62"
  ],
  "incorporatedWithinDays": 30,
  "maxItems": 100
}' |
apify call delfielectronics/uk-company-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,delfielectronics/uk-company-register"
        }
    }
}
```

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/GZcBHLkbRl5rDqM9X/builds/ONyhXZoDeZdIn3XYQ/openapi.json
