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.

FieldTypeDescription
checkIdstringYour reference for this check. Use it with GET /v1/identity/checks/:checkId.
isValidboolean | nulltrue 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.
matchScorestring | nullGhana Card and Voter ID only: how closely the names you sent match the card, e.g. "100%".
resultNamestring | nullThe registered name, for SIM name, Mobile Money and bank account checks.
providerResponseCodestringThe register's own status code. "0000" means it answered normally.
costobjectWhat 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.

POST/v1/identity/ghana-card

Checks the details against the National Identification Authority (NIA) register.
FieldTypeDescription
ghanaCardNumberrequiredstringe.g. GHA-123456789-0
surnamerequiredstringAs printed on the card.
firstnamesrequiredstringAll first and middle names, as printed.
genderrequiredstringmale or female
dateOfBirthrequiredstringdd/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.
FieldTypeDescription
voterIdCardNumberrequiredstringThe number on the voter ID card.
surnamerequiredstringAs printed on the card.
othernamesrequiredstringAll other names, as printed.
sexrequiredstringmale or female
dateOfBirthrequiredstringyyyy/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.
FieldTypeDescription
msisdnrequiredstringGhanaian 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.
FieldTypeDescription
channelrequiredstringmtn-gh, vodafone-gh (Telecel) or tigo-gh (AirtelTigo)
msisdnrequiredstringe.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.
FieldTypeDescription
bankCoderequiredstringSix-digit Ghana bank code, e.g. 300304 (GCB). Unknown codes are rejected with 400.
accountNumberrequiredstringThe 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.

Next