Understanding Confidence and Verification
The business problem
AfriHex responses carry several fields that all sound like "how much can I trust this," but they measure genuinely different things, and mixing them up is how a bank ends up treating a database match as if a human confirmed it in person. This guide separates five distinct claims so you read the right field for the decision you're actually making:
| You're asking | Not the same as |
|---|---|
| Does this address exist in the registry at all? (existence) | Is it this specific customer's address? |
| Was this matched against a third-party database? (source match) | Was it confirmed by anyone on the ground? |
| Did the customer themselves enter or confirm this? (user confirmation) | Is it true? |
| Did a field agent or a real event confirm it? (field verification) | Is it the customer's current address, not a past one? |
| Was a delivery confirmed at this location? (delivery confirmation) | Was it confirmed to the right person? |
What AfriHex returns
Every one of these is a real field somewhere in the API, not a single unified "trust score":
| Concept | Field | Endpoint | What it actually measures |
|---|---|---|---|
| Existence | 404 NOT_FOUND vs. 200 | GET /v2/lookup, GET /v2/reverse, GET /v2/hexcode/{code} | Whether the identifier resolves at all — a precondition, not a confidence score |
| Data completeness | quality_score (0.0–1.0), quality_tier (high/medium/low) | Most geocoding endpoints | How complete the record is (street, area, postcode, coordinates) — not independent verification |
| Source match | provenance.source: "third_party_match" | GET /v2/lookup, GET /v2/reverse | Matched against an external registry (GhanaPostGPS) — never confirmed on the ground for these two endpoints |
| User confirmation | provenance.source: "user_confirmed" | Wherever a customer explicitly enters/confirms their own location | The address owner said so — doesn't mean it's accurate |
| Field/agent verification | provenance.source: "agent_verified" | A field agent's manual structure-point promotion, or a signed proof-of-delivery | Independently confirmed by a human or a real event — the strongest provenance tier |
| Live proximity match | result: "NEAR"/"FAR", confidence | POST /v2/verify/proximity | A declared address vs. a live device GPS fix, right now — see caveats below |
| Delivery confirmation | location_verified, recipient_verified, delivery.confirmed webhook | POST /v2/pod/confirm | A handover happened near the destination — see below |
Before you begin
- Know which endpoint produced the field you're reading — the same word
(
confidence,verified) means different things on different endpoints. This guide exists because those names collide. - Decide your own policy thresholds before you see live data — see Identity & KYC's quality-score bands for a starting point, but the numbers are yours to set.
Copyable request
The clearest side-by-side comes from proximity verification, since it returns several of these axes in one response:
curl -X POST "https://api.afrihex.com/v2/verify/proximity" \
-H "X-API-Key: $AFRIHEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cust_123",
"consent_token": "tok_...",
"declared_address": "GA-142-7281",
"device_location": { "lat": 5.5561, "lng": -0.1962, "gps_accuracy_m": 12, "is_mock_location": false }
}'
Full example response
{
"success": true,
"data": {
"verification_id": "6f3c…",
"result": "NEAR",
"verified": true,
"confidence": 0.97,
"proximity": { "distance_m": 18.4, "within_threshold": true },
"integrity": {
"mock_location": "NOT_DETECTED",
"gps_accuracy": "GOOD",
"provider": "gps",
"ip_geo_match": "MATCH"
},
"timestamp": "2026-08-05T15:30:00Z"
}
}
Field-by-field explanation
result— a spatial fact: was the device physically near the declared address, right now. It says nothing about whose device it was.verified— a derived boolean (NEARandconfidence ≥ 0.6); it's a decision AfriHex made for you, not a separate independent check.confidence— how much AfriHex trusts this specific reading (GPS accuracy, mock-location signals, IP-geo agreement) — not how much you should trust the customer.integrity.mock_location— a spoofing signal,NOT_DETECTEDis the absence of evidence of spoofing, not proof the location is genuine.
What none of this proves
Every field above is location evidence — a signal about where a device
or a record sits — not guaranteed proof of identity, ownership, residence,
creditworthiness, or legality. A verified: true proximity match means a
phone was physically near a declared address at one moment; it does not by
itself establish that the phone's holder is who they claim to be, that they
own or reside at that address, that they're creditworthy, or that anything
about the transaction is lawful. Treat every result here as one input to a
decision your own policies make — not the decision itself. See Identity &
KYC's compliance notes for how this plays
out in a lending flow, and Using Risk Scores
Responsibly for the same caveat applied to
fraud and AML signals.
Error and edge cases
- High
quality_scorewithsource: third_party_match. A complete registry record is not the same as ground-truth confirmation — a well-documented address can still be the wrong customer's. See Choose the Right Location Identifier. verified: falsewithresult: NEAR. Possible whenconfidence < 0.6despite proximity — a low-accuracy GPS fix can be spatially close and still untrusted. Readconfidenceandintegritytogether, notresultalone.- Integrity fields reporting
NOT_PROVIDED. The device didn't send accuracy/mock-location data — treat as unknown, not as a pass. - A signed certificate with
signature_valid: true. Proves the certificate itself wasn't tampered with after issuance — it does not mean the underlying verification is still current; checkrevokedandissued_attoo. See Signed certificates. - Proof of delivery's
recipient_verified. Confirms someone accepted the delivery near the destination — not that they were the named customer, unless your delivery partner independently checked ID.
Production checklist
- Never display or store a single "trust score" that blends
quality_score,provenance.confidence, and proximityconfidence— keep them as separate fields with separate meanings. - Set your own
verified/threshold policy in writing before launch — the defaults (quality_score ≥ 0.8, proximityconfidence ≥ 0.6) are starting points, not regulatory requirements. - Log which endpoint and
provenance.sourcebacked every decision you make off a location — you'll need this for audits and disputes. - Route anything below your threshold to human review instead of a silent auto-reject or auto-approve.
Related endpoints / next guide
- Identity & KYC — the full verification and certificate flow these fields come from.
- Risk & Fraud — the same evidence-not-proof principle applied to fraud and AML/PEP signals.
- Choose the Right Location Identifier — the identifiers these verification calls accept as input.