DEV Community

OpenRegistry
OpenRegistry

Posted on • Originally published at openregistry.sophymarine.com

UK Companies House — post-ECCTA reality and the actual API surface

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/companies returns up to 50 hits per call, paginated. There's a separate /search/officers and /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}/officers returns 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-control returns the structured PSC register: name (or notification of supersession), kind, nature of control, notification dates.
  • Filings/company/{number}/filing-history returns every filing with category, type code, date, document ID. Documents themselves are at /company/{number}/filing-history/{transaction_id}/document and come back as PDF or XHTML iXBRL bytes.
  • Charges/company/{number}/charges returns 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:

  1. Bulk product downloads (annual all-data dumps) cost a fee — but the per-request API has the same data anyway.
  2. 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"
  }]
}
Enter fullscreen mode Exit fullscreen mode

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"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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)