# UK Companies House: Companies, Directors, Owners & Filings (`cleanfeed-data/uk-companies-house`) Actor

Export UK companies from the official Companies House API: profiles, name and advanced search (SIC code, location, status, incorporation dates), directors/officers, persons with significant control, filing history and charges. Bring your own free API key.

- **URL**: https://apify.com/cleanfeed-data/uk-companies-house.md
- **Developed by:** [CleanFeed Data](https://apify.com/cleanfeed-data) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 company profiles

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: Companies, Directors, Owners & Filings

Export UK company data straight from the **official Companies House Public Data API**: company profiles, name search, advanced search by SIC code, location, status, type and incorporation date, plus directors/officers, persons with significant control (beneficial owners), filing history and charges. Clean, flat JSON/CSV with a `type` column on every row.

No HTML scraping, no proxies, no unofficial endpoints. Every row comes from the same API that Companies House publishes for developers, and the data is Crown copyright public-register information you may reuse, including commercially.

### What does this Companies House scraper do?

- **Look up companies by number**: paste company numbers (`00445790`, `SC123456`, `OC301234`, leading zeros optional) or Companies House URLs and get the full profile.
- **Search by name**: the same ranking as the register's search box, up to 1,000 results per query, optionally active companies only.
- **Advanced search**: filter the whole register by **SIC code**, **location**, **status**, **company type**, **name includes/excludes**, and **incorporation or dissolution dates**, up to 10,000 companies per run.
- **New-company leads**: set "Incorporated within the last N days" and schedule it daily or weekly to get fresh incorporations in your sector and area.
- **Related records**: officers (directors, secretaries, LLP members), PSCs (owners, with share and voting bands), filing history (with readable descriptions and document links) and charges (lenders, status, dates).
- **Enrich or save cheap summaries**: upgrade every search hit to a full profile, or keep the cheaper search fields only.

#### Use cases

- **B2B lead generation**: new companies in a SIC code and city, with director names.
- **KYC / KYB and due diligence**: owners, directors, charges and overdue filings in one export.
- **CRM enrichment**: refresh status, address and accounts dates for a list of company numbers.
- **Credit and risk monitoring**: overdue accounts, insolvency history and outstanding charges.
- **Market research**: count and map companies by industry, region and age.

### You need a free Companies House API key (2 minutes)

Companies House issues free API keys to anyone. The actor runs on **your own key**, so you get the full 600 requests per 5 minutes to yourself instead of sharing a quota with every other user.

1. Go to [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk/) and sign in or create an account (GOV.UK One Login: email plus a code by text or authenticator app).
2. Open **Your applications**, then **Create an application**. Give it any name and choose **Live**.
3. On the application, click **Create new key** and choose **REST**. Leave the IP and domain restrictions empty, because Apify runs on cloud servers.
4. Copy the key value itself (a long code like `1a2b3c4d-...`, not the key's name or description) and paste it into the **Companies House API key** field. Apify stores it encrypted and the actor only ever sends it to Companies House.

### What data can you get?

| Row `type` | One row per | Key fields |
|---|---|---|
| `company` | Full company profile | number, name, status, type, incorporation/cessation dates, SIC codes + descriptions, registered office, accounts due/overdue, last accounts type, confirmation statement due/overdue, charges/insolvency/liquidation flags, previous names, and counts (active/resigned officers, PSCs, filings, charges) with active director names when those options are on |
| `company-summary` | Search hit without a profile request | number, name, status, type, dates, address, SIC codes (advanced search) |
| `officer` | Officer appointment | name, first/last name, role, appointed/resigned, occupation, nationality, country of residence, birth month/year, service address, corporate registration details, link to all their appointments |
| `psc` | Person with significant control | individual or corporate, name parts, notified/ceased, natures of control (raw + readable), share and voting bands (`25-50%`, `50-75%`, `75-100%`), right to appoint directors, nationality, corporate registration number |
| `filing` | Filing history item | date, category, form type (CS01, AA, AP01...), readable description, pages, document link |
| `charge` | Charge (mortgage) | charge code, status, created/delivered/satisfied dates, persons entitled (lenders), particulars, fixed/floating/negative pledge flags |

Every row also has `companyNumber`, `companyName`, `url` (the official Companies House page), `sourceType`, `source` and `scrapedAt`. The dataset has ready-made views: Companies, Officers, Owners (PSC), Filings, Charges and All fields.

### How to use it

1. Paste your API key.
2. Add company numbers, name searches and/or advanced-search filters. You can combine them in one run; duplicates are removed.
3. Tick the related records you want (officers, PSCs, filings, charges).
4. Run it, then download as CSV, Excel or JSON, or send it to Google Sheets, a webhook or your CRM.

### Example input

```json
{
  "apiKey": "YOUR_COMPANIES_HOUSE_API_KEY",
  "sicCodes": ["62012"],
  "location": "Manchester",
  "companyStatus": ["active"],
  "incorporatedWithinDays": 30,
  "maxAdvancedResults": 200,
  "includeOfficers": true,
  "includePsc": true
}
```

### Example output

Illustrative values; real rows include every field listed above.

```json
{
  "type": "company",
  "companyNumber": "00445790",
  "companyName": "TESCO PLC",
  "companyStatus": "active",
  "companyTypeLabel": "Public limited company",
  "dateOfCreation": "1947-11-27",
  "sicCodes": ["47110"],
  "sicDescriptions": ["Retail sale in non-specialised stores with food, beverages or tobacco predominating"],
  "fullAddress": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, AL7 1GA",
  "accountsNextDue": "2027-01-31",
  "accountsOverdue": false,
  "confirmationStatementNextDue": "2027-03-29",
  "hasCharges": true,
  "officersActiveCount": 12,
  "activeDirectorNames": ["SMITH, John Andrew", "..."],
  "url": "https://find-and-update.company-information.service.gov.uk/company/00445790",
  "sourceType": "company-number"
}
```

```json
{
  "type": "psc",
  "companyNumber": "12345678",
  "name": "Mr John Andrew Smith",
  "pscKind": "individual-person-with-significant-control",
  "ownershipOfShares": "75-100%",
  "votingRights": "75-100%",
  "rightToAppointDirectors": true,
  "naturesOfControlLabels": ["Ownership of shares – 75% or more", "..."],
  "notifiedOn": "2016-04-06",
  "nationality": "British",
  "dateOfBirthYear": 1970
}
```

### How much does it cost?

You pay per result, and Apify platform usage is included in the price.

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Company profile (`company` row) | **$0.0015** ($1.50 per 1,000) |
| Company search result without profile (`company-summary` row) | $0.0007 ($0.70 per 1,000) |
| Officer, PSC, filing or charge row | $0.0004 ($0.40 per 1,000) |

Examples: 1,000 company profiles cost about **$1.51**. 1,000 profiles with directors and owners (roughly 3 people per company) cost about $2.70. Company numbers that don't exist are free. Set a maximum cost per run in Apify and the actor stops exactly at it.

### Speed and rate limits

Companies House allows **600 requests per 5 minutes per key**. The actor tracks its own requests in a sliding window (550 by default, adjustable), reads Companies House's rate-limit headers, and, if your key is also used by another app and hits HTTP 429, waits for the window to reset and retries without losing data.

Each company profile is one request. Officers, PSCs, filings and charges each add one request per 100 rows (charges are always checked, because the profile's "has charges" flag is sometimes wrong, e.g. for Tesco PLC). Rough throughput: about 550 profiles in the first 5 minutes, then about 110 per minute. If Companies House raises your key's limit, increase **Requests per 5 minutes** to match.

### Run summary

The default key-value store holds `RUN_SUMMARY` with every search (hits, total available, companies added), company outcomes (ok, not found, failed with reasons), input errors, output counts per event, and API stats (requests, retries, 429s, time spent waiting for the rate limit).

### FAQ

**Why do I need my own API key?** Companies House gives each key a 600-requests-per-5-minutes quota and asks developers to keep keys private. With your own key you get that whole quota to yourself, and nothing about your searches is shared with other users. Keys are free.

**Is this data allowed to be reused commercially?** Yes. Companies House places no restrictions on how public-register information is used (beyond not reproducing the Crown insignia), and its own material is under the Open Government Licence v3.0. See the legal note below.

**Can I get every company in a SIC code?** Advanced search returns up to 10,000 companies per run. Split bigger pulls by location or incorporation-date range.

**Does it include emails or phone numbers?** No. Companies House doesn't publish them, and this actor doesn't guess them from other websites.

**Can I monitor new companies?** Yes. Schedule a run with "Incorporated within the last N days" (e.g. 7) and the filters you care about.

**Can I get the PDF documents?** Each filing row links to its document page. Downloading PDFs in bulk is not included.

### More scrapers from cleanfeed-data

All of our Actors use only official, documented public APIs and feeds, and charge only for results.

| Actor | What it does |
|---|---|
| [Greenhouse, Lever & Ashby Jobs Scraper](https://apify.com/cleanfeed-data/multi-ats-jobs) | Every open job from company career pages on 8 ATSs, with new-job alerts |
| [App Store Reviews Scraper](https://apify.com/cleanfeed-data/app-store-reviews) | Apple App Store reviews from many countries, with sentiment and topic tags |
| [Bluesky Posts, Profiles & Followers](https://apify.com/cleanfeed-data/bluesky-data) | Bluesky posts, profiles, threads, followers, feeds and lists via the official API |

### Legal note

This actor only calls the official Companies House Public Data API with your own API key and stays within its documented rate limits. Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Companies House [places no restrictions on reuse of public-register information](https://www.gov.uk/government/publications/companies-house-accreditation-to-information-fair-traders-scheme/public-task-copyright-and-crown-copyright), except that you may not reproduce the Crown insignia, and third-party copyright in filed documents remains with its owners. Officer and PSC records contain personal data: you are the controller for how you store and use it, so comply with UK GDPR and the Data Protection Act 2018 (lawful basis, purpose limitation, keeping data up to date) and with direct-marketing rules (PECR) if you contact people. This actor is not affiliated with or endorsed by Companies House.

# Actor input Schema

## `apiKey` (type: `string`):

Your own free Companies House REST API key. Get one in about 2 minutes: sign in at <a href='https://developer.company-information.service.gov.uk/' target='_blank'>developer.company-information.service.gov.uk</a> → Your applications → Create an application (choose <b>Live</b>) → Create new key (type <b>REST</b>). Stored encrypted by Apify and sent only to Companies House. Each key allows 600 requests per 5 minutes; the actor stays under that automatically.

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

Company numbers (e.g. 00445790, SC123456, OC301234; leading zeros optional) or Companies House company page URLs. Each one returns the full company profile.

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

Company names or keywords, searched with the official Companies House search (same ranking as the register's search box).

## `maxResultsPerSearch` (type: `integer`):

Companies to take from each name search (Companies House returns at most 1,000 per query).

## `activeOnlySearch` (type: `boolean`):

Restrict name searches to active companies.

## `companyNameIncludes` (type: `string`):

Company name must contain this text.

## `companyNameExcludes` (type: `string`):

Company name must not contain this text.

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

5-digit SIC 2007 codes, e.g. 62012 (software development), 56101 (restaurants), 41100 (property development). Matches any of the listed codes.

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

Town, city, county or postcode district of the registered office, e.g. Manchester or SW1A.

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

Leave empty for any status.

## `companyType` (type: `array`):

Leave empty for any type. Private limited company = ltd.

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

Shortcut for new-company leads: only companies incorporated in the last N days. 0 = off. Great for scheduled runs.

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

YYYY-MM-DD

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

YYYY-MM-DD

## `dissolvedFrom` (type: `string`):

YYYY-MM-DD (dissolved companies)

## `dissolvedTo` (type: `string`):

YYYY-MM-DD

## `maxAdvancedResults` (type: `integer`):

Companies to take from the advanced search.

## `enrichWithProfile` (type: `boolean`):

On: every search hit is upgraded to the full company profile (accounts and confirmation-statement dates, overdue flags, previous names, charges/insolvency flags). Off: search hits are saved as cheaper 'company-summary' rows with name, number, status, type, dates, address and (advanced search) SIC codes.

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

One 'officer' row per appointment, plus active director names on the company row.

## `includeResignedOfficers` (type: `boolean`):

Also return officers who have resigned (with resignedOn dates).

## `maxOfficersPerCompany` (type: `integer`):

Cap on officer rows per company.

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

One 'psc' row per beneficial owner / controlling entity, with ownership and voting bands.

## `includeCeasedPsc` (type: `boolean`):

Also return PSCs who have ceased to have control.

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

One 'filing' row per filing, newest first, with a readable description and a document link.

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

Only these filing categories. Empty = all.

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

Newest filings first; cap per company.

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

One 'charge' row per charge, with lender (persons entitled), status and dates.

## `maxChargesPerCompany` (type: `integer`):

Cap on charge rows per company.

## `maxCompanies` (type: `integer`):

Overall cap on companies across all inputs. 0 = no cap.

## `maxConcurrency` (type: `integer`):

Companies processed in parallel. The rate limit is enforced regardless.

## `requestsPer5Minutes` (type: `integer`):

Request budget per 5-minute window for your key. Companies House allows 600 by default; keep some headroom if the key is used elsewhere. Raise only if Companies House granted your key a higher limit.

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790"
  ],
  "maxResultsPerSearch": 20,
  "activeOnlySearch": false,
  "incorporatedWithinDays": 0,
  "maxAdvancedResults": 100,
  "enrichWithProfile": true,
  "includeOfficers": false,
  "includeResignedOfficers": false,
  "maxOfficersPerCompany": 100,
  "includePsc": false,
  "includeCeasedPsc": false,
  "includeFilingHistory": false,
  "maxFilingsPerCompany": 25,
  "includeCharges": false,
  "maxChargesPerCompany": 50,
  "maxCompanies": 0,
  "maxConcurrency": 4,
  "requestsPer5Minutes": 550
}
```

# Actor output Schema

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

Company rows in the Companies view.

## `officers` (type: `string`):

Officer rows (directors, secretaries, LLP members).

## `psc` (type: `string`):

Persons with significant control.

## `filings` (type: `string`):

Filing history rows.

## `charges` (type: `string`):

Charge (mortgage) rows.

## `runSummary` (type: `string`):

JSON record with searches, per-company outcomes, not-found numbers, output counts and API/rate-limit stats.

# 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("cleanfeed-data/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 = { "companyNumbers": ["00445790"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanfeed-data/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/66WppOJtPKBBNcImd/builds/2xv748PNuyoBh6oi9/openapi.json
