PSC

Group structure: who controls whom

Who controls a company and which companies it controls, from the Companies House register of persons with significant control (PSC), as a graph: nodes and edges, the same in sentences (text) and laid out for drawing (layout). Every company held gets a chart: kind says whether it is a group, the company's own persons with significant control, or (where no person is on the register) what the register says instead.

Above the company: every current person with significant control (individuals, companies, legal persons, protected entries), then the owners of its corporate owners, until the chain reaches an individual, an owner registered outside the UK, a statement that there is no registrable person, a company not held, or an entry that cannot be matched. Each of those is a node with a stop giving the reason in plain words. A company with no person on the register has one end node above it: the PSC statement it filed in the register's words, the exemption for a public company whose shares trade on a regulated market, the rule that puts its type outside the PSC regime, or that nothing is held. Below it: the companies whose PSC entries name it. A company can have several owners and an owner several subsidiaries, so this is a graph, not a tree: a company reached twice is one node, and circular control is reported in cycles.

Matching: A company is linked to its owner only where the owner's entry on the register gives a company number and names a UK register, and we hold a company with that number. Names are never matched: an owner that cannot be linked is shown as the register describes it.

Each link shows the nature of control as filed, in the register's own bands. A band is not an exact holding. The register does not show owners registered outside the UK, the beneficiaries of trusts, or anyone below the thresholds for registration, so this may not be the whole structure. Ceased entries are not included (omitted.former_links counts them across the chain, counts.former_owners for the company asked about). Shareholders are a different register and are never mixed in.

Individuals are shown as the register shows them: name, and month and year of birth (never the day). A person who has objected is shown as "Name withheld" or left out, as in the PSC endpoints.

Read from the register copy held: no Companies House request is made. as_at is the date that copy is current to. Limits of one answer: 8 levels above and 5 below, 60 companies in all (24 of them above), 10 registered owners and 25 controlled companies for any one company. Where a limit is reached truncated is true and a more node says where and how many.

Plans: every plan may call this. API Business and Enterprise, and web-app Pro and Team, get every level (level: full). API Free and Starter, and web-app Free, get the first level each way (level: first_level): the company's registered owners and the companies it controls directly, with locked counting the levels and companies beyond and upgrade saying where they are. A chart with one level (a company owned by individuals that controls nothing) is the same on every plan.

Compatibility (2026-10-13): has_group keeps its meaning. has_chart, kind, layout_narrow, former_note, counts.owners, counts.former_owners, limits.ownersOfSubject, a node's note and share_register are new. layout is no longer null for a company with has_group false: test has_group (or kind), not layout, to tell a group from a company with no group.

get/company/{number}/group-structure

Request

  • Base URL: https://api.companystack.co.uk
  • URL: https://api.companystack.co.uk/company/{number}/group-structure
  • Auth: one of:
    • HTTP bearer
    • API key in header X-Api-Key

Path parameters

numberstring required

Response

The chart. has_group: false, with kind owners or statement, for a company with no corporate owner that controls nothing

titlestring

"Group structure" for kind group, "Ownership chart" otherwise

company_numberstring required
company_namestring required
root_idstring

The node id of the company asked about

level'full' | 'first_level' required

full: every level, to where the register stops. first_level: the registered owners and the companies controlled directly, with locked counting what lies beyond

has_groupboolean required

true when the company has a corporate owner or controls a company. false otherwise (unchanged in meaning). Since 2026-10-13 a company with has_group false still has a chart of its own: see has_chart, kind and layout

has_chartboolean required

true when there is a chart to draw (layout is not null). Every company held has one (added 2026-10-13)

kind'group' | 'owners' | 'statement' required

group: a corporate owner or a controlled company exists (has_group true). owners: the company's own persons with significant control and nothing else. statement: no person is on the register, and one end node says what the register says instead: the PSC statement filed, the exemption or rule for that type of company, or that nothing is held (added 2026-10-13)

as_atstring date nullable

The date the register copy is current to (the last change applied from the Companies House PSC stream)

as_shownstring
sourcestring
matchingstring

The rule a link is drawn by

bands_notestring
completeness_notestring
notesstring[]
truncatedboolean

A limit was reached; more nodes say where

layout_narrowobject nullable

The same chart for a narrow screen, in the shape of layout: two or more owners of one company (or childless subsidiaries) are listed in one box. null when layout already fits a phone (added 2026-10-13)

former_notestring nullable

The sentence that says the company's ceased PSC records are not in the chart, with the count. null when there are none (added 2026-10-13)

attributionobject
noticestring

Example response

{
  "as_shown": "As shown on the Companies House register on 11 October 2026."
}

Changes

No recorded changes to this operation across all 1 revision of this API.