Validate BVN
curl --request POST \
--url https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-Api-Key: <api-key>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--data '
{
"bvn": "22222222222"
}
'const options = {
method: 'POST',
headers: {
'X-Timestamp': '<x-timestamp>',
'X-Signature': '<x-signature>',
'Idempotency-Key': '<idempotency-key>',
'X-Api-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({bvn: '22222222222'})
};
fetch('https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic"
payload = { "bvn": "22222222222" }
headers = {
"X-Timestamp": "<x-timestamp>",
"X-Signature": "<x-signature>",
"Idempotency-Key": "<idempotency-key>",
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "completed",
"product": "bvn_basic",
"idType": "bvn",
"level": "basic",
"charge": {
"amount": 70,
"currency": "NGN"
},
"lookupType": "validate",
"passed": true,
"record": null,
"match": {
"bvn": {
"value": "2****2222",
"status": true
},
"firstName": {
"status": true,
"confidenceValue": 100
},
"lastName": {
"status": true,
"confidenceValue": 100
},
"dateOfBirth": {
"status": true,
"confidenceValue": null
}
}
}
}Identity
Validate BVN
Confirm that a name and/or date of birth match a BVN. Does not return the full record or photo. Charged from your NGN wallet when the provider answers. Scope: identity:write. Requires Idempotency-Key.
POST
/
api
/
v1
/
merchant
/
identity
/
bvn
/
basic
Validate BVN
curl --request POST \
--url https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-Api-Key: <api-key>' \
--header 'X-Signature: <x-signature>' \
--header 'X-Timestamp: <x-timestamp>' \
--data '
{
"bvn": "22222222222"
}
'const options = {
method: 'POST',
headers: {
'X-Timestamp': '<x-timestamp>',
'X-Signature': '<x-signature>',
'Idempotency-Key': '<idempotency-key>',
'X-Api-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({bvn: '22222222222'})
};
fetch('https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.sendpadi.com/api/v1/merchant/identity/bvn/basic"
payload = { "bvn": "22222222222" }
headers = {
"X-Timestamp": "<x-timestamp>",
"X-Signature": "<x-signature>",
"Idempotency-Key": "<idempotency-key>",
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "completed",
"product": "bvn_basic",
"idType": "bvn",
"level": "basic",
"charge": {
"amount": 70,
"currency": "NGN"
},
"lookupType": "validate",
"passed": true,
"record": null,
"match": {
"bvn": {
"value": "2****2222",
"status": true
},
"firstName": {
"status": true,
"confidenceValue": 100
},
"lastName": {
"status": true,
"confidenceValue": 100
},
"dateOfBirth": {
"status": true,
"confidenceValue": null
}
}
}
}Part of Identity. List prices first with List products. Live keys debit your NGN wallet when the provider answers (found or not found). Provider-down errors are refunded.
1
Confirm price
GET /api/v1/merchant/identity/products → copy price for bvn_basic. Skip products where available is false.2
Verify
POST /api/v1/merchant/identity/bvn/basic with bvn (11 digits), an Idempotency-Key, and at least one of firstName, lastName, dateOfBirth.lookupType is validate. record is always null. passed is the overall result — use this, not HTTP 201 / success: true (those only mean the lookup finished and was charged). true when the BVN is recognised and every field you sent matched. match.bvn.value is masked. dateOfBirth.confidenceValue may be null when the provider only returns status.
Sandbox (test keys): any 11-digit number returns a sample payload and does not debit your wallet. All zeros (
00000000000) returns IDENTITY_NOT_FOUND.Authorizations
API key id (sp_test_… / sp_live_…)
Headers
Unix time in seconds
HMAC-SHA256 signature
UUID. Required on money-moving writes.
Body
application/json
Response
OK
The response is of type object.

