Validate a Customer Address for Onboarding
The business problem
An onboarding flow needs a decision — accept, escalate to manual review, or reject — from whatever address evidence a new customer provides. The temptation is to treat a passing address check as "this customer is who and where they say they are." It isn't. This guide walks the actual decision AfriHex can support, and draws the line explicitly at what it can't.
What an address match can establish: that a claimed address exists, how complete its data is, and — with a live device fix — that a device was physically near it at one moment.
What it cannot establish, on its own: that the customer owns or resides at that address, that they are who they claim to be, or that they have permission to use it (a shared compound, a relative's house, a forwarding address). Ownership, residence, identity, and permission are claims about a person; AfriHex's evidence is about a location.
What AfriHex returns
curl -X POST "https://api.afrihex.com/v2/kyc/verify" \
-H "X-API-Key: $AFRIHEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cust_123",
"method": "gps_code",
"location": { "gps_code": "GA-142-7281" },
"consent_token": "tok_..."
}'
Before you begin
- A
consent_token— address verification for onboarding requires the customer's consent, same as monitoring (see Location Monitoring — Grant consent). - Decide your
methodbased on what evidence you actually have — see the table below. Don't default tomanualbecause it's the easiest to send; it's also the lowest-trust input. - Set your accept/escalate/reject thresholds before you see live data — see Production checklist.
method | When to use it | Relative trust |
|---|---|---|
gps_fix | Live GPS from the customer's device, captured in-app | Highest of the four inputs |
gps_code | Customer provided a GhanaPostGPS code | Registry match — see caveats below |
hex_code | You already resolved a location in an earlier session | Same trust as whatever produced that hex code originally |
manual | Coordinates you typed in yourself | Lowest — no independent capture at all |
Full example response
{
"success": true,
"data": {
"verification_id": "8a2c1e40-…",
"verified": true,
"hex_code": "AF-GH-7-0GXTQD5EFZZZZ",
"ghanapost_code": "GA-142-7281",
"address": { "region": "Greater Accra", "district": "Accra Metropolitan", "area": "Accra Central" },
"quality_score": 0.91,
"verification": { "method": "gps_code", "accuracy_meters": 250, "confidence": "high" },
"risk_signals": {
"known_residential_area": true,
"address_density": "high",
"previously_verified_by_others": true
}
}
}
Field-by-field explanation
verified— the address resolved and met AfriHex's internal threshold for the chosen method. It is not a statement about the customer.quality_score— data completeness (street, area, postcode, coordinates), not ground-truth confirmation — see Identity & KYC's quality score for the exact bands.risk_signals.previously_verified_by_others—truemeans someone else has previously verified this same address. On its own this is neutral (shared compounds and family houses are normal in Ghana) — it only becomes meaningful combined with your own history of who and how many distinct customers have claimed it.risk_signals.known_residential_area/address_density— characteristics of the area, not the customer. Don't score an individual application down for living somewhere densely populated; that's exactly the geographic-proxy problem discussed in Risk & Fraud's compliance notes.
Error and edge cases
- A high
quality_scorewithmethod: manual. A complete-looking record built from typed-in coordinates carries none of the independent capture agps_fixwould — don't let a high score compensate for a weak method. verified: truebut the customer has no photo ID / KYC document check. Address verification and identity document verification are separate claims — this endpoint only ever speaks to the former. Pair it with your own identity-document process for anything regulatory.- The address resolves but to a business, not a residence. AfriHex has no
concept of "residential vs. commercial" beyond the advisory
known_residential_areasignal — a resolving address is not evidence the customer lives there. For loan/KYC use cases, corroborate with Proximity verification at least once. - Multiple customers verify the same
hex_code. Normal in dense housing and shared compounds — don't auto-reject on this alone; it's one input to fraud scoring (see Risk & Fraud), not disqualifying by itself.
Production checklist
- A written policy maps
quality_scorebands +verification.confidencerisk_signalsto accept/escalate/reject — not an ad hocif quality_score > 0.8scattered through the codebase.
- Every rejection or escalation traceable to a
verification_idand a stated reason, for dispute handling and audit (see Identity & KYC — Compliance notes). - Nothing in this flow is used, alone, as proof of identity, ownership, residence, creditworthiness, or legality — corroborating evidence (document check, proximity verification, human review) exists wherever the decision matters.
- Address-based risk signals (
known_residential_area,address_density) never feed a decision about an individual applicant who hasn't independently transacted — see the redlining caution in Risk & Fraud. - Manual-method verifications are flagged distinctly from device-captured
ones wherever
methodis displayed to a reviewer.
Related endpoints / next guide
- Identity & KYC — the full verification, proximity, and signed-certificate flow this guide is one workflow through.
- Understanding Confidence and Verification — the field-by-field breakdown of every trust signal used above.
- Risk & Fraud — the fraud/AML layer that runs alongside this check.