# UK PSC Tracker — Beneficial Ownership & Control (`nexgendata/uk-psc-beneficial-ownership`) Actor

Pull UK Companies House Persons with Significant Control (PSC) — beneficial owners, parent entities, trusts. Returns name, kind, nationality, country, partial DOB, ownership % range, nature\_of\_control\[], appointed\_on, ceased\_on. AML/KYC/UBO — BvD/Refinitiv/Sayari alt.

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

## Pricing

from $150.00 / 1,000 psc records

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 PSC Tracker — Beneficial Ownership & Control

Pull the **UK Companies House Persons with Significant Control (PSC)** register for any UK company, LLP, or Scottish Limited Partnership. Returns the **beneficial owners and controllers** — natural-person individuals, corporate-entity parents, legal persons, and super-secure (redacted) entries — along with the **statutory nature-of-control codes** that explain *why* each PSC is on the register (ownership of shares, voting rights, board-appointment rights, significant influence or control, control over a trust or firm). Per-PSC output includes name, kind, nationality, country of residence, partial date of birth (month + year), address country, the ownership percentage tier (25–50% / 50–75% / 75–100%), the full `nature_of_control` array, appointment date, and cessation date for historical PSCs.

The UK runs the **most open, machine-readable beneficial-ownership register in the G7**. Since 6 April 2016, under the Small Business, Enterprise and Employment Act 2015 (Part 21A of the Companies Act 2006), every UK limited company, LLP, and Scottish Limited Partnership has been **statutorily required** to maintain a PSC register, file PSC changes with Companies House within 14 days of becoming aware, and publish that register — name, partial DOB, nationality, country of residence, nature of control, and ownership tier — on the free public CH REST API at `api.company-information.service.gov.uk`. There is no enterprise contract, no per-record fee, no NDA, no rate-card. That openness is why the UK PSC register is the foundational input for KYC / KYB / AML / EDD / sanctions-screening pipelines at every UK challenger bank, every UK-licensed money-service business, every FCA Senior Manager Regime firm, every UK money-laundering reporting officer (MLRO), and every Big Four / mid-tier auditor running EDD on UK counterparties. It is also the canonical input for cross-border investigative journalism — the OCCRP, the ICIJ Pandora / Panama / Paradise Papers consortium, Bellingcat, Private Eye, openDemocracy, Transparency International UK, and Global Witness all build on top of this register.

This Actor wraps the official Companies House PSC endpoint (`/company/{number}/persons-with-significant-control`) with **rate-limit-aware retry logic** (CH enforces 600 requests every 5 minutes per key — this Actor handles HTTP 429 with exponential backoff so your overnight UBO sweep does not blow up at 03:00 GMT), exposes **`include_ceased`** as a top-level toggle so you can pull current-only or full-history PSCs in one run, and pushes every PSC as a single dataset row ready for downstream Snowflake / BigQuery / Postgres ingestion, n8n / Make / Zapier workflow ingestion, or Claude / OpenAI / Cursor agent ingestion via Apify's MCP server.

---

### What is a PSC, exactly?

A **Person with Significant Control** is anyone — natural person, corporate entity, or legal person — who meets one or more of the **five statutory conditions** set out in Schedule 1A of the Companies Act 2006:

1. **Direct or indirect ownership of more than 25% of shares** — the classic majority-shareholder / minority-blocker test. A US private-equity holdco that owns 60% of a UK Topco's shares is a PSC under this condition.
2. **Direct or indirect control of more than 25% of voting rights** — captures voting-agreement structures, dual-class share schemes, and shareholder pools where economic ownership and voting power diverge.
3. **Right to appoint or remove a majority of the board of directors** — captures investor protection rights in venture-capital and private-equity term sheets, where the lead investor often retains board-appointment rights disproportionate to its equity stake.
4. **Right to exercise, or actually exercising, significant influence or control over the company** — the catch-all. Captures founders who have stepped down formally but still influence the company, non-executive chairmen with absolute veto rights, and shadow directors operating behind a nominee structure. UK guidance (BEIS / DBT statutory guidance under section 790E) gives ~15 worked examples of what counts as "significant influence or control."
5. **Right to exercise, or actually exercising, significant influence or control over a trust or firm** which itself meets conditions (1)–(4) — captures discretionary trusts, family offices, settlor / trustee / protector arrangements, and Channel Islands / IoM / BVI / Liechtenstein / Caymans structures used to layer beneficial ownership behind a trust wrapper.

The five conditions are deliberately overlapping — a PSC can hit one, several, or all five at once. The `nature_of_control` field on the output is a **list of statutory codes**, not a single value, so a 60% shareholder with board-appointment rights returns `["ownership-of-shares-50-to-75-percent", "voting-rights-50-to-75-percent", "right-to-appoint-and-remove-directors"]` — three codes, one PSC row.

---

### Significant influence vs control — and why this distinction matters

Conditions (4) and (5) — significant **influence** or significant **control** — are the AML / sanctions / UBO leg of the test where most of the **shell-company misuse** and **sanctions-evasion structuring** lives. *Control* in the CH guidance means "the power to direct" — the PSC can dictate decisions. *Influence* means the PSC has the power to ensure the company adopts activities the PSC desires, even if no formal control right exists. Both bring you onto the PSC register. Both are reportable. Both are screenable against OFSI / OFAC / EU / UN sanctions lists, against the UK Insolvency Service's Register of Disqualified Directors, and against PEP (Politically Exposed Person) lists.

The classic AML structures that conditions (4) and (5) catch:

- **Nominee director + founder-influencer** — the company has a £500-a-year nominee director on paper but the beneficial owner still calls every shot. Condition (4) brings the founder onto the PSC register even though they hold no shares and no voting rights.
- **Family trust over offshore holdco over UK opco** — the UK opco's PSC is the offshore holdco; the offshore holdco's PSC under its own register (if it has one) is the trust; the trust's settlor / beneficiary is the natural person. Condition (5) walks the trust leg, dragging the settlor / beneficiary onto the UK PSC register if they exercise significant influence over the trust.
- **Shareholder agreement with veto rights** — economic ownership sits at 10% but the shareholder has a contractual right to veto any sale, IPO, share issuance, or change of strategy. Condition (4) catches the veto-holder.

The **`super-secure-person-with-significant-control`** entry is the legitimate use case for redaction: section 790ZF Companies Act 2006 lets a PSC apply to suppress their name from the public register where they have shown a **serious risk of violence or intimidation** — domestic-abuse survivors, witness-protection cases, judges, MPs at risk of harassment. The Actor surfaces these as `kind="super-secure-person-with-significant-control"` (or the corresponding `-beneficial-owner` variant) with `name=null`. Do not treat super-secure as a red flag in itself — it is a statutory protection, not a concealment mechanism.

---

### What you get per PSC row

Each dataset row is a single Companies House PSC record:

- **`name`** — the PSC's name as registered with Companies House, in CH's canonical `SURNAME, Forename(s)` casing for individuals or the legal name for corporate / legal-person PSCs. `null` for super-secure PSCs (statutorily redacted under section 790ZF Companies Act 2006).
- **`kind`** — one of the eight statutory CH kind codes: `individual-person-with-significant-control`, `corporate-entity-person-with-significant-control`, `legal-person-person-with-significant-control`, `super-secure-person-with-significant-control`, plus the four corresponding `-beneficial-owner` variants (used for non-UK registered entities that file a PSC equivalent under the Register of Overseas Entities regime).
- **`nationality`** — the PSC's stated nationality from their PSC01 filing (individuals only — corporate-entity and legal-person PSCs have no nationality).
- **`country_of_residence`** — the PSC's country of residence at country granularity only (NOT residential address — that is suppressed by CH on the public register).
- **`date_of_birth_year`** + **`date_of_birth_month`** — the partial DOB. Companies House has suppressed the **day** component on the public PSC register since 2018 under the Small Business, Enterprise and Employment Act, meaning every UK PSC's DOB on the public CH API is *intentionally* month + year only. This is the canonical KYC reality you need to design your fuzzy matching logic around — most KYC platforms (Onfido, Veriff, Sumsub, ComplyAdvantage, Trulioo) will collect full DOB from the gov-ID document and you match `(year, month)` against CH and accept the day as un-corroborated.
- **`address_country`** — the country component of the PSC's correspondence / service address as filed at CH (corporate / mail-handling, never residential).
- **`ownership_percentage_range`** — a human-readable summary of the highest ownership tier the PSC hits: `25-50%`, `50-75%`, or `75-100%`. Synthesized from the `nature_of_control` codes. `null` when the PSC is on the register under conditions (3), (4), or (5) only (i.e. board-appointment rights, significant influence, or trust control with no direct ownership).
- **`nature_of_control`** — the full array of statutory CH codes that put the PSC on the register. Always populated. Typical values: `ownership-of-shares-25-to-50-percent`, `ownership-of-shares-50-to-75-percent`, `ownership-of-shares-75-to-100-percent`, `voting-rights-25-to-50-percent`, `voting-rights-50-to-75-percent`, `voting-rights-75-to-100-percent`, `right-to-appoint-and-remove-directors`, `significant-influence-or-control`, `right-to-share-surplus-assets-25-to-50-percent`, `significant-influence-or-control-of-trust`, `significant-influence-or-control-of-firm`.
- **`appointed_on`** — ISO `YYYY-MM-DD` date the PSC was notified to Companies House.
- **`ceased_on`** — ISO `YYYY-MM-DD` date the PSC ceased to be a PSC (`null` for current PSCs). Surfaces only when `includeCeased=true`.
- **`company_name`** + **`company_number`** — the company the PSC is registered against (CH 8-character canonical identifier — 8 digits for E&W, `SC` + 6 for Scotland, `NI` + 6 for Northern Ireland).
- **`data_source`** — `Companies House REST API (api.company-information.service.gov.uk)`.

---

### Use cases — AML, KYC, UBO, sanctions, journalism

1. **AML EDD on UK shell-company structures.** Sweep the PSC register across known shell-company clusters (Scottish Limited Partnerships, LLPs in nominee-director networks documented by the OCCRP / openDemocracy / Private Eye) with `includeCeased=true`, and the output gives you the full beneficial-ownership timeline of each cluster — every individual who has been a PSC, when they became one, when they ceased. Pair with [UK Companies House Officers](https://apify.com/nexgendata/uk-companies-house-officers?fpr=2ayu9b) for the parallel director / secretary leg of the same KYB sweep.

2. **OFSI / OFAC / EU sanctions screening on UK counterparties.** Before any UK-jurisdiction trade, payment, or contract, FCA + OFSI guidance requires you to screen the **beneficial owners** — not just the legal entity, not just the directors — against the OFSI consolidated list, OFAC SDN list, EU consolidated list, and UN 1267 list. This Actor surfaces the PSC list cleanly so you can run name + partial-DOB fuzzy matching against your sanctions screening provider's API (ComplyAdvantage, Refinitiv World-Check, LexisNexis Bridger, Dow Jones Risk Center). Critical under the Russia / Belarus / Iran / DPRK sanctions regimes where 50%-or-more aggregate ownership by a sanctioned party brings the company into scope (the OFAC "50% rule" / OFSI equivalent — and the PSC ownership tier directly informs that calculation).

3. **PEP (Politically Exposed Persons) screening on UK private companies.** UK private companies — especially UK Plcs in regulated sectors (banking, defence, energy, telecoms, healthcare, gambling) — frequently have PSCs who are domestic or foreign PEPs, family members of PEPs, or close associates. Sweep the PSC list, layer in your PEP screening provider (Refinitiv, Dow Jones, ComplyAdvantage), and surface any PEP-linked beneficial owner for enhanced due diligence under regulation 35 of the Money Laundering Regulations 2017.

4. **M&A diligence — full beneficial-ownership reveal before LOI.** Before LOI on a UK target, pull the target's current PSCs plus historical (`includeCeased=true`) — the historical view often surfaces founders who exited at a prior funding round, family-trust structures wound up before sale, or PE / VC syndicate members who exited via secondary. Cross-reference the corporate-entity PSCs against [France Pappers Companies](https://apify.com/nexgendata/france-pappers-companies?fpr=2ayu9b) (for French parent companies), [Singapore ACRA Companies](https://apify.com/nexgendata/singapore-acra-companies?fpr=2ayu9b) (for Singapore holdcos), [India MCA Companies](https://apify.com/nexgendata/india-mca-companies?fpr=2ayu9b) (for Indian parents), and [Hong Kong Companies Registry](https://apify.com/nexgendata/hk-companies-registry?fpr=2ayu9b) (for Hong Kong holdcos).

5. **Register of Overseas Entities cross-reference.** Since 1 August 2022, non-UK entities owning UK real estate must register with Companies House under the Economic Crime (Transparency and Enforcement) Act 2022 and file their beneficial owners. Those filings appear under the `*-beneficial-owner` kind variants on the PSC endpoint. This Actor returns them in the same dataset row format as the domestic PSC entries — same schema, same field names, ready for unified UBO screening across UK Ltds + overseas-entity property owners.

6. **Investigative journalism — cross-border layering and trust unwinding.** The OCCRP, ICIJ, Bellingcat, openDemocracy, Private Eye, and Transparency International UK have all used CH PSC data as the primary discovery layer for UK-domiciled shell entities used in cross-border layering schemes. Set `includeCeased=true`, sweep across a cluster of UK Ltds tied to a target individual, build the time-series of PSC changes (appointed → ceased → appointed → ceased), and the output feeds directly into Linkurious / Neo4j / Maltego graph databases.

7. **Audit firms — Big Four EDD pipeline for client onboarding.** Big Four UK audit practices run mandatory EDD on every new audit client and every new advisory client under ISA (UK) 240 and the FRC's Ethical Standard. The PSC pull is one of the first canonical steps in the EDD workflow. This Actor is the direct, programmatic way to feed PSC data into that workflow at scale.

8. **Tax-authority + HMRC UBO research.** HMRC and the Joint Money Laundering Steering Group (JMLSG) reference the PSC register as the canonical UBO source for UK tax investigations, COP9 (Code of Practice 9) tax-fraud investigations, and Criminal Finance Act 2017 corporate-failure-to-prevent investigations. PSC data feeds directly into HMRC's risk-rating engine.

---

### How this Actor compares vs. enterprise alternatives

| Feature | This Actor | Bureau van Dijk Orbis | Refinitiv World-Check One | Sayari Graph | Moody's Maxsight | Companies House direct |
|---|---|---|---|---|---|---|
| **UK PSC coverage** | Full live API | Yes (Orbis UK + UBO module) | Yes (corporate-records + KYC module) | Yes (UK + multi-jurisdiction graph) | Yes (BvD-derived) | Yes — native source |
| **Per-PSC record** | Single dataset row | Bundled per Orbis report | Bundled per profile | Bundled per Graph query | Bundled per report | Free JSON download |
| **Includes ceased / historical PSCs** | Yes — toggle | Yes (premium tier) | Yes | Yes | Yes | Yes — separate endpoint |
| **Nature-of-control codes parsed** | Yes — full array | Partial (BvD schema) | Partial (Refinitiv schema) | Yes | Partial | Raw — DIY parsing |
| **Ownership tier (25-50 / 50-75 / 75-100%)** | Yes — synthesized | Yes | Yes | Yes | Yes | DIY |
| **Super-secure / redacted PSCs** | Yes — surfaced | Yes (flagged) | Yes (flagged) | Yes | Yes | Yes |
| **Live API path** | Yes — CH REST | BvD WebServices | Refinitiv Data Platform | Sayari API | Moody's API | Native CH REST |
| **Rate-limit-aware retry** | Yes — 429 backoff | Yes (BvD-managed) | Yes (Refinitiv-managed) | Yes | Yes | DIY |
| **Pay-as-you-go** | Yes — Apify metered | No — annual contract | No — annual contract | No — annual contract | No — annual contract | Free (DIY) |
| **No enterprise contract** | Yes | No | No | No | No | Yes — DIY only |
| **Per-record cost** | **$0.10 / PSC** | ~$50k+ / seat / yr | ~$30k+ / seat / yr | ~$60k+ / seat / yr | ~$40k+ / seat / yr | Free (no SLA) |
| **Cost for 1,000 PSC records** | **$100** | ~$5,000+ annualized | ~$3,000+ annualized | ~$6,000+ annualized | ~$4,000+ annualized | Free + DIY engineering cost |
| **Pipe to Snowflake / BigQuery** | One-line Apify connector | BvD WebServices (custom ETL) | Refinitiv DataStream (separate $$$) | Sayari connector | Custom | DIY |
| **MCP-protocol agent ingestion** | Yes — Apify MCP | No | No | No | No | No |

**Bottom line:** Bureau van Dijk Orbis, Refinitiv World-Check One, Sayari Graph, and Moody's Maxsight are the right answer if you have a multi-jurisdiction enterprise compliance program with a six-figure annual budget, a vendor-management process, and a need for *graph-walking* across the global corporate-entity graph (where each PSC corporate parent is itself resolved to its own PSCs / UBOs, recursively). 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. **This Actor is the right answer when you want clean, structured UK PSC data, in a pay-as-you-go model, with rate-limit handling and Snowflake / BigQuery / MCP / n8n ingestion already done** — at $0.10 per PSC record instead of $30k–$60k per Orbis / Refinitiv / Sayari / Moody's seat.

---

### Input

- **`companyNumber`** — exact 8-char Companies House identifier (`00445790`, `SC090312`, `NI012345`). Preferred for deterministic lookups.
- **`companyName`** — partial-match company name (used only when `companyNumber` is blank). The actor calls `/search/companies` and pulls PSC data for the top match.
- **`includeCeased`** — boolean, default `false`. When `true`, returns PSCs whose control has ceased (founder exited at IPO, parent sold to a buyer, trust wound up) in addition to current PSCs.
- **`maxResults`** — hard cap on total PSC rows returned (1–200, prefill 25).
- **`companyHouseApiKey`** — **REQUIRED**. Free key from https://developer.company-information.service.gov.uk/. Without a key the actor exits gracefully with `status="_blocked"` and instructions — no per-record charge is billed.

---

### Pricing — pay per PSC record

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

A typical 5-PSC KYB sweep on one UK target company costs ~$0.50. A 50-PSC M&A diligence sweep across a 5-subsidiary group costs ~$5. A 1,000-PSC sector-wide UBO pull across a list of UK Ltds costs ~$100. For context: BvD Orbis / Refinitiv World-Check / Sayari / Moody's Maxsight UBO seats run $30k–$60k per analyst per year. This Actor sits ~2–3 orders of magnitude below the enterprise alternatives on a per-record basis.

---

### Companies House 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**. Every PSC lookup costs **2–3 requests** (one optional `/search/companies`, one `/company/{number}` to resolve, one or more `/company/{number}/persons-with-significant-control` paginated). That buys you roughly 200–300 company PSC pulls every 5 minutes per key, or ~2,400–3,600 per hour. This Actor handles the rate limit gracefully:

1. **HTTP 429 detection** — every request inspects status. A 429 triggers exponential backoff (1.5s → 3s → 6s → 12s → 24s) honouring the `Retry-After` header when present.
2. **5xx detection** — CH occasionally returns 502 / 503 under load. Same exponential-backoff retry loop, max 5 attempts.
3. **Pagination** — the Actor pages through `/persons-with-significant-control` 50 items at a time via `start_index`, honouring the `maxResults` ceiling.

If you are running a UBO sweep across >300 UK companies, rotate two or more API keys (each free, each independently rate-limited).

---

### Related actors

- **[UK Companies House Officers](https://apify.com/nexgendata/uk-companies-house-officers?fpr=2ayu9b)** — directors / secretaries / LLP members. The director leg of the same UK KYB workflow.
- **[France Pappers Companies](https://apify.com/nexgendata/france-pappers-companies?fpr=2ayu9b)** — French commercial register (INPI / Pappers). Use for French parent-company UBO walks.
- **[India MCA Companies](https://apify.com/nexgendata/india-mca-companies?fpr=2ayu9b)** — India Ministry of Corporate Affairs register.
- **[Singapore ACRA Companies](https://apify.com/nexgendata/singapore-acra-companies?fpr=2ayu9b)** — Singapore Accounting and Corporate Regulatory Authority register.
- **[Hong Kong Companies Registry](https://apify.com/nexgendata/hk-companies-registry?fpr=2ayu9b)** — HK Companies Registry / Cyber Search Centre.

---

[Get started with Apify ?fpr=2ayu9b — sign up free](https://apify.com/?fpr=2ayu9b) and run this Actor in minutes.

# Actor input Schema

## `companyNumber` (type: `string`):

Direct PSC 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 companyName when both are provided.
## `companyName` (type: `string`):

Partial-match company name search. The actor calls /search/companies and pulls PSC data for the top match. For deterministic results, prefer companyNumber. Examples: 'Tesco', 'BP', 'Wise', 'Brewdog'.
## `includeCeased` (type: `boolean`):

When true, also returns PSCs whose control has ceased (e.g. founder who exited at IPO, parent entity sold to a buyer, trust wound up). Useful for AML EDD (was a sanctioned party ever a UBO?), M&A diligence (who held control before the LBO?), and journalism (full beneficial-ownership timeline). Defaults to false for current-only view.
## `maxResults` (type: `integer`):

Hard cap on total PSC rows pushed to the dataset (1-200). Each PSC is one row. Pricing is per-row so set this tight on large group sweeps. Typical company: 1-10 PSCs. Some private-equity holdcos return 20+ when ceased PSCs are included.
## `companyHouseApiKey` (type: `string`):

REQUIRED. Free Companies House REST API key — register at https://developer.company-information.service.gov.uk (no payment, no enterprise contract, takes ~2 minutes). The free tier enforces a 600 request / 5-minute rolling rate limit per key; this actor handles HTTP 429 with exponential backoff automatically. The key is sent via HTTP Basic auth (username = your API key, password = blank). If this field is left blank, the actor logs an ERROR and exits without pushing any rows and without charging the per-result event — you are NOT billed for a missing-key run.

## Actor input object example

```json
{
  "companyNumber": "00445790",
  "includeCeased": 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 = {
    "companyNumber": "00445790",
    "companyName": "",
    "includeCeased": false,
    "maxResults": 25,
    "companyHouseApiKey": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/uk-psc-beneficial-ownership").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 = {
    "companyNumber": "00445790",
    "companyName": "",
    "includeCeased": False,
    "maxResults": 25,
    "companyHouseApiKey": "",
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/uk-psc-beneficial-ownership").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 '{
  "companyNumber": "00445790",
  "companyName": "",
  "includeCeased": false,
  "maxResults": 25,
  "companyHouseApiKey": ""
}' |
apify call nexgendata/uk-psc-beneficial-ownership --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "UK PSC Tracker — Beneficial Ownership & Control",
        "description": "Pull UK Companies House Persons with Significant Control (PSC) — beneficial owners, parent entities, trusts. Returns name, kind, nationality, country, partial DOB, ownership % range, nature_of_control[], appointed_on, ceased_on. AML/KYC/UBO — BvD/Refinitiv/Sayari alt.",
        "version": "0.0",
        "x-build-id": "XptJYQbgZIibYTDZB"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~uk-psc-beneficial-ownership/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-uk-psc-beneficial-ownership",
                "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-psc-beneficial-ownership/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-uk-psc-beneficial-ownership",
                "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-psc-beneficial-ownership/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-uk-psc-beneficial-ownership",
                "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": {
                    "companyNumber": {
                        "title": "Company number (exact 8-char Companies House identifier)",
                        "type": "string",
                        "description": "Direct PSC 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 companyName when both are provided."
                    },
                    "companyName": {
                        "title": "Company name (partial match, used when companyNumber is blank)",
                        "type": "string",
                        "description": "Partial-match company name search. The actor calls /search/companies and pulls PSC data for the top match. For deterministic results, prefer companyNumber. Examples: 'Tesco', 'BP', 'Wise', 'Brewdog'."
                    },
                    "includeCeased": {
                        "title": "Include ceased / historical PSCs",
                        "type": "boolean",
                        "description": "When true, also returns PSCs whose control has ceased (e.g. founder who exited at IPO, parent entity sold to a buyer, trust wound up). Useful for AML EDD (was a sanctioned party ever a UBO?), M&A diligence (who held control before the LBO?), and journalism (full beneficial-ownership timeline). Defaults to false for current-only view.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Max PSC rows returned",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Hard cap on total PSC rows pushed to the dataset (1-200). Each PSC is one row. Pricing is per-row so set this tight on large group sweeps. Typical company: 1-10 PSCs. Some private-equity holdcos return 20+ when ceased PSCs are included.",
                        "default": 50
                    },
                    "companyHouseApiKey": {
                        "title": "Companies House API key (REQUIRED)",
                        "type": "string",
                        "description": "REQUIRED. Free Companies House REST API key — register at https://developer.company-information.service.gov.uk (no payment, no enterprise contract, takes ~2 minutes). The free tier enforces a 600 request / 5-minute rolling rate limit per key; this actor handles HTTP 429 with exponential backoff automatically. The key is sent via HTTP Basic auth (username = your API key, password = blank). If this field is left blank, the actor logs an ERROR and exits without pushing any rows and without charging the per-result event — you are NOT billed for a missing-key run."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
