# Companies House API – UK Company Data, Directors & PSC (`agentic_solutions/uk-companies-house`) Actor

UK company data from the official Companies House API, not scraping. $0.003 per company. Search by name, company number, SIC code, incorporation date and status. Directors and PSCs are optional (+$0.001) and off by default. Not affiliated with or endorsed by Companies House.

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

## Pricing

from $3.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.

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 API – UK Company Data, Directors & PSC

Get **UK company data** from the official **Companies House API**: company profiles, status, SIC codes, registered office and accounts and confirmation-statement due dates, with optional **directors** and **PSCs**. Bring your own free Companies House key.

**Tested with live Companies House API calls** before launch: name search, company-number lookup, advanced SIC and date search, officer and PSC opt-in, and the missing-key case.

### Quick example

Input:

```json
{
  "apiKey": "<your free key>",
  "companyNumbers": [
    "00445790"
  ]
}
```

Output: one real row from a live Companies House API test run on 14 Oct 2026 (selected fields).

```json
{
  "recordType": "company",
  "companyNumber": "00445790",
  "companyName": "TESCO PLC",
  "status": "active",
  "companyType": "plc",
  "jurisdiction": "england-wales",
  "incorporatedOn": "1947-11-27",
  "sicCodes": [
    "47110"
  ],
  "registeredOfficePostcode": "AL7 1GA",
  "accountsNextDue": "2027-08-26",
  "confirmationStatementNextDue": "2027-07-02",
  "hasInsolvencyHistory": false,
  "url": "https://find-and-update.company-information.service.gov.uk/company/00445790"
}
```

> **Personal data notice.** Officer and PSC (people with significant control) records contain personal data under UK GDPR. They are **off by default** and are only fetched when you switch them on. If you process this data, you are the controller and are responsible for your own compliance: a lawful basis (typically legitimate interests, backed by a documented legitimate-interests assessment), transparency, data minimisation, retention and data-subject rights, and direct-marketing rules (PECR). This is not legal advice; take your own advice if unsure.
>
> Safeguards built in: officer/PSC data needs **`confirmLawfulBasis: true`** (recorded in RUN_STATS, otherwise the run stops before fetching anything); **no home/usual residential addresses** (officers get their correspondence/service address only, PSCs no address); **no full dates of birth** (month/year only); **people marked protected/suppressed/super-secure are excluded**; no search by person name. You control retention of the run dataset; delete it when no longer needed.

Get UK company records straight from the **official Companies House Public Data API**. Search by name, look up company numbers, or filter by **SIC code, incorporation date, status and location**. You can also add **officers (directors)** and **people with significant control (PSCs / beneficial owners)**.

It doesn't scrape HTML. It uses stable, documented JSON with polite rate limiting, and you only pay for the companies you get.

### Use cases

1. **New incorporations by industry,** for accountants, banks and insurers.
   ```json
   {"apiKey": "<your free key>", "searchQuery": "", "sicCodes": ["62012"], "incorporatedFrom": "2026-10-09", "companyStatus": ["active"], "maxItems": 200}
   ```
2. **KYC and due-diligence enrichment.** Pass a list in `companyNumbers` to get status, accounts and confirmation-statement due dates.
3. **Supplier monitoring.** A scheduled task over your supplier numbers flags liquidation or dissolution.
4. **Directors and PSCs (opt-in).** Set `includeOfficers` and/or `includePsc` to `true`, and tick `confirmLawfulBasis`. Home addresses and full dates of birth are never output.

### Automations (Make, Zapier, n8n, Google Sheets)

- **n8n:** Weekly schedule → Apify *Run Actor* (SIC + `incorporatedFrom` = 7 days ago) → Google Sheets *Append* → Gmail digest. Docs: https://docs.apify.com/integrations/n8n.md
- **Make:** *Run an Actor* (synchronous) → *Get Dataset Items* → Airtable/Sheets. Docs: https://docs.apify.com/integrations/make.md
- **Zapier:** *Finished Task Run* → CRM *Update Company* (status, due dates). Docs: https://docs.apify.com/integrations/zapier.md
- **Google Sheets:** Actor-to-Actor integration to `lukaskrivka/google-sheets`. Docs: https://docs.apify.com/integrations/actors.md

### Getting your free API key

Create an application on the Companies House Developer Hub and copy its API key into `apiKey`. Your key's limit is 600 requests per 5 minutes.

1. Register (free) at https://developer.company-information.service.gov.uk/.
2. Go to **Your applications → Create an application → Create new key → REST**.
3. Paste the key into the **Companies House API key** field. The key is stored encrypted as a secret input.

Under the Companies House terms, **each user must use their own key**, so this actor has no shared or built-in key. If you run it without a key, it finishes successfully without charging you and returns one information row explaining how to get a key.

Each key allows **600 requests per 5 minutes**. This actor stays under that limit automatically. It uses a shared sliding-window limiter set to 550 requests per 5 minutes. If Companies House still answers 429, all requests pause until the limit resets.

### Input

| Field | What it does |
|---|---|
| `apiKey` | Your Companies House REST key (secret). |
| `searchQuery` | Words in the company name. |
| `nameMatch` | `strict` (default): only companies whose current name contains every word (advanced search `company_name_includes`, plus a safety post-filter). `relevance`: Companies House's ranked search, which can also match former names. |
| `companyNumbers` | Exact numbers, e.g. `00445790`, `SC123456`. Overrides the search fields. |
| `sicCodes`, `incorporatedFrom`, `incorporatedTo`, `companyStatus`, `location` | Filters that use the **advanced search** endpoint. Can be combined with `searchQuery`. |
| `includeOfficers`, `maxOfficersPerCompany`, `officersCurrentOnly` | Opt-in (default off). Add officers; `officersCurrentOnly` (default on) leaves out resigned officers. |
| `includePsc` | Opt-in (default off). Add people with significant control. |
| `confirmLawfulBasis` | Required with officers or PSCs: confirms you have a lawful basis (e.g. legitimate interests) and will meet UK GDPR Art. 14 duties. |
| `maxItems` | Maximum companies to return (default **20**). |

Example: active software companies incorporated in September 2026, with directors:

```json
{"apiKey": "YOUR_KEY", "sicCodes": ["62012"], "companyStatus": ["active"],
 "incorporatedFrom": "2026-09-01", "incorporatedTo": "2026-09-30", "includeOfficers": true, "maxItems": 100}
```

### Output

Each dataset item is one company (`recordType: "company"`). `matchedOn` explains why a row matched (`company_number`, `company_name_includes`, `filters`, `current_name`, `previous_name_or_other`, `relevance`) and `matchSnippet` shows Companies House's snippet in relevance mode (often a former name). Every row carries a `source` field with the attribution "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House." A key-less run returns a single `recordType: "info"` row instead; that row is not charged. Fields include number, name, status, type, jurisdiction, incorporation and dissolution dates, SIC codes, registered office (one line plus structured), accounts and confirmation-statement due dates and overdue flags, charges and insolvency flags, previous names, and a register link. `officers` and `personsWithSignificantControl` are added when you turn them on.

There are two dataset views:

- **Overview**
- **Compliance dates**

Run statistics are saved in the `RUN_STATS` record:

- requests, retries and 429s
- company numbers that weren't found
- skipped companies
- billing errors

Officer and PSC dates of birth are only published as month and year, and that is all this actor outputs.

### Example output

Trimmed real records (selected fields) (officer/PSC names and birth month/year redacted in this README):

```json
[
 {
  "companyNumber": "SA000044",
  "companyName": "TESCO PERSONAL FINANCE LIFE LIMITED",
  "status": "active",
  "companyType": "assurance-company",
  "incorporatedOn": null,
  "sicCodes": [],
  "registeredOfficePostcode": "",
  "accountsNextDue": null,
  "matchedOn": "company_name_includes",
  "url": "https://find-and-update.company-information.service.gov.uk/company/SA000044",
  "source": "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House."
 },
 {
  "companyNumber": "BR001709",
  "companyName": "TESCO CAPITAL NO. 1 LIMITED",
  "status": "open",
  "companyType": "uk-establishment",
  "incorporatedOn": "1990-06-12",
  "sicCodes": [],
  "registeredOfficePostcode": "AL7 1GA",
  "accountsNextDue": null,
  "matchedOn": "company_name_includes",
  "url": "https://find-and-update.company-information.service.gov.uk/company/BR001709",
  "source": "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House."
 },
 {
  "companyNumber": "17429170",
  "companyName": "LIL QUANTUM IDENTITY SYSTEMS LTD",
  "status": "active",
  "companyType": "ltd",
  "incorporatedOn": "2026-09-01",
  "sicCodes": [
   "62012"
  ],
  "registeredOfficePostcode": "ME19 4PS",
  "accountsNextDue": "2028-06-01",
  "matchedOn": "company_number",
  "url": "https://find-and-update.company-information.service.gov.uk/company/17429170",
  "source": "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House.",
  "officers": [
   {
    "name": "[redacted]",
    "role": "director",
    "appointedOn": "2026-09-01",
    "birthMonthYear": "[redacted]"
   }
  ],
  "personsWithSignificantControl": [
   {
    "name": "[redacted]",
    "kind": "individual-person-with-significant-control",
    "naturesOfControl": [
     "ownership-of-shares-75-to-100-percent",
     "voting-rights-75-to-100-percent",
     "right-to-appoint-and-remove-directors"
    ],
    "birthMonthYear": "[redacted]"
   }
  ]
 }
]
```

#### Key fields

| Field | Meaning |
|---|---|
| `companyNumber` | Companies House number |
| `companyName` | Registered name |
| `status` | active, dissolved, liquidation, ... |
| `incorporatedOn` | Incorporation date |
| `sicCodes` | SIC 2007 codes |
| `registeredOfficePostcode` | Registered office postcode |
| `accountsNextDue` | Next accounts due date |
| `matchedOn` | Why the row matched your search |
| `officers / personsWithSignificantControl` | Opt-in; personal data |
| `source` | OGL v3 attribution on every row |

### Pricing (pay per event)

| Event | Price |
|---|---|
| Company record | $0.003 |
| Officers/PSC enrichment (once per company, if officers and/or PSCs are on) | $0.001 |

A company with officers and/or PSCs costs $0.004. Unknown company numbers, failed lookups and the no-key information row are free.

### How it compares (prices checked on the Apify Store, 17 Oct 2026)

| | Company profile | Directors + PSCs |
|---|---|---|
| **This Actor** (official API) | **$0.003** | +$0.001 per company, optional |
| Most-used Companies House actor on the Store (scraper) | $0.004 | included |

That's 25% less for company profiles. With directors and PSCs turned on, both cost $0.004 per company. Prices can change; check each Actor page.

### FAQ

**Do I need a key?** Yes, a free Companies House API key (see above). Without one, the run returns a single uncharged info row.

**Is there a start fee?** No. You pay only per company returned, plus the optional enrichment.

**Are directors' details included?** Only if you turn on officers/PSCs. Then you're responsible for having a lawful basis under UK GDPR.

### Errors

- A missing or invalid key, bad dates or invalid company numbers stop the run with a clear message.
- Temporary errors (5xx or network problems) are retried with backoff. A company that still fails is skipped and listed in `RUN_STATS`, and the rest of the run continues.

### Personal data

You are the controller of any officer or PSC data you choose to collect. You need a lawful basis (usually legitimate interests) and must meet UK GDPR Article 14 duties. Officer and PSC data is personal data under UK GDPR; you are responsible for your own compliance.

### Source, attribution & disclaimer

Source: Companies House. Contains public sector information licensed under the Open Government Licence v3.0 (https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Every output row carries the attribution "Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House." in its `source` field.

No Crown insignia or logos are used.

**Not affiliated with or endorsed by Companies House.**

# Actor input Schema

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

Your free Companies House REST API key (developer.company-information.service.gov.uk → Your applications → Create an application → REST). Stored encrypted. Each key allows 600 requests per 5 minutes.

## `searchQuery` (type: `string`):

Words in the company name. Used alone for a normal name search, or combined with the filters below for an advanced search.

## `nameMatch` (type: `string`):

Strict (default) returns only companies whose current name contains all words of 'Company name'. Relevance uses Companies House's ranked search, which can also match former names; each row shows matchedOn and matchSnippet.

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

Look up exact companies, e.g. 00445790 or SC123456. When set, the other search fields are ignored. Short numbers are zero-padded.

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

Filter by 2007 SIC code(s), e.g. 62012 (business software). Uses the advanced search.

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

Only companies incorporated on/after this date (YYYY-MM-DD).

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

Only companies incorporated on/before this date (YYYY-MM-DD).

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

Only companies with these statuses, e.g. active.

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

Registered office location contains, e.g. Manchester. Uses the advanced search.

## `confirmLawfulBasis` (type: `boolean`):

Required when Include officers or Include PSCs is on. Tick to confirm: 'I have a lawful basis (e.g. legitimate interests) for processing this personal data and will meet my UK GDPR duties, including Art. 14 transparency.' The confirmation is recorded in the run's RUN_STATS. Without it, a run that requests officers/PSCs stops with a message before any data is fetched.

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

Opt-in (off by default). Adds directors/secretaries — personal data under UK GDPR; see README. +$0.001 per company (charged once even with PSCs).

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

Cap on officers fetched per company (current and resigned).

## `officersCurrentOnly` (type: `boolean`):

Exclude resigned officers (default). Turn off to include resigned officers too.

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

Opt-in (off by default). Adds people with significant control — personal data under UK GDPR; see README. Shares the single $0.001-per-company enrichment charge with officers.

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

Maximum companies to return. Keep small for tests; each company with add-ons uses 2-4 API requests.

## Actor input object example

```json
{
  "searchQuery": "software",
  "nameMatch": "strict",
  "confirmLawfulBasis": false,
  "includeOfficers": false,
  "maxOfficersPerCompany": 50,
  "officersCurrentOnly": true,
  "includePsc": false,
  "maxItems": 20
}
```

# Actor output Schema

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

All output records (default dataset, 'overview' view).

## `runStats` (type: `string`):

RUN_STATS JSON: requests, retries, 429s, not-found numbers, errors, billing errors.

# 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 = {
    "searchQuery": "software",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("agentic_solutions/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 = {
    "searchQuery": "software",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("agentic_solutions/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 '{
  "searchQuery": "software",
  "maxItems": 20
}' |
apify call agentic_solutions/uk-companies-house --silent --output-dataset

```

## MCP server setup

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