# Companies House Scraper (`deriverge/companies-house-scraper`) Actor

UK company checks from the Companies House register by number or name: status, incorporation date, registered office, SIC codes, filing deadlines with overdue flags, charges and insolvency history. Officers and owners are not read, and companies not found are free.

- **URL**: https://apify.com/deriverge/companies-house-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Companies House Scraper

Companies House Scraper checks UK companies on the Companies House register and returns one row per company: status, type, key dates, registered office, SIC codes, filing deadlines with overdue flags, the number of charges and any insolvency history, summed up in plain-English risk flags. Enter company numbers or names in **Companies to check** and click **Start**; 50 entries took 33 seconds in October 2026. Officers and persons with significant control are not read, so the rows hold no personal data about directors or owners. It costs $2.00 per 1,000 company records on the Free plan ($1.00 on Business), and the $5 of monthly credit in Apify's Free plan covers about 2,500 company records.

### What data does it return?

| Field | Description |
|---|---|
| `input`, `reference` | The number or name you entered, and your own reference returned unchanged, such as `supplier-42`. |
| `matched`, `matchedBy` | `true` when the company was found, and `number` or `name` for how. Rows with `matched: false` are not charged. |
| `companyNumber`, `name`, `url` | The 8-character company number (`00185647`, `SC083026`), the registered name and the company page on Companies House. |
| `status`, `active` | Status as the register shows it, such as `Active`, `Dissolved`, `Liquidation` or `Active - Proposal to Strike off`, and `true` when it starts with Active. |
| `companyType` | Type of company, such as `Public limited Company` or `Private limited Company`. |
| `jurisdiction` | `Scotland`, `Northern Ireland` or `England and Wales`, from the prefix of the company number in Companies House's list: `SC` companies, `SO` LLPs and `SL` limited partnerships are Scottish, `NI` companies and `NC` LLPs are from Northern Ireland, and numbers without a prefix, `OC` and `LP` are from England and Wales. `null` for overseas companies (`FC`, `BR`) and overseas entities (`OE`), which register for the whole UK. |
| `incorporatedOn`, `dissolvedOn` | Dates of incorporation and dissolution, `YYYY-MM-DD`. |
| `registeredOffice`, `postcode` | The registered office address and its postcode, such as `EC1M 6HA`. |
| `sicCodes` | Nature of business as SIC codes with descriptions, such as `47110` for retail sale in non-specialised stores. |
| `accountsLastMadeUpTo`, `accountsNextMadeUpTo`, `accountsDueBy`, `accountsOverdue` | End of the last filed accounting period, end of the next one, the filing deadline, and `true` when Companies House marks the accounts as overdue. |
| `confirmationLastDate`, `confirmationNextDate`, `confirmationDueBy`, `confirmationOverdue` | The same for the confirmation statement. |
| `chargesTotal`, `chargesOutstanding`, `chargesSatisfied` | Charges (mortgages and other secured lending) ever registered, still outstanding and satisfied, with **Count registered charges** on. |
| `insolvencyHistory` | `true` when the register holds an insolvency record for the company. |
| `riskFlags` | Plain-English warnings, most serious first: insolvency status, dissolution, proposed strike-off, insolvency history, overdue accounts or confirmation statement, outstanding charges, incorporation less than a year ago, and notes on name matching. |
| `checkedAt` | When the company was checked, ISO 8601 UTC. |

### How to check UK companies on Companies House

1. In **Companies to check**, list the companies as a JSON array. Each entry is a company number (`"00445790"`, `"SC083026"`, or `"445790"`, which is padded with zeros), a company name (`"Rolls-Royce Holdings plc"`), or an object with `companyNumber` or `name` and your `reference`.
2. Keep **Count registered charges** on if secured lending matters to you. It reads one more page per company that has charges.
3. To follow the companies over time, give the run a **Watch name** and schedule it (see below).
4. Click **Start**. The **Output** tab has one row per entry, in your order, for download as CSV, Excel or JSON. `SUMMARY` in the key-value store counts companies found, not found and flagged.

An API input that mixes numbers and names and keeps your own references:

```json
{
  "companies": [
    "00445790",
    { "companyNumber": "SC083026", "reference": "bank-01" },
    { "name": "Thames Water Utilities Limited", "reference": "supplier-17" }
  ],
  "includeCharges": true,
  "watchName": "suppliers"
}
```

### Example output

J Sainsbury plc, found by name in a run on 11 October 2026. It had 32 charges registered over its history, 14 of them outstanding.

```json
{
  "reference": null,
  "input": "J Sainsbury plc",
  "matched": true,
  "matchedBy": "name",
  "companyNumber": "00185647",
  "name": "J SAINSBURY PLC",
  "status": "Active",
  "active": true,
  "companyType": "Public limited Company",
  "jurisdiction": "England and Wales",
  "incorporatedOn": "1922-11-10",
  "dissolvedOn": null,
  "registeredOffice": "33 Charterhouse Street, London, England, EC1M 6HA",
  "postcode": "EC1M 6HA",
  "sicCodes": [
    {
      "code": "47110",
      "description": "Retail sale in non-specialised stores with food, beverages or tobacco predominating"
    }
  ],
  "accountsNextMadeUpTo": "2027-03-06",
  "accountsDueBy": "2027-09-06",
  "accountsLastMadeUpTo": "2026-02-28",
  "accountsOverdue": false,
  "confirmationNextDate": "2027-07-25",
  "confirmationDueBy": "2027-08-08",
  "confirmationLastDate": "2026-07-25",
  "confirmationOverdue": false,
  "previousNames": [],
  "chargesTotal": 32,
  "chargesOutstanding": 14,
  "chargesSatisfied": 18,
  "insolvencyHistory": false,
  "riskFlags": [
    "14 outstanding charges are registered against the company (secured lending)."
  ],
  "url": "https://find-and-update.company-information.service.gov.uk/company/00185647",
  "checkedAt": "2026-10-11T17:16:41.687Z"
}
```

### How much does it cost to check UK companies?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 company records | $2.00 | $1.60 | $1.30 | $1.00 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Checking 1,000 companies costs $2.00 on the Free plan and $1.00 on Business, with charges and insolvency included. Entries that cannot be found, names that match only in part, numbers that are not on the register and companies Companies House did not answer for come back as rows with `matched: false` and a note in `riskFlags`, and they are not charged.

### Limits

- Companies are checked one at a time, with up to 3 requests each: the name search, the company page and the charges page. 50 entries, 45 of them names, took 122 requests and 33 seconds.
- A name is looked up with the register's own search, and the companies on its first page of results are compared with your name. A company is taken and charged only when its name matches yours apart from words such as Limited, plc or Group, preferring the exact name and the same legal form. In October 2026, `Kingfisher plc` gave `KINGFISHER PLC` although the search listed `KINGFISHER LIMITED PARTNERSHIP` first, and `BP P.L.C.` was found in third place. A name that matches only in part, such as `Sainsbury`, comes back with `matched: false`, the closest company and its number in `riskFlags`, and is not charged. Use company numbers when you have them.
- Officers, persons with significant control, filing history and figures from the accounts are not read.
- Charges are counted, without the lenders or the dates of each charge.
- UK establishments of overseas companies (numbers starting with `BR`) have fewer fields on the register and come back with fewer values.
- If Companies House fails to answer for more than 40% of the requests, the run ends as failed.

### What the actor does not collect

The register also lists directors, secretaries and persons with significant control with their names, month and year of birth, nationality and correspondence address. The actor never opens those pages, so none of this appears in the output, and a company check cannot be turned into a list of people. The registered office is the company's legal address as filed; for a small company it is often an accountant's office, sometimes a home address, and it is returned as published.

### Watching companies for changes

With a **Watch name**, or in a saved task, every run compares each company with the previous run of the same name and writes the differences to the `CHANGES` record: a new status, a newly overdue filing, new or satisfied charges, a changed registered office, and companies added to or removed from your list. Each change names the field with its old and new value. Every company is returned and charged in every run; the `CHANGES` record is the part that tells you what moved.

### FAQ

#### Is it legal to scrape Companies House?

Companies House is the public register of UK companies, and the pages the actor reads are free to view for anyone without an account. The actor reads company records only and leaves out the pages about officers and owners, so it collects no personal data about directors or shareholders. You are responsible for how you use the data.

#### Can I get directors or beneficial owners?

No. Pages about officers and persons with significant control are left out on purpose, because they describe private individuals.

#### Do I need a Companies House API key?

No. The actor reads the public company pages of the register, so there is no key to create and no API rate limit of your own to manage.

### Related scrapers

- [EU VAT Number Validator](https://apify.com/deriverge/eu-vat-check)
- [French Company Registry Scraper](https://apify.com/deriverge/french-company-check)
- [Polish Company Registry Scraper](https://apify.com/deriverge/polish-company-check)
- [Brazil CNPJ Lookup](https://apify.com/deriverge/brazil-cnpj-lookup)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/companies-house-scraper/changelog.md

# Actor input Schema

## `companies` (type: `array`):

One entry per company: a Companies House number (00445790, SC123456, 445790), a company name, or an object with companyNumber or name and an optional reference returned unchanged. Names are matched to the closest registered name; companies that cannot be found are never charged.

## `includeCharges` (type: `boolean`):

Read the Charges page of every company for the number of outstanding and satisfied charges (mortgages and other secured lending).

## `watchName` (type: `string`):

Give the run a name such as "suppliers" and schedule it. Every later run with the same name compares its results with the previous one and stores the differences (status changes, new overdue filings, new charges) in the CHANGES record. Runs from a saved task are compared automatically even without a name.

## Actor input object example

```json
{
  "companies": [
    "00445790",
    {
      "name": "Rolls-Royce Holdings plc",
      "reference": "supplier-42"
    }
  ],
  "includeCharges": true
}
```

# Actor output Schema

## `companies` (type: `string`):

One row per company with status, filing deadlines, overdue flags, charges, insolvency history and risk flags.

## `changes` (type: `string`):

What changed for each company since the previous run with the same watch name or task.

## `summary` (type: `string`):

Companies checked, not found, flagged and billed.

# 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 = {
    "companies": [
        "00445790",
        {
            "name": "Rolls-Royce Holdings plc",
            "reference": "supplier-42"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/companies-house-scraper").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 = { "companies": [
        "00445790",
        {
            "name": "Rolls-Royce Holdings plc",
            "reference": "supplier-42",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("deriverge/companies-house-scraper").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 '{
  "companies": [
    "00445790",
    {
      "name": "Rolls-Royce Holdings plc",
      "reference": "supplier-42"
    }
  ]
}' |
apify call deriverge/companies-house-scraper --silent --output-dataset

```

## MCP server setup

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

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/5EUrCU0Bz3y6fqDMu/builds/lTajM76CJJ6G2Ze6h/openapi.json
