TrustVerify logoTrustVerify
Decorative footer background
TrustVerify logoTrustVerify

Identity and business verification for UK marketplaces. ID document and selfie checks, UK company and director checks, and a recorded decision on every check.

020 4542 7323

Solutions

  • All solutions
  • Identity (IDV/KYC)
  • Business (KYB)
  • Bot detection
  • AML & PEP screening
  • Seller verification (KYS)
  • UK registry checks
  • Ongoing monitoring
  • Review queue & trust score
  • Fraud checks
  • IP geolocation
  • Email validation
  • Escrow (secure transactions)

Industries

  • Marketplaces

Developers

  • Platform
  • Integrations
  • Developer docs
  • API reference
  • Webhooks
  • Changelog
  • API status
  • Help centre

Blog

  • All articles
  • Glossary
  • Compare
  • Sumsub alternatives
  • Onfido alternatives
  • Veriff alternatives

Company

  • About TrustVerify
  • Careers
  • Contact sales
  • Privacy policy
  • Cookie policy
  • Terms of service

© 2026 Magnificentech Solutions Ltd (Company No. 16321180), trading as TrustVerify. Registered in England & Wales. All rights reserved. · trustverify.co.uk

TrustVerify, Willow Farm, Choppington, Northumberland NE62 5EU · 020 4542 7323

  1. Blog/
  2. Developer/
  3. Why we built TrustVerify on open-source signals
Developer

Why we built TrustVerify on open-source signals

How TrustVerify reads documents, phone numbers and UK company records with published standards and open libraries, and why a missing check is never a pass.

Ayodele Michael Omotayo avatar
Ayodele Michael Omotayo
Founder & CEO, TrustVerify · 28 February 2026 · Updated 31 October 2026 · 13 min read

Closed verification products often hand you a colour and a logo. The colour is the product. You cannot see whether a document was actually read, whether a screen completed, or what happens when an upstream is down. We built TrustVerify so a marketplace can see the measurement, and so a missing measurement cannot masquerade as a pass.

"Open-source signals" is the name for that choice. Where the industry already published the rule — a check digit, a number format, a public register — we implement the rule and show the result. Where we use an open library, we name it here. The customer's integration stays on the TrustVerify API either way.

This is an engineering article. It describes what the code does today. It is not a promise that every check in the platform is an open-source project, and it is not a claim about where servers are located.

What we mean, and what we do not mean

Published rules, implemented in the open. The check digits on a passport's machine-readable zone are specified by ICAO 9303. Phone numbers have a published structure. UK companies have a public register. We would rather compute those than return "verified" with nothing underneath.

A stable integration. Your sign-up flow calls TrustVerify. It does not branch when the way a check is performed changes behind that API. See the docs.

Some checks depend on a data provider. This article does not invent a story in which every provider can be swapped on a Tuesday. What the code does show, and what hurts marketplaces, is the opposite failure: a provider that did not answer, recorded as if it had passed.

Reading a document without inventing an identity

An identity check starts with the image of a document. Text is extracted with Tesseract, the open-source OCR engine, running in the image that serves the check. The interesting part is not the OCR brand. It is what happens when the text is thin.

A busy photo of a desk can produce some characters and a confidence figure. That used to be enough for a check to continue as if a document had been read. It is not enough now. If no name and no document number were read, the document is not readable, including when OCR did not run at all. An unreadable document cannot be approved automatically, and it cannot show as low risk on the trust score: the score is held to at most 59.

Where a machine-readable zone is present, the check digits are computed the way ICAO 9303 specifies. A valid check digit means the line is internally consistent. It does not mean the selfie matches the holder, and it does not mean the document is current. Expiry is tested separately. An expired document holds the trust score to at most 74 and holds the check for a person.

The selfie is compared with the photo on the document. That comparison is a measurement. If it did not run, the report does not print a face-match of zero, because zero would read as "these two faces were compared and do not match". A comparison that never happened is "not assessed". The same rule applies in the other direction: a comparison that ran and scored zero stays in the result. Dropping a genuine zero would make the score look healthier than the evidence.

We cover liveness checks. Liveness is not shown as a separate number in the trust score.

Proof-of-address images can be collected with the check so your team can look at them. Collecting a file is not the same as confirming the address against a register. The report should be read that way. Details are on identity verification and KYC.

Phone numbers and email addresses

At sign-up, before you send a code or accept a listing, you can check the contact details. Both checks are deliberately modest.

Phone. The number is parsed offline with libphonenumber-js. The response normalises it to E.164 and returns the country, a line type and a risk score. The carrier is the network the number range was allocated to. It is not a live lookup, and it does not follow a number that has been ported. A test key returns a fixed sandbox answer.

Email. The check covers syntax, whether the domain has mail servers, disposable domains, and role addresses such as info@. The verdict is deliverable, undeliverable, risky or disposable. If the domain could not be looked up, treat that as unknown, not as undeliverable.

Neither check proves the seller is who they claim to be. They stop the obvious rubbish before you spend an identity check on it. The guide is email and phone checks.

UK company records from the public register

A limited company seller is not verified by an identity score. The company is a separate fact.

TrustVerify reads the UK company from Companies House: name, number, status, registered office and officers, and the people with significant control. Those people are the starting point for who controls the business. They are not, by themselves, proof that the person opening your seller account works there. You still check that person. KYB and UK registry checks describe the flow. Business checks cover UK companies.

Where the company has a Legal Entity Identifier, we match it against the public LEI records operated by GLEIF. No LEI is a normal outcome for a small UK seller. It is not a fail. An outage that cannot be distinguished from "no LEI" is a reason to treat "not found" with care and look at the Companies House record beside it, rather than to invent a match.

Screening of the company and of the people who control it is a further check, with re-screening after onboarding for subjects you enrol. A screen that does not complete is not stored as clear. Enrolment for monitoring runs a real screen first. If the provider does not answer, nothing is written and the caller gets an error, because a monitor with an unknown baseline is worse than no monitor. Alerts go to a webhook you registered, subscribed to aml.hit, not to an address pasted onto the monitor. That keeps signing, retries and the delivery log in one place. See ongoing monitoring and webhooks.

A missing check is not a zero and not a pass

  • A face comparison that did not run is not a face match of 0%.
  • A screen that did not run is not "clear". A secondary document check that was not configured does not count as corroboration.
  • An identity check is approved only when the positive evidence is there: face match passed, document readable and in date, details matching, screen completed and clear, and no capture flag holding it. "Not false" is not "passed".

If you are writing the integration, store the status you received. Do not map an empty field to approved because a database column is non-null. That is how a marketplace approves a seller during an outage.

The trust score guide has the sibling rule for the weighted API. You send values from 0 to 1. If you send nothing, the score is 50 and the tier is provisional. Fifty is not "trusted". Do not send a 1 for a signal you did not measure.

What your integration actually looks like

There is no starter repository to clone and no language client we ask you to install. You call the HTTP API.

A typical seller sign-up:

  1. Create the seller as pending. Do not enable payouts.
  2. Run an identity check for a person. For a limited company, run the company check as well and check the person opening the account.
  3. Store the check identifier. Leave a review status pending until someone has looked. Held company checks are worked on the review queue, with escalation and a recorded reason.
  4. Verify webhook signatures on the raw body. When payout details or company control change, run the relevant check again. A score from March does not describe October.

WooCommerce. There is a plugin you download and install. It scores orders at checkout and can flag or hold them against thresholds you set. It does not cancel orders on its own. WooCommerce.

Shopify. Install the TrustVerify app on your store. On a paid plan, new orders are scored and tagged. Cancelling a high-risk order is an opt-in for that store. It is an app connection, not a plugin you drop into a theme. Shopify.

Your own stack. The fraud score takes an IP, a device fingerprint from your client, browser details you forward, and the order. If there is no IP result, the score is marked as a heuristic and will not come back as approve. A fallback must not look like a full result.

Sandbox test keys let your team walk the flow before a live seller does. A test key does not write the live device-velocity store. API keys are stored only as SHA-256 hashes and shown once, when you create them. An API key can call the API. It cannot sign in to the dashboard.

Records, access, and what "the customer keeps" should mean

"The customer keeps their data" is a slogan we are not going to stretch. Here is the concrete version.

  • You hold the seller relationship. You decide whether they can list and whether they can be paid. TrustVerify holds the check and the decision record.
  • Dashboard sessions live on the server. The browser keeps a random session identifier in an HttpOnly cookie, sent only over HTTPS. Passwords are hashed with Argon2id.
  • Audit events go to an append-only table. The database rejects an update to a recorded event, and it rejects deletion before the retention period ends.
  • If you find a vulnerability, write to security@trustverify.co.uk. We aim to acknowledge reports within two business days.

TrustVerify's registration with the Information Commissioner's Office is ZB962144, under UK GDPR. That is a registration, not a certificate that a document check is lawful for your marketplace. Biometric data used to identify someone is special category data. Your lawful basis, your privacy notice and your retention period are yours to set with your adviser. The ICO's explanation of special category data is here: ICO — special category data. The Data Protection Act 2018 sits alongside the UK GDPR.

Two-factor authentication for dashboard accounts is not in place. We do not describe it as if it were.

A worked example: two sellers, one sign-up service

A marketplace in Bristol sells spare parts for commercial kitchens. The same endpoint path serves both seller types. The branch is yours.

Dana, a sole trader in Bath, lists used mixers. The document could be read, the expiry is in the future, the typed name matches, the face comparison ran, and the screen completed as clear. Status approved. You enable listing and store the check identifier. You do not also store a homemade "verified" flag you cannot reconstruct.

Harbour Parts Ltd, company number on the application, wants to sell new refrigeration units. Your server looks the company up. Companies House shows the company active, with two directors and one person with significant control. The person who filled in your form is not among them. The company check did not fail — the company is real — and it did not pass the person. You hold payouts, ask the applicant to be verified as themselves, and have a reviewer confirm they are authorised by the company. The review is a recorded decision, not a note in a chat. If the company later changes its person with significant control, monitoring is what tells you. The original trust score will not.

When Harbour Parts Ltd's buyer is a restaurant paying a large deposit, the goods can sit in escrow through Escrow.com, available on request. That is a separate arrangement from the check. The check does not move the money.

A checklist for the integration

  • Pending until a real status arrives. An empty response is not an approval.
  • Map "not assessed" and "not screened" to a hold, never to a pass.
  • Store the check identifier, the status and the time. Store the reviewer's reason when a person decides.
  • Separate the person from the company. A company number is not a selfie.
  • Verify webhook signatures on the raw body. Reject anything you cannot verify.
  • Use a test key in staging before you point production at live keys. Do not put the API key in a mobile app or a theme file.
  • Re-check when payout details or company control change. Enrol monitoring if you need a later hit delivered to you.
  • Read KYC vs KYB vs KYS with your operations lead so the checks match the seller types you actually have.
  • Read how to choose KYC software if you are still comparing approaches. The questions in that guide apply to us as well.

UK rules this design has to survive

A summary for engineers, not legal advice.

  • UK GDPR and the Data Protection Act 2018. Documents and selfies are personal data. Biometric identification data is special category. A tidy API does not supply the lawful basis. Sources: ICO and legislation.gov.uk.
  • Money Laundering Regulations 2017. Where your firm or your payment partner is in scope, due diligence has to be reproducible. A check that says what did not run is what an auditor can follow. Source: the 2017 Regulations and the FCA's financial-crime pages.
  • UK sanctions. A healthy score is not a reason to pay a designated person. Screening is its own result. Sources: the UK sanctions list and OFSI.
  • Reporting rules for digital platforms. Seller information reported to HMRC, where the rules apply, is separate from a fraud score. Source: GOV.UK.
  • Online Safety Act 2023. Ofcom supervises duties that some services have on illegal content, including some fraud. A recorded approval is one piece of evidence, not the whole system. Sources: the Act and Ofcom.
  • Companies House. Identity verification of directors and people with significant control makes the register stronger. It does not replace your check on the applicant. Sources: Companies House identity verification and PSC guidance.

Where to go from here

If you are wiring the first seller, start with the docs, then seller verification for the operational picture and plans for what a subscription includes. If you are deciding whether a score is allowed to approve anyone, read what a trust score is before you write the rule.

Take one approved seller and one held seller. From the record alone, say which checks ran, which did not, and why the status is what it is. If you need a vendor slide to answer that, the integration is hiding the signal.

Frequently asked questions

What does "open-source signals" mean here?
Where a check can be done with a published standard or an open library, that is what TrustVerify uses, and the result says what was measured. Document text is read with Tesseract. Machine-readable zone check digits follow ICAO 9303. Phone numbers are parsed with libphonenumber-js. UK companies are read from Companies House.
Does a missing check count as a pass?
No. A measurement that did not run is reported as not assessed. It is not entered as zero, and it is not treated as clear. A screen that did not complete is not a clear screen.
Can I see which upstream produced a result?
You see the check, the fields and the decision. The integration you write is the TrustVerify API. Swapping how a check is performed behind that API does not change the call you make.
How do phone numbers get checked?
The number is parsed offline and normalised to E.164. You get the country, a line type and a risk score. The carrier field is the network the number range was allocated to. It is not a live carrier lookup, and it does not follow numbers that have been ported.
How should a marketplace integrate this?
Call the HTTP API from your sign-up flow, or use the WooCommerce plugin or the Shopify app. Register a webhook if you want a later monitoring alert. Verify the webhook signature before you trust the body. Start from the docs.
What should we keep for an audit?
The check identifier, the decision, the reason, and which measurements were assessed. Audit events are append-only. The database rejects a change to a recorded event, and it rejects deletion before the retention period ends.

See TrustVerify in action

KYC, KYB, AML screening and fraud prevention in one place, with published pricing.

Book a 30-minute demoSee pricingRead the API docs
Ayodele Michael Omotayo avatar

Ayodele Michael Omotayo

Founder & CEO, TrustVerify

Founder and CEO of TrustVerify. Building identity and business verification for UK marketplaces, with every decision recorded.

LinkedIn →

Related posts

Cover image: Using the TrustVerify Sandbox: Test Keys and Your First Check

Developer

Using the TrustVerify Sandbox: Test Keys and Your First Check

A developer guide to the TrustVerify sandbox: test and live keys, deterministic synthetic results, magic test values and what the sandbox does not cover.

Cover image: Pulling Verification Reports via API

Developer

Pulling Verification Reports via API

How to fetch KYC, KYB and AML screening reports by API, check they exist, download the PDF and assemble an evidence bundle for audit.

Cover image: KYC Webhooks and Decision Handling for Marketplaces

Developer

KYC Webhooks and Decision Handling for Marketplaces

A practical guide to consuming KYC and fraud webhooks on a marketplace: signatures, retries, idempotency and mapping decisions to seller states.

On this page

  • What we mean, and what we do not mean
  • Reading a document without inventing an identity
  • Phone numbers and email addresses
  • UK company records from the public register
  • A missing check is not a zero and not a pass
  • What your integration actually looks like
  • Records, access, and what "the customer keeps" should mean
  • A worked example: two sellers, one sign-up service
  • A checklist for the integration
  • UK rules this design has to survive
  • Where to go from here