The short version
Companies House can confirm that a company appears on the UK register. It cannot prove that the person completing your form controls that company or may act for it. Reliable onboarding treats company discovery, identity, authority and ongoing monitoring as four separate decisions.
Key takeaways
- Search results are candidates. The company number is the key. The customer’s confirmation is the record.
- A registry hit is not a KYC pass. Identity, authority and screening are your checks.
- Never let a scheduled sync overwrite data a customer has confirmed. We have seen it blank an entire client list.
- Sole traders are not on the register. Design a second path before launch, not after.
- Officer and PSC data is personal data. Collect only what the decision needs.
What the Companies House API provides
The Public Data API exposes live register information: legal name, company number, status, incorporation date, type, registered office, previous names and SIC codes, with linked resources for officers, persons with significant control, filings, charges and insolvency. Authentication is an API key over HTTP Basic. The standard limit is 600 requests in five minutes; excess traffic gets 429. Companies House API · Authentication
| Task | Typical API call |
|---|---|
| Find candidate companies | GET /search/companies |
| Retrieve the chosen company | GET /company/{company_number} |
| Review officers | GET /company/{company_number}/officers |
| Review beneficial ownership | GET /company/{company_number}/persons-with-significant-control |
Company lookup and KYC are not the same check
- The entity exists, its number and status
- Registered office, officers, PSCs
- Filing history, charges, insolvency
- Who the applicant is
- Whether they may act for the company
- Whether screening passes and the risk is acceptable
The first real problem: matching the right company
In 2024 a partner agency’s client needed a customer spreadsheet enriched with company numbers and SIC codes. The first idea was to crawl register pages with an SEO spider. Because the API is free to registered applications, we wrote a small server-side script instead: search each business name, fetch the profile. The responses were consistent. The matches were not.
- Trading names, abbreviations and previous names broke “take the first result”. The client’s reviewer found cases where the register search returned the wrong entity while a general web search found the right one. We said it upfront: a script prepares the enrichment, a person verifies it.
- SIC codes arrive as bare codes such as
25110. A local lookup table of descriptions has to be joined at export time. - The output was a spreadsheet, not an API. The client wanted their own account reference on every row. Enrichment is a data product for an operations team.
The durable workflow is name and address → candidate companies → scored matches → customer or reviewer confirmation → company number. The number anchors the relationship, not the search ranking.
The second problem: safe synchronisation
On a UK accounting platform we maintained, a scheduled Companies House job started blanking client names and creating duplicate records on a specific day in September 2024. Restoring the previous day’s backup fixed it for a day; the next run reproduced the damage. Sole-trader records were untouched, which was the clue: only limited companies were synchronised. Disabling the job restored the platform. The fault was architectural. Registry data had become authoritative over data customers had already confirmed, and with no snapshot or change history there was nothing to compare the damaged rows against.
Sole traders, limited companies and unregistered businesses onboard differently
A UK wholesale marketplace we worked with from 2023 onboarded retailers into trade-credit accounts. The first form asked for a “company house number” as free text in a modal. We replaced it with a search component that returned candidates, so the retailer confirmed an entity rather than typing an identifier. Downstream, the trade-credit provider’s API had separate resources for limited companies, sole traders and unregistered businesses, keyed on the organisation number.
Search, confirm, snapshot. Officers and PSCs available when the risk policy needs them.
Capture the individual’s name and trading details; apply the identity and address checks appropriate to an unregistered business.
On that marketplace, overseas companies were routed to pay-now rather than credit. A clear limit beats a failed check later.
Three controls made the difference: a back-office review table showing each evidence field as accepted, pending or rejected; every KYC state change stored as an event; and a scheduled job that flags duplicate retailer accounts before review, still running in 2026. One bug worth remembering: a retailer submitted the form before the email one-time code had been verified. Validate the contact channel before accepting the submission, not after.
Implementation essentials
const baseUrl = "https://api.company-information.service.gov.uk";
async function companiesHouseGet<T>(path: string): Promise<T> {
const apiKey = process.env.COMPANIES_HOUSE_API_KEY;
if (!apiKey) throw new Error("Companies House API key is missing");
const response = await fetch(`${baseUrl}${path}`, {
headers: {
Authorization: `Basic ${Buffer.from(`${apiKey}:`).toString("base64")}`,
Accept: "application/json",
},
signal: AbortSignal.timeout(8000),
});
if (response.status === 429) throw new Error("Rate limit reached");
if (!response.ok) throw new Error(`Companies House returned ${response.status}`);
return response.json() as Promise<T>;
}Debounce on the client, search on the server, keep the key out of the browser.
Short-lived search caching, longer profile caching, retry with jitter, a circuit breaker.
Correlation IDs, structured logs, and the sandbox for failure paths before production.
| Incoming change | Recommended behaviour |
|---|---|
| Status, insolvency or material risk change | Save snapshot, create event, apply policy |
| Registered name or office changes | Keep customer display data; request review where relevant |
| Source field becomes null | Keep the confirmed value; log the missing source data |
| Officer or PSC changes | Create a review event when risk requires it |
| API unavailable or ranking changes | Keep the last snapshot and the confirmed company number |
Companies House identity verification became a legal requirement on 18 November 2025, with a twelve-month transition for existing directors and PSCs running to mid-November 2026. Officer and PSC resources may carry an optional identity_verification_details object, and records gain it progressively. Missing data should produce “unavailable” or a review state, not an automatic rejection. When verification is required · Streaming API
Privacy and release checklist
Public register data is still personal data when you store officer or PSC information. Collect only what the decision requires, define retention, restrict access and explain the registry check in your privacy notice. The same applies to a request we often get from UK accountancy and formation businesses: programmatic company-profile pages built from register data. Public, common, and still personal data. ICO data minimisation
Frequently asked questions
- Is the Companies House API free?
- The public data API is available to registered applications with an API key. The standard limit is 600 requests within five minutes, so high-volume products still need caching and queueing.
- Can Companies House be used as a KYC provider?
- It supports company identification, status, officer and beneficial-ownership checks. It does not replace applicant identity, authority, sanctions, PEP, risk and ongoing-monitoring checks where those are required.
- Can I automatically select the first search result?
- Usually, no. Trading names, abbreviations and similar legal names make the first result unreliable. Ask the user to confirm the company or use a scoring and review workflow.
- Does a sole trader have a Companies House number?
- No. Sole traders and ordinary partnerships are not on the company register, so a Companies House search cannot resolve them. Onboarding needs a separate path that captures the individual's name and trading details and applies the checks appropriate to an unregistered business.
- How often should company data be refreshed?
- Match the frequency to risk. A directory can refresh periodically; a regulated relationship may need event-based monitoring. The Streaming API supports real-time change feeds at larger scale.
Technical and operational guidance. Businesses with regulatory obligations should have their due-diligence policy reviewed by a UK compliance professional.
Related guide
Postcodes.io vs Ideal Postcodes
Postcode geography or delivery-point addresses, and when you need both.
Related guide
UK GDPR and overseas development
Restricted transfers, processor terms and production access controls.
Service
API & integration
Design a Companies House integration around your real onboarding process.














































