# Companies House Scraper - UK Company Data & New Companies (`kamerozkan/companies-house-scraper`) Actor

Scrape UK Companies House company data without an API key. Filter by SIC code, incorporation date, location, status and type, get new company leads, registered office addresses and SIC codes as JSON, CSV or Excel.

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

## Pricing

from $2.40 / 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.
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 - UK Company Data & New Companies

Export **UK company data from the Companies House register** as JSON, CSV or Excel: company name and number, status, type, incorporation date, SIC codes, registered office address and postcode. Filter by **SIC code, location, incorporation date, status and company type** to build lists of new UK companies, or look up exact company numbers. Optional accounts and confirmation statement deadlines. No Companies House API key, no login, no proxy.

### What does Companies House Scraper do?

It searches the public Companies House register (find-and-update.company-information.service.gov.uk) with the same filters as the register's advanced search and returns one row per company. A search for every licensed restaurant incorporated in a month (about 800 companies) comes back in seconds, because the actor uses the register's own export and only falls back to the result pages when the export is unavailable.

You can also paste exact company numbers (`00445790`, `SC901122`) to get one full profile each, and turn on **Add accounts and filing deadlines** to read each company's overview page: next accounts date, accounts and confirmation statement due dates, overdue flags, SIC descriptions and previous names.

For scheduled lead lists, **Only companies not delivered in earlier runs** remembers what a saved input already returned, so a weekly run returns and charges only the companies that are new since last time.

The actor collects company-level data only. Officers, directors and persons with significant control are private individuals and are not collected.

### Who is it for?

- **B2B sales and lead generation**: new UK companies by industry and town every week (accountants, insurers, banks, web agencies, telecoms and payroll providers sell to new companies first).
- **Accountants and company formation agents**: companies with accounts or confirmation statements coming due, or overdue.
- **Market research and investors**: how many companies were founded in a sector, region and period.
- **KYC, credit and compliance teams**: verify company numbers, status, registered office and previous names in bulk.
- **Data teams**: enrich a CRM with SIC codes, incorporation dates and postcodes.

### What data can you get?

| Field | Example |
|---|---|
| `companyName`, `companyNumber` | BRIOLA EVENTS LTD, 17432163 |
| `companyStatus` | active, dissolved, liquidation, ... |
| `companyType`, `companyTypeLabel` | ltd, Private limited company |
| `incorporationDate`, `dissolutionDate` | 2026-09-01, null |
| `sicCodes` | \["56102"] |
| `registeredOfficeAddress`, `postcode` | 395 Manchester Road Stockport England SK4 5BY, SK4 5BY |
| `url` | link to the company on Companies House |
| `searchQuery` | which search or number produced the row |
| With **Add accounts and filing deadlines** | |
| `sicDescriptions` | \["56102 - Unlicensed restaurants and cafes"] |
| `nextAccountsMadeUpTo`, `nextAccountsDueBy`, `accountsOverdue` | 2027-09-30, 2028-06-01, false |
| `nextConfirmationStatementDate`, `nextConfirmationStatementDueBy`, `confirmationStatementOverdue` | 2027-08-31, 2027-09-14, false |
| `previousNames` | \[{"name": "TESCO STORES (HOLDINGS) LIMITED", "period": "27 Nov 1947 - 14 Dec 1981"}] |

Empty values are `null` or `[]`.

### How much does it cost?

You pay per company delivered: **$3.00 per 1,000 companies** ($0.003 per company) on the Free plan, with Store discounts on paid Apify plans: Bronze $2.70, Silver $2.55, Gold and above $2.40 per 1,000 companies. Platform usage is included. Turning on the deadlines option does not change the price.

Worked examples:

- 800 new restaurants incorporated in one month: 800 x $0.003 = **$2.40**.
- A weekly new-company list for one industry and city with about 40 new companies a week: 40 x $0.003 = $0.12 per week, about **$0.52 a month**.
- Checking 1,000 company numbers: **$3.00**.

Set **Max companies** or a maximum cost per run to cap spending. Companies skipped because an earlier run already delivered them are not charged.

### How to use it

1. Click **Try for free**.
2. Enter one or more **SIC codes** (for example `62012` for software development) and a **Registered office location** (a town, county or postcode).
3. Choose the period: **Incorporated in the last N days** for fresh leads, or exact **Incorporated from / to** dates.
4. Optional: pick **Company status** and **Company types**, add name filters, or paste **Company numbers** instead.
5. Click **Start**, then download the companies as JSON, CSV or Excel, or read them through the API.
6. For a weekly lead list, save the input as a task, turn on **Only companies not delivered in earlier runs** and add a schedule.

### Input example

```json
{
  "sicCodes": ["56101", "56102"],
  "location": "Manchester",
  "incorporatedFrom": "2026-09-01",
  "incorporatedTo": "2026-09-30",
  "companyStatus": ["active"],
  "companyTypes": ["ltd"],
  "includeDetails": true,
  "maxItems": 25
}
```

### Output example

A row from a QA run on 2026-10-12 with the input above:

```json
{
  "companyNumber": "17432163",
  "companyName": "BRIOLA EVENTS LTD",
  "companyStatus": "active",
  "companyType": "ltd",
  "companyTypeLabel": "Private limited company",
  "companySubtype": null,
  "incorporationDate": "2026-09-01",
  "dissolutionDate": null,
  "sicCodes": ["56102"],
  "registeredOfficeAddress": "395 Manchester Road Stockport England SK4 5BY",
  "postcode": "SK4 5BY",
  "url": "https://find-and-update.company-information.service.gov.uk/company/17432163",
  "companyStatusText": "Active",
  "sicDescriptions": ["56102 - Unlicensed restaurants and cafes"],
  "nextAccountsMadeUpTo": "2027-09-30",
  "nextAccountsDueBy": "2028-06-01",
  "accountsOverdue": false,
  "nextConfirmationStatementDate": "2027-08-31",
  "nextConfirmationStatementDueBy": "2027-09-14",
  "confirmationStatementOverdue": false,
  "previousNames": [],
  "searchQuery": "SIC 56101, 56102 | office in 'Manchester' | incorporated 2026-09-01 to 2026-09-30 | status active | type ltd",
  "scrapedAt": "2026-10-12T16:22:14+00:00"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify, or connect it to Make, n8n, Zapier, Google Sheets, HubSpot or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/companies-house-scraper").call(run_input={
    "sicCodes": ["62012"],
    "location": "London",
    "incorporatedWithinDays": 7,
    "companyStatus": ["active"],
    "onlyNewCompanies": True,
})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["incorporationDate"], company["companyNumber"], company["companyName"], company["postcode"])
```

### FAQ

**Do I need a Companies House API key?** No. The actor reads the public register website that anyone can open in a browser. There is no key, registration or login.

**How does the location filter work?** It is a text match on the registered office address, the same as the register's advanced search. `Manchester` also matches an address on "Manchester Road" in Stockport, so check `postcode` if you need a strict area.

**Where do I find SIC codes?** The UK SIC 2007 list on GOV.UK. Examples: 56101 licensed restaurants, 62012 software development, 68100 buying and selling of own real estate, 41100 development of building projects, 96020 hairdressing and beauty.

**How does "Only companies not delivered in earlier runs" work?** The actor stores the company numbers each saved input has returned in a named key-value store in your own Apify account and skips them next time. Change the input and the memory starts fresh.

**Why are officers and directors missing?** On purpose. They are private individuals, so the actor returns company-level data only.

**Is the data official?** It comes from the public Companies House register and is as current as the register at the time of the run. Companies House data is published under the Open Government Licence.

### Support and feedback

- Found a bug or missing a field? Open an issue on the **Issues** tab of this Actor. We reply within
  48 hours and ship most fixes within a few days.
- Have an idea for a feature? Issues are the fastest way to get it built.
- If the Actor saves you time, a short review on this page helps other users find it.

# Actor input Schema

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

UK SIC 2007 industry codes, for example 56101 (licensed restaurants), 62012 (software development), 41100 (property development). Companies with any of these codes are returned.

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

Full or partial registered office address: a town, county or postcode, for example 'Manchester' or 'EC2A'. This is a text match on the address, not a radius search.

## `incorporatedWithinDays` (type: `integer`):

Only companies incorporated in the last N days (new company leads). Ignored when 'Incorporated from' is set.

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

Earliest incorporation date, YYYY-MM-DD.

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

Latest incorporation date, YYYY-MM-DD.

## `companyStatus` (type: `array`):

Leave empty for every status.

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

Leave empty for every type.

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

Optional. One search per entry for companies whose name contains this text, combined with the filters above, for example 'bakery'.

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

Optional. Skip companies whose name contains this text, for example 'holdings'.

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

Optional. Exact company numbers to look up, for example 00445790 or SC123456. Each number returns one full company profile. When numbers are given, the search filters above are not run (unless you also enter names).

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

Also read each company's overview page: next accounts and confirmation statement dates, overdue flags, SIC descriptions and previous names. Slower (one extra page per company), same price.

## `onlyNewCompanies` (type: `boolean`):

For scheduled runs: skip companies this input already returned in a previous run, so you pay only for new ones. The memory is kept per input in a named key-value store in your account.

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

Stop after this many companies. You are charged per company, so this also caps the cost of the run.

## Actor input object example

```json
{
  "sicCodes": [
    "62012"
  ],
  "location": "London",
  "incorporatedWithinDays": 30,
  "companyStatus": [
    "active"
  ],
  "includeDetails": false,
  "onlyNewCompanies": false,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

One row per result in the default dataset.

# 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": [
        "62012"
    ],
    "location": "London",
    "incorporatedWithinDays": 30,
    "companyStatus": [
        "active"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/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 = {
    "sicCodes": ["62012"],
    "location": "London",
    "incorporatedWithinDays": 30,
    "companyStatus": ["active"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/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 '{
  "sicCodes": [
    "62012"
  ],
  "location": "London",
  "incorporatedWithinDays": 30,
  "companyStatus": [
    "active"
  ],
  "maxItems": 50
}' |
apify call kamerozkan/companies-house-scraper --silent --output-dataset

```

## MCP server setup

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