# Companies House Data — Live UK Company Search (`b2b_leads/companies-house-real-time-data-scraper`) Actor

Live UK company intelligence from the official register. Describe your ideal customer in one sentence, or search by industry in plain English or by company name. Get officers, accounts, filings, charges, ownership and contact details — streamed to your dataset, CRM or Slack. Free trial included.

- **URL**: https://apify.com/b2b\_leads/companies-house-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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 Real-Time Data — Live UK Company Intelligence

**Live United Kingdom company data for lead generation, due diligence, and risk checks.** Describe your ideal customer in one sentence — *"active plumbers in Leeds with websites"* — or search by industry, company name, or number. Get full company profiles, officers & directors, filing history, charges, insolvency cases, ownership, and public contact details, all streamed to your dataset row by row while the run is still working. Results start appearing in seconds.

> ⚠️ **Free Apify plan notice:** Free-tier accounts are limited to **2 results per run**. Upgrade to any paid Apify plan for unlimited exports. This is stated here, in the Actor input form, and in the run log — it is a policy limit, not an error.

### Who this is for

- **B2B sales & lead-gen teams** building UK prospect lists by industry, location, or company age
- **Agencies & local SEO consultants** mapping the companies behind a sector, town, or postcode
- **Credit, compliance & KYC analysts** checking charges, insolvency history, and beneficial ownership
- **Recruiters & sourcing teams** finding decision-makers (directors, secretaries, company secretaries) by name and role
- **Data & ops engineers** feeding CRM enrichment, dedupe, and onboarding pipelines
- **Researchers & AI agents** who need clean, structured company facts without cleanup

### What you can do with it

- **Just say who you want** — write one sentence such as *"active coffee shops in Leeds with websites, up to 25 companies"* and the Actor works out the industry, location, company status, company age, how many to collect, and which extras to bring back. It prints every decision it made in the run log.
- **Build a UK prospect list in seconds** — describe the sector in plain English ("plumbing", "coffee shop", "office cleaning", "recruitment agency"), add a location, and get one clean row per company. No industry codes needed, and you can search several industries or several towns in one run.
- **Start from a ready-made sector** — 31 curated sectors (IT & software, trades, restaurants, logistics, beauty, care homes and more) that expand into the right industry codes for you.
- **Find the decision-makers** — pull every officer and director attached to those companies, with role, appointment and resignation dates, nationality, country of residence, occupation, and month/year of birth as published.
- **Screen before you commit** — pull registered charges (lenders, status, amounts of secured lending context) and insolvency cases (case type, winding-up and dissolution dates, practitioners) in the same run as everything else.
- **Map ownership** — collect the people and companies that own or control each company: nature of control, notified and ceased dates, legal form, registration number.
- **Enrich rows with public contact details** — website, email, phone, and social profiles are added to the same company row where they can be found. Nothing is ever dropped.
- **Push straight into your stack** — every row is saved to the dataset and can be delivered in real time to a CRM, Slack, Zapier, Make, n8n, or Google Sheets.

### Features

| Feature | What it does | Output (`featureType`) |
|---|---|---|
| ⚡ **Ideal customer brief** *(start here)* | One sentence in, complete search setup out — industry, location, status, company age, size, and the extras worth collecting | `company_search` |
| 🏭 **Search by industry** *(own switch, on by default)* | Plain-English industries in a row-per-industry list — "plumbing", "coffee shop", "solar panels" — each with its own location, matched against the official industry reference | `company_search` |
| 🏭 **Ready-made sectors** | 31 curated sectors you can type by name (IT & software, Trades & home services, Restaurants cafés & takeaways…) that expand into the right industry codes | `company_search` |
| 🔎 **Search by company name** *(own switch, off by default)* | Live search by company name or number, with location, status, type, and incorporation/dissolution filters | `company_search` |
| ✨ **Full company details** *(per search section)* | Adds nature of business, accounts dates, confirmation statement dates, and previous names **to the same search row** — switch it on for the industry list, the name list, or both | `company_search` (`detailsFetched: true`) |
| 🏢 **Company Details** | Full registered profile for the companies you supply by number or link | `company_details` |
| 👤 **Officers & Directors** | One row per officer appointment — current and former — with role, dates, nationality, residence, occupation, date of birth, correspondence address | `officers` |
| 🧾 **Filing History** | One row per filed document with date, type, description, notes, page count, and a document link when available | `filing_history` |
| 🏦 **Charges & Insolvency** | One row per registered charge and one row per insolvency case, with persons entitled, status, winding-up dates, and practitioners | `charges`, `insolvency` |
| 🔎 **Ownership** | One row per registered owner or ownership statement, with nature of control bands | `significant_control` |
| 🎯 **Contact details** *(per search section)* | Adds website, email, phone, and social profiles to company rows when they can be found — additive only, and switched on separately for the industry list, the name list, and the companies you look up | `company_search`, `company_details` |
| 🔗 **Scrape By URL** | Structured company rows for company links you paste | `scrape_by_url` |

**Enrichment, not filtering:** with **Enrich with full company details** on, every search result stays **one row** and gains the full registered profile in place (`detailsFetched: true`). No duplicate rows, no dropped companies — every company you discover always reaches your dataset, so your run cost stays predictable. Enrichment adds a little extra time per company.

### How company search works (read this first)

The register stores companies under **industry codes**, and the codes are numeric — `43220` means plumbing, `62020` means IT consultancy. Nobody wants to memorise 731 of those. So this Actor gives you **four ways in**, and you can mix them.

#### 0. Describe your ideal customer (`customerBrief`) — the fastest path of all

One sentence. The Actor reads it and sets up the rest:

```
"active plumbers in Leeds with websites, up to 25 companies"

  → industry: "plumbers"      → location: "Leeds"
  → company status: active    → up to 25 companies
  → also collecting: contact details
```

It understands company status (*active, dissolved, in liquidation, including dissolved*), a company age window (*incorporated since 2020*, *from the last 3 years*, *new companies*), how many you want (*up to 100 companies*), a location (*in Leeds*, *near Bristol*, *across Scotland*), and extras worth collecting (*with websites, with directors, with charges, with ownership, full profiles*). Whatever it decides is printed in the run log, and **anything you also fill in yourself always wins over the brief** — the brief only fills the gaps.

#### 1. By industry in plain English (`industrySearches`) — the main list

Add a row per industry. Type the trade in your own words and the Actor matches it against the **official published industry reference**, then searches every industry that fits:

| You type | It searches | Live example |
|---|---|---|
| `plumbing` | `43220` Plumbing, heat and air-conditioning installation (+ related wholesale) | *plumbing + Leeds + active* |
| `coffee shop` | `56101` Licenced restaurants, `56102` Unlicenced restaurants and cafes | *coffee shop + Leeds + active* |
| `office cleaning` | `81210` General cleaning of buildings | commercial cleaners |
| `software` | `62012` Business and domestic software development, `62011`, `58290` | software houses |
| `solar panels` | `43220`, `43210` Electrical installation | installers |
| `IT support` | `62020` Information technology consultancy activities, `62030` | managed-service providers |

Each row carries its **own location**, so one run can cover plumbing in Leeds, coffee shops in Bristol, and roofers across Scotland. Each row also carries its own **max companies**, and the whole list is one dataset.

Every resolution is printed in the run log (`Industry "plumbing" → 43220 Plumbing, heat and air-conditioning installation`), and each company row records the words that found it in `search_keyword`. Nothing is a black box.

`industryCodesPerKeyword` (default **3**) controls how many industries each row fans out into — a broad word like `cleaning` matches several, a precise one like `daycare` matches one. Each matched industry is its own search, so lower it for a tighter, cheaper list.

A word the reference has no industry for (`charity`, or a typo) is reported in the log and skipped rather than silently returning nothing.

#### 2. By ready-made sector — type the sector name

31 curated sectors, each already mapped to the right industry codes. Type the name into the industry column instead of a trade:

| | | |
|---|---|---|
| IT & software | Online retail & e-commerce | Marketing & advertising |
| Design, media & photography | Construction & building | Trades & home services |
| Property & real estate | Recruitment & staffing | Accounting & bookkeeping |
| Legal services | Management consulting | Engineering & technical consulting |
| Architecture & planning | Environmental consulting & testing | Healthcare & medical practices |
| Care homes & social care | Childcare & nurseries | Restaurants, cafés & takeaways |
| Pubs, hotels & accommodation | Catering & events | Retail shops |
| Motor trade & vehicle repair | Freight, logistics & warehousing | Cleaning & facilities management |
| Security & investigation | Hairdressing, beauty & wellness | Fitness & sports facilities |
| Education & training | Travel agencies & tour operators | Veterinary services |
| Funeral services | | |

Use this when you want a deliberate, clean sector list; use your own words when you want to explore.

#### 3. By company name or number (`searchKeywords`) — when you know the target

Each entry is matched against **company names, current and former**. So `monzo` returns the Monzo companies, `plumber` returns companies *called* "Plumber…". This is a name lookup: the register does not search business activity in free text, which is exactly what the industry list is for. (Because former names are included, a name search can also surface a company that *used* to be called the thing you typed.)

#### Two switches, one dataset

Each way of finding companies has **its own switch**, so each section is complete and self-contained — everything you need for a method sits inside it:

| Section | Switch | Default |
|---|---|---|
| 🏭 Search by industry | `enableIndustrySearch` | **on** |
| 🔎 Search by company name | `enableNameSearch` | off |

- **Industry only** — the default. Name search is off, so the prefilled names below it are ignored.
- **Name only** — switch industry search off, then switch name search on.
- **Both** — turn both on. They run as **separate searches** and land in the same dataset, so you never lose results to an empty combination. One run can mix "industries I'm prospecting" and "competitors I'm tracking".

Each switch also carries its own **max companies** and its own **full details** and **contact details** toggles, so one run can build an outreach-ready industry list while collecting nothing extra on the names you already know.

If you leave a filled-in list behind a switch that is off, the run log says so ("Search by industry is switched off — your 1 industry row(s) were not searched") rather than silently ignoring it.

#### Then narrow it (`searchLocation`, `searchStatus`, and friends)

Setting any filter switches the run into the register's structured mode, which is how you go from *"companies in this sector"* to *"companies in this sector, in this place, of this size, formed in this window"*:

| To find | Use | Example |
|---|---|---|
| Companies **in a place** | `searchLocation`, or a row's own Location | `Leeds`, `Manchester`, `Scotland` |
| Only **live** companies | `searchStatus` | `active` |
| A legal form | `searchCompanyType` | `ltd`, `plc`, `llp` |
| **Newly formed** businesses | `searchIncorporatedFrom` / `To` | `2024-01-01` |
| A **name pattern** | `searchKeywords` + `searchNameExcludes` | `marketing` without `HOLDINGS` |

Your industry rows and the filters combine — each row searches its industry **in that row's location**, with the shared filters applied. Every industry row needs no company name at all: "every active plumbing company in Leeds" is one row (`plumbing` + `Leeds`) and returns hundreds of real companies.

#### Using the brief and the lists together

Both can be filled in at once, and the rule is simple:

| What you did | What the Actor does |
|---|---|
| Brief only | The brief supplies everything. |
| Brief **and** your own industry rows | Your rows run **and** the brief adds its own row. Identical searches are collapsed, so asking for plumbing in Leeds twice is still one search — you never get everything twice. |
| Brief **and** a setting you also filled in (status, location, dates, caps, extras) | **Yours wins.** The brief only fills the gaps, and says in the run log which parts it left alone. |
| Brief **and** company names | The brief's industry search runs, and your name searches run alongside it. |
| Brief **and** industry search switched off | The brief's industry is dropped, and the run log states it plainly instead of searching something you turned off. |

Nothing is ever silently dropped: every decision, deferral, and addition is printed in the run log before collection starts.

### Quick start (a real prospect list in seconds)

The Actor comes prefilled for an instant demo run:

1. Click **Start** — no configuration needed.
2. The default industry row is `plumbing` in `Leeds`, so you immediately get live plumbing companies registered in Leeds, 10 per matched industry.
3. Watch the dataset fill row-by-row in real time.

**Want something else?** Either write a sentence in **🎯 Describe your ideal customer** (*"active coffee shops in Leeds with websites"*), or edit the industry row — a trade and a town is all it takes.

**Want the companies you already know by name?** Switch on **🔎 Search by company name** — three example names are already filled in for you.

#### The company list is shared

The **Companies to look up** list (`companyNumbers` + `companyUrls`) feeds every company-level feature — full profile, Officers & Directors, Filing History, Charges & Insolvency, and Ownership. Add your companies once (for example `09446231`, `00445790`, `SC012298`) and every switch you turn on covers those companies. Companies discovered by the search are not added here automatically, so keep prospecting and lookups separate.

### Full input reference

#### ⚡ Start here — the ideal customer brief

| Field | Type | Default | Notes |
|---|---|---|---|
| `customerBrief` | string | — | One sentence describing who you want, e.g. `"active plumbers in Leeds with websites, up to 25 companies"`. Fills in industry, location, company status, incorporation dates, size, and the extras worth collecting — only where you have not set something yourself. Every decision it makes is printed in the run log. |

Examples it understands:

| Brief | What it sets up |
|---|---|
| `active plumbers in Leeds with websites, up to 25 companies` | plumbing + Leeds + active + 25 rows each + contact details |
| `dissolved construction firms in Manchester` | construction + Manchester + dissolved |
| `software companies in Bristol incorporated since 2020, with directors` | software + Bristol + active + incorporated from 2020 + officers |
| `new marketing agencies in London from the last 3 years` | marketing + London + active + incorporated in the last 3 years |
| `coffee shops in Leeds` | cafés and restaurants + Leeds + active |
| `solar panel installers near Bristol` | plumbing/heating and electrical installation + Bristol + active |

#### 🏭 Search by industry — one complete section

The recommended way to build a prospect list. The switch, the industry rows, and both enrich toggles all live here, so you never have to look anywhere else.

| Field | Type | Default | Notes |
|---|---|---|---|
| `enableIndustrySearch` | boolean | **true** | The switch for this section. |
| `industrySearches` | list of rows | one demo row | Each row: **industry** (a trade in your own words, a ready-made sector name, or an industry code such as `43220`), **location** (city, region, or part of the registered address — the whole UK if empty), and **maxCompanies** (this row's cap). Unmatched industries are reported in the log. |
| `industryMaxResults` | integer | **10** | Companies collected per industry row (1–500). A row can set its own. |
| `industryFullDetails` | boolean | `false` | Merge nature of business, accounts dates, confirmation statement dates, and previous names into each row found by industry. |
| `industryContactDetails` | boolean | `false` | Add website, email, phone, and social profiles to each row found by industry. |
| `industryCodesPerKeyword` | integer | **3** | **Related industries per row** — the most matching industries to use for each trade word you type (1–5). `plumbing` matches plumbing installation and plumbing wholesalers (2); `cleaning` matches 4; `daycare` matches 1. Each match is a separate search with its own full result set, so this also multiplies the rows a single row of your table returns. It does not apply to ready-made sector names (they always cover every industry they stand for) or to industry codes you type. |

#### 🔎 Search by company name — its own complete section

Off by default, with three well-known names prefilled so it works the moment you switch it on.

| Field | Type | Default | Notes |
|---|---|---|---|
| `enableNameSearch` | boolean | `false` | The switch for this section. |
| `searchKeywords` | string list | `["monzo", "brewdog", "deliveroo"]` | Company names or company numbers (`09446231`). One search per entry, matched against current **and former** names. |
| `nameMaxResults` | integer | **10** | Companies collected per name or number (1–500). |
| `nameFullDetails` | boolean | `false` | Merge the full company profile into each row found by name. |
| `nameContactDetails` | boolean | `false` | Add contact details to each row found by name. |

#### 🎛️ Narrow the results

Filters are applied by the register itself, so they cost you nothing extra. Setting any filter switches the search into its structured mode, which also fills in status, company type, and industry codes on each row.

| Field | Type | Default | Notes |
|---|---|---|---|
| `searchLocation` | string | — | Location for name searches and for any industry row that leaves its own location empty. e.g. `Manchester`, `Leeds`, `Scotland`. |
| `searchStatus` | select | any | `active`, `dissolved`, `liquidation`, `administration`, `receivership`, `voluntary-arrangement`, `converted-closed`, `insolvency-proceedings`. |
| `searchCompanyType` | select | any | `ltd`, `plc`, `llp`, and the other registered legal forms. |
| `searchNameExcludes` | string | — | Drop companies whose name contains this text, e.g. `HOLDINGS`. |
| `searchIncorporatedFrom` / `searchIncorporatedTo` | string | — | `YYYY-MM-DD`. Ideal for finding newly formed businesses. |
| `searchDissolvedFrom` / `searchDissolvedTo` | string | — | `YYYY-MM-DD`. |

#### 🏢 Companies to look up (`companyNumbers` / `companyUrls`)

| Field | Type | Default | Notes |
|---|---|---|---|
| `companyNumbers` | string list | `["09446231"]` | UK company numbers, e.g. `09446231`, `00445790`, `SC012298`, `NI024553`. This one list feeds every company-level feature. |
| `companyUrls` | string list | `[]` | Company page links — the number is read from the link. |
| `enableCompanyDetails` | boolean | `false` | Full registered profile for each company in the list — nature of business, accounts and confirmation statement dates, previous names. One row per company. |
| `lookupContactDetails` | boolean | `false` | Add website, email, phone, and social profiles to each company in this list. |

#### 📄 Company records — Officers & Directors (`enableOfficers`, default off)

| Field | Type | Default | Notes |
|---|---|---|---|
| `officersMaxPerCompany` | integer | **10** | Max officer rows per company (1–500). |
| `officersActiveOnly` | boolean | `false` | When off you also get former directors and secretaries — useful for role history and risk checks. |

#### 🧾 Company records — Filing History (`enableFilingHistory`, default off)

| Field | Type | Default | Notes |
|---|---|---|---|
| `filingHistoryMaxPerCompany` | integer | **10** | Max filing rows per company (1–1000), newest first. |

#### 🏦 Company records — Charges & Insolvency (`enableCharges`, default off)

| Field | Type | Default | Notes |
|---|---|---|---|
| `chargesMaxPerCompany` | integer | **10** | Max charge rows per company (1–500). Companies with no charges or insolvency simply produce no extra rows. |

#### 🔎 Company records — Ownership (`enableSignificantControl`, default off)

| Field | Type | Default | Notes |
|---|---|---|---|
| `significantControlMaxPerCompany` | integer | **10** | Max ownership rows per company (1–500). |

#### 🌐 Delivery & connection

| Field | Type | Default | Notes |
|---|---|---|---|
| `webhookUrl` | string | — | Optional. Every record is also POSTed here in real time. |
| `webhookFormat` | select | `json` | `json` (full record) or `slack` (Slack-ready message). |

#### 🔗 Scrape By URL (`enableScrapeByUrl`, default off)

| Field | Type | Notes |
|---|---|---|
| `scrapeUrls` | string list | Company page links, e.g. `https://find-and-update.company-information.service.gov.uk/company/00445790`. |

**Connection**

| Field | Type | Default | Notes |
|---|---|---|---|
| `proxyConfiguration` | proxy editor | Apify **RESIDENTIAL**, country `GB` | The register covers the United Kingdom only, so United Kingdom residential connections are used by default. Change this only if you need custom connection URLs. |

#### Run volume

There is no separate global cap — you control volume where you set it. An industry row collects up to its own **maxCompanies** (or `industryMaxResults`, default 10) for each industry it resolves to, and each name collects up to `nameMaxResults`. Only switched-on sections are ever searched, so a switched-off list costs you nothing. One row of `plumbing` at the default `industryCodesPerKeyword: 3` resolves to two industries, so it collects up to 20 companies; a row of `restaurants` resolves to a curated sector of four codes, so up to 40. The per-company caps for Officers, Filing History, Charges, and Ownership are added on top. The run budget is the sum of all of those, and the run log prints exactly how many searches are queued before it starts.

### Output schema (field reference)

One dataset row per company, officer, filed document, charge, insolvency case, or owner. Filter views by `featureType`.

#### Company identity & firmographics

`company_number` · `company_name` · `company_url` (and `url`) · `company_status` · `company_type` · `incorporated_on` · `incorporated_year` · `registered_office_address` · `country_of_registration` (England and Wales / Scotland / Northern Ireland) · `sic_codes` · `nature_of_business` (code + description) · `accounts` (`next_made_up_to`, `next_due`, `last_made_up_to`) · `confirmation_statement` (`next_statement_date`, `next_due`, `last_statement_date`) · `previous_names` (name + period) · `has_charges` · `has_insolvency` · `has_ownership`

#### Search context

`search_keyword` — what discovered this company: the words you typed (`plumbing`, `coffee shops`), a ready-made sector name, a company name or number, or `industry code 43220` · `position` — rank on the search it was found on · `detailsFetched` — `true` when the full profile was merged into this same row

#### Contact details (additive)

`leadDetailsFetched` · `website` · `email`, `emails` · `phone`, `phones` · `socials`

#### Officers

`officer_id` · `officer_name` · `officer_role` · `officer_status` (Active / Resigned) · `officer_link` · `appointed_on` · `resigned_on` · `appointed_before` · `nationality` · `country_of_residence` · `occupation` · `date_of_birth` (month/year as published) · `correspondence_address` · `company_number`, `company_name`, `position`

#### Filing history

`filing_date` · `filing_type` · `filing_description` · `filing_annotations` · `filing_link` · `filing_pages` · `company_number`, `company_name`, `position`

#### Charges

`charge_code` · `charge_link` · `charge_created_on` · `charge_delivered_on` · `charge_status` · `charge_description` · `persons_entitled` · `total_charges` · `charges_outstanding` · `charges_satisfied` · `charges_part_satisfied` · `company_number`, `company_name`, `position`

#### Insolvency

`case_number` · `case_type` · `commencement_of_winding_up` · `dissolved_on` · `practitioners` (role, name, address, appointed on, ceased to act) · `company_number`, `company_name`, `position`

#### Ownership

`owner_name` · `owner_kind` (individual / corporate-entity / statement) · `owner_status` · `natures_of_control` · `notified_on` · `ceased_on` · `nationality` · `country_of_residence` · `date_of_birth` · `legal_form` · `legal_authority` · `place_registered` · `registration_number` · `correspondence_address` · `statement` · `total_owners`

#### Direct link collection

`pageType` · `company_number` · `company_name` · `company_status` · `company_type` · `incorporated_on` · `registered_office_address` · `sic_codes` · `previous_names`

### Webhook integration

Every record is always written to the dataset. Add `webhookUrl` and each record is **additionally** POSTed in real time — perfect for pushing new prospect rows straight into a CRM.

**Slack format** (`webhookFormat: "slack"`) — paste a Slack Incoming Webhook URL; messages render like:

```
:office: *TESCO PLC (00445790)*
*Type:* company_search  •  *Company number:* 00445790  •  *Incorporated:* 27 November 1947  •  *Address:* Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA
<https://find-and-update.company-information.service.gov.uk/company/00445790|Open on the register>
```

**JSON format** (`webhookFormat: "json"`) — the full record object, one POST per row. Works with Discord (via /webhooks), Zapier, Make, n8n, a CRM, or your own enrichment pipeline:

```json
{
  "featureType": "company_search",
  "company_number": "09446231",
  "company_name": "MONZO BANK LIMITED",
  "company_status": "Active",
  "company_type": "Private limited company",
  "incorporated_on": "18 February 2015",
  "registered_office_address": "Broadwalk House, 5 Appold Street, London, United Kingdom, EC2A 2AG",
  "sic_codes": ["64191"],
  "search_keyword": "monzo",
  "detailsFetched": false,
  "url": "https://find-and-update.company-information.service.gov.uk/company/09446231",
  "scrapedAt": "2026-09-29T12:00:00.000Z"
}
```

Webhook delivery is best-effort: a slow or failing webhook URL never blocks or breaks the run or the dataset writes.

### Using with AI agents (MCP)

The Actor works great through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) with Claude Desktop, Cursor, LangChain, or any MCP client:

1. In your MCP client config, add the Apify MCP server with your `APIFY_TOKEN`.
2. Expose this Actor as a tool (Actor ID: `~your-username/companies-house-real-time-data`).
3. Ask natural-language questions like:
   - *"Find 25 active software companies registered in Manchester since 2022, then list their directors."*
   - *"Which of these 5 companies have registered charges or insolvency cases, and who owns them?"*
   - *"Build a prospect list of marketing agencies in Bristol with their websites and phone numbers."*

The Actor returns clean, structured rows — no cleanup needed for LLM pipelines.

### Free-tier limits (paid-only features)

| Plan | Behavior |
|---|---|
| Free | Capped at **2 results per run** (default). The run finishes cleanly with a clear log message — this is a policy limit, not an error. |
| Any paid plan (Bronze+) | No caps — full output. |

Paying users are detected automatically from the platform run context — nothing to configure per run.

### Pricing model

This Actor uses **Pay-Per-Event (PPE)**: you are charged one `result` event per dataset row saved. Set a max spend per run and, when your limit is reached, the Actor stops gracefully, writes its summary, and exits cleanly without errors.

### FAQ

**Do I need my own connections?**
No. The Actor ships preconfigured for Apify Residential with United Kingdom country targeting, which is what the register covers, and the residential charge is included in its pricing. Most users should leave the default.

**How do I find companies by industry?**
Add a row in **Search by industry** with the trade in your own words — `plumbing`, `coffee shop`, `software`, `office cleaning`, `logistics` — plus a location. Or type one of the 31 ready-made sector names in the same place. You never need to know an industry code, and you can add as many rows as you like to cover several industries or several towns.

**What is the one-sentence brief for?**
It saves you setting anything up. Write *"active plumbers in Leeds with websites, up to 25 companies"* and the Actor works out the industry, location, status, company age, size, and extras, then prints what it decided in the run log. If you also fill a setting in yourself, yours always wins — the brief only fills the gaps.

**I used the brief and still filled in the sections below. Which one wins?**
Both are used, without surprises. Settings you filled in (status, location, dates, company counts, extras) beat the brief, and the log says what the brief left alone. For industries, your rows run **and** the brief adds its own row rather than replacing anything — and if you asked for the same thing twice, the duplicate search is collapsed so you never get the same company twice.

**Can I search by industry and by company name in the same run?**
Yes — there is one switch for company discovery, and the industry list and the name box are two ways in. They run as separate searches and land in the same dataset, so you can prospect a sector and track named competitors at the same time.

**Why did my free run stop at 2 items?**
That's the free-plan cap described above — it applies to every Apify Actor on the free plan. Upgrade to any paid Apify plan and the cap disappears automatically; no code or config change needed.

**How fresh is the data?**
Every run collects live data at the moment you press Start. The register is updated continuously as companies file, so scheduling repeat runs on a watchlist of company numbers is the recommended pattern for change monitoring.

**Will I get rate-limited or blocked?**
The Actor paces its work, reuses a warmed session, and routes through country-targeted residential connections — the same safeguards used at large scale. Keep the default concurrency and it just works.

**What does "Enrich with full company details" cost me in time?**
It adds a little extra time per company to fill in nature of business, accounts dates, and previous names in the same row. With it off you get fast cards with name, number, address, and incorporation date. Either way, every discovered company is saved — companies are never filtered out.

**How accurate are the contact details?**
They are best-effort and only ever added: a company row is exported whether or not a website, email, phone, or social profile could be found. Companies whose details are not publicly discoverable simply come back with those fields empty.

**Does the Actor cover companies outside the UK?**
No — it covers the United Kingdom register only (England and Wales, Scotland, and Northern Ireland). That is why United Kingdom connections are the default.

**Is any raw source payload included?**
No — rows contain only the clean, structured fields documented above. There is no raw-data option and no internal payload dumps in webhooks.

**Does the run timeout?**
Runs support up to 10,000 seconds (about 2.7 hours) per run, which covers large multi-feature exports. For bigger volumes, run multiple scheduled passes with smaller per-section limits.

### Disclaimer

This Actor is not affiliated with, endorsed by, or sponsored by Companies House. It provides access to publicly available company register information for research and business intelligence. Respect the register's terms of use when using collected data.

***

*Built for UK lead generation, due diligence, and company research. 🇬🇧*

# Actor input Schema

## `customerBrief` (type: `string`):

The quickest way to start. Write a sentence and the Actor sets up the rest for you — for example "active plumbers in Leeds with websites, up to 25 companies", "dissolved construction firms in Manchester", or "software companies in Bristol incorporated since 2020, with directors". It reads the industry, location, company status, incorporation dates, how many companies, and which extras are worth collecting, then tells you what it decided in the run log. Anything you also fill in yourself always wins over the brief — and if you list industries below as well, the brief joins your list instead of replacing it.

## `enableIndustrySearch` (type: `boolean`):

Find companies by what they DO, not by what they are called — the fastest way to build a prospect list from scratch. Everything you need is in this one place: the industries, where to look, how many companies each industry should return, and whether to add full details and contact details. Leave it on and fill in at least one row below.

## `industrySearches` (type: `array`):

One row per industry. Type the trade in plain English — no industry codes needed ("plumbing", "coffee shop", "office cleaning", "logistics", "hair salon"). Ready-made sectors you can type instead: IT & software, Online retail & e-commerce, Marketing & advertising, Design media & photography, Construction & building, Trades & home services, Property & real estate, Recruitment & staffing, Accounting & bookkeeping, Legal services, Management consulting, Engineering & technical consulting, Architecture & planning, Environmental consulting & testing, Healthcare & medical practices, Care homes & social care, Childcare & nurseries, Restaurants cafés & takeaways, Pubs hotels & accommodation, Catering & events, Retail shops, Motor trade & vehicle repair, Freight logistics & warehousing, Cleaning & facilities management, Security & investigation, Hairdressing beauty & wellness, Fitness & sports facilities, Education & training, Travel agencies & tour operators, Veterinary services, Funeral services. You can also type an industry code such as 43220 if you already know it.

## `industryMaxResults` (type: `integer`):

How many companies each industry row collects (1–500, default 10). A row of its own table can set its own number instead. Default 10 keeps runs quick and cheap to test.

## `industryFullDetails` (type: `boolean`):

Each industry result stays ONE row but is enriched in place with nature of business, accounts dates, confirmation statement dates, and previous company names. Adds a little extra time per company. Every discovered company is always saved — nothing is ever dropped or duplicated.

## `industryContactDetails` (type: `boolean`):

Adds publicly available contact details to each company found by industry — website, email, phone, and social profiles — when they can be found. Everything is ADDED to the row; companies with nothing findable are still exported, so run cost and timing stay predictable. Adds a little extra time per company. Ideal when you want an outreach-ready list rather than just company names.

## `industryCodesPerKeyword` (type: `integer`):

One trade word can match several entries in the official industry list. "plumbing" matches plumbing installation AND plumbing wholesalers (2). "cleaning" matches 4 different cleaning industries. "daycare" matches exactly one. This is the most matches to use for each trade you type (1–5, default 3). Each match is a separate search with its own full result set, so it also multiplies how many companies that row returns: 2 matches at 10 companies each means up to 20 rows for that one row of your table. Lower it for a tighter, more literal list; raise it to sweep up related businesses. It does NOT affect ready-made sector names (they always cover every industry they stand for) or industry codes you type yourself.

## `enableNameSearch` (type: `boolean`):

For target lists you already know: a named business, a competitor, or a list of company numbers. Everything for this method is in this one place. It runs alongside the industry list rather than replacing it, so one run can mix prospect discovery and competitor tracking.

## `searchKeywords` (type: `array`):

One search per entry — company names (e.g. "monzo", "brewdog") or company numbers (e.g. "09446231", "SC012298"). Entries match company names, past and present, so a company that used to have the name you typed can also appear. Three well-known examples are filled in for you — replace them with your own targets.

## `nameMaxResults` (type: `integer`):

How many companies each name or number above returns (1–500, default 10).

## `nameFullDetails` (type: `boolean`):

Each name result stays ONE row but is enriched in place with nature of business, accounts dates, confirmation statement dates, and previous company names.

## `nameContactDetails` (type: `boolean`):

Adds publicly available contact details to each company found by name — website, email, phone, and social profiles — when they can be found. Everything is ADDED to the row; companies with nothing findable are still exported.

## `searchLocation` (type: `string`):

Match part of the registered office address, e.g. "Manchester", "Leeds", "Scotland". Each industry row above can carry its own location instead — this one applies to name searches and to any industry row that leaves location empty.

## `searchStatus` (type: `string`):

Only return companies with this status. An industry list defaults to active companies; pick "Any status" to include dissolved and closed ones.

## `searchCompanyType` (type: `string`):

Only return companies of this legal type.

## `searchIncorporatedFrom` (type: `string`):

Only companies incorporated on or after this date, e.g. 2024-01-01. Ideal for reaching newly formed businesses before your competitors do.

## `searchIncorporatedTo` (type: `string`):

Only companies incorporated on or before this date, e.g. 2025-12-31.

## `searchDissolvedFrom` (type: `string`):

Only companies dissolved on or after this date.

## `searchDissolvedTo` (type: `string`):

Only companies dissolved on or before this date.

## `searchNameExcludes` (type: `string`):

Drop companies whose name contains this text, e.g. "HOLDINGS" or "(UK)". Applied by the register, so it costs nothing extra.

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

UK company numbers, e.g. 00445790, 09446231, SC012298, NI024553. This one list feeds every company-level feature below.

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

Company page links from the register, e.g. https://find-and-update.company-information.service.gov.uk/company/00445790 — the number is read from the link. Use this instead of, or as well as, the numbers above.

## `enableCompanyDetails` (type: `boolean`):

Fetch the complete registered profile for each company in the list above — nature of business, accounts and confirmation statement dates, previous names, and which registry sections exist. One row per company.

## `lookupContactDetails` (type: `boolean`):

Adds publicly available contact details — website, email, phone, and social profiles — to the companies in the list above, when they can be found. Everything is ADDED to the row; companies with nothing findable are still exported.

## `enableOfficers` (type: `boolean`):

Directors, secretaries, and other officers for the companies above — names, roles, appointment and resignation dates, nationality, country of residence, occupation, and date of birth (month/year as published). This is the decision-maker list behind every prospect company.

## `officersMaxPerCompany` (type: `integer`):

Maximum officer rows per company (1–500).

## `officersActiveOnly` (type: `boolean`):

Skip officers who have already resigned. Leave it off to also collect former directors and secretaries, which is useful for role history and risk checks.

## `enableFilingHistory` (type: `boolean`):

The filed document history for each company: filing date, filing type, description, notes, and a direct link to the document when one is available. One row per filing.

## `filingHistoryMaxPerCompany` (type: `integer`):

Maximum filing rows per company (1–1000), newest first.

## `enableCharges` (type: `boolean`):

Registered charges (mortgages) and insolvency cases: charge code, creation and delivery dates, status, persons entitled, description, plus case numbers, case types, winding-up and dissolution dates, and practitioners. Essential for credit, risk, and due-diligence lists.

## `chargesMaxPerCompany` (type: `integer`):

Maximum charge rows per company (1–500). Companies with no charges simply produce no extra rows.

## `enableSignificantControl` (type: `boolean`):

The people and companies that own or control each company: names, nature of control, notified and ceased dates, nationality, country of residence, legal form, registration number, and registered statements.

## `significantControlMaxPerCompany` (type: `integer`):

Maximum ownership rows per company (1–500).

## `enableScrapeByUrl` (type: `boolean`):

Paste any company page link from the register and get a structured company profile row back — ideal for refreshing a list of companies you already track.

## `scrapeUrls` (type: `array`):

Company page links from the register, e.g. https://find-and-update.company-information.service.gov.uk/company/00445790.

## `webhookUrl` (type: `string`):

Every record is always saved to the run dataset — this webhook is an ADDITIONAL real-time push. Each new row is also sent to this URL (CRM, Slack, Zapier, Make, n8n, Google Sheets). A failing webhook never stops the run.

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message.

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

UK residential connections are used by default for reliable results at scale. Change this only if you need custom proxy URLs.

## Actor input object example

```json
{
  "customerBrief": "",
  "enableIndustrySearch": true,
  "industrySearches": [
    {
      "industry": "plumbing",
      "location": "Leeds"
    }
  ],
  "industryMaxResults": 10,
  "industryFullDetails": false,
  "industryContactDetails": false,
  "industryCodesPerKeyword": 3,
  "enableNameSearch": false,
  "searchKeywords": [
    "monzo",
    "brewdog",
    "deliveroo"
  ],
  "nameMaxResults": 10,
  "nameFullDetails": false,
  "nameContactDetails": false,
  "searchLocation": "",
  "searchStatus": "",
  "searchCompanyType": "",
  "searchIncorporatedFrom": "",
  "searchIncorporatedTo": "",
  "searchDissolvedFrom": "",
  "searchDissolvedTo": "",
  "searchNameExcludes": "",
  "companyNumbers": [
    "09446231"
  ],
  "companyUrls": [],
  "enableCompanyDetails": false,
  "lookupContactDetails": false,
  "enableOfficers": false,
  "officersMaxPerCompany": 10,
  "officersActiveOnly": false,
  "enableFilingHistory": false,
  "filingHistoryMaxPerCompany": 10,
  "enableCharges": false,
  "chargesMaxPerCompany": 10,
  "enableSignificantControl": false,
  "significantControlMaxPerCompany": 10,
  "enableScrapeByUrl": false,
  "scrapeUrls": [],
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Full dataset for this run (every featureType).

## `overview` (type: `string`):

Core company fields across features, including detailsFetched and contact fields.

## `company_search` (type: `string`):

featureType=company\_search only. One company = one row; the full registered profile is merged in when "Enrich with full company details" is enabled.

## `company_details` (type: `string`):

featureType=company\_details — only from the Company Details feature (company numbers/link you supplied), not from search enrichment.

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

No description

## `filing_history` (type: `string`):

No description

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

No description

## `insolvency` (type: `string`):

No description

## `significant_control` (type: `string`):

No description

## `scrape_by_url` (type: `string`):

No description

# 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 = {
    "customerBrief": "",
    "enableIndustrySearch": true,
    "industrySearches": [
        {
            "industry": "plumbing",
            "location": "Leeds"
        }
    ],
    "industryMaxResults": 10,
    "industryFullDetails": false,
    "industryContactDetails": false,
    "industryCodesPerKeyword": 3,
    "enableNameSearch": false,
    "searchKeywords": [
        "monzo",
        "brewdog",
        "deliveroo"
    ],
    "nameMaxResults": 10,
    "nameFullDetails": false,
    "nameContactDetails": false,
    "searchLocation": "",
    "searchStatus": "",
    "searchCompanyType": "",
    "searchIncorporatedFrom": "",
    "searchIncorporatedTo": "",
    "searchDissolvedFrom": "",
    "searchDissolvedTo": "",
    "searchNameExcludes": "",
    "companyNumbers": [
        "09446231"
    ],
    "companyUrls": [],
    "enableCompanyDetails": false,
    "lookupContactDetails": false,
    "enableOfficers": false,
    "officersMaxPerCompany": 10,
    "officersActiveOnly": false,
    "enableFilingHistory": false,
    "filingHistoryMaxPerCompany": 10,
    "enableCharges": false,
    "chargesMaxPerCompany": 10,
    "enableSignificantControl": false,
    "significantControlMaxPerCompany": 10,
    "enableScrapeByUrl": false,
    "scrapeUrls": [],
    "webhookUrl": "",
    "webhookFormat": "json",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/companies-house-real-time-data-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 = {
    "customerBrief": "",
    "enableIndustrySearch": True,
    "industrySearches": [{
            "industry": "plumbing",
            "location": "Leeds",
        }],
    "industryMaxResults": 10,
    "industryFullDetails": False,
    "industryContactDetails": False,
    "industryCodesPerKeyword": 3,
    "enableNameSearch": False,
    "searchKeywords": [
        "monzo",
        "brewdog",
        "deliveroo",
    ],
    "nameMaxResults": 10,
    "nameFullDetails": False,
    "nameContactDetails": False,
    "searchLocation": "",
    "searchStatus": "",
    "searchCompanyType": "",
    "searchIncorporatedFrom": "",
    "searchIncorporatedTo": "",
    "searchDissolvedFrom": "",
    "searchDissolvedTo": "",
    "searchNameExcludes": "",
    "companyNumbers": ["09446231"],
    "companyUrls": [],
    "enableCompanyDetails": False,
    "lookupContactDetails": False,
    "enableOfficers": False,
    "officersMaxPerCompany": 10,
    "officersActiveOnly": False,
    "enableFilingHistory": False,
    "filingHistoryMaxPerCompany": 10,
    "enableCharges": False,
    "chargesMaxPerCompany": 10,
    "enableSignificantControl": False,
    "significantControlMaxPerCompany": 10,
    "enableScrapeByUrl": False,
    "scrapeUrls": [],
    "webhookUrl": "",
    "webhookFormat": "json",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/companies-house-real-time-data-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 '{
  "customerBrief": "",
  "enableIndustrySearch": true,
  "industrySearches": [
    {
      "industry": "plumbing",
      "location": "Leeds"
    }
  ],
  "industryMaxResults": 10,
  "industryFullDetails": false,
  "industryContactDetails": false,
  "industryCodesPerKeyword": 3,
  "enableNameSearch": false,
  "searchKeywords": [
    "monzo",
    "brewdog",
    "deliveroo"
  ],
  "nameMaxResults": 10,
  "nameFullDetails": false,
  "nameContactDetails": false,
  "searchLocation": "",
  "searchStatus": "",
  "searchCompanyType": "",
  "searchIncorporatedFrom": "",
  "searchIncorporatedTo": "",
  "searchDissolvedFrom": "",
  "searchDissolvedTo": "",
  "searchNameExcludes": "",
  "companyNumbers": [
    "09446231"
  ],
  "companyUrls": [],
  "enableCompanyDetails": false,
  "lookupContactDetails": false,
  "enableOfficers": false,
  "officersMaxPerCompany": 10,
  "officersActiveOnly": false,
  "enableFilingHistory": false,
  "filingHistoryMaxPerCompany": 10,
  "enableCharges": false,
  "chargesMaxPerCompany": 10,
  "enableSignificantControl": false,
  "significantControlMaxPerCompany": 10,
  "enableScrapeByUrl": false,
  "scrapeUrls": [],
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  }
}' |
apify call b2b_leads/companies-house-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/companies-house-real-time-data-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/F8CW5mX4c8UGJn1BI/builds/aRAfPzB9zfELSSlVs/openapi.json
