Verify a company is real — from official registers, in one call.
One POST /business checks a company against the VIES VAT register, the GLEIF LEI register and (optionally) Companies House, then validates its registered address on our own engine. You get a single 0–100 business score, a clear verdict, and the register evidence behind it. Official, free-to-use sources — no credit bureau, no black box.
Business Verification is available on request
This product is not sold self-serve. Tell us which registers you need to reach and the volume you expect, and we’ll follow up by email. The full response — register evidence, score and verdict — is documented in the API reference.
What each result means
Every field the /business response includes, and what it tells you about a company.
- business_score
- A single 0–100 composite, weighted only over the checks that actually ran (VAT 40 · LEI 30 · address 20 · name 10, re-normalised over what we could verify). Lets your code branch simply:
if business_score < 80: review. - verdict
- Our overall read. verified (≥80) — the identifiers are valid and the details cohere. partial (50–79) — some registers confirm the company, others were unavailable or didn’t line up. unverified (<50) — the company doesn’t hold together against the registers we reached. insufficient_input (
business_score: null) — a name alone could only be checked against the LEI register and found nothing, or no register could be reached at all; that’s thin input, not evidence against the company — add a VAT number or address and re-check. - register.vat
- The VIES result for the VAT number you sent:
checked,valid, plus the register’s ownname,addressandcountrywhere the member state returns them. This is the EU’s official VAT-validity service — a valid here means the VAT number is live and registered today. - register.lei
- The GLEIF result:
found, theleiitself, the register’slegal_name,status(e.g.ISSUED,LAPSED) andcountry. GLEIF is the open, CC0 global register of legal entities — an active LEI is strong evidence the entity is a real, identified legal person. - register.companies_house
- Present when a UK company is checked. Resolved against a built-in local copy of the official Companies House register — no API key, fully offline — returning
found,company_number,name,status,category,incorporation_dateand registeredaddress. Omitted (not failed) when not applicable. - register.beneficial_owners
- Present for UK companies: the people with significant control as filed in the public PSC register — a
countand anownerslist ofname,kind,natures_of_control,notified_on,nationalityandcountry_registered. This is the register as recorded, not an investigative or verified ownership trace, and UK only. PSC entries for individuals are personal data, served under OGL v3.0; we honour a data-subject removal request and suppress the entry on request. - register.sirene
- Present when a French company is checked. Resolved against a built-in local copy of the official INSEE SIRENE register (~15.9M companies) — no API key, fully offline — returning
found,siren,name,status,active(etatAdministratif:A=active /C=ceased),legal_category,creation_dateanddiffusible. Scored into the composite like Companies House — an active SIREN counts as a full register confirmation. The returnednameis the register’s name as filed, not a verified trade name. For non-diffusible (INSEE-protected) entities we keep thesirenand status but suppress the name — we don’t redistribute INSEE-protected names. Register existence and status, the French equivalent of the UK Companies House leg. - jurisdiction_risk
- A country-level risk signal for the company’s jurisdiction (where it is based):
iso2,cpi_scoreandcpi_rank(Transparency International’s CPI 2024, 0–100, higher = cleaner), the officialeu_tax_blacklistandeu_aml_high_riskflags, arisk_band(low/medium/elevated/high/severe) and arisk_score(0–100, higher = riskier). 187 countries. This is a jurisdiction reference, not a per-entity determination — CPI is a perceptions index, the EU flags are official country designations; neither says anything about this specific company. Available standalone and free atGET/POST /jurisdiction-risk?country=deu. - iban
- Present when you send an
iban. Offline structure + check-digit validation (ISO 13616 / mod-97, 80 countries) plus a bank-exists lookup of the IBAN’s bank code against official directories for 8 countries: Germany (Deutsche Bundesbank Bankleitzahlen) and FR / ES / PT / GR / NL / IE / MT (ECB List of MFIs) — returning the bank’sname,bicandcity, and flaggingiban_country_differs_from_company_country. Honest scope: this validates the IBAN is structurally real and its bank exists — it does not confirm the account exists or belongs to this company (that needs a bank-side check). Other countries get structure + check-digit only. Also available standalone atPOST /iban-validate. - attribution
- The mandatory licence credit returned whenever register data is present — e.g. Companies House / PSC: “Contains public sector information licensed under the Open Government Licence v3.0. Source: Companies House.”; SIRENE: “Contains INSEE SIRENE data, licensed under the Open Licence / Licence Ouverte 2.0 (Etalab). Source: INSEE.”; jurisdiction risk: “Corruption Perceptions Index 2024 by Transparency International, licensed under CC BY 4.0. EU tax and AML high-risk jurisdiction lists: © European Union, via EUR-Lex.”; bank directories: “Source: Deutsche Bundesbank (Bankleitzahlendatei, non-binding, for payment processing). Source: European Central Bank (List of MFIs).”
- address
- Present only when you sent an address. The full Acuris validation of the registered address —
match_typeup to rooftop,accuracy_type, thestandardizedform. Same engine as/validate, 240+ countries. - consistency.name_match_score
- Does the name you submitted match the name the register holds? “Stahlwerk Becker GmbH” against the VIES/GLEIF registered name scores high; a different trading name scores low. Informational — it nuances the score, it doesn’t gate the verdict.
- register_name
- The authoritative legal name as the registers return it — useful when the name on your order or contract is a brand or abbreviation and you want the entity’s real legal name.
- checks_run / check_scores
checks_runlists which legs actually executed (a register that was down or not applicable simply isn’t in here);check_scoresgives the per-check component score behind the composite, so you can see which register carried the verdict.- reasons
- Machine-readable codes behind the verdict (e.g.
vat_invalid,lei_not_found,claimed_name_differs_from_register,registered_address_not_validated) — for your code to act on programmatically.
What this checks — and what it doesn’t
Honesty first: this confirms a legal entity exists in an official register — VIES, GLEIF, Companies House for the UK and INSEE SIRENE for France — and that its identifiers and details cohere. For UK companies it also surfaces the public PSC register as filed — who is recorded as having significant control. We add a country-level jurisdiction-risk signal for where the company is based, but that rates the jurisdiction, not the company. It is not an ownership investigation, not verified or unwound layered ownership, not a credit decision, and not a certified compliance artefact. Every register fails soft — one being down lowers confidence, it never hard-fails the call.
| What you get today | What it is not |
|---|---|
| ✅ VAT number is live and registered now (VIES, the EU’s official service) | 🔎 Investigative or verified UBO tracing, layered-ownership unwinding, or ownership in countries outside the UK |
| ✅ Legal entity is identified in the open GLEIF LEI register | 💳 A credit decision, credit limit or solvency rating |
| ✅ Registered address is real, deliverable-grade, to point-coordinate level | ⚖️ A certified AML/KYB compliance artefact, BaFin approval or EBA-RTS conformance |
| ✅ The name you hold matches the register’s legal name | 🔍 Financial accounts, filings analysis or adverse-media screening |
| ✅ UK beneficial owners from the public PSC register — who is recorded as having significant control | — |
| ✅ French company exists in the official INSEE SIRENE register, with active/ceased status — the French equivalent of the Companies House leg | 🔍 An investigation of the specific company, or redistributing INSEE-protected (non-public) company names |
| ✅ Country-level risk context for the company’s jurisdiction (CPI 2024 + the EU tax-blacklist and AML high-risk lists) | 🚫 A determination that this company is risky or corrupt — it scores the jurisdiction, not the entity |
Screening a name against sanctions lists? That’s a separate capability — /sanctions-screen fuzzy-matches a name against the EU Consolidated, OFAC SDN & Consolidated, UN, UK OFSI, Swiss SECO, French Trésor and Australian DFAT lists (sanctions only — not PEP, not adverse media). A hit is a name match for human adjudication, never a determination that an entity is sanctioned; name collisions are common. It runs free inside our Business Verification and standalone via /sanctions-screen. Verifying a person, not a company? See the Identity Check; for government-grade proof, the EUDI Wallet Verifier.
Real registers, one score
One 0–100 score
VAT, LEI, registered address and name checks collapse into a single number plus a verified / partial / unverified verdict your code can branch on (insufficient_input when there’s too little to check — score null).
VIES VAT validity
The VAT number is checked against the EU’s official VIES service — live registration status, plus the registered name and address where the member state returns them.
GLEIF LEI lookup
The open, CC0 global register of legal entities — confirm an active LEI, pull the authoritative legal name, status and country.
Companies House, built in
UK companies resolve against a local copy of the official Companies House register — company number, status, registered office. No API key, fully offline, on-prem-ready.
France SIRENE, built in
French companies resolve against a local copy of the official INSEE SIRENE register — ~15.9M companies, fully offline, on-prem-ready. Confirm a SIREN exists and is active (etatAdministratif), with legal category and creation date. Licensed under the Open Licence / Licence Ouverte 2.0 (Etalab).
UK beneficial owners
For UK companies we return the people with significant control exactly as filed in the public PSC register — name, nature of control and nationality — under the Open Government Licence. The register as recorded, UK only, not an ownership investigation.
Registered-address validation
The address leg is full Acuris validation — standardisation, corrections and point-coordinate matching across 240+ countries.
Every register fails soft
If VIES is down or GLEIF times out, the score is computed over the checks that did run. One register down lowers confidence — it never hard-fails your call.
Jurisdiction risk signal
A country-level read on where the company is based: Transparency International’s CPI 2024 score plus the EU’s official tax-blacklist and AML high-risk lists, rolled into a risk_band. It rates the jurisdiction, not the company — CPI is a perceptions index, the EU flags are official country designations. Also a free standalone /jurisdiction-risk endpoint.
EU data residency
Runs on the same EU-hosted stack as our address validation. US data residency optional.
Where teams put it to work
Marketplace seller onboarding
Before a new seller goes live, confirm the business behind the storefront actually exists: valid VAT, an identified legal entity, a real registered address. Route weak scores to manual review instead of letting a phantom company list.
B2B invoice-payment risk
Offering net-30 or invoice terms? Check the buyer is a registered company with a live VAT number before you extend credit terms — and price the risk on businesses you can’t verify.
Fintech KYB intake
First-pass business verification for merchant and SMB onboarding: registers confirm the entity exists and its identifiers cohere before a human — or your full KYB provider — picks it up.
Supplier & vendor vetting
Procurement and AP: validate a new supplier’s VAT and registered address before the first PO, and catch typo’d or recycled VAT numbers before they hit your ledger.
VAT-number cleanup
Audit existing customer or vendor records: re-validate stored VAT numbers against VIES in bulk and flag the ones that have lapsed, changed or never matched.
Pre-KYB triage
Full UBO/KYB checks are expensive and slow. Run this first, pass only entities that already verify into the heavy flow, and send the obvious non-companies straight to rejection.
Three lines, any language
A one-line curl, or the same call straight from Node and Python — clean JSON, identical on every tier. (Response below is illustrative.)
curl -X POST 'https://api.acuris-geo.com/business' \
-H 'X-Acuris-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "Stahlwerk Becker GmbH",
"vat": "DE123456789",
"country": "deu",
"address": "Hohenzollernring 72, 50672 Köln"
}'
# → illustrative response:
# {
# "business_score": 100,
# "verdict": "verified",
# "checks_run": ["vat", "lei", "address", "name"],
# "register": {
# "vat": { "checked": true, "valid": true, "name": "Stahlwerk Becker GmbH", "country": "DE" },
# "lei": { "found": true, "legal_name": "Stahlwerk Becker GmbH", "status": "ISSUED" }
# },
# "address": { "match_type": "rooftop", "accuracy_type": "rooftop" },
# "register_name": "Stahlwerk Becker GmbH",
# "validation_credits_remaining": 4988
# }const res = await fetch("https://api.acuris-geo.com/business", {
method: "POST",
headers: { "X-Acuris-Key": process.env.ACURIS_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
name: "Stahlwerk Becker GmbH",
vat: "DE123456789",
country: "deu",
address: "Hohenzollernring 72, 50672 Köln",
}),
});
const r = await res.json();
console.log(r.business_score, r.verdict, r.register.vat.valid);
// → 100 "verified" trueimport os, requests
r = requests.post(
"https://api.acuris-geo.com/business",
headers={"X-Acuris-Key": os.environ["ACURIS_API_KEY"]},
json={
"name": "Stahlwerk Becker GmbH",
"vat": "DE123456789",
"country": "deu",
"address": "Hohenzollernring 72, 50672 Köln",
},
).json()
print(r["business_score"], r["verdict"], r["checks_run"])
# → 100 verified ['vat', 'lei', 'address', 'name']At least one of name / vat is required; lei, address and country are optional and each adds a leg to the score.
Priced individually, on request
Business Verification is priced individually, like our other identity and risk checks — volumes and the registers you need differ too much for a one-size price. Sanctions screening runs free inside every Business Verification and Identity Check call, or standalone via /sanctions-screen.