# Ownership Chain

Who controls the company, followed up the register to the parent nobody registered controls.

The PSC chain followed company by company (up to five levels): names, numbers, status, what each controller holds, where the register ends, trouble above. Individuals counted, never named.

Every UK company files its people with significant control: the companies and individuals that own more than a quarter of it, hold the votes, or can appoint the board. One company's filing shows only its own controllers; who controls the controller is another filing, and the one above that another. This endpoint follows the chain up the register while the controller is a UK-registered company, up to five levels, and gives it back as one picture: each company with its status and insolvency flag, what each controller holds, where the register runs out (a foreign parent, a listed company whose shares are widely held, a statement that there's no PSC), and whether any company above is in trouble. Companies are named and numbered; an individual with significant control is counted, never named.

- Price: 2 credits
- Page: https://meetkatalis.com/apis/ownership
- OpenAPI: https://meetkatalis.com/openapi.yaml

## Endpoints

- `GET /api/v1/ownership?company=…` — A company number or name

## Call it

```bash
curl -H "x-api-key: $KATALIS_API_KEY" \
  "https://meetkatalis.com/api/v1/ownership?company=00519500"
```

```javascript
const res = await fetch("https://meetkatalis.com/api/v1/ownership?company=00519500", {
  headers: { "x-api-key": process.env.KATALIS_API_KEY },
});
if (!res.ok) throw new Error(`Katalis ${res.status}: ${await res.text()}`);
console.log(await res.json());
```

```python
import os, requests

r = requests.get(
    "https://meetkatalis.com/api/v1/ownership?company=00519500",
    headers={"x-api-key": os.environ["KATALIS_API_KEY"]},
    timeout=60,
)
r.raise_for_status()
print(r.json())
```

## Example response (a real reply)

```json
{
  "company": { "name": "TESCO STORES LIMITED", "number": "00519500", "status": "active" },
  "levels": 3,
  "ultimateParentOnRegister": { "name": "TESCO PLC", "number": "00445790", "status": "active" },
  "chain": [
    { "level": 0, "name": "TESCO STORES LIMITED", "number": "00519500", "status": "active", "controllers": [ { "kind": "company", "name": "Tesco Holdings Limited", "number": "00243011", "controls": ["owns 75–100% of the shares", "holds 75–100% of the voting rights", "can appoint and remove the directors"], "followed": true } ] },
    { "level": 1, "name": "TESCO HOLDINGS LIMITED", "number": "00243011", "status": "active", "controllers": [ { "kind": "company", "name": "Tesco Plc", "number": "00445790", "followed": true } ] },
    { "level": 2, "name": "TESCO PLC", "number": "00445790", "status": "active", "controllers": [] }
  ],
  "troubleAbove": [],
  "reading": "TESCO STORES LIMITED is controlled by Tesco Holdings Limited (00243011), which owns 75–100% of the shares; TESCO HOLDINGS LIMITED is controlled by Tesco Plc (00445790) …"
}
```

## What you'd build with it

- **Credit control and vetting.** The customer looks fine; its parent is in administration. One call shows it.
- **Onboarding.** Who ultimately owns this supplier, as far as the public register can say, and where the trail leaves the UK.
- **Group work.** Every company in a chain by number, ready for the other endpoints.

## Why this one

- **The chain, not one filing.** Five levels in one call, each company's status and insolvency flag read on the way up.
- **Where the register ends, said.** A foreign parent, a listed company or a PSC statement: the reply names the point the public record stops.
- **Companies named, people counted.** Individuals with significant control are counted, never named, so the reply can be shown anywhere.

## Conventions

- Auth: `x-api-key: kat_live_…` on every request (free key at https://meetkatalis.com/developers: a verified email and mobile, 100 credits a month, no card).
- One credit balance across every API; each endpoint's price is on its page and in `x-credits` in https://meetkatalis.com/openapi.yaml.
- Keys are camelCase everywhere. A registered company is `company: { name, number, status, statusDetail?, filingsOverdue? }` on the register endpoints; the enrichment family (enrich, score, assess, brand-kit, ai-visibility, tender-match) keeps `business` / `profile` with `companyNumber`.
- Every error has `code` and `requestId`; every reply an `x-request-id` header; a charged reply `x-credits-remaining`; a reply that gave credits back `x-credits-refunded`. Missing = 404 with `query`.
- Burst ceiling 60 requests a minute per key (429, `Retry-After`, no credits used). A failure on our side (5xx) gives the call's credits back.
- Company data contains public sector information licensed under the Open Government Licence v3.0.

Provided "as is"; results come from public sources and, in places, AI, and may be inaccurate or out of date; not legal, professional or credit advice. Terms: https://meetkatalis.com/apis/terms