Verify NIN (basic)
curl --request POST \
--url https://api.sendpadi.com/api/v1/merchant/identity/nin/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 '
{
"nin": "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({nin: '22222222222'})
};
fetch('https://api.sendpadi.com/api/v1/merchant/identity/nin/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/nin/basic"
payload = { "nin": "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": "nin_basic",
"idType": "nin",
"level": "basic",
"charge": {
"amount": 100,
"currency": "NGN"
},
"lookupType": "record",
"record": {
"idNumber": "22222222222",
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"fullName": "John Michael Doe",
"gender": "Male",
"dateOfBirth": "1990-01-01",
"phoneNumber": "08012345678",
"photo": "<base64>"
},
"match": null
}
}{
"success": false,
"message": "Insufficient funds. NIN costs 70 NGN; your available balance is 0 NGN.",
"error": "INSUFFICIENT_BALANCE"
}{
"success": false,
"message": "No record was found for this NIN. The lookup was completed and has been charged.",
"error": "IDENTITY_NOT_FOUND",
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "completed",
"refunded": false,
"charge": {
"amount": 70,
"currency": "NGN"
}
}
}{
"success": false,
"message": "NIN verification is temporarily unavailable. Please try again shortly. You have not been charged.",
"error": "IDENTITY_PROVIDER_UNAVAILABLE",
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "failed",
"refunded": true,
"charge": {
"amount": 70,
"currency": "NGN"
}
}
}Identity
Verify NIN (basic)
Look up core NIN biodata including photo. Charged from your NGN wallet when the provider answers. Scope: identity:write. Requires Idempotency-Key.
POST
/
api
/
v1
/
merchant
/
identity
/
nin
/
basic
Verify NIN (basic)
curl --request POST \
--url https://api.sendpadi.com/api/v1/merchant/identity/nin/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 '
{
"nin": "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({nin: '22222222222'})
};
fetch('https://api.sendpadi.com/api/v1/merchant/identity/nin/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/nin/basic"
payload = { "nin": "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": "nin_basic",
"idType": "nin",
"level": "basic",
"charge": {
"amount": 100,
"currency": "NGN"
},
"lookupType": "record",
"record": {
"idNumber": "22222222222",
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"fullName": "John Michael Doe",
"gender": "Male",
"dateOfBirth": "1990-01-01",
"phoneNumber": "08012345678",
"photo": "<base64>"
},
"match": null
}
}{
"success": false,
"message": "Insufficient funds. NIN costs 70 NGN; your available balance is 0 NGN.",
"error": "INSUFFICIENT_BALANCE"
}{
"success": false,
"message": "No record was found for this NIN. The lookup was completed and has been charged.",
"error": "IDENTITY_NOT_FOUND",
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "completed",
"refunded": false,
"charge": {
"amount": 70,
"currency": "NGN"
}
}
}{
"success": false,
"message": "NIN verification is temporarily unavailable. Please try again shortly. You have not been charged.",
"error": "IDENTITY_PROVIDER_UNAVAILABLE",
"data": {
"transactionId": "idv_txn_001",
"reference": "IDV-abc",
"status": "failed",
"refunded": true,
"charge": {
"amount": 70,
"currency": "NGN"
}
}
}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 nin_basic. Skip products where available is false.2
Verify
The sample body is the minimum:
nin only. That returns the full record. Optionally send firstName, middleName, lastName, dateOfBirth, phoneNumber if you also want a match object.lookupType is record. Returns core biodata (name, date of birth, gender, phone) plus record.photo as raw base64 when the provider has it. match is null unless you sent match fields.
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
11-digit NIN. Digits only.
Optional. Compared with the record and returned in match.
Optional. Compared with the record and returned in match.
Optional. Compared with the record and returned in match.
Optional. YYYY-MM-DD or DD-MM-YYYY. Compared with the record.
Optional. Compared with the record using the last 10 digits.
Response
OK
The response is of type object.

