Back to blog

How to Check a UK Company: 14 Official Sources and Which Have an API

How to check a UK company: Companies House API, HMRC VAT check API, UK Sanctions List, FCA register and more, with rate limits and an onboarding sequence.

Luka Abramovic21 min read

Isometric company profile checked against registry, tax and regulatory source tiles.

If your supplier screening still downloads OFSI's Consolidated List, it has been checking against a closed list since 28 January 2026. The UK Sanctions List is now the only source for UK sanctions designations (GOV.UK). The list also misses companies that are frozen without being named, because an asset freeze extends to entities a designated person owns or controls, including through more than 50% of the shares or votes. To check a UK company properly, screen its people with significant control against the list too, using the ownership and control data Companies House already publishes for them.

Below are 14 official UK sources for checking a supplier or customer: what each proves, what it doesn't, how a system reaches it and how to use it in onboarding. Access rules and limits are as of September 2026. This is a practical summary, not legal advice. For sanctions obligations, OFSI's general guidance is the authority.

The 14 sources at a glance

Apply for HMRC access first, because it's the slow one. HMRC says registering for its VAT-check API takes around two weeks, and production credentials come only after you've tested in its sandbox and accepted its terms of use (HMRC's published API definition). Companies House (via its developer hub), the FCA and the Charity Commission issue keys through developer-portal sign-ups, and OSCR's API is by request. The rest are open APIs, public files or web searches.

Official UK sources for checking a company or supplier (access and limits as of September 2026)
SourceWhat it provesWhat it does not proveHow a system reaches it
1. Companies House registerThe company exists, with its status, registered office, filing deadlines, officers, people with significant control (PSCs), charges and insolvency casesThat it trades or can pay, or employs the person emailing youAPI key, 600 requests per 5 minutes; a Streaming API; bulk files
2. Disqualified directors register (Companies House)A person is disqualified from acting as a director, by court order, undertaking or sanctions designationThat a matching name is the same personThe same API and key
3. HMRC Check a UK VAT numberThe number is registered, with HMRC's name and address for it; the verified mode adds a consultation number as evidenceThat the business invoicing you is the one registeredRegistered application; OAuth 2.0 client credentials, scope read:vat; HMRC's standard 3 requests per second
4. HMRC Check a UK EORI numberA GB EORI number is valid; name and address only if the business agreed to share themAnything about XI numbers, which HMRC sends to the European Commission's checkerOpen access, no credentials; up to 10 numbers per request
5. UK Sanctions List (FCDO)A person or entity is designated under UK sanctionsThat an unlisted company is clear: entities a designated person owns or controls are frozen without being listedFiles in seven formats (ODT, ODS, XML, HTML, TXT, CSV, PDF) at static URLs; an online search
6. The GazetteAn insolvency notice was published, such as a winding-up petition, a winding-up order or a bankruptcy orderThat a company with no notice is solventNotices as data, via format-specific URLs or content negotiation
7. Individual Insolvency Register (Insolvency Service, England and Wales)An individual, such as a sole trader, has a current bankruptcy, individual voluntary arrangement (IVA) or debt relief order, or one that ended in the last three monthsOlder cases, which drop off three months after they end, or any case in Scotland or Northern IrelandWeb search by name
8. Accountant in Bankruptcy Register of Insolvencies (Scotland)An individual or business in Scotland is insolvent: sequestrations (Scottish bankruptcies), protected trust deeds, and insolvency documents that Scottish companies and LLPs must file with the AiBInsolvency elsewhere in the UKWeb search
9. FCA Financial Services RegisterA firm's FCA status and permissionsThat the firm contacting you is the firm on the register: anyone can quote a reference numberAPI key from the FCA's developer portal, currently free; 50 requests per 10 seconds; no service-level agreement
10. FCA Mutuals Public RegisterA mutual society is registered with the FCA, or used to beFCA authorization, a separate function recorded on the Financial Services RegisterWeb search
11. Charity Commission for England and WalesA charity is on the Register of Charities for England and WalesRegistration in ScotlandDeveloper portal: subscribe to the Register of Charities product for a key; rate and quota limits may apply
12. OSCR Scottish Charity RegisterA charity is on the Scottish Charity RegisterRegistration in England and WalesAn API launched in beta in May 2023, on request and not for marketing; register downloads
13. ICO register of fee payersThe organization has paid the data protection feeThat it handles personal data lawfullyWeb search; a dataset download updated daily
14. Confirmation of Payee (Pay.UK)The name you entered matches, or nearly matches, the account name, and whether it's a business or personal accountThat the account belongs to the supplier you think: it checks the name you typeOnly through your bank or payment provider

Companies House: status, people and control

Every other check keys off the company number, so normalize it first. It is eight characters: an optional two-letter prefix, then zero-padded digits. SC marks a Scottish company and NI a Northern Irish one. OC, SO and NC mark LLPs in England and Wales, Scotland and Northern Ireland, OE an overseas entity and FC an overseas company. No letters means a company in England and Wales. A spreadsheet that stores 01234567 as a number turns it into 1234567, which the API won't find. This pads numbers the way Companies House's own website code does (ch.gov.uk source):

import re

def company_number(raw):
    s = re.sub(r"\s", "", str(raw)).upper()
    m = re.fullmatch(r"([A-Z]{0,2})(\d+)", s)
    if not m or len(s) > 8:
        raise ValueError(f"not a company number: {raw!r}")
    prefix, digits = m.groups()
    return prefix + digits.zfill(8 - len(prefix))

def vat_number(raw):
    s = re.sub(r"[\s.-]", "", str(raw)).upper().removeprefix("GB")
    if not re.fullmatch(r"\d{9}|\d{12}", s):
        raise ValueError(f"not a UK VAT number: {raw!r}")
    return s

The same padding in a spreadsheet, for cleaning a supplier export:

=IF(A2 = "", "", LET(s, UPPER(SUBSTITUTE(A2, " ", "")),
     p, IF(ISNUMBER(--LEFT(s, 1)), "", LEFT(s, 2)),
     d, MID(s, LEN(p) + 1, 20),
     p & REPT("0", 8 - LEN(p) - LEN(d)) & d))

Then call the API. The key is the HTTP Basic username and the password is empty, which the colon after the key does in curl (authentication guide):

curl -u "$CH_API_KEY:" https://api.companieshouse.gov.uk/company/01234567

The limit is 600 requests in five minutes, and exceeding it is expensive: every request for the rest of that window gets a 429 (rate limiting guide). An unpaced batch job spends its 600 in seconds, fails for minutes, and a naive retry loop turns the failures into another burst. Pace it just under two requests per second and it never trips.

The profile fields that decide pass, refer or stop

These fields come from Companies House's own enumerations, SDK and website code (api-enumerations, api-sdk-node, ch.gov.uk). The actions are our defaults.

Company profile fields worth an automated rule
FieldValueWhat it meansOur default
company_statusdissolved, converted-closed, removed, closedThe entity no longer exists in that formStop
company_statusliquidation, administration, receivership, voluntary-arrangement, insolvency-proceedingsA formal insolvency process is under wayRefer to credit or finance
company_status_detailactive-proposal-to-strike-offThe status still says active, but the company is on its way off the registerRefer; no credit or prepayment
corporate_annotationPresentA registrar's warning, such as a strike-off under section 1002A because the incorporation application was misleading, false or deceptiveRefer
registered_office_is_in_disputetrueThe registrar has replaced the registered office with the Companies House default address, which the company can only leave by paper form AD01 with evidence of its link to the new addressRefer
undeliverable_registered_office_addresstrueCompanies House has had mail returned from the registered officeRefer
accounts.overdue, confirmation_statement.overduetrueA filing is lateRefer above a spend level you set
has_insolvency_historytrueRead /company/{number}/insolvency for the case types and dates, such as petition and winding-up datesRefer with the case list attached
type, jurisdictionA registered society type, or scotlandAnother register holds part of the record (see the sector and insolvency sections)Route to the extra check

Officers: identity verification and disqualification

From 18 November 2025, directors and PSCs must verify their identity with Companies House. Existing directors confirm it with their next confirmation statement, during a 12-month transition, and each PSC has a 14-day window to provide their verification details (Companies House). In Companies House's own service code, officer and PSC responses carry an identity_verification_details object, with identity_verified_on once the person has verified and appointment_verification_statement_due_on for the date it's due (company-appointments API, PSC data API). Until that date, an unverified existing director is normal. Refer only when the due date has passed with no verification date. A rule that flags every unverified director fires on every supplier whose confirmation statement hasn't come round yet.

Verification proves a director is a real, identified person, not that they're allowed to be a director. That's the disqualification check. For each active director, search the disqualified officers register by name, then compare the month and year of birth from the officers list. A match on name and birth month and year goes to a person. It can also surface a sanctions designation: Companies House's disqualification types include one for people designated under the Sanctions and Anti-Money Laundering Act 2018 (disqualified_officer_descriptions.yml).

Both lists include history: skip officers with resigned_on and PSCs or statements with ceased_on, or your screening flags a director who resigned in 2019.

People with significant control, and a misspelled key

The PSC list at /company/{number}/persons-with-significant-control shows who holds more than 25% of the shares or votes, can appoint or remove a majority of the board, or otherwise has significant influence or control. Each PSC's natures_of_control gives the band, such as ownership-of-shares-50-to-75-percent. A company with no PSC to list files a statement instead, at /company/{number}/persons-with-significant-control-statements, and most statements mean ownership isn't known yet:

PSC statements and what to do with each (keys from Companies House's enumerations)
Statement keyMeaningOur default
no-individual-or-entity-with-signficant-controlThe company believes no one is registrablePass and record it
psc-exists-but-not-identifiedA PSC exists but isn't identifiedRefer
psc-details-not-confirmedIdentified, but particulars not confirmedRefer
steps-to-find-psc-not-yet-completedThe company hasn't finished lookingRefer
psc-contacted-but-no-responseA notice to a suspected PSC went unansweredRefer
restrictions-notice-issued-to-pscThe company has issued a restrictions noticeRefer

Look at the first key again: "signficant" is misspelled in Companies House's own enumerations, and that is the value the API returns. A rule written with the correct spelling never matches, so every company that legitimately has no PSC lands in the referral queue. Copy keys from the enumerations file rather than retyping them.

Keep the checks current without polling

  • The Streaming API pushes changes to companies, officers, PSCs, filings, charges and insolvency cases over long-lived connections, filtered at your end to your supplier numbers. Each event carries a timepoint. Store the last one processed and reconnect with ?timepoint= set to it, so a restart resumes instead of missing events (streaming service source).
  • Bulk files. The Free Company Data Product is a monthly snapshot of every live company, including status and the next accounts and confirmation statement due dates, published within five working days of month end. The PSC snapshot lists every PSC and is overwritten daily before 10am. Join both on the normalized company number, and one download replaces thousands of calls.

HMRC: VAT and EORI numbers

If a VAT check built into your finance system stopped working in February 2025, this is the likely reason: HMRC removed version 1 of its Check a UK VAT Number API on 17 February 2025, and version 2 needs a registered application. HMRC describes the API as solely for traders doing due diligence on VAT-registered businesses (API definition). A check is two calls, shown with HMRC's documentation examples:

# 1. Application token, valid for 4 hours: cache it and reuse it
curl -X POST https://api.service.hmrc.gov.uk/oauth/token \
  -H "content-type: application/x-www-form-urlencoded" \
  --data "client_id=$HMRC_CLIENT_ID&client_secret=$HMRC_CLIENT_SECRET&grant_type=client_credentials&scope=read:vat"

# 2. Verified check: the supplier's VAT number, then yours, digits only
curl https://api.service.hmrc.gov.uk/organisations/vat/check-vat-number/lookup/553557881/146295999727 \
  -H "Accept: application/vnd.hmrc.2.0+json" \
  -H "Authorization: Bearer $HMRC_TOKEN"

# Response
{ "target": { "name": "Credite Sberger Donal Inc.", "vatNumber": "553557881",
              "address": { "line1": "131B Barton Hamlet", "postcode": "SW97 5CK", "countryCode": "GB" } },
  "requester": "146295999727",
  "consultationNumber": "ypAeKRPlW",
  "processingDate": "2019-01-31T12:53:05+00:00" }
  • 200. Store consultationNumber and processingDate on the supplier record as your evidence of the check. Without your own VAT number HMRC runs the simple check, which returns no consultation number, so always send it. Compare the name and postcode with Companies House: a trading name can differ legitimately, but ask before the first payment.
  • 404, "targetVrn does not match a registered company". The number isn't registered. Our default is to hold VAT on that supplier's invoices and ask them.
  • 400, INVALID_REQUEST. The number isn't 9 or 12 digits. If a GB prefix or a space got through, fix the normalizer; if digits are missing, ask the supplier.
  • 403, "requesterVrn does not match a registered company". Your own VAT number in the configuration is wrong. Alert whoever runs the integration, not accounts payable.
  • 429. HMRC's standard limit is 3 requests per second per application, and its guidance is to pause before retrying and to avoid batching (reference guide). Tokens last 4 hours (authorization guide).

For suppliers who move goods across the border, HMRC's Check a UK EORI number API needs no credentials: POST up to 10 numbers per request to /customs/eori/lookup/check-multiple-eori. Each must match ^(GB)[0-9]{12,15}$, and XI numbers are rejected with a pointer to the European Commission's checker. The name and address come back only if the business agreed to share them, so a valid result without a name is normal (API definition).

Sanctions: the UK Sanctions List and the ownership test

With OFSI's Consolidated List closed since 28 January 2026, the FCDO's UK Sanctions List is the only list to screen against. It is published in seven formats with a static URL for each, so a job can fetch the CSV or XML directly (GOV.UK), and a format guide documents the fields. If a screening tool or vendor still names OFSI's list as its source, ask when they switched. Then screen in this order:

  1. Screen more than the supplier's name: its registered name, any trading names, each active director and each current PSC.
  2. Apply the ownership test with the PSC data. OFSI's guidance applies an asset freeze to entities owned or controlled, directly or indirectly, by a designated person. Three of the test's limbs are more than 50% of the shares, more than 50% of the voting rights and the right to appoint or remove a majority of the board (OFSI), and each has a PSC key. ownership-of-shares-50-to-75-percent means more than 50% and not more than 75%, the 75-to-100 bands mean more than 75%, and Companies House defines right-to-appoint-and-remove-directors in the board limb's own words. A designated person holding any of them puts the supplier inside the test even though it isn't on the list. Stop, and escalate to whoever owns sanctions compliance.
  3. Know what the PSC data misses. The bands start above 25%, and a corporate PSC is only the first link in a chain, so indirect or split holdings need a person to trace them. The test's control limb, whether a designated person could expect the company to be run as they wish, has no threshold at all, which is why any designated PSC goes to a person. The 50% threshold may also move. OFSI's call for evidence on ownership and control ran from February to April 2026, and the government says it is exploring aggregating holdings and changing "more than 50%" to "50% or more", in line with the EU and US (OFSI blog). Keep the threshold in configuration, not code.
  4. Re-screen when the list changes, not only at onboarding. Store the file date with each result, and re-run the whole supplier base whenever a new file appears.

The ownership test, applied to PSCs whose names matched the list:

OWNERSHIP_TEST = re.compile(
    r"^((ownership-of-shares|voting-rights)-(50-to-75|75-to-100)-percent"
    r"|right-to-appoint-and-remove-directors)")

def meets_ownership_test(psc):
    return not psc.get("ceased_on") and any(
        OWNERSHIP_TEST.match(n) for n in psc.get("natures_of_control", []))

Insolvency: The Gazette and the insolvency registers

Companies House shows an insolvency once a case reaches it, through has_insolvency_history and the case list. Three gaps remain, each with its own check:

  • Petitions come before orders. The Gazette publishes winding-up petitions as well as winding-up orders (Gazette data service), and until an order or appointment reaches Companies House, the company can still show as active. Before you prepay a supplier or extend credit to a customer, search The Gazette for the company's name and number. Each notice can be fetched as data (data formats), so a match is stored as structured evidence rather than a screenshot.
  • Scottish companies file some insolvency documents elsewhere. Companies House's own API notes say the law requires some Scottish company and LLP insolvency documents to be filed with the Accountant in Bankruptcy (api-enumerations). For numbers beginning SC or SO, also search the AiB register.
  • Sole traders have no company record. For a sole trader or a partner in England or Wales, search the Individual Insolvency Register by name. It holds only current bankruptcies, IVAs and debt relief orders and those that ended in the last three months (GOV.UK), so a clean result says nothing about last year. It doesn't cover Scotland, where sequestrations and protected trust deeds are on the AiB register, and Northern Ireland keeps separate registers.

Sector registers: the FCA, mutual societies and charities

Don't run every supplier through every register. Route from what Companies House and the purchase request already tell you:

  • The profile's type is a registered society (registered-society-non-jurisdictional or industrial-and-provident-society). Companies House holds only partial data on these, and its own enumeration text points to the FCA's Mutuals Public Register, so search that.
  • You're buying a regulated financial service. Look the firm up on the Financial Services Register by its firm reference number, and for anything that matters use the phone number and website shown there, not the ones in the email. The FCA offers no service-level agreement on the API, so an outage should send the check to a person rather than pass it.
  • The supplier or customer is a charity. Check the Charity Commission's register for England and Wales or OSCR's for Scotland, depending on where it's registered. A Scottish charity number such as SC039669 has the same shape as a Scottish company number, so it passes the company-number normalizer and can return an unrelated company. Keep charity and company numbers in separate fields.

Data protection: the ICO register of fee payers

When a supplier will handle personal data for you, such as a payroll bureau or an IT provider, our default is to confirm it appears on the ICO's register of data protection fee payers and store the registration details on the supplier record. Use the web search for a handful of suppliers and the dataset, updated daily, for a supplier base. A new registration can take up to two working days to appear (ICO), so re-check a newly registered supplier missing from today's file in a few days rather than failing it.

Bank details: Confirmation of Payee

Confirmation of Payee (CoP) isn't a register you can call: it runs between banks, and you reach it through your bank or payment provider when you add a payee. The Payment Systems Regulator required most payment providers that send Faster Payments or CHAPS for customers to implement it by 31 October 2024 (PSR). What you control is the name you send and what each result triggers. For a business account, CoP compares against the registered business name or a trading name registered to the account (Pay.UK FAQs), so send the exact Companies House name, not the name on the supplier's letterhead.

Confirmation of Payee results and what each should trigger
ResultWhat it meansOur default
MatchThe name matches the accountContinue, subject to your first-payment rules
Close matchThe bank shows you the actual account nameContinue if it's the Companies House name or a trading name you already hold, and update the payee name. Otherwise refer
No matchThe name doesn't match the accountStop and call back
Unable to checkThe receiving provider doesn't offer CoPTreat as no match: call back before paying
Account type differsA personal account for a limited company, or the reverseRefer

The call-back on a number already on file, and the payment hold that enforces it, are covered in our back office automation examples, along with checking a new supplier against existing records before creating one (supplier setup).

Worked example: re-checking 2,000 suppliers inside the limits

An illustrative example. A business re-checks its 2,000 UK suppliers every month: profile, officers and PSCs from Companies House, a disqualification search for two directors per supplier on average, a verified VAT check and a sanctions screen.

Monthly re-check of 2,000 suppliers (illustrative inputs, published limits)
CheckCalls per supplierCalls in totalLimitShortest run inside the limit
Companies House profile, officers and PSCs36,000600 per 5 minutes (2 per second)3,000 seconds: 50 minutes
Companies House disqualification searches24,000The same key and limit2,000 seconds: 33 minutes more, 83 in all
HMRC VAT check, verified mode12,0003 per second667 seconds: 11 minutes, alongside the above
UK Sanctions List01 file downloadNone per supplierSeconds, plus local matching

Change one input and the design changes. At 20,000 suppliers the same Companies House work is 100,000 calls, at least 50,000 seconds or nearly 14 hours at the limit, and a monthly re-check still misses whatever changed on day two. At that size, use the bulk files and streams as the baseline, and call the API only for companies that changed.

The supplier onboarding check sequence

Run these steps in order when a supplier is created or its details change. "Refer" means the case goes to a named person with the evidence attached, in a queue someone actually works (what that queue needs is in our guide to connecting business systems). "Stop" means no purchase order or payment until it's resolved. The thresholds are our defaults, so set your own.

Supplier onboarding checks with pass, refer and stop rules
StepCheckPassRefer to a personStop
1. IdentifiersNormalize the company number (8 characters), VAT number (9 or 12 digits) and EORI (GB plus 12 to 15 digits)All validAn invalid format: ask the supplierNone
2. Company profileGET /company/{number}Status active (open and registered are live statuses too) and no flags from the profile tableAny flag from the profile table, or a name that differs from your recordNot found after normalizing, or dissolved, converted-closed, removed or closed
3. OfficersActive directors, with a disqualification search for eachVerified, or verification not yet due; no disqualification matchVerification overdue; a name match with the same birth month and yearA disqualification match a person has confirmed
4. PSCsThe PSC list, or PSC statements if there are noneCurrent PSCs listed, or the no-registrable-person statementAny statement that ownership is unknown or unconfirmed; a corporate PSC outside the UKNone
5. SanctionsCompany name, trading names, directors and PSCs against the UK Sanctions ListNo potential matchA potential match, for a person to compare dates of birth, nationality and addressesA confirmed match, or a designated person holding more than 50% of shares or votes, or the right to appoint or remove a majority of the board
6. VATHMRC verified check, when the supplier charges VAT200 with a consultation number; name and postcode consistent with Companies HouseA name or address that differs404: no VAT paid on its invoices until resolved
7. Sector registersWhen triggered: registered society, charity, regulated financial service, personal data, Scottish company, sole traderRegistered and currentNot found where expected, including a registration too new to appearNot authorized for the regulated activity you're buying
8. Bank detailsConfirmation of Payee through your bankMatchA close match to an unknown name; a business or personal account mismatchNo match or unable to check, until a call-back confirms the details
9. EvidenceStore source, time, result and reference per check: HMRC consultation number and processing date, sanctions file date, CoP resultEvery step, whatever the outcome
10. MonitoringStreams or a paced monthly re-run; a full sanctions re-screen whenever the list changesAny change re-runs steps 2 to 5 for that supplier

Steps 2 to 4 as code, using the fields above. The sanctions ownership test is in the sanctions section:

STOP = {"dissolved", "converted-closed", "removed", "closed"}
LIVE = {"active", "open", "registered"}
NO_PSC = "no-individual-or-entity-with-signficant-control"  # sic: Companies House's spelling

def profile_check(p):
    status = p["company_status"]
    if status in STOP:
        return "stop", [status]
    flags = [] if status in LIVE else [status]
    if p.get("company_status_detail") == "active-proposal-to-strike-off":
        flags.append("strike-off proposed")
    if p.get("corporate_annotation"):
        flags.append("registrar annotation")
    if p.get("registered_office_is_in_dispute"):
        flags.append("office replaced with the default address")
    if p.get("undeliverable_registered_office_address"):
        flags.append("mail returned from registered office")
    if p.get("accounts", {}).get("overdue") or p.get("confirmation_statement", {}).get("overdue"):
        flags.append("filing overdue")
    if p.get("has_insolvency_history"):
        flags.append("insolvency history")
    return ("refer" if flags else "pass"), flags

def verification_overdue(person, today):  # today as "YYYY-MM-DD"
    ivd = person.get("identity_verification_details") or {}
    due = ivd.get("appointment_verification_statement_due_on")
    return not ivd.get("identity_verified_on") and due is not None and due < today

def statements_check(items):  # only when the PSC list is empty
    current = [i["statement"] for i in items if not i.get("ceased_on")]
    ok = current and all(s == NO_PSC for s in current)
    return ("pass" if ok else "refer"), current

If you're automating supplier or customer onboarding and want these checks inside your ERP or accounts payable workflow, bring an export of your supplier master, with company and VAT numbers as they're stored today, and one supplier that caused trouble. We'd start by normalizing the identifiers and running the Companies House and VAT checks against the export, which shows how many records fail before a single rule is written. That's where our internal systems and automation work begins.

Build with Adamant Code

Is your business outgrowing its tools?

Bring one workflow or software problem. We’ll discuss where your current setup falls short and the next step worth exploring.

Talk through your workflow
How to Check a UK Company: 14 Official Sources and Which Have an API | Adamant Code