# Companies House API — UK Company Search, Profile & Filings (`highbrow_fame/companies-house-api`) Actor

Search UK companies and read the public register: number, status, type, SIC codes, dates, registered office, accounts dates, latest filings, officer and charge counts. Unofficial Companies House API.

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

## Pricing

$1.00 / 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

## Companies House API — UK Company Search, Profile & Filings

Everything the UK Companies House register shows about a company as one clean JSON record: company number, registered name, status (Active, Dissolved, Liquidation …), company type, incorporation and dissolution dates, registered office address (as one line and split into street, town, region, postcode, country), SIC codes with descriptions, previous names with their periods, accounts and confirmation-statement due dates, the number of officers and resignations, the number of registered charges, and the latest filings with date, type code, description, page count and PDF link. Search by company name or look up company numbers — built on the public Companies House website, no API key, no login.

**Try it in 1 minute:**

1. Press **Start** — the prefilled input searches "Rolls-Royce Holdings" (the top hit) and looks up company number 00445790 (Tesco PLC).
2. Seconds later the **Output** tab shows the records: status, type, incorporation date, registered office, SIC codes, accounts dates, officers count and the latest 25 filings.
3. Download JSON, CSV or Excel, or paste your own list of names or numbers, raise **Max results per query** and switch **Include charges count** on.

Price: **$1.00 per 1,000 companies** (one company = one record, with its filings and counts included when you ask for them). Numbers that are not on the register, queries without matches and invalid inputs are free.

**Use it to:**

- Enrich a CRM or spreadsheet of UK suppliers, customers or leads with their registered details, status and SIC codes.
- Run KYB / onboarding checks: is the company active, when was it incorporated, are its accounts or confirmation statement overdue, how many charges are registered.
- Monitor competitors or a portfolio on a schedule: new filings, status changes, name changes, address moves.
- Resolve company names to company numbers (with search position) before feeding an AI agent or a data pipeline.
- Build lists of companies by name pattern and read their nature of business without an API key.

### How it works

1. **Company numbers** are normalised to the 8-character register form (7524813 → 07524813, sc123456 → SC123456; a company page link gives its number) and deduplicated.
2. **Search queries** go to the public search page (`/search/companies?q=…`); the first results page holds 20 companies, cut to **Max results per query**, each with its `position`. A company found by several inputs is read once.
3. For every company the **overview page** (`/company/<number>`) gives name, number, status, type, dates, registered office, SIC codes, previous names and the accounts / confirmation-statement dates.
4. With the options on, up to three more pages are read per company: the **officers page** for the heading "N officers / M resignations" (counts only — no officer names are collected), the first **filing-history** page (25 filings) and the **charges** page for its count.

Requests go directly to Companies House (no proxy, unless a connection drops), one second apart per worker; the register's per-IP rate limit (HTTP 429) is waited out and retried on the same route. The website has no robots.txt (checked October 2026). Filing descriptions are scrubbed of phone numbers and e-mail addresses.

### Input

| Field | What it does |
|---|---|
| `queries` | Company names to search, one per line. |
| `companyNumbers` | Company numbers (07524813, SC123456, 7524813) or company page links, one per line. |
| `maxResults` | Companies per query, up to 20 (default 5). |
| `includeFilings` | Add the latest filings to every company (default on). |
| `maxFilings` | Filings per company from the first page, up to 25 (default 25). |
| `includeOfficersCount` | Add the officers and resignations counts (default on). |
| `includeCharges` | Add the registered charges count (default off). |
| `maxConcurrency` | Companies read in parallel (default 2; each worker waits 1 s between requests). |
| `proxyConfiguration` | Used only to retry after a network error; the first try is direct. |

### Output

One record per company:

| Field | What it is |
|---|---|
| `companyNumber`, `name`, `url` | Identity and the company's page on the register |
| `companyStatus`, `companyType` | Active / Dissolved / Liquidation …; Private limited Company, Public limited Company, LLP … |
| `incorporatedOn`, `dissolvedOn` | Dates, YYYY-MM-DD |
| `registeredOffice`, `address` | The registered office as one line and split into `{ addressLine1, addressLine2, locality, region, postalCode, country }` (best effort) |
| `sicCodes[]` | `{ code, description }` — nature of business |
| `previousNames[]` | `{ name, from, to }` |
| `accounts`, `confirmationStatement` | `{ nextDue, lastMadeUpTo, nextMadeUpTo, overdue }` |
| `officersCount`, `resignationsCount` | How many officers the register lists and how many resigned (counts only) |
| `chargesCount` | Registered charges, with Include charges count on |
| `filings[]` | `{ date, type, description, pages, url }` — newest first, from the first filing-history page |
| `detailsError` | Why an optional page could not be read; null when all went well |
| `query`, `position` | The search query and the 1-based position the company came from; null for a company number |
| `input`, `status`, `error`, `scrapedAt` | What you gave, `OK` / `NOT_FOUND` / `NO_RESULTS` / `INVALID_INPUT` / `FAILED`, the reason, and when |

#### Example

```json
{
  "input": "Rolls-Royce Holdings",
  "query": "Rolls-Royce Holdings",
  "position": 1,
  "companyNumber": "07524813",
  "name": "ROLLS-ROYCE HOLDINGS PLC",
  "companyStatus": "Active",
  "companyType": "Public limited Company",
  "incorporatedOn": "2011-02-10",
  "dissolvedOn": null,
  "registeredOffice": "Kings Place, 90 York Way, London, United Kingdom, N1 9FX",
  "address": { "addressLine1": "Kings Place", "addressLine2": "90 York Way", "locality": "London", "region": null, "postalCode": "N1 9FX", "country": "United Kingdom" },
  "sicCodes": [{ "code": "70100", "description": "Activities of head offices" }],
  "previousNames": [{ "name": "ROLLS-ROYCE HOLDINGS LIMITED", "from": "2011-02-10", "to": "2011-03-08" }],
  "accounts": { "nextDue": "2027-06-30", "lastMadeUpTo": "2025-12-31", "nextMadeUpTo": "2026-12-31", "overdue": false },
  "confirmationStatement": { "nextDue": "2027-10-13", "lastMadeUpTo": "2026-09-29", "nextMadeUpTo": "2027-09-29", "overdue": false },
  "officersCount": 52,
  "resignationsCount": 37,
  "chargesCount": null,
  "filings": [
    { "date": "2026-10-07", "type": "CS01", "description": "Confirmation statement made on 29 September 2026 with no updates", "pages": 3, "url": "https://find-and-update.company-information.service.gov.uk/company/07524813/filing-history/MzU0OTcwNzk4OWFkaXF6a2N4/document?format=pdf&download=0" }
  ],
  "detailsError": null,
  "url": "https://find-and-update.company-information.service.gov.uk/company/07524813",
  "status": "OK",
  "error": null,
  "scrapedAt": "2026-10-19T12:00:00.000Z"
}
```

### FAQ

**Is this an official API?** No, it's an unofficial API built on public pages — the Companies House website that anyone can browse without a key or login. Companies House also offers an official REST API, which needs a registered account and key; this Actor is for the cases where you have neither. The data is what the website shows; the Actor only shapes it into stable JSON records.

**Why is a company NOT_FOUND?** The number is not on the register (a typo, or a number from another registry). Numbers are padded with leading zeros for you (7524813 → 07524813); Scottish, Northern Irish and LLP numbers keep their two-letter prefix (SC, NI, OC …). Try the name as a search query instead.

**Do you collect officer names or personal data?** No. The officers page is read only for its heading ("N officers / M resignations"); names, addresses, dates of birth and nationalities are never read or stored. Registered office addresses are public business data and are kept.

**How many search results can I get?** Up to 20 per query, the first results page of the register. For long lists, use more specific names (the register searches previous names too, and the record says which previous name matched a hit through `position`) or paste the company numbers directly.

**What about rate limits?** Companies House limits requests per IP; this Actor waits one second between the requests of a worker (2 workers by default) and waits out and retries an HTTP 429 on the same route. A run of a thousand companies with filings and officers counts takes about half an hour.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

### Related Actors

- [SEC EDGAR API](https://apify.com/highbrow_fame/sec-edgar-filings) — 10-K, 10-Q, 8-K and full-text search
- [Yahoo Finance API](https://apify.com/highbrow_fame/yahoo-finance-quotes) — stock quotes and fundamentals
- [Website Tech Stack Detector](https://apify.com/highbrow_fame/website-tech-stack) — CMS, frameworks and analytics of any site
- [Google News API](https://apify.com/highbrow_fame/google-news-api) — headlines by keyword and topic
- [Web Fetch API](https://apify.com/highbrow_fame/web-fetch-api) — any URL as HTML, text, Markdown or JSON

# Actor input Schema

## `queries` (type: `array`):

Company names to search on the Companies House register, one per line (e.g. "Rolls-Royce Holdings"). Up to Max results companies per query, each with its search position.

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

Companies to read, one per line: an 8-character number (07524813, SC123456, NI677208), a shorter digits-only number (7524813 is padded to 07524813) or a company page link.

## `maxResults` (type: `integer`):

Companies per search query, up to 20 (the first results page).

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

Add the latest filings (date, type code, description, pages, PDF link) to every company — one extra request per company.

## `maxFilings` (type: `integer`):

Filings per company from the first filing-history page (25 per page).

## `includeOfficersCount` (type: `boolean`):

Add how many officers and resignations the register lists (counts only — officer names are never collected).

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

Add how many charges (mortgages, debentures) are registered against the company.

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

Companies read at the same time; each worker waits one second between requests. The register rate-limits per IP (HTTP 429), which is waited out and retried.

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

Used only to try again after a network error: the register answers directly, so the first try of every request goes out without a proxy.

## Actor input object example

```json
{
  "queries": [
    "Rolls-Royce Holdings"
  ],
  "companyNumbers": [
    "00445790"
  ],
  "maxResults": 1,
  "includeFilings": true,
  "maxFilings": 25,
  "includeOfficersCount": true,
  "includeCharges": false,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "queries": [
        "Rolls-Royce Holdings"
    ],
    "companyNumbers": [
        "00445790"
    ],
    "maxResults": 1,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/companies-house-api").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 = {
    "queries": ["Rolls-Royce Holdings"],
    "companyNumbers": ["00445790"],
    "maxResults": 1,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/companies-house-api").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 '{
  "queries": [
    "Rolls-Royce Holdings"
  ],
  "companyNumbers": [
    "00445790"
  ],
  "maxResults": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/companies-house-api --silent --output-dataset

```

## MCP server setup

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

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/XthsjMfb21qIDt1tq/builds/dXrPLQPB5g0YbzbIl/openapi.json
