# UK Companies House Officers Search — Director Lookup (`nexgendata/uk-companies-house-officers`) Actor

Search UK Companies House officers — directors, secretaries, LLP members — by name / company / number. Returns role, partial DOB, nationality, occupation, country, appointment + resignation, service address. KYC / AML / M\&A — Veriff / Onfido / BvD alt.

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

## Pricing

from $100.00 / 1,000 officers

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Officers Search — Director Lookup

Search the **UK Companies House** register for **officers** — directors, company secretaries, and LLP members — by company name, by company number, or by officer surname. Returns the officer's name, role, partial date of birth (month + year only — Companies House has suppressed the day component on the public register since 2018 under the *Small Business, Enterprise and Employment Act*), nationality, occupation, country of residence, date of appointment, date of resignation (where applicable), the company name and 8-character Companies House number they were appointed to, and the **service address** on file (corporate / mail-handling address — the residential address is permanently suppressed by CH on the public register).

The United Kingdom runs the most **open, machine-readable corporate registry in the G7**. Every limited company, LLP, public limited company, and overseas branch trading in the UK files its director list, company secretary, partial DOB, nationality, occupation, country of residence, and appointment / resignation dates with **Companies House** — and Companies House publishes those filings, in full, on a **free public REST API** at `api.company-information.service.gov.uk`. That openness is why the UK Companies House register is the foundational input for KYC / KYB / AML / EDD pipelines across every major UK challenger bank, every UK-licensed money-service business, and every Big Four / mid-tier auditor doing client-onboarding work. It is also the canonical input for cross-border investigative journalism (the OCCRP, the ICIJ Panama Papers / Pandora Papers consortium, Bellingcat, Private Eye, openDemocracy, and Companies House Open Data hackers all build on top of this same register).

This Actor wraps the official Companies House REST API with **rate-limit-aware retry logic** (Companies House enforces a 600 request / 5-minute rolling window per API key — this Actor handles HTTP 429 with exponential backoff so your KYC sweep does not blow up on a busy weekday morning) and pushes every officer record as a single dataset row, one row per officer, ready for downstream Snowflake / BigQuery / Postgres ingestion, ready for n8n / Make / Zapier workflow ingestion, ready for Claude / OpenAI / Cursor agent ingestion via Apify's MCP server. Set `companyHouseApiKey` to your free Companies House key for **live access to the full UK register** (5M+ active and dissolved entities) — or leave it blank and the Actor serves from a curated public-record universe of ~30 of the most-searched UK entities (FTSE 100 incumbents, UK fintech, plus dissolved entities relevant to KYC red-flag examples).

---

### What you get per officer row

Each dataset row is a single Companies House officer record:

- **`name`** — the officer's name as registered with Companies House, in CH's canonical `SURNAME, Forename(s)` casing (e.g. `MURPHY, Kenneth`, `STORONSKY, Nikolay`)
- **`role`** — `director`, `secretary`, `llp-member`, `llp-designated-member`, `corporate-director`, `judicial-factor`, or one of the other ~15 enumerated CH officer roles
- **`date_of_birth_partial`** — `YYYY-MM` (Companies House suppresses the day component on the public register since 2018 under the Small Business, Enterprise and Employment Act, meaning every UK director's DOB on the public CH API is *intentionally* month + year only — this is the canonical KYC reality you need to design your matching logic around)
- **`nationality`** — the officer's stated nationality from the AP01 / AP02 appointment filing
- **`occupation`** — free-text occupation field as filed by the officer (`Chief Executive Officer`, `Company Director`, `Solicitor`, `Accountant`, etc.)
- **`country_of_residence`** — the officer's country of residence (NOT residential address — that is suppressed; only country granularity is exposed on the public register)
- **`appointed_on`** — ISO `YYYY-MM-DD` date the officer was appointed
- **`resigned_on`** — ISO `YYYY-MM-DD` date the officer resigned (`null` for current officers)
- **`company_name`** — the legal name of the company the officer is appointed to
- **`company_number`** — Companies House's 8-character canonical identifier (8 digits for England & Wales, `SC` + 6 digits for Scotland, `NI` + 6 digits for Northern Ireland)
- **`address`** — the officer's **service address** (corporate / mail-handling address) as filed at CH. Never the residential address — that is permanently redacted on the public register under the *Small Business, Enterprise and Employment Act 2015*
- **`data_source`** — `Companies House REST API` (live path) or `Curated UK Companies House public-record disclosures` (fallback path)

---

### 8 use cases — KYC, AML, M&A, lead-gen, journalism

1. **KYC / KYB onboarding for UK-incorporated counterparties.** Before onboarding any UK Ltd, PLC, or LLP counterparty, FCA Senior Manager Regime + the Money Laundering Regulations 2017 require verifying the **legal entity, the directors, and the Persons of Significant Control (PSC)** against the canonical Companies House register. This Actor automates the director-verification leg: pull the current officer list for the target company number, cross-reference the names + partial DOBs against the KYC documents the prospect uploaded, and flag any officer-list mismatch as a *high-priority* manual review. Pair this with [Company Enrichment Tool](https://apify.com/nexgendata/company-enrichment-tool?fpr=2ayu9b) for the full KYB package (domain, employee count, funding, tech stack).

2. **AML EDD on UK shell-company red flags.** UK Companies House is a known booking center for shell-company misuse — *Private Eye*, the OCCRP, openDemocracy, and the UK NCA have all documented systematic abuse of cheap (£12) UK incorporation by sanctions evaders, layering schemes, and trade-based money-laundering networks. The classic red flags this Actor surfaces directly: (a) directors who resign en masse 3-12 months before the company is struck off, (b) directors with nominee-service country of residence (e.g. a UK Ltd with directors all resident in BVI / Belize / Seychelles), (c) the same officer appearing across 50+ dormant Ltds with no operating history (set `includeFormerOfficers=true` + sweep across multiple `companyNumber` lookups). For the PSC + UBO leg, layer in the Companies House `/company/{number}/persons-with-significant-control` endpoint via [b2b-leads-finder](https://apify.com/nexgendata/b2b-leads-finder?fpr=2ayu9b).

3. **PSC register cross-reference for sanctions screening.** Since 2016, every UK company must file a PSC (Person of Significant Control) register — the UK's beneficial-ownership transparency mechanism. The PSC register lives at the same Companies House endpoint as the officer register, so this Actor (officer leg) plus a downstream PSC pull gives you the full director + beneficial-owner picture for OFAC SDN / OFSI / EU consolidated / UN sanctions screening. Critical for FCA-regulated firms and any UK exporter under the Russia / Belarus / Iran / DPRK sanctions regimes.

4. **M&A diligence — target board composition + director interlock mapping.** Before LOI on a UK target, pull the target company's current officers, then sweep across every related subsidiary in the corporate group (using the parent's `company_number` plus the subsidiary numbers). Set `includeFormerOfficers=true` to capture the prior CEO / CFO / chairman who may still hold founder shares, may be a non-executive director on a related entity, or may be the prior litigant in a director-disqualification action. Pair with [SEC Form 13F Holdings Tracker](https://apify.com/nexgendata/sec-form-13f-holdings-tracker?fpr=2ayu9b) for the US institutional-ownership cross-reference and [Singapore ACRA Companies](https://apify.com/nexgendata/singapore-acra-companies?fpr=2ayu9b) for the SEA-jurisdiction leg.

5. **Director-disqualification screening.** The UK's Insolvency Service maintains a public Register of Disqualified Directors (under the Company Directors Disqualification Act 1986) — currently ~12,000 disqualified individuals. Disqualifications run typically 2-15 years, and during the disqualification window the individual cannot be a director or take part in promotion / formation / management of any UK company. Sweep this Actor's officer output against the disqualified-directors register, looking for partial name + partial DOB matches. *Any match against an actively-disqualified director is an immediate company-level red flag* — the company is illegally constituted and likely a candidate for striking-off.

6. **B2B lead-gen — UK director outreach by sector.** Every UK Ltd files an SIC code identifying its industry. Pull officers across the SIC code range you care about (e.g. SIC 62012 = "Business and domestic software development", SIC 64191 = "Banks") and you have the canonical UK decision-maker list for that sector: every CEO, CTO, CFO, and chairman, name + role + appointment date, no scraping, no LinkedIn TOS violation, no ZoomInfo enterprise contract. Cross-link with [B2B Leads Finder](https://apify.com/nexgendata/b2b-leads-finder?fpr=2ayu9b) for the email-enrichment + intent-data layer to convert the director list into a workable cold-outreach pipeline.

7. **Investigative journalism — UK shell entity + cross-border layering.** The OCCRP / ICIJ / Bellingcat / openDemocracy / *Private Eye* / FinCEN Files investigations all rely on Companies House as the primary discovery layer for UK-domiciled shell entities used in cross-border layering schemes. Set `includeFormerOfficers=true`, sweep across a known cluster of Ltds (e.g. Scottish Limited Partnerships, LLPs in known nominee-director networks), and the output gives you the full director-appointment timeline for the cluster, ready for graph analysis (Neo4j / Linkurious / Maltego) to surface the human nominees who connect the cluster. For the Greater China leg, layer in [Hong Kong Companies Registry](https://apify.com/nexgendata/hk-companies-registry?fpr=2ayu9b); for the India leg, [India MCA Companies](https://apify.com/nexgendata/india-mca-companies?fpr=2ayu9b).

8. **Recruiter / executive-search intelligence — UK director moves.** Every CEO / CFO / chairman move in a UK Ltd shows up as a CH appointment / resignation filing within ~14 days — months ahead of the LinkedIn update, the press release, or the executive-search news. Set `includeFormerOfficers=true`, filter on senior-leadership occupations (`Chief Executive Officer`, `Chief Financial Officer`, `Chairman`, `Managing Director`), and you have a near-real-time signal of UK senior-leadership moves across the entire UK economy — perfect for executive-search lead-gen, headhunter pipeline, or institutional-investor governance research.

---

### How this Actor compares vs. enterprise alternatives

| Feature | This Actor | Veriff KYC | Onfido KYC | Bureau van Dijk Orbis | Refinitiv World-Check One | Companies House direct |
|---|---|---|---|---|---|---|
| **UK Companies House officer coverage** | Full (live API) | Indirect — name + DOB check | Indirect — name + DOB check | Yes (Orbis UK module) | Yes (corporate-records add-on) | Yes — native source |
| **Per-officer record** | Single dataset row | Bundled per identity check | Bundled per identity check | Bundled per Orbis report | Bundled per profile | Free download |
| **Includes former / resigned officers** | Yes (toggle) | No | No | Yes (premium tier) | Yes | Yes |
| **Partial DOB (CH-suppressed day)** | Yes (month + year) | Yes (full DOB from gov ID) | Yes (full DOB from gov ID) | Yes (partial as filed) | Yes (partial as filed) | Yes |
| **Nationality + country of residence** | Yes | Indirect | Indirect | Yes | Yes (KYC tier) | Yes |
| **Service address (corporate, not residential)** | Yes | No | No | Yes | Yes | Yes |
| **Live API path** | Yes — CH REST | Veriff KYC API | Onfido KYC API | BvD WebServices (XML legacy) | Refinitiv Data Platform | Native CH REST |
| **Rate-limit-aware retry** | Yes — 429 backoff | Yes (Veriff-managed) | Yes (Onfido-managed) | Yes (BvD-managed) | Yes (Refinitiv-managed) | DIY |
| **Pay-as-you-go** | Yes — Apify metered | No — per-check pricing | No — per-check pricing | No — annual contract | No — annual contract | Free (API only) |
| **No enterprise contract** | Yes | Often (depending on volume) | Often (depending on volume) | No | No | Yes — DIY only |
| **Per-record cost** | **$0.05 / officer** | $4-9 / KYC check | $2-5 / KYC check | ~$50k+ / seat / yr | ~$30k+ / seat / yr | Free (no SLA, no support, DIY rate-limit handling) |
| **Cost for 1,000 officer records** | **$50** | $4,000-$9,000 | $2,000-$5,000 | ~$5,000+ annualized | ~$5,000+ annualized | Free + DIY engineering cost |
| **Pipe to Snowflake / BigQuery** | One-line Apify connector | API ingestion DIY | API ingestion DIY | BvD WebServices (custom ETL) | Refinitiv DataStream (separate $$$) | DIY |
| **MCP-protocol agent ingestion** | Yes — Apify MCP | No | No | No | No | No |

**Bottom line:** Veriff and Onfido are the right answer if you need a *full identity-verification* product — government-ID OCR + face-liveness + Sanctions screening + AML risk score, bundled per check. Bureau van Dijk Orbis and Refinitiv World-Check are the right answer if you have a multi-jurisdiction enterprise compliance program with an annual budget and a vendor-management process. Going direct to Companies House is the right answer if you have the engineering capacity to handle the 600 req / 5-min rate limit yourself, manage the API-key rotation, build the retry / backoff layer, and own the Snowflake / BigQuery ingestion ETL — many UK challenger banks and Big Four firms already do this. **This Actor is the right answer if you want clean, structured UK Companies House officer data, in a pay-as-you-go model, with the rate-limit handling and Snowflake / BigQuery / MCP / n8n ingestion already done** — at $0.05 per officer record instead of $2-9 per KYC check or $25k-$50k per Orbis / Refinitiv seat.

---

### Input

- **`searchQuery`** — partial-match search across company names *and* officer surnames (e.g. `tesco`, `wise`, `storonsky`, `dyson`)
- **`companyNumber`** — exact 8-char Companies House identifier (`00445790`, `SC090312`, `NI012345`). Takes precedence over `searchQuery` when both are provided
- **`includeFormerOfficers`** — boolean, default `false`. When `true`, returns resigned officers in addition to current
- **`maxResults`** — hard cap on total officer rows returned (1-500, prefill 25)
- **`companyHouseApiKey`** — optional. Free key from https://developer.company-information.service.gov.uk/. Without it, the Actor serves from a curated fallback universe of ~30 of the most-searched UK entities

---

### Pricing — pay per officer record

- **`apify-actor-start`** — minimal flat fee at run start (covers infrastructure & connection setup)
- **`apify-default-dataset-item`** — `$0.05` per UK Companies House officer record pushed to the dataset

A typical 25-officer KYC sweep (covering one target company's full current board) costs ~$1.25. A 100-officer M&A diligence sweep across a 5-subsidiary group costs ~$5. A 1,000-officer sector-wide UK director-outreach pull for B2B lead-gen costs ~$50.

For context: Veriff's per-check KYC pricing typically lands in the $4-9 range *per identity*; Onfido in the $2-5 range *per check*; Bureau van Dijk Orbis seat-licenses run $25k-$50k *per year* per analyst. This Actor sits ~2-3 orders of magnitude below the enterprise alternatives on a per-record basis — and on a strict apples-to-apples basis (CH officer record only, not bundled with face-liveness + sanctions scoring + ID OCR), the gap is even wider. Where Veriff / Onfido charge by the identity *check* and bundle in a face-match + liveness + sanctions scoring step, this Actor charges by the underlying officer record — and it's up to you to layer in your own face-match / sanctions / PEP / disqualified-director screen downstream.

---

### Companies House API rate limits — and how this Actor handles them

The official Companies House REST API enforces a **600 request / 5-minute rolling rate limit per API key**. That sounds generous but is easy to blow through on a serious KYC / KYB sweep — every company lookup costs 2 requests (one `/company/{number}` plus one `/company/{number}/officers`), so 600 requests buys you ~300 company lookups every 5 minutes, or ~3,600 per hour per key.

This Actor handles the rate-limit gracefully:

1. **HTTP 429 detection** — every request inspects the response status. A 429 triggers automatic backoff
2. **`Retry-After` header respect** — when CH returns a 429 with a `Retry-After` value, this Actor sleeps for at least that many seconds before retrying
3. **Exponential backoff fallback** — if no `Retry-After` is set (or if it's zero), this Actor backs off with `1.5 ^ attempt` seconds, capped at 5 retries per endpoint
4. **Per-company throttling** — by default, the live path pulls officers from at most 5 matched companies per run, with up to 50 officers per page. That keeps a single run comfortably under the 600 / 5-minute window

For sweeps larger than ~300 companies per 5 minutes, request a **higher-tier CH API key** (the developer.company-information.service.gov.uk console allows raising limits via support ticket) or shard the sweep across multiple keys.

---

### Data quality & sourcing notes — Companies House public-record discipline

All data returned is sourced from public Companies House filings under the **Companies Act 2006** and the *Small Business, Enterprise and Employment Act 2015* (which introduced the public-record DOB-day suppression in 2018). Director names, partial DOBs (month + year only), nationality, occupation, country of residence, and service addresses are *all* matters of public record — every UK director's appointment filing (AP01 / AP02) is statutorily required to disclose those fields, and Companies House publishes them on the free REST API.

**What this Actor does NOT expose:**
- **Residential addresses** — permanently redacted on the public CH register since the *Small Business, Enterprise and Employment Act* dispute-resolution process. The only address surfaced is the officer's **service address** (corporate / mail-handling)
- **Full DOB day** — also suppressed since 2018; only month + year are exposed
- **National Insurance number** — never published on the CH register (this is a UK HMRC-only identifier)
- **Personal email / phone** — never published on the CH register

The Actor's curated fallback universe (used when no API key is supplied) is composed entirely of officer disclosures already public via the same Companies House REST register, plus HKEX-style cross-references in the parent company's IPO Prospectus / Annual Report. No scraping of paid or rate-limited endpoints; no captcha bypass; no scraping of LinkedIn or other social media. Users are responsible for complying with **UK GDPR + the Data Protection Act 2018** when handling director names + DOBs in downstream pipelines.

---

### Related NexGenData Actors

If this UK Companies House officer Actor is useful, the following sister Actors complete a global corporate-registry + KYC / KYB / M&A diligence stack:

- 🇭🇰 [Hong Kong Companies Registry — CR Number & Director Lookup](https://apify.com/nexgendata/hk-companies-registry?fpr=2ayu9b) — sister Actor for HK's ICRIS register; identical schema shape (CH number ↔ CR number)
- 🇸🇬 [Singapore ACRA Companies](https://apify.com/nexgendata/singapore-acra-companies?fpr=2ayu9b) — sister Actor for Singapore's ACRA register (UEN ↔ CH number)
- 🇮🇳 [India MCA Companies](https://apify.com/nexgendata/india-mca-companies?fpr=2ayu9b) — sister Actor for India's Ministry of Corporate Affairs register (CIN ↔ CH number)
- 💼 [B2B Leads Finder](https://apify.com/nexgendata/b2b-leads-finder?fpr=2ayu9b) — convert the UK director list into a workable outreach pipeline with email enrichment + intent signals
- 🏢 [Company Enrichment Tool](https://apify.com/nexgendata/company-enrichment-tool?fpr=2ayu9b) — domain, employee count, funding, tech stack — the full KYB enrichment layer to pair with this Actor's officer leg

---

### Try Apify free with our affiliate

This Actor runs on Apify. Sign up via [our affiliate link](https://apify.com/?fpr=2ayu9b) to support continued development — and you get free Apify platform credit to test-drive this Actor (plus the rest of our 280+ NexGenData fleet) before committing.

---

### Legal & compliance

Companies House officer data is matters of public record under the *Companies Act 2006* (sections 162-167 covering the duty to keep a register of directors) and the *Companies Act 2006* (section 1136 covering location and inspection of the public register). Every UK company is statutorily required to publish its directors' names, partial DOBs, nationality, occupation, country of residence, service addresses, and appointment dates on the public Companies House register — and CH publishes those filings, in full, on its free REST API. This Actor does not scrape any paid or rate-limited endpoint, does not bypass any access control, and does not surface residential addresses or any other suppressed personal data.

Users are responsible for ensuring downstream processing of officer data complies with the **UK GDPR**, the **Data Protection Act 2018**, the **Money Laundering Regulations 2017** (MLR 2017), the **FCA Senior Manager Regime** (where applicable), and any sector-specific obligations (e.g. solicitor-regulated firms under the SRA Accounts Rules, accountants under the ICAEW / ACCA AML supervisory regime, estate agents under HMRC AML supervision). For sanctions screening, layer in the OFSI consolidated list, OFAC SDN, EU consolidated, and UN consolidated; this Actor surfaces the officer + service-address fields needed to feed those screening engines but does *not* perform the screening itself.

This Actor is provided "as-is" under the standard Apify terms — Apify SLA covers infrastructure availability; data accuracy is a direct function of what officers + companies file with Companies House. When CH itself has stale, missing, or contested filings (e.g. a striking-off pending an appeal), this Actor surfaces the CH state-of-record as-is and does *not* attempt to reconcile against third-party sources. For higher-assurance use cases (e.g. regulated FCA Senior Manager Regime onboarding), users should combine this Actor's CH-officer output with corroborating evidence (government ID OCR via Veriff / Onfido, sanctions screening via Refinitiv World-Check / Dow Jones RiskCenter, PEP screening via LexisNexis WorldCompliance).

# Actor input Schema

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

Partial-match search across UK Companies House. Searches by company name (e.g. 'Tesco', 'Wise', 'Brewdog') OR by officer surname (e.g. 'Steiner', 'Storonsky', 'Dyson'). When a Companies House API key is supplied, this hits the live `/search/companies` endpoint and pulls officers from the top 5 matching companies. With no API key, the actor falls back to a curated public-record universe of ~30 of the most-searched UK entities. Leave blank if using `companyNumber` for a direct lookup.
## `companyNumber` (type: `string`):

Direct lookup by Companies House company number. UK companies use the 8-character canonical format: 8 digits for England/Wales (e.g. '00445790' for Tesco PLC), 'SC' + 6 digits for Scotland (e.g. 'SC090312' for NatWest Group plc), 'NI' + 6 digits for Northern Ireland. Takes precedence over `searchQuery` when both are provided. Get from any UK company's letterhead, invoice, or website — statutorily required under section 82 of the Companies Act 2006.
## `includeFormerOfficers` (type: `boolean`):

When true, returns directors and secretaries who have since resigned (e.g. ex-CEOs, former board members) in addition to currently appointed officers. Useful for M&A diligence (find the prior CEO at the target), journalism (track a director's full appointment history), and KYC red-flag screening (look for officers who resigned just before a striking-off event). Defaults to false to keep results focused on current board composition.
## `maxResults` (type: `integer`):

Hard cap on total officer rows returned (1-500). Each officer is one dataset row. Pricing is per-row, so set this tight if you're sweeping many companies. Typical KYC lookup: 5-15 officers per target company. M&A diligence sweep across a 5-subsidiary group: 50-100 officers.
## `companyHouseApiKey` (type: `string`):

Optional Companies House REST API key for live, real-time access to the full UK register (5M+ active and dissolved entities). Register a free key at https://developer.company-information.service.gov.uk/ — no payment, no enterprise contract. The free tier enforces a 600 requests / 5-minute rolling rate limit per key; this actor handles backoff + retry automatically on HTTP 429. With no key supplied, the actor serves from a curated public-record universe covering ~30 of the most-searched UK entities (FTSE 100 incumbents + UK fintech + dissolved KYC examples).

## Actor input object example

```json
{
  "searchQuery": "tesco",
  "includeFormerOfficers": false,
  "maxResults": 25
}
````

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "tesco",
    "companyNumber": "",
    "includeFormerOfficers": false,
    "maxResults": 25,
    "companyHouseApiKey": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/uk-companies-house-officers").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "tesco",
    "companyNumber": "",
    "includeFormerOfficers": False,
    "maxResults": 25,
    "companyHouseApiKey": "",
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/uk-companies-house-officers").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "tesco",
  "companyNumber": "",
  "includeFormerOfficers": false,
  "maxResults": 25,
  "companyHouseApiKey": ""
}' |
apify call nexgendata/uk-companies-house-officers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nexgendata/uk-companies-house-officers",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "UK Companies House Officers Search — Director Lookup",
        "description": "Search UK Companies House officers — directors, secretaries, LLP members — by name / company / number. Returns role, partial DOB, nationality, occupation, country, appointment + resignation, service address. KYC / AML / M&A — Veriff / Onfido / BvD alt.",
        "version": "0.0",
        "x-build-id": "L5aBo7uQtVhaz8JJ9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~uk-companies-house-officers/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-uk-companies-house-officers",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/nexgendata~uk-companies-house-officers/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-uk-companies-house-officers",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/nexgendata~uk-companies-house-officers/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-uk-companies-house-officers",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search query — company name OR officer surname (partial match)",
                        "type": "string",
                        "description": "Partial-match search across UK Companies House. Searches by company name (e.g. 'Tesco', 'Wise', 'Brewdog') OR by officer surname (e.g. 'Steiner', 'Storonsky', 'Dyson'). When a Companies House API key is supplied, this hits the live `/search/companies` endpoint and pulls officers from the top 5 matching companies. With no API key, the actor falls back to a curated public-record universe of ~30 of the most-searched UK entities. Leave blank if using `companyNumber` for a direct lookup."
                    },
                    "companyNumber": {
                        "title": "Company number (exact, 8-char canonical CH identifier)",
                        "type": "string",
                        "description": "Direct lookup by Companies House company number. UK companies use the 8-character canonical format: 8 digits for England/Wales (e.g. '00445790' for Tesco PLC), 'SC' + 6 digits for Scotland (e.g. 'SC090312' for NatWest Group plc), 'NI' + 6 digits for Northern Ireland. Takes precedence over `searchQuery` when both are provided. Get from any UK company's letterhead, invoice, or website — statutorily required under section 82 of the Companies Act 2006."
                    },
                    "includeFormerOfficers": {
                        "title": "Include former / resigned officers",
                        "type": "boolean",
                        "description": "When true, returns directors and secretaries who have since resigned (e.g. ex-CEOs, former board members) in addition to currently appointed officers. Useful for M&A diligence (find the prior CEO at the target), journalism (track a director's full appointment history), and KYC red-flag screening (look for officers who resigned just before a striking-off event). Defaults to false to keep results focused on current board composition.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max officer rows returned",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Hard cap on total officer rows returned (1-500). Each officer is one dataset row. Pricing is per-row, so set this tight if you're sweeping many companies. Typical KYC lookup: 5-15 officers per target company. M&A diligence sweep across a 5-subsidiary group: 50-100 officers.",
                        "default": 50
                    },
                    "companyHouseApiKey": {
                        "title": "Companies House API key (optional — actor uses curated fallback if blank)",
                        "type": "string",
                        "description": "Optional Companies House REST API key for live, real-time access to the full UK register (5M+ active and dissolved entities). Register a free key at https://developer.company-information.service.gov.uk/ — no payment, no enterprise contract. The free tier enforces a 600 requests / 5-minute rolling rate limit per key; this actor handles backoff + retry automatically on HTTP 429. With no key supplied, the actor serves from a curated public-record universe covering ~30 of the most-searched UK entities (FTSE 100 incumbents + UK fintech + dissolved KYC examples)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
