---
title: "Get persons with significant control"
method: GET
path: "/v1/company/{company_number}/psc"
tags: ["PSC"]
---

# Get persons with significant control

`GET /v1/company/{company_number}/psc`

## Request

- Base URL: `https://api.registrum.co.uk`
- URL: `https://api.registrum.co.uk/v1/company/{company_number}/psc`
- Auth: API key in header `X-API-Key`

Get the PSC (Persons with Significant Control) register for a company.

Returns all active and ceased PSCs, split into categories. `kind` is a closed
enum decided by an explicit allow-list of every Companies House PSC kind:

- **individual** - a natural person with significant control
- **corporate-entity** - a company with significant control
- **legal-person** - a legal person (e.g., government body) with significant control
- **super-secure** - a person whose details are protected by court order
- **unknown** - Companies House returned a kind we have not classified. Nothing
  is inferred from it: no verification status, no chain traversal.

Every PSC also carries **`kind_raw`** - the verbatim Companies House `kind`
string (e.g. `individual-beneficial-owner`). Before 2026-08-01 an
unrecognised kind was echoed into `kind` itself; it is now normalised to
`unknown` and the original value is always available in `kind_raw`.

**Corporate-entity PSCs - which register the number belongs to.** Companies
House stores a corporate PSC's number as the entity's number at whatever
registry `identification.place_registered` names, which is often not
Companies House (Guernsey Registry, Jersey Financial Services Commission,
Commercial Register Of Liechtenstein, ...). Four fields make this explicit:

- `registry_number` - the number exactly as filed, at whatever registry issued it
- `registry_name` - that registry's name as filed
- `registry_is_companies_house` - `true` (confirmed UK register), `null` (a
  number is present but cannot be tied to the UK register), `false` (no
  registration number filed at all)
- `company_number` - populated **only** when `registry_is_companies_house`
  is `true`, and always in canonical Companies House form (zero-padded,
  upper-cased), so it can be passed straight back to this API

Before 2026-08-01 `company_number` carried the raw filed value whatever
register it came from, so a foreign number could zero-pad onto an unrelated
UK company (CH-Api#59). Clients that need the old raw behaviour should read
`registry_number`.

Each PSC includes decoded `natures_of_control_decoded` with human-readable descriptions
of the control type (e.g., "Owns 25-50% of shares" instead of `ownership-of-shares-25-to-50-percent`).

Companies exempt from PSC filing (e.g., listed PLCs on regulated markets) return
`has_psc_exemption: true` with empty PSC lists.

Data is cached for 30 days. If the Companies House API is down, stale cached data
is returned with `cached: true` in the response.

**Example:** `/v1/company/12345678/psc`

---

**Upstream usage:** 1 upstream call per unique company on first fetch (cached for 30 days).
Companies with >100 PSCs require additional pagination calls.

## Path parameters

- `company_number` string, required: The Companies House company number. 8 alphanumeric characters (e.g., `00445790` for Tesco PLC). Numeric-only numbers are automatically zero-padded.

## Response `200`

PSC register returned successfully

- PSCEnvelope: Response envelope for GET /v1/company/{company_number}/psc.
  - `status` string: 'success' or 'error'
  - `data` PSCListResponse: Enriched PSC register for a company.
    - `company_number` string, required: The queried company number
    - `active_pscs` object[]: Currently active PSCs (individuals, corporate entities, legal persons, super-secure)
    - `ceased_pscs` object[]: PSCs that have ceased
    - `total_active` integer: Count of active PSCs
    - `total_ceased` integer: Count of ceased PSCs
    - `has_psc_exemption` boolean: True if company is exempt from PSC filing (e.g., listed PLCs)
  - `cached` boolean: True if this response was served from cache rather than fetched live
  - `cache_age_seconds` integer, nullable: How many seconds ago this data was fetched from Companies House (null if not cached)
  - `fetched_at` string, nullable: ISO 8601 instant (UTC) when this data was actually fetched from Companies House. Use this, not cache_age_seconds, to show a user when the data was last checked: an age is measured at the moment this response was produced, so anything that caches the response downstream will overstate freshness by however long it held it. This instant does not drift. Null when unknown - render nothing rather than a guessed date.
  - `data_source` string: 'live' - fetched from Companies House right now; 'cached' - served from local cache (data is recent, no upstream call needed); 'cached_rate_conserved' - served from cache because the CH API budget is above 70% utilisation; data may be up to 30 days old in this state
  - `credits_used` integer: Number of API credits consumed by this request
  - `credits_remaining` integer, nullable: API credits remaining this month (null in dev mode)

## Other responses

- `400`: Invalid company number format, or the company number is empty (blank path segment)
- `401`: Missing or invalid API key
- `404`: Company not found at Companies House
- `422`: Validation Error
- `502`: Companies House API is temporarily unavailable
- `503`: Request shed to protect shared Companies House capacity; retry after the seconds given in the Retry-After header

---

[API](https://skmtc.dev/registrum/apis/registrum-api.md) · [All operations](https://skmtc.dev/registrum/apis/registrum-api/llms.txt) · [OpenAPI document](https://skmtc.dev/registrum/apis/registrum-api/revisions/2bf0ecf7cc02?raw)
