Do these four signals belong to one real person?
One call checks a name, postal address, email and phone number — each one validated against our own data, then cross-checked against each other. You get a single 0–100 identity score, a clear verdict, and the reasons behind it. Built on the same engines that validate addresses in 240+ countries.
Identity Check is available on request
This product is not sold self-serve. Tell us which signals you need to check — name, address, email, phone — plus the countries and the volume, and we’ll follow up by email. The document & biometric step-up is described below.
What each result means
Every field the /identity response includes, and what it tells you about a person.
- identity_score
- A single 0–100 composite. Each signal you provide is scored and weighted (address 40 · email 30 · phone 20 · name 10, re-normalised over what you sent), then cross-signal mismatches subtract penalties. Lets your code branch simply:
if score < 80: review. - verdict
- Our overall read. verified (≥80) — every signal is real and they cohere. partial (50–79) — some signals check out, others are weak or inconsistent. unverified (<50) — the data doesn’t hold together. A placeholder or well-known fictional name (“Max Mustermann”, “John Doe”, “Mickey Mouse”) always caps the verdict at unverified, however good the rest looks.
- signals.address
- The full Acuris address-validation response — standardised address,
match_typeup to rooftop, corrections, per-component match flags. Same engine as/validate, 240+ countries. - signals.email
- The full email check — format, DNS MX, disposable-domain, role-account and newly-registered-domain flags (the email’s domain was registered within the last ~90 days — a one-way signal: a hit is strong, absence proves nothing), did-you-mean typo suggestions. A deliverable but disposable inbox is capped: it verifies, but it isn’t an identity.
- signals.phone
- The full phone check — E.164 normalisation, numbering-plan validity, line type, region, carrier, time zones. Fully offline, nothing sent to a third party.
- signals.name
- Format and plausibility — placeholder and well-known fictional names (“John Doe”, “Mickey Mouse”), digits, single-token, suspicious patterns. Honest scope: we check that the name is plausible, not that it appears in any register.
- consistency.email_name_match
- Does the email’s local part plausibly belong to the named person?
marie.peeters@…matches Marie Peeters (umlauts andjdoe-style initials handled);info@…against a person’s name returns no_match and costs 10 points. - consistency.phone_country_match
- Does the phone number’s country (derived from the number itself) match the address country? A US mobile attached to a Brussels address returns false and costs 10 points.
- consistency.email_domain_country_match
- Informational only: whether the email’s ccTLD matches the address country. Generic domains (
.com) returnnulland are never penalised. - signal_scores
- The per-signal component scores (0–1) behind the composite, so you can see which signal dragged the total down.
- consistency.ip_country_match
- Does the caller’s IP geolocate to the same country as the address? Derived from Regional Internet Registry delegation data, entirely offline. A request from a US IP against Marie Peeters’ Brussels address returns false and shaves a small penalty — a risk signal, never a block. Only present when you pass an IP.
- signals.ip.is_datacenter
- Is the IP a hosting / cloud / datacenter range rather than a consumer ISP? We match AWS, GCP, Cloudflare and Oracle ranges;
datacenter_providernames the one we hit. (Some commercial VPNs run on these; consumer VPNs on residential IPs are not detected.) Real customers rarely check out from a datacenter — a useful tell, weighed not gated. - signals.ip.is_tor
- Is the IP a known Tor exit node? Checked against the public exit list. true applies a small penalty; like every IP signal it nudges the score and never decides the verdict on its own.
- signals.address_flags
- Special-use address detection:
is_po_box,is_parcel_locker(Packstation),is_virtual_office(c/o, Regus and the like) and apoi_hintfor non-residential premises, summed intoresidential_likelihood(high · medium · low). A perfectly valid address that is a mailbox, not a home — honest scope: a likelihood, not proof. Only present when something special is found. - area_deprivation
- For German and English addresses: the official socioeconomic deprivation decile of the address’s neighbourhood — Germany from the RKI’s GISD at PLZ-5 level (CC BY 4.0), England from the government’s IMD 2019 per postcode (OGL). Each response carries its own
decile_scalebecause the two indices run in opposite directions (IMD: 1 = most deprived; GISD: 10 = most deprived). This is an area statistic, not a statement about the person, and it is deliberately never part ofidentity_score— it’s informational enrichment for your own analytics (insurance risk, affordability, service targeting). England + Germany only; other addresses simply omit the block. - sanctions
- A name-only screen against the official EU consolidated, OFAC SDN & Consolidated, UN, UK OFSI, Swiss SECO, French Trésor and Australian DFAT sanctions lists, run free on every call:
hit,match_count,top_scoreand up to threematches. Honest scope: a name match for a human to adjudicate, not a determination that the person is sanctioned — name collisions are common, and this covers sanctions only, not PEP or adverse-media lists. Deliberately kept out ofidentity_scoreso a name clash can never quietly lower a verified verdict. - review_required
- Set to true only when the sanctions screen returns a possible match, with
sanctions_possible_matchadded toreasons. Your one branch for “send this to a human before proceeding” — separate from the score, so compliance routing never rides on a fraud number. - reasons
- Machine-readable codes behind the verdict (e.g.
name_is_placeholder,email_is_disposable,phone_region_differs_from_address_country) — for your code to act on programmatically.
What this checks — and what it doesn’t
Honesty first: this is a data-coherence check over the attributes you submit. It tells you whether the signals are real and whether they plausibly belong to one person — it is not a legally certified KYC identity proof against a government register.
| What you get today | What it is not (yet) |
|---|---|
| ✅ Address is real, deliverable-grade, to point-coordinate level | 🪪 A match against a government / credit-bureau register |
| ✅ Email exists, isn’t disposable, fits the name | 📄 Document & biometric verification — not part of this check; available as a step-up |
| ✅ Phone is valid and belongs to the address country | ⚖️ A certified AML/KYC compliance artefact |
| ✅ Synthetic-identity tells: placeholder & fictional names, role inboxes, cross-country mismatches | — |
✅ Sanctions name-screen against EU, OFAC SDN & Consolidated, UN, UK OFSI, Swiss SECO, French Trésor and Australian DFAT lists, with a review_required flag |
🔍 A determination that someone is sanctioned — a hit is a name match for human adjudication |
| ✅ IP country / datacenter / Tor flags and special-use address detection as risk signals | 🏛️ PEP or adverse-media screening — we cover sanctions lists only |
Need government-grade identity? Our EUDI Wallet Verifier validates EU Digital Identity Wallet credentials (eIDAS 2.0) — cryptographically signed name, date of birth and address straight from a member-state-issued wallet, the method the EU is making the standard for remote identification from 2027. The identity check on this page is the fast, friction-free first filter; the document & biometric proof tier and the wallet flow are the proof.
Verifying a company, not a person? See Business Verification (KYB) — VAT (VIES), LEI (GLEIF) and registered-address checks in one call.
The step-up: document & biometric proof
When the coherence check isn’t enough — a regulated onboarding, a high-value account, a case your rules flag for review — the same API escalates that user to a full identity-document and biometric verification, presented inside your own flow.
Government ID capture
The user scans a passport, national ID card or driving licence in an in-page flow — document checks run automatically, no redirect away from your product.
Selfie liveness & face match
A short selfie sequence confirms a live person is present and compares the face to the document photo.
Verdict-first decision
The result reaches you by webhook or via GET /identity/proof/result as status and reason codes (approved, declined, resubmission_requested) — your systems receive the decision, not a copy of the document.
One identity ladder
Run the coherence check on everyone, escalate to document proof only where it’s warranted, and reserve the EUDI Wallet flow for state-issued credentials. Three tiers, one API family.
Commercials: quoted individually — contact sales for a price. Production onboarding includes the consent and data-protection setup for biometric processing. Document & biometric verification is performed by our specialist partner Veriff and delivered as part of your Acuris integration.
Fraud & compliance signals, in the same call
Beyond the four core signals, /identity folds in three free risk layers. Pass the caller’s IP and we add its country, datacenter and Tor flags, derived from offline Regional Internet Registry delegation data. The address leg flags special-use premises — PO boxes, parcel lockers, virtual offices — as a residential_likelihood. And every name is screened against the EU, OFAC SDN & Consolidated, UN, UK OFSI, Swiss SECO, French Trésor and Australian DFAT sanctions lists. None of this costs extra.
What a sanctions hit is — and isn’t. A hit is a name match surfaced for a human to adjudicate, not a determination that the person is sanctioned; name collisions are common. We screen sanctions lists only — not PEP (politically-exposed-persons) or adverse-media sources. By design the screen sits outside identity_score and instead raises a separate review_required flag, so a name clash never quietly lowers a verdict and a clean name never reads as “cleared”. The IP and address-risk flags work the same way: they adjust the score by small penalties but never gate the verdict on their own.
Every signal checked, then checked against each other
One 0–100 score
Four validations and the cross-checks collapse into a single number plus a verified / partial / unverified verdict your code can branch on.
Rooftop address validation
The address leg is full Acuris validation — standardisation, corrections and point-coordinate matching across 240+ countries.
Email ↔ name match
marie.peeters@… belongs to Marie Peeters; info@… doesn’t. Umlauts folded, jdoe-style initials understood.
Phone ↔ country match
The number’s real region — derived from the numbering plan, not the caller’s claim — checked against the address country.
Synthetic-identity tells
Placeholder and fictional names (Max Mustermann, John Doe, Mickey Mouse), disposable inboxes and role accounts are flagged — a placeholder or fictional name alone caps the verdict at unverified.
Full sub-results included
You don’t just get the score — the complete address, email and phone validation responses ride along in signals.
IP & device intelligence
Pass the caller’s IP and we add its country, whether it’s a datacenter range (AWS, GCP, Cloudflare, Oracle) or a Tor exit — all offline, and free inside the same call.
Special-use address detection
PO boxes, Packstation parcel lockers, virtual offices (c/o, Regus) and non-residential premises are flagged as a residential_likelihood — a real address that isn’t a home.
Sanctions screening
Every name is screened free against the EU, OFAC SDN & Consolidated, UN, UK OFSI, Swiss SECO, French Trésor and Australian DFAT lists. A hit is a name match for your team to adjudicate — sanctions only, never auto-blocked.
Review-required routing
A possible sanctions match sets review_required: true — one clean branch to send a case to a human, kept entirely separate from the fraud score.
EU data residency
Runs on the same EU-hosted stack as our address validation. US data residency optional.
Where teams put it to work
Signup fraud screening
Score every new account before it gets credit, trial access or a promo code. A US phone, a mailinator inbox and a placeholder name on a Berlin address is a bot — reject it with reasons, in one call.
Checkout risk gating
Before accepting invoice payment or cash-on-delivery, check the order’s contact data holds together. Route low scores to prepayment instead of losing the parcel.
Marketplace seller onboarding
First-pass screening for new sellers and listers: coherent real-world contact data before a human reviews them — and before a fraudulent storefront goes live.
Lead scoring & routing
Form fills with verified, coherent contact data are worth a sales call; asdf@test.com with score 12 isn’t. Push the identity score into your CRM and route accordingly.
CRM hygiene
Audit existing records: flag accounts whose email, phone and address no longer cohere — stale data, shared inboxes, fake registrations from before you screened.
Pre-KYC triage
Full document KYC costs €1+ per check. Run this first and send only plausible identities into the expensive flow — and the obvious junk 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.
curl -X POST 'https://api.acuris-geo.com/identity' \
-H 'X-Acuris-Key: YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": {"first": "Marie", "last": "Peeters"},
"address": "Avenue Louise 54, 1050 Bruxelles",
"country": "bel",
"email": "marie.peeters@telenet.be",
"phone": "+32 470 12 34 56"
}'
# → {
# "identity_score": 100,
# "verdict": "verified",
# "consistency": {
# "email_name_match": "matched",
# "phone_country_match": true
# },
# "signals": { "address": {…}, "email": {…}, "phone": {…}, "name": {…} },
# "credits_charged": { "primary": 1, "email": 1, "phone": 1 }
# }const res = await fetch("https://api.acuris-geo.com/identity", {
method: "POST",
headers: { "X-Acuris-Key": process.env.ACURIS_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
name: { first: "Marie", last: "Peeters" },
address: "Avenue Louise 54, 1050 Bruxelles",
country: "bel",
email: "marie.peeters@telenet.be",
phone: "+32 470 12 34 56",
}),
});
const r = await res.json();
console.log(r.identity_score, r.verdict, r.consistency.email_name_match);
// → 100 "verified" "matched"import os, requests
r = requests.post(
"https://api.acuris-geo.com/identity",
headers={"X-Acuris-Key": os.environ["ACURIS_API_KEY"]},
json={
"name": {"first": "Marie", "last": "Peeters"},
"address": "Avenue Louise 54, 1050 Bruxelles",
"country": "bel",
"email": "marie.peeters@telenet.be",
"phone": "+32 470 12 34 56",
},
).json()
print(r["identity_score"], r["verdict"], r["consistency"])
# → 100 verified {'email_name_match': 'matched', 'phone_country_match': True, …}Priced individually, on request
Identity Check is priced individually, like our other identity and risk checks — the signals and volume you need differ too much for a one-size price. Sanctions screening, name/IP/address risk flags and consistency checks all run free inside every call.