# UK Companies House Scraper (`zapticx/uk-companies-house-scraper`) Actor

Look up UK companies by company number or Companies House URL, or search the register by name, SIC code, status, address text and incorporation date. Returns company profiles, registered office, accounts dates, directors and PSC beneficial owners from the official API. No API key needed to start.

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

## Pricing

from $2.00 / 1,000 company (basic)s

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Companies House Scraper

Get structured **UK company data from Companies House** — by exact lookup or by
search. Give it a **company number** or a **Companies House URL**, or discover
companies by name, **SIC code**, status, registered-office address text and
incorporation date. Every result comes back as a clean record with the company
profile, **registered office**, accounts and confirmation-statement dates,
**directors and officers**, and **PSC beneficial owners**.

It reads the **official Companies House Public Data API** — not scraped HTML —
and **you do not need your own API key to start**. Add your own free key when
you want to run bigger jobs.

Export to JSON, CSV or Excel, or pull the data straight into your own systems
through the Apify API.

**Typical uses:** B2B lead generation · company and market research · competitor
and supplier checks · due diligence support · director and beneficial-ownership
research · compliance data workflows · finding newly incorporated companies.

***

### What can you do with this Actor?

- **Enrich a list of companies you already have.** Paste company numbers or
  Companies House URLs and get back full, current register data for each one.
- **Build a UK company prospect list.** Find active companies in an industry
  (SIC code), incorporated in a date range, with a given town in their
  registered address.
- **Track newly incorporated companies.** Filter by incorporation date to see
  who registered this week, this month or this quarter.
- **Research directors and officers.** Pull the current and past officer list
  for any company, with roles and appointment dates.
- **Check who really owns a company.** Get Persons with Significant Control
  (PSC) — the beneficial owners — including corporate owners with their
  registration details.
- **Support due diligence.** Optionally add filing history, registered charges
  (mortgages) and insolvency history.
- **Monitor compliance dates.** Accounts and confirmation-statement due dates,
  and the register's own overdue flags.

### What data can you extract?

**Company profile** — name, company number, status (active, dissolved, in
liquidation, in administration…), company type (Ltd, PLC, LLP…), jurisdiction,
incorporation date, dissolution date, previous names.

**Registered office** — full structured address, plus flattened
`locality`, `region`, `postalCode` and `country` columns for spreadsheets.

**Industry** — SIC codes, each with its official Companies House description.

**Accounts and confirmation statement** — last and next made-up-to dates, next
due dates, accounts category, accounting reference date, and the register's own
`accountsOverdue` / `confirmationStatementOverdue` flags.

**Register flags** — has charges, has insolvency history, has been liquidated,
has super-secure PSCs, can file, registered office in dispute.

**Directors and officers** *(on by default)* — every current and former
director, secretary and LLP member: name, role, appointment and resignation
dates, nationality, country of residence, month and year of birth, service
address, and Companies House identity-verification details where present.

**PSC / beneficial owners** *(on by default)* — name, kind (individual,
corporate entity, legal person, super-secure), natures of control **with their
official plain-English descriptions**, notification and cessation dates, and —
for corporate owners — the full identification block (legal form, authority,
country and registration number). **PSC statements** are included too, such as
a company's formal declaration that it has no registrable person.

**Optional deeper data** — filing history (25 most recent filings with readable
descriptions), registered charges and who they are secured to, and insolvency
cases with appointed practitioners.

**Calculated for you** — company age in years, active and resigned officer
counts, active and ceased PSC counts, days until accounts and confirmation
statement are due, outstanding charge count, recent filing count, and a link to
the company's page on the public register. These live in a separate `derived`
block so you always know what came from Companies House and what did not.

***

### How to use it

The Actor works in two modes, and it picks the mode from what you fill in.

#### Lookup mode — you already know the companies

Fill in **Company numbers** and/or **Companies House URLs**. Every company you
list is fetched. Short numbers are padded automatically (`123456` becomes
`00123456`) and Scottish (`SC`), Northern Irish (`NI`) and LLP (`OC`) prefixes
all work.

#### Discovery mode — you want to find companies

Leave the company numbers empty and use the search filters instead: company
name contains / does not contain, company status, company type, SIC codes,
registered-office address text, and an incorporation date range.

> If you supply company numbers **and** search filters, the Actor runs in
> lookup mode and tells you in the log which filters it ignored.

Then choose what to collect for each company. Full profile, directors and PSC
are **on** by default; filing history, charges and insolvency are **off**.

***

### Input examples

#### Exact company lookup

```json
{
  "companyNumbers": ["00445790"]
}
```

#### Multiple companies at once

```json
{
  "companyNumbers": ["00445790", "03977902", "01624297"],
  "fetchFullProfile": true,
  "includeOfficers": true,
  "includePsc": true
}
```

#### Companies House URL lookup

Paste the page you were looking at — anything after the company number is
ignored.

```json
{
  "companyUrls": [
    "https://find-and-update.company-information.service.gov.uk/company/00445790",
    "https://find-and-update.company-information.service.gov.uk/company/03977902/officers"
  ]
}
```

#### Company discovery — active software companies registered in Manchester since 2025

```json
{
  "companyStatus": ["active"],
  "sicCodes": ["62012"],
  "location": "Manchester",
  "incorporatedFrom": "2025-01-01",
  "maxResults": 25
}
```

#### Newly incorporated companies in an industry

```json
{
  "companyStatus": ["active"],
  "companyType": ["ltd"],
  "sicCodes": ["62020"],
  "incorporatedFrom": "2026-01-01",
  "maxResults": 1000,
  "fetchFullProfile": false,
  "includeOfficers": false,
  "includePsc": false
}
```

Turning the profile and enrichments off makes discovery dramatically faster and
cheaper — the search itself already returns name, number, status, type,
incorporation date, registered address and SIC codes. Runs above 25 companies
need your own Companies House API key.

#### Directors and beneficial owners

```json
{
  "companyNumbers": ["03977902"],
  "includeOfficers": true,
  "includePsc": true
}
```

#### Deep company research — filings, charges and insolvency

```json
{
  "companyNumbers": ["NI017460"],
  "includeOfficers": true,
  "includePsc": true,
  "includeFilingHistory": true,
  "includeCharges": true,
  "includeInsolvency": true
}
```

***

### Output example

One record per company. Abridged below — a real record carries every officer,
and `filingHistory`, `charges` and `insolvencyCases` are `null` here because
this run did not ask for them.

```json
{
  "companyName": "GOOGLE UK LIMITED",
  "companyNumber": "03977902",
  "companyStatus": "active",
  "companyType": "ltd",
  "jurisdiction": "england-wales",
  "incorporationDate": "2000-04-20",
  "cessationDate": null,
  "registeredOfficeAddress": {
    "premises": null,
    "addressLine1": "1 St. Giles High Street",
    "addressLine2": null,
    "careOf": null,
    "poBox": null,
    "locality": "London",
    "region": null,
    "postalCode": "WC2H 8AG",
    "country": "United Kingdom"
  },
  "locality": "London",
  "region": null,
  "postalCode": "WC2H 8AG",
  "sicCodes": [
    "82990"
  ],
  "sicCodeDescriptions": [
    "Other business support service activities not elsewhere classified"
  ],
  "accountsNextDueOn": "2026-09-30",
  "accountsOverdue": false,
  "confirmationStatementNextDueOn": "2027-05-04",
  "confirmationStatementOverdue": false,
  "hasCharges": false,
  "hasInsolvencyHistory": false,
  "officers": [
    {
      "name": "ABOGADO NOMINEES LIMITED",
      "officerRole": "corporate-secretary",
      "officerRoleLabel": "Secretary",
      "appointedOn": "2026-06-01",
      "appointedBefore": null,
      "resignedOn": null,
      "isActive": true,
      "isPre1992Appointment": false,
      "nationality": null,
      "occupation": null,
      "countryOfResidence": null,
      "dateOfBirth": null,
      "address": {
        "premises": "C/O Company Secretarial Department",
        "addressLine1": "280 Bishopsgate",
        "addressLine2": null,
        "careOf": null,
        "poBox": null,
        "locality": "London",
        "region": null,
        "postalCode": "EC2M 4AG",
        "country": "United Kingdom"
      },
      "identityVerificationDetails": null
    }
  ],
  "psc": [
    {
      "name": "Alphabet, Inc.",
      "kind": "corporate-entity-person-with-significant-control",
      "nameElements": null,
      "naturesOfControl": [
        "ownership-of-shares-75-to-100-percent",
        "voting-rights-75-to-100-percent",
        "right-to-appoint-and-remove-directors"
      ],
      "naturesOfControlDescriptions": [
        "The person holds, directly or indirectly, more than 75% of the shares in the company.",
        "The person holds, directly or indirectly, more than 75% of the voting rights in the company.",
        "The person holds the right, directly or indirectly, to appoint or remove a majority of the board of directors of the company."
      ],
      "notifiedOn": "2016-04-06",
      "ceasedOn": null,
      "ceased": false,
      "isActive": true,
      "nationality": null,
      "countryOfResidence": null,
      "dateOfBirth": null,
      "address": {
        "premises": "Corporation Service Company",
        "addressLine1": "251 Little Falls Drive",
        "addressLine2": null,
        "careOf": null,
        "poBox": null,
        "locality": "Wilmington",
        "region": "Delaware",
        "postalCode": "19808",
        "country": "United States"
      },
      "identification": {
        "legal_form": "Corporate",
        "legal_authority": "Delaware Secretary Of State",
        "country_registered": "Delaware",
        "place_registered": "Delaware",
        "registration_number": "5786925"
      },
      "identityVerificationDetails": null
    }
  ],
  "pscStatements": [],
  "filingHistory": null,
  "charges": null,
  "insolvencyCases": null,
  "derived": {
    "companyAgeYears": 26.4,
    "recentlyIncorporated": false,
    "activeOfficersCount": 3,
    "resignedOfficersCount": 16,
    "activePscCount": 1,
    "ceasedPscCount": 0,
    "daysUntilAccountsDue": 23,
    "daysUntilConfirmationStatementDue": 239,
    "outstandingChargesCount": null,
    "recentFilingCount": null
  },
  "enrichmentStatus": {
    "profile": "ok",
    "officers": "ok",
    "psc": "ok",
    "pscStatements": "none_on_register",
    "filingHistory": "not_requested",
    "charges": "not_requested",
    "insolvency": "not_requested"
  },
  "companiesHouseUrl": "https://find-and-update.company-information.service.gov.uk/company/03977902",
  "scrapedAt": "2026-09-07T18:04:27Z"
}
```

Note `region: null`. Companies House simply does not publish a region for most
addresses, and the Actor reports that as *unknown* rather than inventing an
empty string. The same discipline applies everywhere — see **`enrichmentStatus`**
below.

#### Why a field is empty: `enrichmentStatus`

| Value | Meaning |
|---|---|
| `not_requested` | You turned that enrichment off. The field is `null`. |
| `ok` | Fetched, and there is data. |
| `none_on_register` | Fetched, and there genuinely is none. The field is `[]`. |
| `failed: <reason>` | That one lookup failed. The field is `null` and the rest of the record is still valid and delivered. |

An empty list and a null mean different things, and this Actor never confuses
them. A missing value is never turned into `0`, `false` or `""`.

***

### Dataset views

The **Output** tab gives you three ready-made views, which is what makes the
data usable in a spreadsheet without a second run:

| View | What it gives you |
|---|---|
| **Companies** | One row per company — the headline fields plus the calculated summaries |
| **Officers** | **One row per director/officer**, with its company alongside |
| **Beneficial owners (PSC)** | **One row per PSC**, with its company alongside |

Officers and PSCs are nested inside the company record, which is right for JSON
and APIs but awkward for Excel. The Officers and PSC views flatten them for you:
a 3-company run with 120 officers exports as 120 clean CSV rows. There is no
extra charge for using a view.

***

### Pricing

You are charged **once per company delivered**, at the highest tier that company
actually reached.

| Tier | Per company | Per 1,000 companies | What it covers |
|---|---|---|---|
| **Basic** | $0.002 | **$2.00** | Company profile / search data only |
| **Enriched** | $0.005 | **$5.00** | …plus directors/officers and/or PSC and PSC statements |
| **Deep** | $0.008 | **$8.00** | …plus filing history, charges or insolvency |

**The tiers do not stack.** A company that reaches Deep costs **$0.008**, not
$0.002 + $0.005 + $0.008. Each company produces exactly one charge.

- **No Actor-start fee.**
- **Companies that are not found on the register, invalid, or fail are never
  charged** — they never reach the dataset.
- If an enrichment fails, you are billed at the lower tier you actually
  received.

At the default settings (profile + directors + PSC), 25 companies costs
**$0.125** and 1,000 companies costs **$5.00**.

***

### Built-in Companies House API access

The Actor ships with a **built-in Companies House API key**, so you can run it
straight away with no registration and no setup.

That key is shared with everyone using the free lane, so it is capped at
**25 companies per run**. That is intended for trying the Actor out, one-off
lookups, small enrichment jobs and automations that check a handful of
companies at a time.

### Bring your own Companies House API key

For anything larger, add your own key. It is free, takes a few minutes, and
gives you your own request quota instead of a shared one.

1. Register at <https://developer.company-information.service.gov.uk/>
2. Create an application and choose the **Live** environment (not the sandbox).
3. Create a key of type **REST**.
4. Leave **Restricted IPs** and **JavaScript domains** blank.
5. Paste it into **Your Companies House API key**.

The field is handled as an encrypted secret — it is stored encrypted by Apify,
never written into your results, and never printed in the run log.

With your own key you can collect up to **10,000 companies per run**, which is
the maximum Companies House Advanced Search will return for one set of filters.

> Using your own key gives you a **private** quota. It does not raise or bypass
> Companies House's limits — those still apply, to you as they do to everyone.
> This Actor never rotates keys or uses proxies to work around them.

***

### Large runs and performance

Companies House allows **600 requests per 5 minutes per key** — roughly 2 per
second, shared across all endpoints. The Actor paces itself below that and waits
for the window to reset if it gets there.

Roughly what a company costs in requests:

| What you collect | Requests per company |
|---|---|
| Discovery only, profile off | ~0.01 (one search request covers 100 companies) |
| Profile only | 1 |
| Profile + directors + PSC (**default**) | ~4 |
| Everything | ~5 |

Realistic timings at default settings:

| Companies | Approximate time |
|---|---|
| 25 | under 1 minute |
| 100 | ~3 minutes |
| 1,000 | ~25 minutes |
| 10,000 | ~4 hours |

**Discovery without enrichment is a different order of magnitude**: 1,000
companies in well under a minute, because the search endpoint returns 100
companies per request. If you only need the basics — name, number, status,
type, incorporation date, address, SIC codes — turn the profile and enrichments
off and the job finishes in seconds.

Records are written to the dataset **as each company completes**, so a long run
you stop early still leaves you everything collected so far.

***

### Integrations and automation

The output is flat, typed and stable, so it drops into whatever you already use.

- Run it and read the dataset through the **Apify API**, or trigger downstream
  systems with **webhooks**.
- Connect the run or its dataset to **Make**, **Zapier** or **n8n** using their
  Apify integration or a generic HTTP module. There is no native Companies House
  connector on those platforms, so this Actor saves you hand-building auth,
  pagination, retries and three separate enrichment calls.
- Call it from **Python** or **JavaScript/Node.js** with the Apify client.
- Export **CSV** or **Excel** straight from the Output tab — use the Officers or
  PSC view when you want one row per person.
- Feed the JSON to **AI agents and LLM workflows** that need current, factual UK
  company data.
- Load the dataset into **BI tools and data pipelines** for reporting.

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("zapticx/uk-companies-house-scraper").call(
    run_input={
        "companyNumbers": ["00445790"],
        "includeOfficers": True,
        "includePsc": True,
    }
)
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["companyName"], company["derived"]["activeOfficersCount"])
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('zapticx/uk-companies-house-scraper').call({
    companyNumbers: ['00445790'],
    includeOfficers: true,
    includePsc: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].companyName);
```

***

### Data source

Data comes from the **Companies House Public Data API**
(`api.company-information.service.gov.uk`) — the UK registrar's own service.
SIC, filing, PSC and company-status descriptions come from the official
[Companies House enumerations](https://github.com/companieshouse/api-enumerations).

> Contains public sector information licensed under the
> [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

This Actor is built by **Zapticx**. It is **not affiliated with, endorsed by or
operated by Companies House**, and it is not an official source. For anything
legally binding, check the register itself.

***

### Limitations

Worth knowing before you run a big job:

- **Discovery is capped at 10,000 companies per set of filters.** That is a
  Companies House Advanced Search limit, not ours. The Actor stops cleanly and
  tells you. To collect more, split the job — usually by incorporation date
  range — and run it again.
- **The address filter is text, not geography — it is not a map or radius
  search.** "Registered office address contains" matches the *text* of the
  registered address. `Manchester` also
  matches a company on *Manchester Road* in London, and a business trading in
  Manchester whose registered office sits at its accountant's address in London
  will **not** match. Registered office is not the same as trading address.
- **Some register fields are sparse.** Measured across 120 real officers:
  `occupation` was populated **0%** of the time, identity-verification details
  14%, country of residence 52%, date of birth 85%, nationality 89%. `region`
  appeared for about a third of companies. All are returned as nullable and
  none is relied on internally.
- **PSC can legitimately be empty.** PLCs traded on a regulated market are
  exempt, so a large listed company often has **no** PSC at all. That is correct
  register data, reported as `[]` with `none_on_register` — not a failure.
- **Optional enrichment costs requests and time.** Filing history, charges and
  insolvency each add per-company requests. Charges and insolvency are skipped
  automatically when the register already says there are none.
- **Companies House rate limits apply** (600 requests per 5 minutes per key).
  Large runs take as long as those limits allow.
- **Dissolved and historical companies are valid results.** They return complete
  data with a `dissolved` status and a cessation date — filter by company status
  if you only want live companies.
- **What the register does not hold, this Actor does not return:** no emails, no
  phone numbers, no websites, no turnover, no employee counts, no credit scores.
  Financial figures live inside filed accounts documents, which this version
  does not parse. Nothing is estimated, inferred or invented.
- **Officer dates of birth are month and year only.** That is a statutory
  restriction on the register, not a limitation of this Actor.
- **Runs depend on Companies House availability.** If the API is down or slow,
  the Actor retries, reports honestly, and still delivers whatever it collected.

***

### Privacy and responsible use

Officer and PSC records contain personal data about real people. Companies House
publishes it because the Companies Act 2006 requires it — but "public" is not
the same as "unrestricted".

- The Open Government Licence covers the company data; it **excludes personal
  data**.
- When you export officer or PSC records you become a **data controller in your
  own right** under UK GDPR, and you are responsible for having a lawful basis.
- If you use the data for marketing, UK PECR and the ICO's direct-marketing
  rules apply to you.
- This Actor deliberately does not build cross-company profiles of individuals,
  does not emit person-linking identifiers, and never reconstructs a full date of
  birth from the month and year the register publishes.

This is practical guidance, not legal advice.

***

### FAQ

**What is a Companies House scraper?**
A tool that pulls company records from the UK's official company register.
This one reads the Companies House Public Data API rather than scraping web
pages, so results are structured and stable.

**Can I search UK companies by SIC code?**
Yes. Add one or more five-digit SIC 2007 codes — for example `62012` for
business and domestic software development — and combine them with status,
company type, address text and an incorporation date range.

**Can I extract company directors?**
Yes. Directors and officers are included by default: current and former, with
role, appointment and resignation dates, nationality, country of residence and
month/year of birth. Use the **Officers** view for one row per person.

**Can I get Persons with Significant Control (PSC)?**
Yes, on by default — including natures of control with their official
descriptions, and the full identification block for corporate owners. PSC
statements are returned too.

**Why is PSC data sometimes empty?**
Because the company genuinely has none on the register. PLCs traded on a
regulated market are exempt, and some companies file a statement instead. The
Actor reports this as `[]` with `none_on_register`, which is different from a
failed lookup (`null`).

**Can I scrape Companies House without my own API key?**
Yes. A built-in key is included, capped at 25 companies per run. Add your own
free Companies House key for larger runs.

**How many companies can I extract?**
25 per run on the built-in key; up to 10,000 per run with your own key, which is
the maximum Companies House Advanced Search returns for one set of filters.
Split larger jobs by incorporation date range.

**Can I export Companies House data to CSV or Excel?**
Yes — from the Output tab in JSON, CSV, Excel or XML. Pick the Officers or PSC
view first if you want one row per person instead of nested data.

**Can I use the Actor through an API?**
Yes. Start runs and read results through the Apify API, or subscribe to webhooks
when a run finishes.

**Can I use it with Make, Zapier or n8n?**
Yes, through their Apify integration or a generic HTTP module. None of those
platforms has a native Companies House connector, so the Actor handles the
authentication, pagination, rate limiting and enrichment calls for you.

**Does it return company emails or phone numbers?**
No. Companies House does not publish contact details, so neither does this
Actor.

**Can I look up a company from a Companies House link?**
Yes. Paste the URL into **Companies House URLs** — anything after the company
number in the link is ignored.

# Actor input Schema

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

Companies House company numbers to look up, for example 00445790. Short numbers are padded automatically (123456 becomes 00123456) and Scottish (SC), Northern Irish (NI) and LLP (OC) prefixes are supported. Leave empty to search the register instead.

## `companyUrls` (type: `array`):

Paste Companies House company pages, for example https://find-and-update.company-information.service.gov.uk/company/00445790. Anything after the company number in the link is ignored, so you can paste the page you were already looking at.

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

Search the Companies House register for companies whose registered name contains this text. Combine it with the filters below, or leave it empty and search on those alone.

## `excludeNameContains` (type: `string`):

Exclude companies whose registered name contains this text - useful for stripping out holdings, dormant or trustee entities from a prospect list.

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

Only return companies with these statuses. Leave empty to include every status. Choose Active for live trading companies, or Dissolved / In liquidation / In administration for research and due diligence.

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

Only return these legal forms, for example private limited company (Ltd), public limited company (PLC) or limited liability partnership (LLP). Leave empty for all types.

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

Five-digit UK SIC 2007 industry codes, for example 62012 for business and domestic software development. Add several to cover a whole sector. Full list: https://resources.companieshouse.gov.uk/sic/

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

Matches the TEXT of the registered office address - this is not a map or radius search. 'Manchester' also matches a company on Manchester Road in London, and a Manchester business whose registered office is at its accountant in London will not match. Registered office is not the same as trading address.

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

Earliest incorporation date, as YYYY-MM-DD. Use this to find newly registered companies.

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

Latest incorporation date, as YYYY-MM-DD. Combine with the field above for a date range.

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

How many companies to return. Without your own Companies House API key this is capped at 25 per run. With your own free key you can collect up to 10,000, which is the maximum Companies House Advanced Search returns for one set of filters.

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

Adds accounts and confirmation-statement dates, overdue flags, previous names and jurisdiction. Costs one extra Companies House request per company. Always on when you look companies up by number or URL. Turn it off for fast, wide discovery runs.

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

Adds every current and former director, secretary and LLP member, with role, appointment and resignation dates, nationality, country of residence and month/year of birth. Use the Officers view in the Output tab for one row per person.

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

Adds Persons with Significant Control - who really owns or controls the company - with their natures of control in plain English, plus any PSC statements the company has filed. Companies exempt from the PSC regime correctly return an empty list.

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

Adds the 25 most recent filings with readable descriptions. Off by default because most runs do not need it and it adds a request per company.

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

Adds registered charges and who they are secured to. Skipped automatically, at no cost, for companies Companies House already says have none.

## `includeInsolvency` (type: `boolean`):

Adds insolvency cases and appointed practitioners. Skipped automatically, at no cost, for companies Companies House already says have none.

## `companiesHouseApiKey` (type: `string`):

OPTIONAL - you do not need this for normal small runs. Leave it empty to use the built-in key, which is capped at 25 companies per run. To run larger jobs, create your own free REST key at https://developer.company-information.service.gov.uk/ (choose a LIVE application and leave 'Restricted IPs' blank) and paste it here. It is stored as an encrypted secret and never appears in your results or logs. Your own key gives you a private request quota; Companies House's own rate limits still apply.

## Actor input object example

```json
{
  "companyNumbers": [
    "00445790",
    "03977902",
    "01624297"
  ],
  "companyUrls": [],
  "searchQuery": "software",
  "excludeNameContains": "holdings",
  "companyStatus": [],
  "companyType": [],
  "sicCodes": [
    "62012"
  ],
  "location": "Manchester",
  "incorporatedFrom": "2025-01-01",
  "incorporatedTo": "2025-12-31",
  "maxResults": 3,
  "fetchFullProfile": true,
  "includeOfficers": true,
  "includePsc": true,
  "includeFilingHistory": false,
  "includeCharges": false,
  "includeInsolvency": false
}
```

# Actor output Schema

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

One record per company. Use the Companies, Officers and Beneficial owners (PSC) views in the Output tab to see the data flattened for CSV or Excel.

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

Companies delivered, not found and failed; Companies House requests used, retries and rate-limit waits; billable events charged; and the data-source attribution.

# 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",
        "03977902",
        "01624297"
    ],
    "maxResults": 3,
    "fetchFullProfile": true,
    "includeOfficers": true,
    "includePsc": true,
    "includeFilingHistory": false,
    "includeCharges": false,
    "includeInsolvency": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("zapticx/uk-companies-house-scraper").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",
        "03977902",
        "01624297",
    ],
    "maxResults": 3,
    "fetchFullProfile": True,
    "includeOfficers": True,
    "includePsc": True,
    "includeFilingHistory": False,
    "includeCharges": False,
    "includeInsolvency": False,
}

# Run the Actor and wait for it to finish
run = client.actor("zapticx/uk-companies-house-scraper").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",
    "03977902",
    "01624297"
  ],
  "maxResults": 3,
  "fetchFullProfile": true,
  "includeOfficers": true,
  "includePsc": true,
  "includeFilingHistory": false,
  "includeCharges": false,
  "includeInsolvency": false
}' |
apify call zapticx/uk-companies-house-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/ZoeBdktFEwnsPumuN/builds/hMVgjP7dZHoiToQRn/openapi.json
