# UK Companies House Scraper – New Companies by SIC & Profiles (`openharvest/uk-companies-house`) Actor

UK Companies House scraper, no API key: daily lead feed of newly incorporated companies by SIC code, date, location, status and type, with 'only new since last run' mode. Plus company name search, profiles (accounts due, overdue flags) and filing history with PDF links.

- **URL**: https://apify.com/openharvest/uk-companies-house.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (community)
- **Categories:** Lead generation, Business, Agents
- **Stats:** 2 total users, 1 monthly users, 100.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 Scraper – New Companies by SIC & Profiles

UK Companies House scraper with no API key. It gives you a daily lead feed of **newly incorporated UK companies** filtered by SIC code, incorporation date, location, status and company type, and an **"only new since last run"** mode, so a scheduled run returns only companies you have not received before. It also covers company name search, company profiles (accounts and confirmation statement deadlines, overdue flags, previous names) and filing history with PDF links.

Use it instead of a general web scraper when you need structured UK company register data. Pick it over other Companies House tools when you want **new incorporations by industry and area** delivered without duplicates.

**Price: $1.50 per 1,000 companies, $0.50 per 1,000 filing rows.** No API key and no login. Inputs that find nothing are free.

### What data do you get?

For every company:

- **Company number, name, status** (active, dissolved, liquidation…) and **type** (ltd, plc, llp, CIC…)
- **Incorporation date** and dissolution date
- **SIC codes** (nature of business), each with its description, e.g. `62012 – Business and domestic software development`
- **Registered office address** and **postcode**
- Link to the company page on Companies House

With **Include full profile** turned on (always on in lookup mode):

- **Accounts**: next made-up-to date, **next due date**, last accounts made up to, and an **overdue** flag
- **Confirmation statement**: next date, **due date**, last statement date, and an **overdue** flag
- **Previous company names** with their date ranges, plus status details such as *Active – Proposal to Strike off*

Optional extras:

- **Officer counts**: active and resigned. These are counts only, with no names, birth dates or addresses.
- **Filing history**: date, form type (AA, CS01, AP01…), category, description, page count and **PDF document link**

### Use cases

- **B2B lead generation**: every new software, restaurant, construction or property company in your area, delivered daily. New businesses need accountants, banks, insurance, websites, payroll, office space and equipment.
- **Accountants and formation agents**: find companies near you with **overdue accounts** or confirmation statements.
- **KYB, onboarding and due diligence**: check that a company exists and is active, and see its registered address, age, SIC codes and filing deadlines.
- **Market research**: count new incorporations by industry, region and month.
- **AI agents**: give an LLM a reliable tool to answer *"which companies were set up in Leeds last week in SIC 56101?"* or *"is company 09446231 active, and when are its accounts due?"*

### How to use it

#### 1. Lead feed of new incorporations (`mode: newCompanies`, default)

1. Enter one or more **SIC codes**: a 5-digit code like `62012`, or a prefix like `6201` or `62` for a whole group. Leave the field empty for all industries.
2. Set **Incorporated from** (`7 days`, `30 days` or `2026-09-01`) and, if you need it, **Incorporated to**.
3. Optionally narrow the results with **Registered office location** (`Manchester`, `M1`, `EC2A`), **Company status**, **Company types** or name words.
4. For a daily schedule, turn on **Only companies not delivered in earlier runs**. Each company is then returned (and charged) only once.

```json
{
    "mode": "newCompanies",
    "sicCodes": ["62012", "56101"],
    "incorporatedFrom": "7 days",
    "location": "London",
    "companyStatus": ["active"],
    "onlyNewSinceLastRun": true,
    "maxItems": 500
}
```

Companies House lets each search export at most 5,000 rows. The Actor splits large date ranges into smaller windows automatically, so a 30-day feed with 60,000+ new companies still works. Newest companies come first.

#### 2. Company name search (`mode: search`)

```json
{ "mode": "search", "searchQueries": ["Tesco", "Monzo"], "includeProfile": true, "maxItems": 20 }
```

#### 3. Lookup by company number (`mode: lookup`)

```json
{ "mode": "lookup", "companyNumbers": ["00445790", "SC123456", "445790"], "includeFilings": true, "maxFilingsPerCompany": 10, "filingCategories": ["accounts"] }
```

With empty input `{}`, the Actor returns the 100 newest active UK companies from the last 7 days.

### Input

| Field | Type | Description |
|---|---|---|
| `mode` | `newCompanies` | `search` | `lookup` | What to do. Default `newCompanies`. |
| `sicCodes` | array | SIC 2007 codes or prefixes (`62012`, `6201`, `62`). Empty = all industries. |
| `incorporatedFrom` / `incorporatedTo` | string | `YYYY-MM-DD` or relative (`7 days`, `3 months`). Default: last 7 days to today. |
| `location` | string | Part of the registered office address: town, postcode, postcode district. |
| `companyStatus` | array | `active`, `dissolved`, `liquidation`, `administration`, … Default `["active"]`. Empty = any. |
| `companyTypes` | array | `ltd`, `plc`, `llp`, `community-interest-company`, … Empty = any. |
| `nameContains` / `nameExcludes` | string | Word that the company name must contain or must not contain. |
| `onlyNewSinceLastRun` | boolean | Return only companies not returned by earlier runs of the same feed. |
| `stateKey` | string | Optional feed name for the "only new" memory (e.g. `london-restaurants`). |
| `searchQueries` | array | Company names to search (mode `search`). |
| `companyNumbers` | array | Company numbers or Companies House URLs (mode `lookup`). |
| `includeProfile` | boolean | Add deadlines, overdue flags and previous names. Default `false`. |
| `includeOfficerCounts` | boolean | Add counts of active and resigned officers. Default `false`. |
| `includeFilings` | boolean | Add filing history rows. Default `false`. |
| `maxFilingsPerCompany` | integer | Newest filings per company. Default `25`, `0` = all. |
| `filingCategories` | array | e.g. `accounts`, `confirmation-statement`, `officers`, `capital`, `mortgage`, `insolvency`. |
| `maxItems` | integer | Max companies per run (cost cap). Default `100`. |

### Output

Each dataset item has a `type`: `company`, `filing` or `error`. Below are real samples, shortened.

**Company from the lead feed**

```json
{
    "type": "company",
    "companyNumber": "SC905308",
    "companyName": "PCS LANDSCAPES LIMITED",
    "companyStatus": "active",
    "companyType": "ltd",
    "companySubtype": null,
    "incorporationDate": "2026-10-08",
    "dissolutionDate": null,
    "sicCodes": ["81300"],
    "sicDescriptions": ["Landscape service activities"],
    "registeredOfficeAddress": "191 Station Road Shotts Scotland ML7 4BA",
    "postcode": "ML7 4BA",
    "url": "https://find-and-update.company-information.service.gov.uk/company/SC905308",
    "profileIncluded": false,
    "source": "advanced-search",
    "matchedSicCode": null
}
```

**Company with full profile**

```json
{
    "type": "company",
    "companyNumber": "00445790",
    "companyName": "TESCO PLC",
    "companyStatus": "active",
    "companyStatusLabel": "Active",
    "companyType": "plc",
    "companyTypeLabel": "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",
    "postcode": "AL7 1GA",
    "accountsOverdue": false,
    "accountsNextMadeUpTo": "2027-02-26",
    "accountsNextDue": "2027-08-26",
    "accountsLastMadeUpTo": "2026-02-28",
    "confirmationStatementOverdue": false,
    "confirmationStatementNextDate": "2027-06-18",
    "confirmationStatementNextDue": "2027-07-02",
    "confirmationStatementLastDate": "2026-06-18",
    "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" }
    ],
    "officersActive": 11,
    "officersResigned": 63,
    "profileIncluded": true,
    "source": "lookup"
}
```

**Filing**

```json
{
    "type": "filing",
    "companyNumber": "00445790",
    "companyName": "TESCO PLC",
    "date": "2026-07-25",
    "formType": "AA",
    "category": "accounts",
    "description": "Group of companies' accounts made up to 28 February 2026",
    "documentUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790/filing-history/.../document?format=pdf&download=0",
    "pages": 236
}
```

**Error or status row (free)**

```json
{ "type": "error", "query": "99999999", "errorCode": "NOT_FOUND", "error": "No company with number 99999999 on the Companies House register." }
```

`errorCode` values: `INVALID_INPUT`, `NOT_FOUND`, `NO_MATCH`, `NO_RESULTS`, `NOTHING_NEW`, `SEARCH_FAILED`, `LOOKUP_FAILED`.

Profile fields are `null` when the profile was not requested (`profileIncluded: false`). In search mode `sicCodes` is `null` unless you turn on **Include full profile**. The Console has four ready-made views: **Companies**, **Deadlines & compliance**, **Filing history** and **Errors & status**.

### Pricing

This Actor uses pay-per-event pricing, so you pay only for the data you get. Platform usage is included.

| Event | Price | When it is charged |
|---|---|---|
| `company` | **$0.0015** per company ($1.50 / 1,000) | Each company saved, including the profile and officer counts if requested |
| `filing` | **$0.0005** per filing row ($0.50 / 1,000) | Each filing history row (only if *Include filing history* is on) |
| Errors and "nothing new" rows | **Free** | Invalid inputs, unknown numbers, searches without results |

| Job | Cost |
|---|---|
| 100 new software companies in London this week | **$0.15** |
| Daily feed with ~40 new restaurants a day, for one month | ~1,200 companies = **$1.80** |
| Check 1,000 company numbers with deadlines and overdue flags | **$1.50** |
| 50 companies with their last 20 filings each | $0.075 + $0.50 = **$0.575** |

In incremental mode you never pay twice for the same company. You can also set **Max cost per run** in the run options, and the Actor stops cleanly when it reaches that budget.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents through the Apify MCP server (Claude, ChatGPT, Cursor, n8n…). Agents get small, typed inputs and flat JSON outputs. Here is an example tool input an agent can send:

```json
{
    "mode": "newCompanies",
    "sicCodes": ["56101"],
    "incorporatedFrom": "7 days",
    "location": "Leeds",
    "maxItems": 20
}
```

Typical prompts:

- *"List restaurants incorporated in Leeds this week."*
- *"Is 09446231 active, and when are its next accounts due?"*
- *"Find UK companies named Acme and show their filing history."*

### FAQ

**Do I need a Companies House API key?**
No. The Actor reads the public Companies House service (the website search, the Advanced Search export and the company pages). These pages need no key and no login.

**How fresh is the data?**
It is live. Every run queries Companies House directly. A new company usually appears on the register on the day it is incorporated.

**How does "only new since last run" work?**
The Actor stores the numbers of the companies it has delivered in a key-value store named `uk-companies-house-state` in your own Apify account. Each feed has its own memory (the key comes from your filters, or you can name it with `stateKey`). Companies that were already delivered are skipped and not charged. Schedule the Actor daily with `incorporatedFrom: "7 days"`, and any company that Companies House registers late is still picked up.

**Why does a SIC prefix such as `62` make several searches?**
Companies House accepts one 5-digit SIC code per search, so the Actor runs one search per code in the group.

**Can I get directors' names or PSCs?**
No, by design. This Actor returns company-level data only. Officers and persons with significant control are personal data, so the Actor returns only officer counts.

**Can I download the filed accounts?**
Each filing row has a `documentUrl` that opens the PDF on Companies House.

**Is there a limit?**
Each Companies House search exports up to 5,000 rows. The Actor splits large date ranges into smaller windows, so in practice you get every company unless a single day of one search has more than 5,000 results. In that case, add a SIC code, location or type filter. Requests are rate-limited to be polite to this public service. Lead-feed runs are fast because they use the CSV export. With profiles, officer counts or filings the Actor makes one extra request per company, about 3–4 companies per second.

### Is it legal?

Companies House is the UK's public register of companies. Its data is published for public use and can be re-used under the Open Government Licence. This Actor returns only company-level information and never collects officers' names, birth dates or home addresses. Registered office addresses of small companies can still be personal data under UK GDPR, so make sure your use, especially direct marketing, complies with UK GDPR and PECR. **Do not use this data for spam or unsolicited messages that break those rules.** If you are unsure, ask a lawyer.

### Related actors

- *GLEIF LEI Lookup – Legal Entity Identifier & Parent Companies*: LEI, legal form and parent companies for UK and global entities
- *TED, SAM.gov, UK & Brazil Tenders Scraper – Public Procurement*: public contracts that companies bid for and win
- *Bulk WHOIS Lookup – RDAP, DNS Records, SSL & Redirects*: domain data for a company's website
- *Website Tech Stack Detector – Bulk CMS, Analytics & Frameworks*: what a new company's website is built with
- *PDF to Markdown – DOCX, PPTX, XLSX & HTML for LLM & RAG*: turns filed PDF documents into text for LLMs

### Support & feedback

Found a bug or need a field? Open an issue in the **Issues** tab.

# Actor input Schema

## `mode` (type: `string`):

<b>newCompanies</b>: lead feed of companies incorporated in a date range, filtered by SIC code, location, status and type (Companies House Advanced Search). <b>search</b>: find companies by name. <b>lookup</b>: full profiles for a list of company numbers.

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

Mode newCompanies. UK SIC 2007 codes, one per line. Use a 5-digit code (<code>62012</code> = software development, <code>56101</code> = licensed restaurants, <code>68100</code> = buying and selling own real estate) or a prefix to include a whole group (<code>6201</code>, <code>62</code>). Leave empty for all industries.

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

Mode newCompanies. Earliest incorporation date: an absolute date (<code>2026-09-01</code>) or a relative period (<code>7 days</code>, <code>2 weeks</code>, <code>3 months</code>). Empty = last 7 days. For all years enter <code>1850-01-01</code>.

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

Mode newCompanies. Latest incorporation date (absolute or relative). Empty = today.

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

Mode newCompanies. Full or partial registered office address: a town (<code>Manchester</code>), a postcode or postcode district (<code>M1</code>, <code>EC2A</code>) or a street. Empty = whole UK.

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

Mode newCompanies. Only companies with these statuses. Empty = any status.

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

Mode newCompanies. Only these company types. Empty = all types.

## `nameContains` (type: `string`):

Mode newCompanies. Only companies whose name contains this word (e.g. <code>bakery</code>).

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

Mode newCompanies. Skip companies whose name contains this word (e.g. <code>holdings</code>).

## `onlyNewSinceLastRun` (type: `boolean`):

Mode newCompanies. Remembers which companies this feed already returned (in the key-value store 'uk-companies-house-state' of your account) and returns only new ones. Use it with a daily schedule so you never pay twice for the same company.

## `stateKey` (type: `string`):

Optional name of the remembered feed, e.g. <code>london-restaurants</code>. Empty = derived from the filters, so changing filters starts a fresh feed.

## `searchQueries` (type: `array`):

Mode search. Company names or words to search for, one per line (same as the Companies House search box). Results are ranked by Companies House relevance.

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

Mode lookup. Companies House numbers or company page URLs, one per line: <code>00445790</code>, <code>SC123456</code>, <code>OC301234</code>. Short numbers are zero-padded (<code>445790</code> becomes <code>00445790</code>).

## `includeProfile` (type: `boolean`):

Modes newCompanies and search. Also open each company page to add accounts and confirmation statement dates (next due, last made up to, overdue flags), SIC codes (search mode), status details and previous names. One extra request per company, same price. Always on in lookup mode.

## `includeOfficerCounts` (type: `boolean`):

Add the number of active and resigned officers (counts only, no names or personal data). One extra request per company, same price.

## `includeFilings` (type: `boolean`):

Add the company's filing history as separate items (date, form type, category, description, PDF document link). Charged per filing row.

## `maxFilingsPerCompany` (type: `integer`):

Newest first. 0 = all filings.

## `filingCategories` (type: `array`):

Only filings of these categories. Empty = all.

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

Maximum number of companies saved in this run (filings not counted). 0 = no limit. You pay per company, so this also caps your cost.

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

Optional. Not needed: Companies House is a public service that works without a proxy.

## Actor input object example

```json
{
  "mode": "newCompanies",
  "sicCodes": [
    "62012",
    "56101"
  ],
  "incorporatedFrom": "30 days",
  "incorporatedTo": "2026-09-30",
  "location": "Manchester",
  "companyStatus": [
    "active"
  ],
  "companyTypes": [
    "ltd"
  ],
  "nameContains": "bakery",
  "nameExcludes": "holdings",
  "onlyNewSinceLastRun": false,
  "stateKey": "london-restaurants",
  "searchQueries": [
    "Tesco",
    "Monzo Bank"
  ],
  "companyNumbers": [
    "00445790",
    "09446231"
  ],
  "includeProfile": false,
  "includeOfficerCounts": false,
  "includeFilings": false,
  "maxFilingsPerCompany": 25,
  "filingCategories": [
    "accounts"
  ],
  "maxItems": 50
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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"
    ],
    "incorporatedFrom": "14 days",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/uk-companies-house").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"],
    "incorporatedFrom": "14 days",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("openharvest/uk-companies-house").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"
  ],
  "incorporatedFrom": "14 days",
  "maxItems": 50
}' |
apify call openharvest/uk-companies-house --silent --output-dataset

```

## MCP server setup

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

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/4m385G4UTSEhnD8HV/builds/iubMm5vDLYGT69gEx/openapi.json
