KYB

Verify a company (KYB) in one call

Runs structured checks — existence, status, name and registered postcode match, age, overdue filings, Gazette company insolvency notices, PSC register and PSC discrepancies against the beneficial owners you supply, named directors, disqualified-director screening (it reports unable_to_check, never pass, while CompanyStack's copy of the disqualified directors register is not complete and current), sanctions screening (the company, its previous names, current PSCs and officers against every sanctions list loaded, including the UK Sanctions List (which includes the UN designations the UK gives effect to), the EU list, the US lists (OFAC and Consolidated Screening List) and the Canadian, Australian, NZ and French lists; full detail in the sanctions field, see GET /sanctions/company/{number}), optional ECCTA identity verification, registered-address density and net assets — and returns an overall pass, refer, fail or unable_to_check with reason codes. unable_to_check means nothing failed but a check that matters could not run: the officers could not be read (Companies House unreachable and no copy held), so no director was checked, or a source the check needs is missing, incomplete or out of date in CompanyStack's copy (the disqualified directors register, The Gazette's insolvency notices, the sanctions lists, the PSC register, the company's PSC statements when no PSC is registered, or identity verification when you asked for it). A missing source is never read as "nothing found". It is never a pass, and outranks refer (whose reasons are still listed); run the check again later. Every result is stored and can be retrieved later with GET /kyb/checks/{id} as evidence of your due diligence, with a PDF certificate at GET /kyb/checks/{id}.pdf.

Allowance: each paid API plan includes KYB checks every calendar month (UTC), counted per account and shared with KYB run from lists (Starter 100, Business 1,000; see https://companystack.co.uk/pricing). X-KYB-Monthly-Limit and X-KYB-Monthly-Remaining count them down; when the month is used the call answers 429 kyb_allowance_used with Retry-After and resets_at (the 1st, 00:00 UTC), before any check runs and without storing anything.

Reason codes: COMPANY_NOT_FOUND, COMPANY_DISSOLVED, COMPANY_IN_INSOLVENCY, PROPOSAL_TO_STRIKE_OFF, VOLUNTARY_ARRANGEMENT, STATUS_UNUSUAL, NAME_MISMATCH, NAME_SIMILAR, NAME_MATCHES_PREVIOUS_NAME, REGISTERED_POSTCODE_MISMATCH, NEWLY_INCORPORATED, ACCOUNTS_OVERDUE, CONFIRMATION_STATEMENT_OVERDUE, INSOLVENCY_NOTICE, STRIKE_OFF_NOTICE, NO_PSC_REGISTERED (no PSC is registered and the company has no current statement saying why), PSC_STATEMENT_OPEN_QUESTION (no PSC is registered and the company's own current statement leaves open who controls it, for example a PSC not yet identified or confirmed, a notice not answered or a restrictions notice: refer, with the statement quoted and dated), PSC_DISCREPANCY, DIRECTOR_NOT_FOUND, POSSIBLE_DISQUALIFIED_PERSON, OFFICERS_UNAVAILABLE (the officers check and every check that needs the officers: result unable_to_check), DISQUALIFIED_REGISTER_UNAVAILABLE, GAZETTE_UNAVAILABLE, SANCTIONS_UNAVAILABLE, PSC_REGISTER_UNAVAILABLE, PSC_STATEMENTS_UNAVAILABLE (no PSC is registered and the company's PSC statements could not be read just now, so we cannot say whether it filed a statement: never read as none), IDENTITY_VERIFICATION_UNAVAILABLE (a source missing, incomplete or out of date: result unable_to_check), SANCTIONS_POSSIBLE_MATCH, SANCTIONS_STRONG_MATCH (a name match on a sanctions list: refer, never fail — review it against the official entry), IDENTITY_VERIFICATION_OVERDUE. Warnings: HIGH_DENSITY_REGISTERED_ADDRESS, GAZETTE_HISTORY_PARTIAL (CompanyStack's Gazette copy does not cover the whole 24-month look-back), NEGATIVE_NET_ASSETS, IDENTITY_VERIFICATION_DUE_SOON, SANCTIONS_SCREENING_INCOMPLETE (no matches, but a list was not loaded or not refreshed recently, or some names could not be screened), NO_REGISTRABLE_PERSON_STATED (no PSC is registered and the company states it has no registrable person: the company's own statement, quoted with its date, not verified by CompanyStack and not a finding that nobody owns or controls it — enquire how it is owned or controlled; never read it as a clean result), PSC_EXEMPTION_TO_CONFIRM (a public limited company with no PSC: exempt if its voting shares are admitted to trading on a UK or EEA regulated market — confirm the listing). Organisations outside the PSC rules (overseas companies, registered societies and similar) get psc_register not_checked. The response also carries facts.charges: the number of outstanding, part-satisfied and satisfied charges on the register as at a date (or that they could not be read). It is information, not a check, and never changes the result: a charge is normal for a healthy borrower.

post/kyb/check

Request

  • Base URL: https://api.companystack.co.uk
  • URL: https://api.companystack.co.uk/kyb/check
  • Auth: one of:
    • HTTP bearer
    • API key in header X-Api-Key

Request body

company_numberstring required
expected_namestring

Name your customer gave you

expected_postcodestring

Registered office postcode you expect

expected_pscsstring[]

Beneficial owners your customer declared — compared with the PSC register

expected_directorsstring[]

People who claim to be directors

include_identity_verificationboolean

Also check ECCTA identity verification deadlines (live Companies House call, cached 24h)

min_age_monthsinteger
address_density_thresholdinteger
referencestring

Your own reference, stored with the check

Response

Check result (also stored)

check_idstring required
company_numberstring required
company_namestring nullable
referencestring nullable
outcome'pass' | 'refer' | 'fail' | 'unable_to_check' required

unable_to_check: nothing failed, but a check that matters could not run: the officers could not be read from Companies House and no copy is held (reason code OFFICERS_UNAVAILABLE), so no director was checked, or a register the check needs, such as the disqualified directors register, is not complete or current. Never a pass: run the check again later.

summarystring
reason_codesstring[] required
warningsstring[]
data_as_ofstring nullable
checked_atstring date-time required
disclaimerstring

What the check covered, naming only the sanctions lists it actually screened

noticestring

Who the data is prepared for and that CompanyStack accepts no responsibility to anyone else who relies on it (Terms 15B). Keep it with the data if you show it to others (Terms 17.5).

Changes

No recorded changes to this operation across all 1 revision of this API.