Companies House API
The Companies House API is the official UK government REST API for company data. It is free, needs only a registered API key, and returns company profile, officers, PSC beneficial owners and filing history as JSON. The UK is the outlier here: most European registers publish no equivalent free API.
Free. No per-call charge. Crown copyright under the Open Government Licence - free reuse with attribution. Read-only. Official docs: Companies House Public Data API.
npx skills add Nolpak14/getregdata -g -y
Teaches your agent the endpoints, the auth pattern and the failure modes below - so it runs the check correctly rather than guessing. Read SKILL.md
What you get, for free
- Company profile
- Number, status (active / dissolved / liquidation), incorporation date, registered office, SIC codes, and the accounts and confirmation-statement due dates.
- Officers
- Directors and secretaries with roles, appointment dates, nationality, occupation and a partial date of birth.
- PSC - beneficial owners
- Persons or entities with significant control, and the nature of that control: share ownership bands, voting rights, or the right to appoint the board.
- Filing history
- The statutory filing sequence - accounts, confirmation statements, officer changes and charges.
Getting an API key
- Register a free account at developer.company-information.service.gov.uk and create an application.
- Under Manage applications, create an API key (a "REST API" / Live key).
- Authenticate with HTTP Basic, using the API key as the username and a blank password. In curl that is the trailing colon in -u "KEY:".
export CH_KEY=your_companies_house_api_key # trailing colon = empty password curl -u "$CH_KEY:" \ "https://api.company-information.service.gov.uk/company/00445790"
Rate limit is 600 requests per 5-minute window across all endpoints. There is no burst allowance - exceeding it returns 429 until the window resets.
Endpoints
| Purpose | Call |
|---|---|
| Search companies by name | GET /search/companies?q={name}&items_per_page=20 |
| Company profile | GET /company/{number} |
| Officers and directors | GET /company/{number}/officers |
| PSC - beneficial owners | GET /company/{number}/persons-with-significant-control |
| Filing history | GET /company/{number}/filing-history |
| An officer's other appointments | GET /officers/{officer_id}/appointments |
Running a KYB check end to end
- 1 Resolve identity
Search by name and take the canonical company_number from the result. Names are not unique; numbers are. Skip if you already hold a number.
- 2 Confirm it is real and current
Pull the profile and check company_status. Record incorporation date, registered office and SIC codes.
- 3 Who runs it
Pull officers and list the active directors - officer_role of director with no resigned_on date.
- 4 Who controls it
Pull the PSC list and read natures_of_control on each entry to establish the basis of control.
- 5 Recent signals
Scan filing history. Recent officer changes, registered charges or overdue accounts warrant a closer look.
What bites people
Not every company names an owner - and that is not a pass
The PSC endpoint can return statement objects instead of people: psc-exists-but-not-identified, super-secure-persons-with-significant-control, or a PSC exemption. Treat any of these as beneficial owner UNRESOLVED and record the gap. Reading them as "no owner, therefore low risk" is the single most common mistake made against this API.
Keep the leading zeros
Company numbers are strings, not integers. 00445790 is not 445790. Take the company_number from search verbatim and pass it through unchanged.
company_status has more than two values
active is the pass condition. liquidation, administration, receivership and dissolved are all adverse - a dissolved company cannot trade. Do not test for "not dissolved".
Officer DOB and addresses are privacy-trimmed
Date of birth is month and year only. The address shown is often a service address rather than a residential one - do not treat it as the person’s home.
The 5-minute window has no burst allowance
Hit 600 requests in 5 minutes and every further call fails until the window resets. For batch KYB, throttle below the cap and retry after the reset rather than immediately.
Documents live on a different host
Filing endpoints return metadata plus a links.document_metadata pointer. The actual PDF sits on document-api.company-information.service.gov.uk and is a second call. Most KYB checks never need it.
The jurisdictions with no free equivalent
The UK is the outlier. Most European registers publish through portals built for people, not a general-purpose API - so the next jurisdiction you need probably has no free option. These read the official source live and return the same shape of structured record.
Is the Companies House API free?
Yes. There is no per-call charge and no paid tier for the Public Data API. You need a free API key, and the data is Crown copyright under the Open Government Licence, which permits reuse with attribution. The only hard limit is 600 requests per 5-minute window.
How do I get a Companies House API key?
Register a free account at developer.company-information.service.gov.uk, create an application, then create a REST API (Live) key under Manage applications. Authenticate with HTTP Basic using the key as the username and an empty password - in curl, -u "KEY:" with the trailing colon.
Can I get UK beneficial owners from the API?
Yes, through the persons-with-significant-control endpoint. Read natures_of_control for the basis of control - share bands, voting rights, or the right to appoint directors. Be careful: the endpoint may return a statement rather than a person, which means ownership is unresolved rather than absent.
Is there an equivalent free API for other countries?
For most of Europe, no. The UK is genuinely the outlier. Germany, Spain, Italy and Poland publish their registers through interactive portals designed for humans rather than general-purpose APIs, which is the gap the paid regdata actors fill.
What is the difference between this skill and the API?
The API is the UK government’s. The skill is ours: an installable agent skill that teaches an AI agent the endpoints, the auth pattern, the PSC interpretation rules and the failure modes above, so it runs a UK KYB check correctly instead of guessing.