# UK Companies House Search – Directors & Overdue Accounts (`chris_elder/uk-companies-house-search`) Actor

Export UK companies from Companies House by SIC code, town/postcode, status and incorporation date, or look up company numbers and names. Accounts and confirmation-statement due dates, overdue flags, directors and PSCs. No API key. $1.50 per 1,000 companies ($3 from 7 Nov).

- **URL**: https://apify.com/chris_elder/uk-companies-house-search.md
- **Developed by:** [Chris Elder](https://apify.com/chris_elder) (community)
- **Categories:** Lead generation, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 50.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 Search – Directors & Overdue Accounts

Export UK companies from the **Companies House register** in one run: filter by **SIC code**, **town or postcode**, **status** and **incorporation date**, or paste a list of **company numbers / names**. Every row can include **accounts and confirmation-statement due dates**, **overdue flags**, **directors** and **persons with significant control (owners)**. No Companies House API key, no login.

**$1.50 per 1,000 companies.** Directors/PSC add-on +$1.50 per 1,000. Companies that are not found, fail, or are skipped by the overdue filter are **free**.

### What people use it for

| Job | Input |
|---|---|
| **New-company leads** (accountants, banks, insurers, web agencies) | `incorporatedFrom: 2026-10-01`, `statuses: [active]`, optional `location` or `sicCodes` |
| **Accountancy prospecting: companies with overdue accounts** | `sicCodes` + `location` + `onlyOverdue: true` |
| **Trade lists** (e.g. every active roofer in Bristol) | `sicCodes: ["43910"]`, `location: "Bristol"` |
| **KYB / supplier checks** on a client or supplier list | `companyNumbers` or `companyNames` + `includeOfficers` + `includePscs` |
| **Dissolved / liquidation monitoring** | `statuses: ["liquidation"]` or `dissolvedFrom` |

### Quick start

```json
{
  "sicCodes": ["43910"],
  "location": "Bristol",
  "statuses": ["active"],
  "maxResults": 20,
  "includeDetails": true
}
```

Look up specific companies (leading zeros added for you, register URLs accepted):

```json
{
  "companyNumbers": ["00445790", "SC123456"],
  "companyNames": ["Tesco PLC"],
  "includeOfficers": true,
  "includePscs": true
}
```

### Real output (Tesco PLC, trimmed)

```json
{
  "companyNumber": "00445790",
  "companyName": "TESCO PLC",
  "companyStatus": "Active",
  "companyType": "Public limited Company",
  "incorporationDate": "1947-11-27",
  "sicCodes": ["47110"],
  "sicDescriptions": ["Retail sale in non-specialised stores with food, beverages or tobacco predominating"],
  "registeredOfficeAddress": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
  "accountsNextMadeUpTo": "2027-02-26",
  "accountsNextDueBy": "2027-08-26",
  "accountsLastMadeUpTo": "2026-02-28",
  "accountsOverdue": false,
  "confirmationNextDueBy": "2027-07-02",
  "confirmationStatementOverdue": false,
  "anythingOverdue": false,
  "previousNames": [{ "name": "TESCO STORES (HOLDINGS) LIMITED", "period": "27 Nov 1947 - 14 Dec 1981" }],
  "directors": "BETHELL, Melissa; BODSON, Bertrand Jean Francois; ...",
  "officers": [{ "name": "BETHELL, Melissa", "role": "Director", "status": "Active", "appointedOn": "2018-09-24", "nationality": "British", "countryOfResidence": "United Kingdom" }],
  "pscExemption": "From 18 June 2018 the company is exempt from the requirement to obtain information of its PSC because it has voting shares admitted to trading on a UK regulated market",
  "companyUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790",
  "status": "ok"
}
```

Search rows (without details) contain number, name, status, type, incorporation/dissolution date, SIC codes and registered office address. The **Companies** table view shows the key columns; export as CSV, Excel or JSON.

### Pricing

**Price update:** from 7 Nov 2026 (06:30 UTC) the price per company rises from $0.0015 to $0.003 ($3 per 1,000 companies); officer and PSC lookups stay $0.0015. Apify gives users 14 days' notice. The prices below apply until then.

| Event | Price | When |
|---|---|---|
| Company | **$0.0015** | Each company saved (search row or looked-up company, incl. accounts/confirmation details) |
| Officers / PSC add-on | **$0.0015** | Only if you tick directors and/or PSCs (charged once per company) |
| Not found / failed / skipped by `onlyOverdue` | **$0** | |

Worked examples: 1,000 active roofers in a county = **$1.50**. 500 companies with directors and owners = **$1.50**. 200 overdue-accounts leads found by scanning 2,000 companies = **$0.30**. Set *Maximum cost per run* in Apify and the Actor stops cleanly at your limit.

### Input reference

- **sicCodes** – 5-digit nature-of-business codes (e.g. 43910 roofing, 62020 IT consultancy, 69201 accounting, 56101 restaurants, 68209 letting).
- **location** – text in the registered office address (town, county, postcode district).
- **statuses / companyTypes** – Companies House values (active, dissolved, liquidation...; ltd, plc, llp...).
- **incorporatedFrom/To, dissolvedFrom/To** – YYYY-MM-DD.
- **nameIncludes / nameExcludes** – words in the company name.
- **maxResults** – up to 5,000 per search (the register's own export limit). For more, split by date range or location across runs.
- **companyNumbers / companyNames / maxMatchesPerName** – direct lookups.
- **includeDetails** – accounts + confirmation statement dates, overdue flags, previous names (free; always on for lookups).
- **onlyOverdue** – keep only companies Companies House marks *Accounts overdue* or *Confirmation statement overdue*.
- **includeOfficers / onlyActiveOfficers / includePscs** – people data (see privacy below).

### FAQ

**Do I need a Companies House API key?** No. The Actor reads the public register website and its official advanced-search CSV export.

**How fresh is the data?** Live: every run reads the register at that moment.

**Why are some fields empty?** Overseas entities, LLPs and dissolved companies show fewer sections. PSC rows are empty for listed PLCs; the exemption reason is given in `pscExemption`.

**Is this legal?** The register is public information that Companies House publishes free for anyone to search. Officer and PSC names are personal data: you are responsible for using them lawfully (UK GDPR, PECR for marketing). To minimise personal data, this Actor **does not collect dates of birth or home/correspondence addresses**. Companies House does not verify everything filed, so check critical facts on the register page linked in `companyUrl`.

**How fast?** Search-only: thousands of rows in seconds (one CSV request). With details or people: about 3–10 companies per second, kept polite to the public service.

**Something missing?** Open an issue on the Actor's Issues tab. Feature requests get answered.

# Actor input Schema

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

Nature-of-business codes, e.g. 43910 (roofing), 62020 (IT consultancy), 56101 (restaurants), 69201 (accountants). Up to 5,000 matching companies per run.

## `location` (type: `string`):

Town, county or postcode text in the registered office address, e.g. Bristol, Manchester, SW1A.

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

Leave empty for any status.

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

e.g. ltd, plc, llp. Leave empty for all types.

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

YYYY-MM-DD. Use this for newly incorporated companies (new-business leads).

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

YYYY-MM-DD.

## `dissolvedFrom` (type: `string`):

YYYY-MM-DD (dissolved companies only).

## `dissolvedTo` (type: `string`):

YYYY-MM-DD.

## `nameIncludes` (type: `string`):

Word that must appear in the company name, e.g. roofing.

## `nameExcludes` (type: `string`):

Word that must not appear in the name (needs another filter).

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

Maximum companies to save from the search (Companies House returns at most 5,000 per search).

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

Company numbers or register URLs, e.g. 00445790, SC123456, https://find-and-update.company-information.service.gov.uk/company/00445790. Leading zeros are added for you.

## `companyNames` (type: `array`):

Names to match on the register (best match first), e.g. your client or supplier list.

## `maxMatchesPerName` (type: `integer`):

How many search hits to keep for each name.

## `includeDetails` (type: `boolean`):

Next/last accounts dates, due-by dates, overdue flags, previous names and SIC descriptions. Always on for number/name lookups. No extra charge.

## `onlyOverdue` (type: `boolean`):

Scans the search results and keeps only companies Companies House marks as overdue. Companies that are not overdue are skipped free. Great for accountants and compliance teams.

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

Officer name, role, appointed/resigned dates, nationality and country of residence (first page, up to 35 officers). Dates of birth and addresses are not collected. +$1.50 per 1,000 companies.

## `onlyActiveOfficers` (type: `boolean`):

Skip resigned officers.

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

PSC names, nature of control (e.g. 75% or more of shares), notified/ceased dates. Dates of birth and addresses are not collected. Same add-on price as officers (charged once if you pick both).

## `maxConcurrency` (type: `integer`):

Kept low to be polite to the public register.

## Actor input object example

```json
{
  "sicCodes": [
    "43910"
  ],
  "location": "Bristol",
  "statuses": [
    "active"
  ],
  "maxResults": 20,
  "maxMatchesPerName": 1,
  "includeDetails": true,
  "onlyOverdue": false,
  "includeOfficers": false,
  "onlyActiveOfficers": true,
  "includePscs": false,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `overview` (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 = {
    "sicCodes": [
        "43910"
    ],
    "location": "Bristol",
    "statuses": [
        "active"
    ],
    "maxResults": 20,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("chris_elder/uk-companies-house-search").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": ["43910"],
    "location": "Bristol",
    "statuses": ["active"],
    "maxResults": 20,
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("chris_elder/uk-companies-house-search").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": [
    "43910"
  ],
  "location": "Bristol",
  "statuses": [
    "active"
  ],
  "maxResults": 20,
  "includeDetails": true
}' |
apify call chris_elder/uk-companies-house-search --silent --output-dataset

```

## MCP server setup

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

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/gBJDn03fnR9bp87iU/builds/cGEKGfU31dFzzEgTh/openapi.json
