# Companies House Scraper — UK Company Search API | $3.50/1k (`glasswing/companies-house-scraper`) Actor

Scrape the UK Companies House register by company name, company number or URL: status, type, incorporation date, registered office, SIC codes, previous names, accounts and confirmation deadlines, and recent filing history with PDF links. No officers or PSCs.

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

## Pricing

from $2.80 / 1,000 results

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

### What does Companies House Scraper do?

Companies House Scraper turns the **UK Companies House register** into clean rows you can filter, join and export. Search by company name, or paste company numbers or Companies House URLs, and get one row per company: status, company type, incorporation and dissolution dates, registered office address and postcode, SIC codes, previous names, accounts and confirmation-statement deadlines, and the **latest 25 filings** with their PDF links.

It works as a **Companies House API alternative**: you need no API key, no account and no rate-limit bookkeeping. It reads the public register pages over plain HTTP, so runs are fast (20 companies with filing history in about 12 seconds) and cheap.

It collects **company data only**. Officers, directors and persons with significant control (PSCs) are never fetched, and their names are withheld from filing descriptions.

### Use cases for this Companies House scraper

- **B2B lead lists and market maps.** Find every active UK company in a niche by name or keyword, then filter by SIC code, postcode, company type or age.
- **KYB, onboarding and supplier checks.** Confirm a company exists, is `Active` and is not overdue with its accounts before you sign or pay.
- **Credit and risk monitoring.** Schedule a run over your customer list and watch for `Liquidation`, `Dissolved`, overdue accounts or new insolvency filings.
- **CRM enrichment.** Add the registered office, SIC codes and incorporation date to company records you already have.
- **Deal sourcing and research.** Pull the filing timeline (accounts, share changes, charges, resolutions) for the companies you track.
- **Automation.** Push rows to Google Sheets, Airtable, Supabase or your CRM with n8n, Make or Zapier.

### What data you get from every company

| Field | Type | Description |
|---|---|---|
| `companyName` | string | Registered company name |
| `companyNumber` | string | 8-character company number, e.g. `00445790`, `SC117120` |
| `companyStatus` | string | `Active`, `Dissolved`, `Liquidation`, `Closed`, ... |
| `companyType` | string | e.g. `Private limited Company`, `Public limited Company` |
| `incorporationDate` | string | Incorporation (or registration) date, `YYYY-MM-DD` |
| `dissolvedDate` | string | Dissolution date, for dissolved companies |
| `registeredOfficeAddress` | string | Registered office address as published |
| `postcode` | string | UK postcode of the registered office |
| `sicCodes` | array | SIC 2007 codes, e.g. `["47110"]` |
| `natureOfBusiness` | array | SIC codes with their descriptions |
| `previousNames` | array | Former names with `from` and `to` dates |
| `nextAccountsMadeUpTo` | string | Next accounts made-up-to date |
| `accountsDueBy` | string | Next accounts due date |
| `lastAccountsMadeUpTo` | string | Last accounts made-up-to date |
| `accountsOverdue` | boolean | `true` when Companies House marks the accounts overdue |
| `nextConfirmationStatementDate` | string | Next confirmation statement date |
| `confirmationStatementDueBy` | string | Next confirmation statement due date |
| `lastConfirmationStatementDate` | string | Last confirmation statement date |
| `confirmationStatementOverdue` | boolean | `true` when the confirmation statement is overdue |
| `filingHistoryUrl` | string | The company's filing history page |
| `filings` | array | Latest filings (up to 25): `date`, `type` (form code such as `AA`, `CS01`, `SH01`), `description`, `pdfUrl`, `pages` |
| `filingsOnPage` | integer | Number of filings in `filings` |
| `latestFilingDate` | string | Date of the most recent filing |
| `filingHistoryError` | string | Why the filing history could not be read (the company row is still delivered) |
| `url` | string | Company page on Companies House |
| `status` | string | `ok`, `not_found` or `error` (see below) |
| `error` | string | Reason when `status` is not `ok` |
| `scrapedAt` | string | ISO 8601 time of extraction |

All dates are `YYYY-MM-DD`. A missing field means Companies House does not publish it for that company (overseas establishments, for example, have no SIC codes or accounts dates). Nothing is guessed.

#### Result status (tri-state output)

| `status` | Meaning | Billed? |
|---|---|---|
| `ok` | The company was found and extracted. | Yes |
| `not_found` | Companies House answered, but the company number does not exist or the search has no results. | No |
| `error` | The page could not be read after retries (network error or a layout change). `error` says why. | No |

### How to scrape Companies House with this Actor

1. Click **Try for free** to open the Actor in Apify Console.
2. Type a company name into **Company name search**, or paste company numbers or Companies House URLs into **Company numbers or Companies House URLs**.
3. Set **Maximum companies**. The default of 20 is one page of search results.
4. Click **Start**. Records appear in the dataset in real time. Export them as JSON, CSV, Excel, XML or HTML.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `query` | string | - | Company name or keyword, searched like the Companies House search box |
| `startUrls` | array of strings | one example company | Company numbers (`00445790`, `SC117120`; `445790` is padded), company URLs (any tab) or search URLs (`/search/companies?q=...`) |
| `includeFilingHistory` | boolean | `true` | Add the latest 25 filings to each row (one extra request per company, same price) |
| `maxItems` | integer | `20` | Stop after this many company rows |
| `proxyConfiguration` | object | off | Not needed; Companies House answers direct requests |

Search by name:

```json
{
    "query": "tesco",
    "maxItems": 20
}
```

Look up a list of companies by number:

```json
{
    "startUrls": ["00445790", "SC117120", "https://find-and-update.company-information.service.gov.uk/company/13391258"],
    "includeFilingHistory": true
}
```

### Output

A real row from a test run on 2026-10-19 (filings trimmed to 2 of 25):

```json
{
    "url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
    "status": "ok",
    "scrapedAt": "2026-10-19T07:23:32.025Z",
    "companyNumber": "00445790",
    "companyName": "TESCO PLC",
    "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"],
    "natureOfBusiness": ["47110 - Retail sale in non-specialised stores with food, beverages or tobacco predominating"],
    "previousNames": [
        { "name": "TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY", "from": "1981-12-14", "to": "1983-08-25" },
        { "name": "TESCO STORES (HOLDINGS) LIMITED", "from": "1947-11-27", "to": "1981-12-14" }
    ],
    "nextAccountsMadeUpTo": "2027-02-26",
    "accountsDueBy": "2027-08-26",
    "lastAccountsMadeUpTo": "2026-02-28",
    "accountsOverdue": false,
    "nextConfirmationStatementDate": "2027-06-18",
    "confirmationStatementDueBy": "2027-07-02",
    "lastConfirmationStatementDate": "2026-06-18",
    "confirmationStatementOverdue": false,
    "filingHistoryUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790/filing-history",
    "filings": [
        {
            "date": "2026-09-16",
            "type": "SH03",
            "description": "Purchase of own shares. Clarification hmrc confirmation received that appropriate duty has been paid on this repurchase",
            "pdfUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790/filing-history/MzU0MzY3ODg5MGFkaXF6a2N4/document?format=pdf&download=0",
            "pages": 4
        },
        {
            "date": "2026-08-26",
            "type": "SH06",
            "description": "Cancellation of shares. Statement of capital on 7 July 2026 GBP 397,007,409.26",
            "pdfUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790/filing-history/MzUzOTMzNzQ1OWFkaXF6a2N4/document?format=pdf&download=0",
            "pages": 4
        }
    ],
    "filingsOnPage": 25,
    "latestFilingDate": "2026-09-16"
}
```

Officer and PSC filings keep their form code and date, but the name is replaced: `"Appointment of [name withheld] as a director on 20 February 2025"`. Their `pdfUrl` is left out, because those documents name the person.

### How much does it cost to scrape Companies House?

Pay per result: **$3.50 per 1,000 companies**, plus a $0.005 start fee per run. The filing history is included at no extra charge. Rows with status `not_found` or `error` are free.

| Event | Price | Charged when |
|---|---|---|
| `apify-actor-start` | $0.005 | Once per run, when it starts. |
| `result` | $0.0035 | Each company row saved with status `ok`. |

| Companies | Cost |
|---|---|
| 100 | $0.36 |
| 1,000 | $3.51 |
| 10,000 | $35.01 |

The Actor stops gracefully when your run's maximum charge is reached. Compute is included, and no proxy is needed.

### Integrations, exports and API access

Run it from the Apify API, the JavaScript or Python client, the Apify CLI, or on a **Schedule** (for example weekly over your customer list). Connect the dataset to Google Sheets, Airtable, Make, n8n, Zapier, Slack or a webhook. AI agents can call it through the Apify MCP server.

### Limitations

- **No officers, directors or PSCs.** This Actor deliberately collects company data only. Officer and PSC page URLs are skipped as start URLs; each becomes a free `error` row.
- Filing history is the **latest 25 filings** per company (the first page Companies House shows). Older filings are on the `filingHistoryUrl` page.
- A name search returns what the Companies House search box returns, 20 companies per page, best match first. It also matches previous names, so a search for "tesco" can return a company that was once called Tesco Tyres.
- UK establishments of overseas companies (`BR...` numbers) have no SIC codes, accounts dates or filings of their own on the register; their rows carry what is published.
- Accounts figures (turnover, profit) are not extracted. They are inside the accounts documents; use `pdfUrl` to fetch them.
- Results reflect the register at the time of the run.

### FAQ

**Do I need a Companies House API key?** No. The Actor reads the public register pages. You need no key, no account and no quota management.

**Is Companies House data free to reuse?** Companies House data is public, and Companies House notes that commercial organisations use the registers to build their own products. Check the terms that apply to your use, especially for any personal data.

**Why are there no directors in the output?** That is by design: officers and persons with significant control are individuals. If you need them, use the Companies House public data API under its own terms.

**Can I look up thousands of companies by number?** Yes. Put the numbers in **Company numbers or Companies House URLs**, one per line, and set **Maximum companies** high enough. Short numbers are padded (`445790` becomes `00445790`), and Scottish (`SC`), Northern Irish (`NI`) and LLP (`OC`) prefixes work.

**Why did I get fewer rows than `maxItems`?** The search had fewer matches, or the run hit your **Max total charge**. Check the run log.

**What happens if Companies House changes its pages?** Rows come back with `status: error` and a reason instead of silently wrong data, and you are not billed for them. Report it in the **Issues** tab with the run ID.

**Can I use this Actor from an AI agent or MCP client?** Yes. It runs with no input at all, every row is self-describing (`status` plus `error`), and inputs are plain strings.

### Related Actors

- [Domain Intelligence Report](https://apify.com/glasswing/domain-intelligence-report) - use it to check a company's website domain: DNS, mail setup, TLS, registration and tech stack.
- [LinkedIn Company Scraper](https://apify.com/glasswing/linkedin-company-scraper) - use it to add employee counts, industry and website from the company's LinkedIn page.
- [Google News Scraper](https://apify.com/glasswing/google-news-scraper) - use it to watch the press coverage of the companies you track.
- [Yahoo Finance Scraper](https://apify.com/glasswing/yahoo-finance-scraper) - use it for share prices and financials of listed UK companies such as PLCs.
- [ATS Jobs Scraper](https://apify.com/glasswing/ats-jobs-scraper) - use it to see which companies are hiring, a growth signal for lead lists.
- [USPTO Trademark Scraper](https://apify.com/glasswing/uspto-trademark-scraper) - use it to see which US trademarks a company or brand owns, with status and filing dates.

### Legal and data-protection notice

This Actor extracts only company information that Companies House publishes on its public register: company names, numbers, statuses, dates, registered office addresses, SIC codes and filing records. It does not collect officers, directors, persons with significant control or any other individual's details, it withholds personal names found in filing descriptions, and it does not log in or work around access controls. However, a registered office can be a home address and your results could still contain personal data. Personal data is protected by the UK GDPR, the EU GDPR and other regulations around the world. You should not process personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with Companies House's terms and applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Companies House or the UK government. All trademarks belong to their respective owners.

# Changelog

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

# Actor input Schema

## `query` (type: `string`):

A company name or keyword, searched like the Companies House search box (e.g. `rolls royce`). Ignored when you add your own Start URLs.

## `startUrls` (type: `array`):

One per line: a company number (`00445790`, `SC117120`; `445790` is padded), a company page URL (any tab, e.g. `/company/00445790/filing-history`) or a search URL (`/search/companies?q=...`). Officer and PSC pages are not supported.

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

Fetch the latest page of filing history (up to 25 filings: date, form type, description, PDF link) for each company. One extra request per company; untick for profile-only rows.

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

Stop after this many company rows. Each row with status `ok` is one billable result. A name search returns 20 companies per page and follows further pages only as needed.

## `proxyConfiguration` (type: `object`):

Optional. Companies House answers direct requests from datacenter IPs, so no proxy is needed.

## Actor input object example

```json
{
  "query": "tesco",
  "startUrls": [
    "https://find-and-update.company-information.service.gov.uk/company/00445790"
  ],
  "includeFilingHistory": true,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "query": "tesco",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("glasswing/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 = {
    "query": "tesco",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("glasswing/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 '{
  "query": "tesco",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call glasswing/companies-house-scraper --silent --output-dataset

```

## MCP server setup

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