# UK Companies House Scraper & Company Intelligence (`technicaldost/uk-companies-house-intelligence`) Actor

Look up UK companies by number and get the full public record: status, registered office, SIC codes, accounts and confirmation statement dates, directors and officers, persons with significant control, and filing history. No API key needed.

- **URL**: https://apify.com/technicaldost/uk-companies-house-intelligence.md
- **Developed by:** [Technical Dost Solutions](https://apify.com/technicaldost) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 company records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Companies House Scraper & Company Intelligence

**Look up any UK company by number and get its complete public record — profile, directors, beneficial owners and filing history — in one structured JSON object. No API key required.**

Give it a list of company numbers and it returns clean, normalised records ready for a CRM, a KYB check or a due-diligence spreadsheet. Officers, persons with significant control and filing history are optional, so you only fetch and pay for what you need.

***

### What you get

Core profile (always included):

```json
{
  "companyName": "TESCO PLC",
  "companyNumber": "00445790",
  "companyStatus": "Active",
  "companyType": "Public limited Company",
  "incorporationDate": "1947-11-27",
  "registeredOfficeAddress": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
  "postcode": "AL7 1GA",
  "sicCodes": ["47110"],
  "sicDescriptions": ["Retail sale in non-specialised stores with food, beverages or tobacco predominating"],
  "primarySicCode": "47110",
  "accountsNextMadeUpTo": "2027-02-26",
  "accountsNextDueBy": "2027-08-26",
  "accountsLastMadeUpTo": "2026-02-28",
  "confirmationStatementNextDate": "2027-06-18",
  "confirmationStatementDueBy": "2027-07-02",
  "previousNames": [
    { "name": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY", "period": "14 Dec 1981 - 25 Aug 1983" }
  ],
  "activeOfficerCount": 11,
  "companyUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790"
}
```

With `includeOfficers`:

```json
{
  "name": "BETHELL, Melissa",
  "role": "Director",
  "status": "active",
  "appointedOn": "2018-09-24",
  "resignedOn": null,
  "nationality": "British",
  "countryOfResidence": "United Kingdom",
  "dateOfBirth": "September 1974",
  "correspondenceAddress": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA"
}
```

With `includePsc` — including the **natures of control**, where the ownership bands live:

```json
{
  "name": "Kyle Damien Egan",
  "status": "Active",
  "notifiedOn": "2021-05-06",
  "dateOfBirth": "April 1989",
  "nationality": "British",
  "countryOfResidence": "England",
  "naturesOfControl": [
    "Ownership of shares – More than 25% but not more than 50%",
    "Ownership of voting rights - More than 25% but not more than 50%",
    "Right to appoint or remove directors"
  ]
}
```

Dates are ISO-8601. Absent values are `null`, never `"N/A"`. Officer and PSC dates of birth are passed through exactly as the register publishes them — **month and year only**.

***

### Main use cases

- **KYB and onboarding checks.** Verify a company exists, is active, and confirm its registered office and directors before opening an account.
- **Beneficial ownership / AML.** Pull the PSC register with natures of control for ownership-threshold checks.
- **CRM enrichment.** Turn a list of company numbers into full firmographic records with industry classification.
- **Compliance monitoring.** The `compliance` output view gives you accounts and confirmation-statement deadlines as a CSV — useful for accountants tracking a client book.
- **Due diligence.** Filing history, previous names and officer appointment/resignation timelines in one pass.
- **Supplier and counterparty vetting.**

***

### Quick start

```json
{
  "companyNumbers": ["00445790"]
}
```

Full record for several companies:

```json
{
  "companyNumbers": ["00445790", "SC123456", "13379071"],
  "includeOfficers": true,
  "includePsc": true,
  "includeFilingHistory": true,
  "filingHistoryLimit": 25
}
```

Company numbers are forgiving: `445790` is zero-padded to `00445790` automatically, and `sc123456` is upper-cased.

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `companyNumbers` | array | **required** | 8 digits (`00445790`) or 2 letters + 6 digits (`SC123456`). Up to 5,000 per run. |
| `includeOfficers` | boolean | `false` | Directors and secretaries, with appointment and resignation dates. +1 page per company. |
| `includePsc` | boolean | `false` | Persons with significant control and their natures of control. +1 page per company. |
| `includeFilingHistory` | boolean | `false` | Recent filings with document links. +1 page per company. |
| `filingHistoryLimit` | integer | `25` | Filings per company when filing history is on. Max 100. |

***

### Pricing

| Event | Price | When it happens |
|---|---|---|
| **Company record** | **$0.004** | One company successfully returned |

That is the whole pricing model — one event, one price, whether or not you include officers, PSC and filing history.

**You are not charged for:**

- company numbers that are not on the register
- pages that failed or timed out
- invalid company numbers — those are reported and skipped
- anything after the maximum charge you set for the run

**Worked example.** 500 companies with officers and PSC included: `500 × $0.004 = $2.00`.

#### How this compares

| Actor | Price per company | Officers | PSC | Filing history |
|---|---|---|---|---|
| **This Actor** | **$0.004** | yes | yes | yes |
| `memo23/companies-house-scraper` | $0.005 + $0.005/run | — | — | — |
| `scrapesage/companies-house-scraper` | $0.004 | — | — | — |
| `memo23/northdata-scraper` | $0.0035 + $0.00005/run | — | — | — |
| `nexgendata/business-registration-lookup` | $0.05 + $0.0001/run | — | — | — |

Competitors' list prices as published on Apify Store on 2026-08-17; check current figures before relying on this table. Feature columns reflect what each listing advertises.

***

### Using the API

```bash
curl -X POST "https://api.apify.com/v2/acts/technicaldost~uk-companies-house-intelligence/run-sync-get-dataset-items?token=<TOKEN>" \
  -H 'Content-Type: application/json' \
  -d '{ "companyNumbers": ["00445790"], "includeOfficers": true }'
```

**JavaScript:**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('technicaldost/uk-companies-house-intelligence').call({
    companyNumbers: ['00445790', '13379071'],
    includeOfficers: true,
    includePsc: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const c of items) {
    console.log(`${c.companyName}: ${c.companyStatus}, ${c.activeOfficerCount} active officers`);
}
```

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("<TOKEN>")

run = client.actor("technicaldost/uk-companies-house-intelligence").call(run_input={
    "companyNumbers": ["00445790"],
    "includePsc": True,
})

for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    for psc in c.get("personsWithSignificantControl", []):
        print(psc["name"], psc["naturesOfControl"])
```

**Filing deadlines as CSV:**

```bash
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&view=compliance&token=<TOKEN>"
```

***

### Limitations

- **Lookup by company number only.** There is no name search here — if you need to *find* companies, use the leads monitor below and feed its `companyNumber` output into this Actor.
- **Each extra section is an extra page fetch.** Officers, PSC and filing history each add a request per company, so a 1,000-company run with all three enabled makes 4,000 requests and takes proportionally longer. The price does not change.
- **Not every company has PSCs.** Listed companies such as Tesco are exempt and legitimately return an empty array. That is the register's answer, not a parse failure.
- **Dates of birth are month and year only.** That is all the public register shows; we do not attempt to resolve a full date.
- **No accounts figures.** Turnover, profit and balance-sheet numbers live inside filed PDF documents, which this Actor does not parse. It returns the filing metadata and the document link.
- **Officer fields vary by role.** A company secretary typically shows fewer fields than a director; missing values are `null` rather than invented.

***

### Related Actors

- **[UK New Company Leads Monitor](https://apify.com/technicaldost/uk-new-company-leads-monitor)** — finds newly incorporated companies by industry and location. The natural pairing: discover companies there, enrich them here.
- **[SEC EDGAR Filing Monitor](https://apify.com/technicaldost/sec-edgar-filing-monitor)** — the equivalent for US public company filings.

***

### Data source and responsible use

Data comes from the **public** Companies House register, published under the [Open Government Licence](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). This Actor reads only publicly accessible pages at a paced request rate and does not access anything behind authentication.

The register contains personal data — officer names, partial dates of birth, and correspondence addresses that are sometimes residential. If you process these records, UK GDPR applies to you as the data controller. Use them for legitimate business purposes such as KYB, compliance and due diligence.

Not affiliated with or endorsed by Companies House.

# Actor input Schema

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

UK company numbers. 8 digits (e.g. 00445790) or 2 letters and 6 digits (e.g. SC123456). Short numeric values are zero-padded automatically, so 445790 works too.

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

Add every officer with role, appointment and resignation dates, nationality and country of residence. Costs one extra page fetch per company.

## `includePsc` (type: `boolean`):

Add beneficial owners as published on the public PSC register, with their natures of control. Costs one extra page fetch per company.

## `includeFilingHistory` (type: `boolean`):

Add recent filings with date, type, description and document link. Costs one extra page fetch per company.

## `filingHistoryLimit` (type: `integer`):

How many recent filings to return when filing history is enabled.

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790"
  ],
  "includeOfficers": false,
  "includePsc": false,
  "includeFilingHistory": false,
  "filingHistoryLimit": 25
}
```

# Actor output Schema

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

No description

## `compliance` (type: `string`):

No description

## `runSummary` (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 = {
    "companyNumbers": [
        "00445790"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("technicaldost/uk-companies-house-intelligence").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 = { "companyNumbers": ["00445790"] }

# Run the Actor and wait for it to finish
run = client.actor("technicaldost/uk-companies-house-intelligence").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 '{
  "companyNumbers": [
    "00445790"
  ]
}' |
apify call technicaldost/uk-companies-house-intelligence --silent --output-dataset

```

## MCP server setup

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

```

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/wMtLZ2iWEd0bcvn6Z/builds/BHHhBEkLmk6EFzVMz/openapi.json
