UK business systems guide

Using the Companies House API for UK customer onboarding and KYC

How to find the right legal entity, understand what Companies House does not verify, and keep registry updates from damaging customer records.

A registry hit is not a KYC pass: match score by signal, legal name, postcode, evidence and town
By Ritesh AgarwalReviewed Sep 9, 20268 min read

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.

RegistryDiscover and resolveCandidates, then a confirmed company number
Your checksVerify person and authorityIdentity, mandate, sanctions, risk
Over timeMonitor safelySnapshots and review events, never silent overwrites

Key takeaways

  1. Search results are candidates. The company number is the key. The customer’s confirmation is the record.
  2. A registry hit is not a KYC pass. Identity, authority and screening are your checks.
  3. Never let a scheduled sync overwrite data a customer has confirmed. We have seen it blank an entire client list.
  4. Sole traders are not on the register. Design a second path before launch, not after.
  5. Officer and PSC data is personal data. Collect only what the decision needs.
REGISTRY-BACKEDYOUR CONTROLS01 DiscoverGET /search/companiesshort candidate listnever auto-pick #102 ResolveGET /company/{number}customer confirmsnumber is the key03 Verifyidentity of applicantauthority to actsanctions · risk04 Monitorstatus · officersPSC · insolvencyreview eventsRegistry snapshot + change eventsconfirms: exists · number · status · office · officers · PSCs · filingsdecides: who is applying · may they act · is the risk acceptableFIG. 01FOUR-STAGE ONBOARDING
Fig. 01 Companies House anchors the first two stages. The third and fourth are your checks and your policy.scroll →

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

TaskTypical API call
Find candidate companiesGET /search/companies
Retrieve the chosen companyGET /company/{company_number}
Review officersGET /company/{company_number}/officers
Review beneficial ownershipGET /company/{company_number}/persons-with-significant-control

Company lookup and KYC are not the same check

Companies House can tell you
  • The entity exists, its number and status
  • Registered office, officers, PSCs
  • Filing history, charges, insolvency
Your onboarding must decide
  • Who the applicant is
  • Whether they may act for the company
  • Whether screening passes and the risk is acceptable
Do not turn a registry hit into a KYC pass. Companies House does not check the accuracy of what is filed. For regulated businesses the register supports customer due diligence; it does not complete it. Register guidance · HMRC due-diligence guidance

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.

  1. 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.
  2. SIC codes arrive as bare codes such as 25110. A local lookup table of descriptions has to be joined at export time.
  3. 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.

A practical matching score0–100
40Exact normalised legal name
25Exact registered-office postcode
10Town or locality
25Status, SIC, date and previous-name evidence
±Calibrate against reviewed matches from your own customers
90–100Preselect, then ask the customer to confirm.
70–89Show the strongest candidates and their differences.
Below 70Send to review; also review close top-two scores.

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.

Companies Housescheduled job orstreaming timepointregistry_snapshotraw responseretrieved_at · etagmapped fieldsUpdate policycompare · validatenull keeps old valuematerial → eventcustomer_companyconfirmedoperationalregistry_change_eventdiff · review statusaudit historyregistry_linkcompany numbermatch method · statea name that arrives blank neveroverwrites a name a customer confirmedpause the job without stopping the product · resume failed batches from the last timepointFIG. 02SAFE REGISTRY SYNC
Fig. 02 Registry data lands in a snapshot, a policy decides what changes, and the customer record only moves under explicit rules.scroll →
The same platform shows why the job exists. Its client task deadlines for annual accounts and confirmation statements come from the due dates Companies House publishes. The due date should change when the register changes. The customer’s display name should not.

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.

Limited companyResolves to a company number

Search, confirm, snapshot. Officers and PSCs available when the risk policy needs them.

Sole traderNo register entry

Capture the individual’s name and trading details; apply the identity and address checks appropriate to an unregistered business.

Overseas or unregisteredSay clearly what they can do

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.

Identity is a separate product decision. On a UK product in 2026 we integrated a document identity check and chose ID verification alone, without face-match or liveness, because that was the decision the product needed. Testing showed the document’s country and type had to be validated inputs: a declaration of one country’s driving licence was accepted with another country’s identity card. A company number does none of this work.

Implementation essentials

Minimal server-side clienttypescript
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>;
}
Interactive trafficReserve capacity for customer searches

Debounce on the client, search on the server, keep the key out of the browser.

Bulk enrichmentQueue, cache and retry below the limit

Short-lived search caching, longer profile caching, retry with jitter, a circuit breaker.

OperationsTrack timeouts, 429s, mismatches and reviews

Correlation IDs, structured logs, and the sandbox for failure paths before production.

Incoming changeRecommended behaviour
Status, insolvency or material risk changeSave snapshot, create event, apply policy
Registered name or office changesKeep customer display data; request review where relevant
Source field becomes nullKeep the confirmed value; log the missing source data
Officer or PSC changesCreate a review event when risk requires it
API unavailable or ranking changesKeep 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

Store the company number as a stringShow candidates; never auto-accept the firstCustomer confirms name, number and addressKeep the key and searches on the serverSeparate snapshots from confirmed dataNulls never delete confirmed fieldsJobs are observable, idempotent, pausableCollect officer and PSC data only when neededRecord evidence, decisions and review times
Our ruleSearch → resolve → confirm the number → verify person and authority → assess risk → monitor. Registry data is a source inside your onboarding system, never the system itself.

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.
Published 1 Sep 2026Reviewed 9 Sep 2026Reviewer Appycodes Editorial Team

Technical and operational guidance. Businesses with regulatory obligations should have their due-diligence policy reviewed by a UK compliance professional.

Our clients

UK · Europe · Worldwide

Selected case studies

What we built, how it works and the results for our clients.

Creoate product interface01
B2B commerce

Eight years behind a wholesale marketplace

Next.js storefront, Python ingestion pipelines, DynamoDB data layer and AWS infrastructure.

8+ yearsdevelopment and support
Ontick product interface02
Event technology

Ticketing owned by the event team

Multi-organiser commerce, Stripe instalments and two native apps in one connected platform.

£2M+ticket sales processed
Easyship product interface03
Global logistics

Helping shippers compare their options

Rate, tax and duty calculators, server-rendered courier pages and a custom MongoDB CMS.

550+couriers in the calculator
TEFL.ie product interface04
Education & training

Connecting course sales to the classroom

WordPress and WooCommerce, a Moodle LMS, Stripe deposits and Zoho CRM, tied together with Zapier automation.

Since 2017development and support
All White Laser product interface05
Medical aesthetics

From equipment finance to clinic support

A lead-to-billing system on GoCardless Direct Debit, provider certification, and a React Native app for machine owners.

9 yrsdevelopment and support
Decofetch product interface06
Luxury commerce

A custom home for designer furniture

Server-rendered Next.js commerce over a Laravel API, bespoke operations tooling and re-architected AWS infrastructure.

0→livemarketplace development
BA Engine Room product interface07
AI operations

Connecting discovery, contracts and delivery

Discovery briefs, e-signed contracts, Stripe deposits, delivery milestones and time tracking in one operational system.

0→1custom platform development
PlusHeat product interface08
Home services

Helping customers choose their boiler cover

Custom plan configuration, postcode-qualified lead journeys, CRM synchronisation and campaign landing pages.

5 yrswebsite development and support
Léonia product interface09
Beauty commerce

Shopify shaped around a beauty brand

Custom theme, customer accounts, loyalty rewards, referrals and gift-with-purchase offers.

5 yrsShopify development and support
Shutters 365 product interface10
Home improvement

From window measurements to a priced order

A seven-step product builder with live previews, sample orders and supplier tools.

7-stepproduct configurator
Bloc Ads Manager product interface11
Advertising

From targeted ads to venue check-ins

Campaign creation, audience targeting, in-app ads and reporting linked to venue check-ins.

check-inscampaign attribution
Bloc product interface12
Social events

Four years across the app and operations

Mobile app, backend, advertising tools, a digital marketplace and website.

4+ yrssupport across five codebases
Zonely product interface13
Social mobile

Two apps, one real-time conversation marketplace

Customer and buddy apps with per-minute billing, wallets, moderation and admin tools.

2 appsfor iOS and Android
Player Profile Hub product interface14
Grassroots football

Helping grassroots players get discovered

Verified profiles, video highlights, coach discovery and safeguarding on web and mobile.

0→1custom platform development
DeepSpatial product interface15
Geospatial AI

Connecting clients, investors and emerging talent

Corporate and investor pages, the Xploor talent platform and ongoing releases on AWS Amplify.

2 yrsdevelopment and support
Yippee Malta product interface16
Travel

A booking journey the tour team owns

A multilingual website connected to the booking API, with deposits, coupons and affiliate tracking.

6languages across the booking journey
Professional Energy product interface17
Energy brokerage

Tenders, contracts and accounts brought together

Supplier tenders, contract management, brokerage accounting and client records.

100+suppliers per tender

Tell us what you are trying to build.

A thirty-minute call with the engineer who would run it.

Discuss your project