# UK Companies House Bulk Scraper - Directors & Owners (`automatic/uk-companies-house-bulk`) Actor

Filter millions of UK companies from the official Companies House register by SIC code, location, status, type and incorporation date. Optionally add directors and beneficial owners (PSCs). No API key needed.

- **URL**: https://apify.com/automatic/uk-companies-house-bulk.md
- **Developed by:** [Philip Kirkbride](https://apify.com/automatic) (community)
- **Categories:** Business, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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 Bulk Scraper — Companies, Directors & Owners

Build filtered lists of UK companies from the official Companies House
register, and optionally add each company's **directors** and **owners
(persons with significant control)**. Filter by industry (SIC code), location,
status, company type and incorporation date. No API key, login or proxy setup
needed.

- **Millions of live UK companies** from the official monthly register snapshot
- **Filters that combine**: SIC codes, SIC keywords, name, status, company
  type, postcode, town, county, country and an incorporation date range
- **Directors and owners on request**: current officers with role, appointment
  date and month/year of birth, plus beneficial owners, including corporate
  owners with their registration numbers and the nature of control (for
  example "75% or more of shares")
- **Up to 50,000 companies per run** (5,000 with directors or owners)

### What people use it for

- **B2B lead lists**: every active software company in Manchester, with its
  directors' names
- **New-business prospecting**: companies incorporated in the last month in
  your sector, while they are still choosing suppliers
- **Distress and turnaround signals**: companies in liquidation in a region,
  for insolvency practitioners, lenders and buyers of assets
- **Ownership research and KYC**: who controls a list of companies, including
  parent companies
- **Market mapping**: counts of companies by sector, postcode area or company
  type

### Quick start

Active IT companies in Manchester, with directors and owners:

```json
{
  "sicPrefixes": ["62"],
  "towns": ["Manchester"],
  "statuses": ["Active"],
  "includeOfficers": true,
  "includePscs": true,
  "maxItems": 200
}
```

Construction companies incorporated in 2026 (fast: no people lookups):

```json
{
  "sicPrefixes": ["41", "43"],
  "incorporationFrom": "2026-01-01",
  "maxItems": 5000
}
```

Companies in liquidation in central London postcodes:

```json
{
  "statuses": ["Liquidation"],
  "postcodePrefixes": ["EC1", "EC2", "EC3", "EC4", "WC1", "WC2", "SW1", "W1"],
  "maxItems": 1000
}
```

Values inside one filter are ORed; different filters are ANDed. SIC prefixes
and SIC keywords count as one industry filter, so a company matches when any
prefix or any keyword matches. Dates use `YYYY-MM-DD` and are inclusive.

### Filters

| Input | Example | What it matches |
|---|---|---|
| `sicPrefixes` | `["62", "6201"]` | SIC 2007 codes starting with any prefix (2–5 digits) |
| `sicKeywords` | `["software"]` | Words in the published SIC descriptions |
| `nameContains` | `["bakery"]` | Text anywhere in the company name |
| `statuses` | `["Active"]` | Exact company status, for example `Active`, `Liquidation` or `Active - Proposal to Strike off` |
| `categories` | `["Private Limited Company"]` | Exact company type, for example `Public Limited Company` or `Limited Liability Partnership` |
| `postcodePrefixes` | `["M1", "SW1A"]` | Registered-office postcode prefix, 2–7 characters (spaces ignored) |
| `towns` | `["Leeds"]` | Registered-office post town |
| `counties` | `["Kent"]` | Registered-office county |
| `countries` | `["Scotland"]` | Registered-office country |
| `incorporationFrom` / `incorporationTo` | `"2025-01-01"` | Incorporation date range |
| `snapshotMonth` | `"2026-11"` | A specific monthly release (empty means latest) |
| `maxItems` | `1000` | Hard cap on companies delivered |

#### Useful SIC prefixes

| Prefix | Industry |
|---|---|
| `41`, `43` | Construction of buildings; specialised construction trades |
| `47` | Retail trade |
| `56` | Restaurants, cafés and other food and drink services |
| `62` | Computer programming, consultancy and IT services |
| `64`–`66` | Financial services and insurance |
| `68` | Real estate |
| `69` | Legal and accounting |
| `70` | Head offices and management consultancy |
| `73` | Advertising and market research |
| `86` | Human health activities |

### Directors and owners

Turn on `includeOfficers` and/or `includePscs` to add people to every company
the filters match. Each company's public register entry is read once, and
the people appear on the same row:

- **`officers`**: current directors, secretaries and other officers with role,
  appointment date, month and year of birth, nationality, country of residence,
  correspondence address and a link to each officer's other appointments.
- **`personsWithSignificantControl`**: individuals and corporate owners with
  their nature of control (register code and wording), notified date, and, for
  corporate owners, legal form, governing law and registration number. Shown
  as `individual`, `corporate` or `other`.
- **`peopleLookup`**: the outcome for that company (`succeeded`, `notFound`,
  `failed` or `notAttempted`) and the register's own counts of active and
  resigned officers, active PSCs, PSC statements and any exemption notice.

Turn on `includeFormerPeople` to include resigned officers and ceased owners
too.

People lookups are slower than the list itself: plan on roughly one company
per second when both lists are requested. A company whose lookup does not
succeed is still delivered, with its status explained, and is **not charged**
the people lookup.

### Output

One row per company. Shortened example with directors and owners:

```json
{
  "companyNumber": "01234567",
  "companyName": "ALPHA BAKERY LIMITED",
  "companyStatus": "Active",
  "companyCategory": "Private Limited Company",
  "incorporationDate": "2017-12-14",
  "regAddress": {"postTown": "MANCHESTER", "postCode": "M1 1AA", "country": "England"},
  "sicCodes": ["10710"],
  "sicDescriptions": ["Manufacture of bread; manufacture of fresh pastry goods and cakes"],
  "accounts": {"nextDueDate": "2026-12-31", "lastMadeUpDate": "2025-12-31"},
  "mortgages": {"charges": 1, "outstanding": 1, "satisfied": 0},
  "companyProfileUrl": "https://find-and-update.company-information.service.gov.uk/company/01234567",
  "officers": [
    {"name": "BAKER, Ada Jane", "role": "Director", "status": "active",
     "appointedOn": "2017-12-14", "dateOfBirth": "1977-08",
     "nationality": "British", "countryOfResidence": "England"}
  ],
  "personsWithSignificantControl": [
    {"name": "Ms Ada Jane Baker", "kind": "individual", "status": "active",
     "naturesOfControl": [{"code": "ownership-of-shares-75-to-100-percent",
                           "description": "Ownership of shares – 75% or more"}]}
  ],
  "peopleLookup": {"status": "succeeded", "activeOfficers": 1, "activePscs": 1},
  "source": {"publisher": "Companies House", "snapshotReleaseDate": "2026-11-01",
             "dataCoveredThrough": "2026-10-31"}
}
```

Every row also has the full registered-office address, up to four SIC codes
with descriptions, accounts and confirmation-statement dates, mortgage-charge
counts, previous names and the snapshot it came from. Company numbers stay
text, so leading zeros and prefixes such as `SC` or `OC` are kept. Blank
register values are `null`.

### Freshness and limits

- **Monthly data.** Company details come from the official monthly snapshot,
  which Companies House compiles to the end of the previous month and
  publishes within about five working days. Each row records the snapshot
  release date and the date it covers. People lookups read the register at
  the time of the run.
- **Live companies only.** The official snapshot contains
  live companies only; dissolved companies are not included.
- **No contact details.** The register does not publish email addresses or
  phone numbers, and neither does this actor. Dates of birth are month and
  year only, as on the register. Addresses are correspondence addresses as
  filed.
- **Narrow filters can take longer.** The actor stops as soon as `maxItems`
  companies are delivered, but a very narrow filter may need most of the
  snapshot read before enough matches are found.
- **Large officer lists.** Officer lists are read up to six register pages
  (210 appointments); `peopleLookup.officersTruncated` marks a longer list.

### Pricing

Pay per event:

- **Result**: charged for each company row delivered.
- **People lookup**: charged once per company when you turn on directors
  and/or owners and that company's lookup succeeds. Failed, not-found and
  skipped lookups are never charged.

See the Pricing tab for current rates. Set a maximum charge for the run and
the actor stops cleanly before going over it, counting both events.

### Run summary

The run's `OUTPUT` record shows the snapshot used, the filters, counters (rows
scanned, matched, delivered), per-file status, any warnings and errors, and a
`people` section with lookup counts when directors or owners were requested.
`stoppedBy` says why the run ended (`endOfData`, `maxItems`, `chargeLimit`,
`timeBudget`, `peopleUnavailable` and so on) and `coverage.complete` says
whether the whole snapshot was read. A run that reaches its time limit keeps
the companies already delivered.

### Attribution

Contains public sector information licensed under the Open Government Licence
v3.0. © Crown copyright. Source: Companies House Free Company Data Product and
the public Companies House register.

# Actor input Schema

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

Official release month in YYYY-MM form, for example 2026-11 for the 2026-11-01 file. Leave empty for the latest published snapshot. Months not currently listed by Companies House are reported unavailable.

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

Case-insensitive substrings; a company matches any one. Empty keeps every name.

## `sicPrefixes` (type: `array`):

2 to 5 digit prefixes, for example 62 or 62020; a company matches any one. Combined with SIC keywords as one SIC filter.

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

Case-insensitive keywords matched against the published SIC text; a company matches any one. Combined with SIC prefixes as one SIC filter.

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

Exact statuses such as Active or Liquidation; a company matches any one. Empty keeps every status in the live-company snapshot.

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

Exact categories such as Private Limited Company or Public Limited Company; a company matches any one. Empty keeps every category.

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

Registered-office postcode prefixes with spaces ignored, for example SW1A or M1; a company matches any one.

## `towns` (type: `array`):

Exact registered-office post towns, case-insensitive; a company matches any one.

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

Exact registered-office counties, case-insensitive; a company matches any one.

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

Exact registered-office address countries such as England or Wales, case-insensitive; a company matches any one.

## `incorporationFrom` (type: `string`):

Inclusive incorporation date in YYYY-MM-DD form.

## `incorporationTo` (type: `string`):

Inclusive incorporation date in YYYY-MM-DD form.

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

Hard cap across the whole run. Scanning stops as soon as this many company rows have been delivered. With directors or PSC lookups the maximum is 5,000, because each company needs its own register lookups.

## `includeOfficers` (type: `boolean`):

For each matched company, add its current directors, secretaries and other officers from the public Companies House register: name, role, appointment date, month and year of birth, nationality, country of residence and correspondence address. Charged as one people lookup per company that succeeds. Slower: allow roughly 1-2 companies per second.

## `includePscs` (type: `boolean`):

For each matched company, add its persons with significant control (beneficial owners), including corporate owners with their registration numbers and the nature of control (for example 75% or more of shares). Shares the same per-company people lookup charge as directors.

## `includeFormerPeople` (type: `boolean`):

Also return resigned officers and ceased persons with significant control. Off returns current people only.

## Actor input object example

```json
{
  "snapshotMonth": "",
  "nameContains": [],
  "sicPrefixes": [],
  "sicKeywords": [],
  "statuses": [],
  "categories": [],
  "postcodePrefixes": [],
  "towns": [],
  "counties": [],
  "countries": [],
  "maxItems": 100,
  "includeOfficers": false,
  "includePscs": false,
  "includeFormerPeople": false
}
```

# Actor output Schema

## `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 = {
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("automatic/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 = { "maxItems": 100 }

# Run the Actor and wait for it to finish
run = client.actor("automatic/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 '{
  "maxItems": 100
}' |
apify call automatic/uk-companies-house-bulk --silent --output-dataset

```

## MCP server setup

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