# UK Companies House Company Data (No Officers or PSCs) (`ataism/uk-companies-house`) Actor

UK company profiles from the official Companies House API: status, SIC, address, accounts dates, filings. No officers or PSCs.

- **URL**: https://apify.com/ataism/uk-companies-house.md
- **Developed by:** [Kaizoku Data](https://apify.com/ataism) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 company saveds

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 Company Data Scraper (No Officers or PSCs)

Get UK company records from the **official Companies House API** as clean, structured data. Each record has status, type, incorporation and dissolution dates, the registered office, SIC codes with descriptions, accounts and confirmation-statement dates (including overdue flags), charge and insolvency flags, previous names, and optionally the filing history.

**Company data, not people data.** This Actor deliberately returns **no officers and no persons with significant control (PSCs)**, and removes people's names from filing details. Some company fields can still identify a person, such as a one-person company's name or a registered office that is someone's home: see *Your responsibilities (UK GDPR and PECR)*.

**Price: $0.0025 per company**, plus **$0.0005 per filing-history row** if you ask for filings.

### What you can do with it

- **Enrich a list of company numbers:** status, SIC, address, and whether accounts are overdue.
- **Size a market or study a sector:** for example, how many active software companies (SIC 62012) were incorporated in Manchester this quarter, and how many have since been dissolved. You can also use it to research companies before a B2B deal. Many small companies are run by one person, so read *Your responsibilities* below before you contact anyone.
- **Monitor compliance:** find companies with overdue accounts or confirmation statements, charges, or insolvency history.
- **Watch filing activity:** the latest accounts, address changes and new charges for each company.

### You need a free Companies House API key

Companies House requires a key for every API request. It's **free** and takes about 5 minutes:

1. Register at the [Companies House Developer Hub](https://developer.company-information.service.gov.uk/).
2. Go to *Your applications* → *Create an application* → choose **REST** → **API key**.
3. Paste the key into the **Your Companies House API key** field. Apify stores it encrypted.

**Try it first without a key:** the prefilled example (company 00445790, Tesco PLC, no filing history) runs on our own key, so you can see the output before signing up. Any other input needs your key, and a run without one stops at once with a link to the free sign-up. No results are charged.

Each key allows **600 requests per 5 minutes**. The Actor paces itself below that, so a run of 1,000 full profiles takes about 9–10 minutes. It's slower than a scraper, but it's official, stable and never blocked.

### Input

| Field | What it does |
|---|---|
| **API key** | Your own free key (see above). |
| **Company numbers** | Look up specific companies, e.g. `00445790`, `SC123456`, `OC301234`. Short numbers are zero-padded. |
| **Search: name contains / excludes** | Advanced search on company name. |
| **Search: status** | active, dissolved, liquidation, administration, … |
| **Search: company type** | ltd, plc, llp, … |
| **Search: SIC codes** | e.g. `62012`. |
| **Search: incorporated from / to** | Date range. |
| **Search: location** | Registered-office location text. |
| **Max search results** | Up to 5,000. |
| **Fetch the full profile for search results** | On by default. Adds accounts and confirmation-statement dates, flags and previous names (1 extra request per company, same price). |
| **Include filing history** | Most recent N filings (1–100), optionally by category. |

Example: new software companies in Manchester, with their latest 5 filings:

```json
{
  "apiKey": "<your key>",
  "sicCodes": ["62012"],
  "statuses": ["active"],
  "incorporatedFrom": "2026-07-01",
  "location": "Manchester",
  "maxResults": 200,
  "includeFilingHistory": true,
  "maxFilingsPerCompany": 5
}
```

### Output

```json
{
  "companyNumber": "00445790",
  "companyName": "TESCO PLC",
  "status": "active",
  "statusLabel": "Active",
  "type": "plc",
  "typeLabel": "Public limited company",
  "jurisdiction": "england-wales",
  "incorporatedOn": "1947-11-27",
  "dissolvedOn": null,
  "registeredOffice": { "addressLine1": "Tesco House, Shire Park", "locality": "Welwyn Garden City", "postalCode": "AL7 1GA", "country": "United Kingdom" },
  "sicCodes": [{ "code": "47110", "description": "Retail sale in non-specialised stores with food, beverages or tobacco predominating" }],
  "accounts": { "lastMadeUpTo": "2026-02-28", "nextDue": "2027-08-31", "overdue": false },
  "confirmationStatement": { "nextDue": "2027-06-14", "overdue": false },
  "hasCharges": true,
  "hasInsolvencyHistory": false,
  "previousNames": [],
  "filings": [
    { "date": "2026-06-20", "category": "accounts", "type": "AA", "description": "Group of companies' accounts made up to 28 Feb 2026" },
    { "date": "2026-05-02", "category": "officers", "type": "AP01", "description": "Appointment of [person removed] as a director on 1 May 2026" }
  ],
  "filingsTotal": 1432,
  "detailLevel": "full",
  "profileUrl": "https://find-and-update.company-information.service.gov.uk/company/00445790",
  "source": "Companies House",
  "retrievedAt": "2026-10-18T06:00:00.000Z"
}
```

*(Values are illustrative.)* You can export it as JSON, CSV, Excel or XML, or read it through the Apify API.

### Pricing

Pay per event:

- **$0.0025 per company** saved.
- **$0.0005 per filing-history row** (only when *Include filing history* is on).
- Apify's standard tiny start fee per run.

For example:

- 1,000 companies cost **$2.50**.
- 1,000 companies with 10 filings each cost **$7.50**.

Invalid or unknown company numbers are skipped and **not charged**. Set *Max total charge* to cap a run; the Actor stops cleanly and never delivers more than you paid for.

### Privacy: what we leave out, on purpose

- **No officers or PSCs.** Those endpoints are never called.
- **Filing descriptions are cleaned.** Names of directors, secretaries, members and PSCs are replaced with `[person removed]`. Free-text legacy descriptions are dropped. A value that doesn't look like what it should be (a form code, jurisdiction, charge number, currency or amount) is shown as `[removed]`, and a bad date as `[date removed]`.
- **Address changes show the postcode district only.** In filing descriptions, old and new addresses become the first half of the postcode, e.g. "Registered office address changed from LS1 to YO1". Nothing else from the address is shown: no house number, street, town, PO box or care-of name. An overseas address shows only its country (if it ends with a country name we recognise); otherwise you get `[address]`.
- **Care-of names are removed.** The separate "care of" field and service addresses are dropped. If the company wrote "C/O …", "FAO …" or "Attn …" into an address line, that part is removed; a line that is only care-of text is empty (null), and the other lines stay where they are.
- The **registered office** is kept. It's a public company attribute, though for very small companies it can be the director's home.

### Your responsibilities (UK GDPR and PECR)

- **You are the data controller** for what you do with the output. Companies House says: "Once they hold your information, third-parties are responsible for making sure they comply with data protection law" ([Your personal information on the Companies House register, GOV.UK](https://www.gov.uk/guidance/your-personal-information-on-the-companies-house-register)).
- **Some company data is personal data.** The registered office of a small company is often someone's home, and some company names are a person's name (e.g. "JOHN SMITH LTD"). UK GDPR applies to these.
- **Marketing by email or text:** sole traders and some partnerships are treated as individuals under PECR. You can only email or text them if they have specifically consented or the "soft opt-in" applies ([Business-to-business marketing, ICO](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/business-to-business-marketing/)).

### Reliability

- Uses the official, versioned REST API: no HTML parsing and no blocking.
- Paces requests under the 600-per-5-minutes limit, waits for the window to reset on 429, and retries 5xx errors.
- Unknown company numbers are reported in the run's `RUN_SUMMARY` and not charged.
- A daily self-test checks live responses against a recorded baseline: expected fields, fill rates, and that no officer/PSC/person fields appear in the output. We fix breakages fast.

### Is it allowed?

Yes. Companies House makes "all of the public data we hold on companies available free of charge… through our application program interface" ([GOV.UK](https://www.gov.uk/guidance/search-the-companies-house-register)). Its staff have said Companies House "imposes no rules or requirements on how the information on the public register is used"; you remain responsible for data-protection and other law ([CH forum](https://forum.companieshouse.gov.uk/t/is-data-provided-under-the-ocs/4513)). This Actor is not affiliated with Companies House.

### FAQ

**Why do I need my own key?** Companies House issues keys per application and limits each to 600 requests per 5 minutes. Your own key means your runs never compete with other users for that limit.

**Can I get directors?** No. That's deliberate: this Actor is for company-level data only.

**Something's wrong?** Open an issue on the Actor's Issues tab. We aim to reply within 2 working days.

# Actor input Schema

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

Free from the Companies House Developer Hub (developer.company-information.service.gov.uk → Your applications → create an application → API key). It's stored encrypted and used only for your runs. Limit: 600 requests per 5 minutes per key; the Actor paces itself under it.

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

Look up these companies directly, e.g. 00445790, SC123456, OC301234. Short numbers are zero-padded.

## `nameIncludes` (type: `string`):

Advanced search: company name includes this text.

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

Advanced search: company name does NOT include this text.

## `statuses` (type: `array`):

Keep only companies with these statuses.

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

Companies House type codes, e.g. ltd, plc, llp, private-unlimited, private-limited-guarant-nsc, limited-partnership, oversea-company, charitable-incorporated-organisation.

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

e.g. 62012 (business and domestic software development).

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

YYYY-MM-DD

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

YYYY-MM-DD

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

Registered office location text, e.g. Manchester.

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

Cap on companies taken from the search (1–5000).

## `fetchFullProfile` (type: `boolean`):

Adds accounts and confirmation-statement dates, charges and insolvency flags, and previous names (1 extra API request per company). Off = search fields only (faster, same price).

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

Add the most recent filings ($0.0005 per filing row).

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

Most recent filings per company (1–100).

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

Only these categories. Leave empty for all.

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

Internal: "selfTest" runs the maintainer health check.

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790"
  ],
  "maxResults": 100,
  "fetchFullProfile": true,
  "includeFilingHistory": false,
  "maxFilingsPerCompany": 10,
  "mode": "scrape"
}
```

# Actor output Schema

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

UK company records, one item per row (JSON, CSV, Excel or XML).

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

Counts, skipped inputs and errors for this run.

# 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("ataism/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("ataism/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 ataism/uk-companies-house --silent --output-dataset

```

## MCP server setup

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