Identity API
Reference
KYC checks
Synchronous checks against Ghanaian registers. Send the details, get the answer in the same response.
How every check responds
All five endpoints return the same shape. Fields that don't apply to a check come back as null.
| Field | Type | Description |
|---|---|---|
checkId | string | Your reference for this check. Use it with GET /v1/identity/checks/:checkId. |
isValid | boolean | null | true when the details match the register, false when they don't. null when the check doesn't produce a yes/no (SIM name) or the register couldn't decide; treat null as unverified. |
matchScore | string | null | Ghana Card and Voter ID only: how closely the names you sent match the card, e.g. "100%". |
resultName | string | null | The registered name, for SIM name, Mobile Money and bank account checks. |
providerResponseCode | string | The register's own status code. "0000" means it answered normally. |
cost | object | What this check cost: { amount, currency }. |
A check is billed once the register answers, whatever the answer. Validation errors (400) and an empty wallet (403) are not billed, and a register outage (502) is refunded automatically. See errors.
Date formats differ between registers
Ghana Card expects
dd/mm/yyyy. Voter ID expects yyyy/mm/dd. Names should be sent exactly as printed on the card.POST/v1/identity/ghana-card
Checks the details against the National Identification Authority (NIA) register.
| Field | Type | Description |
|---|---|---|
ghanaCardNumberrequired | string | e.g. GHA-123456789-0 |
surnamerequired | string | As printed on the card. |
firstnamesrequired | string | All first and middle names, as printed. |
genderrequired | string | male or female |
dateOfBirthrequired | string | dd/mm/yyyy |
Bash
curl -X POST 'https://api.sendexa.co/v1/identity/ghana-card' \-H 'Authorization: Basic <YOUR_TOKEN>' \-H 'Content-Type: application/json' \-d '{"ghanaCardNumber": "GHA-123456789-0","surname": "Mensah","firstnames": "Kofi Yaw","gender": "male","dateOfBirth": "14/03/1992"}'
JSON
{"success": true,"code": "CHECK_COMPLETE","message": "Successful","requestId": "REQ-1791820800000","timestamp": "2026-10-12T10:00:00.000Z","data": {"checkId": "IDN-5f0c2a9e-7c1b-4f7e-9d2a-0b6c1e8f3a21","isValid": true,"matchScore": "100%","resultName": null,"providerResponseCode": "0000","cost": { "amount": 0.05, "currency": "USD" }}}
POST/v1/identity/voter-id
Checks the details against the Electoral Commission (EC) voter register.
| Field | Type | Description |
|---|---|---|
voterIdCardNumberrequired | string | The number on the voter ID card. |
surnamerequired | string | As printed on the card. |
othernamesrequired | string | All other names, as printed. |
sexrequired | string | male or female |
dateOfBirthrequired | string | yyyy/mm/dd |
JSON
{"voterIdCardNumber": "5012345678","surname": "Owusu","othernames": "Ama Serwaa","sex": "female","dateOfBirth": "1995/07/21"}
The response has the same shape as Ghana Card: isValid and matchScore.
POST/v1/identity/msisdn-name
Returns the name a SIM was registered under.
| Field | Type | Description |
|---|---|---|
msisdnrequired | string | Ghanaian number in international format without +, e.g. 233241234567 |
JSON
{"success": true,"code": "CHECK_COMPLETE","message": "Successful","requestId": "REQ-1791820800000","timestamp": "2026-10-12T10:00:00.000Z","data": {"checkId": "IDN-0d4e…","isValid": null,"matchScore": null,"resultName": "KOFI MENSAH","providerResponseCode": "0000","cost": { "amount": 0.02, "currency": "USD" }}}
POST/v1/identity/mobile-money
Says whether a number is a registered Mobile Money wallet, and returns the wallet name.
| Field | Type | Description |
|---|---|---|
channelrequired | string | mtn-gh, vodafone-gh (Telecel) or tigo-gh (AirtelTigo) |
msisdnrequired | string | e.g. 233241234567 |
JSON
{"success": true,"code": "CHECK_COMPLETE","message": "Successful","requestId": "REQ-1791820800000","timestamp": "2026-10-12T10:00:00.000Z","data": {"checkId": "IDN-7a91…","isValid": true,"matchScore": null,"resultName": "KOFI MENSAH","providerResponseCode": "0000","cost": { "amount": 0.02, "currency": "USD" }}}
Here isValid means "this is a registered wallet".
POST/v1/identity/bank-account
Returns the account holder's name, so you can confirm it before sending a transfer.
| Field | Type | Description |
|---|---|---|
bankCoderequired | string | Six-digit Ghana bank code, e.g. 300304 (GCB). Unknown codes are rejected with 400. |
accountNumberrequired | string | The account number. |
JSON
{"success": true,"code": "CHECK_COMPLETE","message": "Successful","requestId": "REQ-1791820800000","timestamp": "2026-10-12T10:00:00.000Z","data": {"checkId": "IDN-c3b2…","isValid": true,"matchScore": null,"resultName": "KOFI Y MENSAH","providerResponseCode": "0000","cost": { "amount": 0.02, "currency": "USD" }}}
Costs in these examples are illustrative. Every response tells you what that check actually cost in cost, and each charge appears in your wallet history.