The UK's Economic Crime and Corporate Transparency Act 2023 ("ECCTA") changed Companies House from a passive filing repository into a verification authority. Identity verification for directors and PSCs is being rolled out in phases through 2026, suspended-name powers expanded, and there's a new "abbreviated information" mode for small filers. None of that broke the public REST API — but it changed what's in the data. If you're integrating Companies House in 2026, here's what the surface actually looks like, what's free, what's paywalled, and the quirks that bite if you don't know them.
What's free and programmatic
Companies House publishes one of the cleanest open registry APIs in the world. You sign up at developer.company-information.service.gov.uk, get an API key, and you're off. The API covers:
-
Search —
/search/companiesreturns up to 50 hits per call, paginated. There's a separate/search/officersand/search/disqualified-officers. -
Profile —
/company/{number}returns the full statutory record: status, type, incorporation date, registered office, SIC codes, accounts schedule, confirmation-statement schedule, previous names, jurisdiction (England and Wales, Scotland, NI), insolvency-history flag. -
Officers —
/company/{number}/officersreturns directors + secretaries + auditors with appointment dates, roles, dates of birth (month + year only — day is suppressed under the residential-address protections of the Companies Act 2006 s.243), and country of residence. -
Persons with Significant Control —
/company/{number}/persons-with-significant-controlreturns the structured PSC register: name (or notification of supersession), kind, nature of control, notification dates. -
Filings —
/company/{number}/filing-historyreturns every filing with category, type code, date, document ID. Documents themselves are at/company/{number}/filing-history/{transaction_id}/documentand come back as PDF or XHTML iXBRL bytes. -
Charges —
/company/{number}/chargesreturns registered fixed/floating charges with persons entitled, status (outstanding / satisfied / part-satisfied), creation date.
Rate limit is 600 requests per 5 minutes per key — generous enough for a serious workflow but not unlimited. Hit it and you get an HTTP 429 with a Retry-After header in seconds.
What's paywalled or AML-gated
Two things only:
- Bulk product downloads (annual all-data dumps) cost a fee — but the per-request API has the same data anyway.
- The PSC nominee register and the names-by-residential-address feed are Companies House internal tools, not public.
Notably the PSC register itself is fully public. The UK never went the route of restricting beneficial-ownership data to AML-obliged entities — unlike the EU post-CJEU C-37/20.
OpenRegistry's coverage of the UK surface
OpenRegistry proxies Companies House one-to-one with these tools:
| Tool | Status | Notes |
|---|---|---|
search_companies |
✅ live | by name + by exact 8-character company number |
get_company_profile |
✅ live | full statutory record incl. previous_company_names, accounts.next_due
|
get_officers |
✅ live | merges current + resigned, paginated |
get_persons_with_significant_control |
✅ live | structured PSC register; corporate PSCs appear here distinctly from individuals |
get_shareholders |
✅ live (via filing pointer) | UK CH does not expose a structured shareholders endpoint — the statutory members register is published as part of the Confirmation Statement (CS01). Tool returns the latest CS01 + IN01 filing IDs; pass to fetch_document and parse the iXBRL |
list_filings |
✅ live | every filing from incorporation forward |
get_financials |
✅ live | annual accounts subset of list_filings
|
fetch_document |
✅ live | iXBRL / PDF / XHTML bytes returned raw, no re-rendering |
get_charges |
✅ live | full charge register |
get_officer_appointments |
✅ live | given an officer ID, every UK company that officer sits / sat on |
search_officers |
✅ live | by name; useful for adverse-media + PEP screening |
Quirks an integrator hits the hard way
1. Company numbers are not all 8-digit numerics. UK CH issues numbers from a structured space:
- 8 digits → standard England & Wales / Wales-only company
-
SC+ 6 digits → Scottish company -
NI+ 6 digits → Northern Ireland -
OC+ 6 digits → LLP (Limited Liability Partnership) -
LP+ 6 digits → Limited Partnership -
RC+ 6 digits → Registered Society -
FC+ 6 digits → Foreign company branch (UK establishment of an overseas firm — no UK accounts filed; statutory dossier is at the home jurisdiction) -
NF+ 6 digits → Northern Ireland LLP
If your code assumes all-numeric you'll silently exclude Scotland and every LLP in the country. OC404063 is a real LLP; SC456789 is a real Scottish company. Both work in OpenRegistry's search_companies and get_company_profile.
2. PSC ≠ shareholders. UK CH publishes a structured PSC register and a separate (filing-only) statement of capital. They disagree: a 10% direct shareholder appears in the statement of capital but not in PSC; a corporate trustee with appointment rights appears in PSC without being a shareholder. Treat get_persons_with_significant_control as the controlling-influence register, not the equity register. For full equity, fetch the latest CS01 PDF/iXBRL via fetch_document and parse it yourself — that's exactly the workflow we walked in Iceland Foods 4-layer chain.
3. Status is more granular than active/dissolved. CH's company_status field has eight values — active, dissolved, liquidation, receivership, administration, voluntary-arrangement, converted-closed, removed — plus a free-text company_status_detail for the "in-flight" cases. A company shown as active - proposal to strike off is materially riskier than a plain active one. OpenRegistry's unified status field collapses to active/inactive for cross-country comparison; the upstream nuance is preserved verbatim in jurisdiction_data.company_status_detail.
4. Dates of birth are partial. Director DoB returns { month, year } only. The day is suppressed under the residential-address-protection rules introduced in 2018. Don't try to match against a full DD-MM-YYYY DoB from another source — match on year + month or on full name + DoB-year.
A complete worked example — Monzo Bank Ltd
// Request
{
"name": "search_companies",
"arguments": { "jurisdiction": "GB", "query": "Monzo Bank", "limit": 1 }
}
// Response (truncated)
{
"jurisdiction": "GB",
"count": 1,
"results": [{
"company_id": "09446231",
"company_name": "MONZO BANK LIMITED",
"status": "active",
"incorporation_date": "2015-02-06",
"registered_address": "Broadwalk House, 5 Appold Street, London, England, EC2A 2AG"
}]
}
Then get_company_profile("GB", "09446231") returns the full record; get_officers("GB", "09446231") returns 17 directors + secretaries; get_persons_with_significant_control("GB", "09446231") returns the PSCs; list_filings("GB", "09446231", { limit: 25 }) returns the most-recent filings; get_charges("GB", "09446231") returns every registered charge against the company. Five tool calls. Sub-second total latency. Replaces a manual workflow that would otherwise span five separate Companies House screens.
Connecting an MCP client
Add this to your client (Claude Desktop / Cursor / Cline / Goose / Zed — any MCP 2025-06-18 compliant agent):
{
"mcpServers": {
"openregistry": {
"url": "https://openregistry.sophymarine.com/mcp"
}
}
}
Free anonymous tier — 20 requests per minute per IP, every tool, every jurisdiction. No signup, no API key.
Or skip the MCP layer entirely and search on the web at openregistry.sophymarine.com/search?jurisdiction=GB, or jump straight to a known company at openregistry.sophymarine.com/company/gb/09446231 for Monzo's full profile, directors, filings, and charges.
Where ECCTA goes from here
The director-and-PSC identity-verification regime is rolling out in phases through 2026. The data shape returned by the public API hasn't changed — but starting late 2025, records show whether each director / PSC has completed Companies House identity verification (identity_verification_status). Untrusted records may eventually be hidden from search; the current behaviour is they remain visible with the verification flag missing. Watch the field as it appears.
OpenRegistry's full coverage
OpenRegistry is a free remote MCP server giving AI agents real-time access to company-registry data from 30 national governments. This article focused on the UK; the same toolkit covers:
🇬🇧 UK Companies House · 🇫🇷 INSEE Sirene + INPI RNE · 🇩🇪 Handelsregister · 🇮🇹 Registro Imprese (BRIS) · 🇪🇸 BORME · 🇳🇱 KVK · 🇧🇪 KBO · 🇨🇭 Zefix · 🇳🇴 Brreg · 🇫🇮 PRH · 🇮🇪 CRO · 🇵🇱 KRS · 🇨🇿 ARES · 🇮🇸 RSK · 🇮🇲 IoM Registry · 🇨🇾 DRCOR · 🇲🇨 RCI · 🇱🇮 Liechtenstein HR · 🇰🇷 OPENDART · 🇭🇰 Companies Registry · 🇹🇼 GCIS · 🇲🇾 SSM · 🇦🇺 ABR · 🇳🇿 Companies Office · 🇨🇦 Corporations Canada (+ BC + NWT) · 🇲🇽 PSM · 🇰🇾 CIMA · 🇷🇺 ЕГРЮЛ
→ Hosted MCP endpoint: https://openregistry.sophymarine.com/mcp
→ Docs: https://openregistry.sophymarine.com/docs/
→ Free anonymous tier: 20 req/min, every tool, every jurisdiction.
Made by Sophymarine.
Top comments (0)