Overview
The AmbVerify API provides lightning-fast programmatic access to identity verification and modification services. Instant verification endpoints return data immediately, while Modification & Clearance services are processed asynchronously and return their final results via Webhooks.
Want to integrate our API?
Fill out the form below to instantly generate a request to our integration team via WhatsApp.
Authentication
All endpoints (except Health Check) require a Bearer token in the Authorization header.
Authorization: Bearer YOUR_API_KEY
Your API key is a 64-character string provided by the AmbVerify admin team. Keep it secret — treat it like a password.
Base URL
https://ambverify.com.ng/api/v1
Error Handling
{
"success": false,
"error": "Description of what went wrong"
}
Core & Account
Query live status updates across all services using any primary identifier (tracking_id, nin, bvn, phone_number, ticket_id, or batch_id).
| Query Parameter | Type | Requirement | Description |
|---|---|---|---|
tracking_id | string | opt | Search IPE clearance, personalization, or mod tracking ID |
nin | string | opt | Search by 11-digit NIN (Validations & Modifications) |
bvn | string | opt | Search by 11-digit BVN (BVN Agency Mods) |
phone_number | string | opt | Search by 11-digit phone number (BVN Retrieval) |
ticket_id | string | opt | Search by 8-digit BVN CRM ticket ID |
batch_id | string | opt | Search an entire batch submission |
Example Status Query
curl -X GET "https://ambverify.com.ng/api/v1/check_status.php?tracking_id=WYZ123456789" \
-H "Authorization: Bearer YOUR_API_KEY"
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/check_status.php?tracking_id=WYZ123456789');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY'
]
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.get('https://ambverify.com.ng/api/v1/check_status.php?tracking_id=WYZ123456789', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/check_status.php"
headers = { "Authorization": "Bearer YOUR_API_KEY" }
params = { "tracking_id": "WYZ123456789" }
response = requests.get(url, headers=headers, params=params)
print(response.json())
Status Response 200 OK
{
"success": true,
"count": 1,
"data": [
{
"service": "ipe_clearance",
"id": 1201,
"tracking_id": "WYZ123456789",
"status": "Successful",
"reply": "Cleared successfully",
"nin": "12345678901",
"created_at": "2026-09-27 10:15:30"
}
]
}
Check your real-time API wallet balance and dedicated virtual bank account details for instant auto-funding.
curl -X GET "https://ambverify.com.ng/api/v1/wallet.php" \
-H "Authorization: Bearer YOUR_API_KEY"
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/wallet.php');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY']
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.get('https://ambverify.com.ng/api/v1/wallet.php', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get("https://ambverify.com.ng/api/v1/wallet.php", headers=headers)
print(response.json())
Success Response 200 OK
{
"success": true,
"wallet_balance": 48500.00,
"currency": "NGN",
"virtual_account": {
"account_number": "6615023553",
"account_name": "AMB - Dev Solutions",
"bank_name": "PALMPAY"
}
}
Fetch the current API pricing for all services, automatically reflecting any custom discounts applied to your account.
Success Response 200 OK
{
"success": true,
"currency": "NGN",
"services": {
"ipe_clearance": {
"types": [
{ "validation_type": "IPE Clearance", "price": 400.00 },
{ "validation_type": "HIT Clearance", "price": 900.00 }
]
},
"nin_validation": {
"types": [
{ "validation_type": "No Record Found", "price": 400.00 },
{ "validation_type": "Photographic error", "price": 400.00 }
]
},
"tin_verification": {
"types": [
{ "validation_type": "TIN ID (Individual)", "price": 300.00 },
{ "validation_type": "TIN Cert (Individual)", "price": 350.00 },
{ "validation_type": "TIN ID (Company)", "price": 300.00 },
{ "validation_type": "TIN Cert (Company)", "price": 350.00 }
]
}
}
}
Public endpoint — no authentication required. Use this to monitor gateway uptime and server readiness.
curl -X GET "https://ambverify.com.ng/api/v1/status.php"
<?php
$response = file_get_contents('https://ambverify.com.ng/api/v1/status.php');
echo $response;
?>
const axios = require('axios');
axios.get('https://ambverify.com.ng/api/v1/status.php')
.then(res => console.log(res.data));
import requests
print(requests.get("https://ambverify.com.ng/api/v1/status.php").json())
Response 200 OK
{
"status": "ok",
"version": "1.0",
"service": "AmbVerify API"
}
Instant Verifications
These endpoints process requests instantly, returning the full JSON data and a PDF Slip link in the same response.
Instant Tax Identification Number (TIN) Verification & Certificate Retrieval for both Individuals (JTB) and Registered Corporate Entities (CAC).
Request Parameters
| Parameter | Type | Requirement | Description |
|---|---|---|---|
type |
string | req | Target entity category: individual or company |
format |
string | opt | Output format: id (TIN ID Card Slip) or certificate (Official Tax Certificate). Default is id. |
id_number |
string | req (individual) | Applicant's 11-digit NIN or BVN |
first_name |
string | opt | Applicant's First Name (as registered with NIMC/Bank) |
last_name |
string | opt | Applicant's Last Name / Surname |
dob |
string | opt | Format: YYYY-MM-DD |
rc_number |
string | req (company) | CAC RC or BN Number (e.g. RC123456, BN654321) |
company_type |
string | opt | company, business_name, incorporated_trustee, limited_partnership (default: company) |
Example 1: Individual TIN ID Slip
{
"type": "individual",
"format": "id",
"id_number": "12345678901",
"first_name": "JOHN",
"last_name": "DOE",
"dob": "1990-05-15"
}
Example 2: Corporate Official TIN Certificate
{
"type": "company",
"format": "certificate",
"rc_number": "RC123456",
"company_type": "company"
}
Success Response 200 OK
{
"success": true,
"message": "TIN verification successful.",
"type": "company",
"amount_charged": 350.00,
"data": {
"tax_id": "2301928374650",
"name": "ACME ENTERPRISES NIGERIA",
"id_number": "BN1029384",
"registration_type": "Business Name",
"status": "ACTIVE",
"ticket_id": "TINCOM19283746501234",
"pdf_url": "https://ambverify.com.ng/download_slip.php?id=270926-AB12CD34EF56&api=1"
},
"slip_url": "https://ambverify.com.ng/download_slip.php?id=270926-AB12CD34EF56&api=1"
}
AMB_SLIP_DOWNLOAD event containing the raw base64 string for direct client downloads.
V1 (Standard): Fully refundable upon record failure. Returns verified demographic citizen data and instant official PDF slip download links.
| Field | Type | Requirement | Description |
|---|---|---|---|
nin | string | req | 11-digit National Identification Number |
slip_type | string | opt | basic, regular, standard, premium, vnin (default: basic) |
curl -X POST "https://ambverify.com.ng/api/v1/nin_verification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"nin": "12345678901", "slip_type": "premium"}'
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/nin_verification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode([
'nin' => '12345678901',
'slip_type' => 'premium'
])
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/nin_verification.php', {
nin: '12345678901',
slip_type: 'premium'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/nin_verification.php"
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"nin": "12345678901", "slip_type": "premium"}
print(requests.post(url, json=payload, headers=headers).json())
Success Response 200 OK
{
"success": true,
"report_id": "011026-F9B2C1",
"allow_slip": 1,
"slip_download_url": "https://ambverify.com.ng/download_slip.php?report_id=011026-F9B2C1&slip_type=nin_premium",
"data": {
"nin": "12345678901",
"firstname": "KABIR",
"surname": "SULAIMAN",
"middlename": "DANLAMI",
"dob": "1994-08-12",
"gender": "Male",
"telephoneno": "08012345678",
"residence_address": "Plot 24 Innovation Drive, Garki II",
"residence_town": "Abuja",
"residence_lga": "Municipal",
"residence_state": "FCT",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
STRICT V2: High-priority channel. Wallet is charged upfront. Non-refundable on verification failure (auto-refunded on timeout only).
curl -X POST "https://ambverify.com.ng/api/v1/nin_v2.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"nin": "12345678901", "slip_type": "standard"}'
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/nin_v2.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode(['nin' => '12345678901', 'slip_type' => 'standard'])
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/nin_v2.php',
{ nin: '12345678901', slip_type: 'standard' },
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' } }
).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
print(requests.post("https://ambverify.com.ng/api/v1/nin_v2.php", json={"nin": "12345678901", "slip_type": "standard"}, headers=headers).json())
| Field | Type | Requirement | Description |
|---|---|---|---|
bvn | string | req | 11-digit Bank Verification Number |
slip_type | string | opt | basic, plastic, advance (default: basic) |
Example Request
curl -X POST "https://ambverify.com.ng/api/v1/bvn_verification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"bvn": "22223333444",
"slip_type": "basic"
}'
<?php
$payload = [
'bvn' => '22223333444',
'slip_type' => 'basic'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/bvn_verification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/bvn_verification.php', {
bvn: '22223333444',
slip_type: 'basic'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/bvn_verification.php"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"bvn": "22223333444",
"slip_type": "basic"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Success Response 200 OK
{
"success": true,
"report_id": "011026-A1B2C3",
"slip_download_url": "https://ambverify.com.ng/download_slip.php?report_id=011026-A1B2C3&slip_type=bvn_basic",
"data": {
"bvn": "22223333444",
"firstname": "JOHN",
"surname": "DOE",
"middlename": "MICHAEL",
"dob": "1990-05-15",
"gender": "Male",
"telephoneno": "08012345678",
"enrollmentBank": "First Bank",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
V1 (Standard): Fully refundable upon record failure. Verify NIN demographic records and generate official slips directly by phone number.
| Field | Type | Requirement | Description |
|---|---|---|---|
phone | string | req | 11-digit Nigerian phone number (e.g. 08012345678) |
slip_type | string | opt | basic, regular, standard, premium, vnin (default: basic) |
curl -X POST "https://ambverify.com.ng/api/v1/phone_verification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phone": "08012345678", "slip_type": "standard"}'
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/phone_verification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode(['phone' => '08012345678', 'slip_type' => 'standard'])
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/phone_verification.php',
{ phone: '08012345678', slip_type: 'standard' },
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' } }
).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
print(requests.post("https://ambverify.com.ng/api/v1/phone_verification.php", json={"phone": "08012345678", "slip_type": "standard"}, headers=headers).json())
Success Response 200 OK
{
"success": true,
"report_id": "011026-P8D2A3",
"allow_slip": 1,
"slip_download_url": "https://ambverify.com.ng/download_slip.php?report_id=011026-P8D2A3&slip_type=nin_standard",
"data": {
"nin": "72041234567",
"firstname": "ZAINAB",
"surname": "ALIYU",
"telephoneno": "08012345678",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
STRICT V2: High-priority channel. Wallet is charged upfront. Non-refundable on verification failure (auto-refunded on timeout only).
curl -X POST "https://ambverify.com.ng/api/v1/phone_v2.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phone": "08012345678", "slip_type": "premium"}'
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/phone_v2.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode(['phone' => '08012345678', 'slip_type' => 'premium'])
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/phone_v2.php',
{ phone: '08012345678', slip_type: 'premium' },
{ headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' } }
).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
print(requests.post("https://ambverify.com.ng/api/v1/phone_v2.php", json={"phone": "08012345678", "slip_type": "premium"}, headers=headers).json())
Perform demographic lookups using First Name, Last Name, Gender, and Date of Birth. If multiple citizens share the demographic parameters, an array of candidate profiles is returned.
| Field | Type | Requirement | Description |
|---|---|---|---|
first_name | string | req | Applicant First Name (e.g. JOHN) |
last_name | string | req | Applicant Surname / Last Name (e.g. DOE) |
gender | string | req | m (Male) or f (Female) |
dob | string | req | Format: YYYY-MM-DD or DD-MM-YYYY |
slip_type | string | opt | basic, regular, standard, premium, vnin (default: basic) |
curl -X POST "https://ambverify.com.ng/api/v1/demo_verification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "JOHN",
"last_name": "DOE",
"gender": "m",
"dob": "1990-05-15",
"slip_type": "standard"
}'
<?php
$payload = [
'first_name' => 'JOHN',
'last_name' => 'DOE',
'gender' => 'm',
'dob' => '1990-05-15',
'slip_type' => 'standard'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/demo_verification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/demo_verification.php', {
first_name: 'JOHN',
last_name: 'DOE',
gender: 'm',
dob: '1990-05-15',
slip_type: 'standard'
}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }
}).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"first_name": "JOHN", "last_name": "DOE", "gender": "m", "dob": "1990-05-15", "slip_type": "standard"}
print(requests.post("https://ambverify.com.ng/api/v1/demo_verification.php", json=payload, headers=headers).json())
Async & Modification Services
Submit one or more NINs for manual validation. Wallet is charged immediately. You can track status via Webhooks or by Polling the GET endpoint.
| Field | Type | Requirement | Description |
|---|---|---|---|
nins | array | req | Array of 11-digit NINs (Max 100) |
validation_type | string | req | No Record Found, Photographic error, Modification validation, Bank validation, SIM validation |
Example Submission Request
curl -X POST "https://ambverify.com.ng/api/v1/nin_validation.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"validation_type": "No Record Found",
"nins": ["12345678901", "98765432101"]
}'
<?php
$payload = [
'validation_type' => 'No Record Found',
'nins' => ['12345678901', '98765432101']
];
$ch = curl_init('https://ambverify.com.ng/api/v1/nin_validation.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/nin_validation.php', {
validation_type: 'No Record Found',
nins: ['12345678901', '98765432101']
}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }
}).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"validation_type": "No Record Found", "nins": ["12345678901", "98765432101"]}
print(requests.post("https://ambverify.com.ng/api/v1/nin_validation.php", json=payload, headers=headers).json())
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/nin_validation.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"request_id": 101,
"batch_id": "A3F8C901",
"nin": "12345678901",
"validation_type": "No Record Found",
"status": "Successful",
"reply": "Validation record updated successfully.",
"created_at": "2026-09-27 10:15:30"
}
}
Submit an official manual request to modify NIMC NIN details. Our backend team processes the modification and uploads the verified slip documents.
Request Parameters (Always Required)
| Field | Type | Requirement | Description |
|---|---|---|---|
nin | string | req | 11-digit National Identification Number |
modification_type | string | req | name, phone, address, dob, name_phone, name_dob, dob_phone |
Additional Parameters by Modification Type
| Type | Required Target Fields | Notes |
|---|---|---|
name |
first_name, surname |
middle_name is optional |
phone |
new_phone |
New 11-digit phone number to link |
address |
address, state, lga, town |
New residential location details |
dob |
new_dob, passport_photo_base64, affidavit_photo_base64 |
Date format: YYYY-MM-DD. Both images base64 encoded. |
name_dob |
first_name, surname, new_dob, passport_photo_base64, affidavit_photo_base64 |
Combines Name and DOB fields |
Example Request (Name Modification)
{
"nin": "12345678901",
"modification_type": "name",
"first_name": "JOHN",
"middle_name": "EMMANUEL",
"surname": "DOE"
}
Submission Response 201 Created
{
"success": true,
"message": "NIN Modification request submitted successfully.",
"batch_id": "A4D9F12B",
"request_id": 503,
"nin": "12345678901",
"modification_type": "name",
"amount_charged": 2500.00,
"wallet_balance": 47500.00
}
Poll the status and download the verified modification documents (Picture 1 and Picture 2) using nin or request_id.
GET https://ambverify.com.ng/api/v1/nin_modification.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"request_id": 503,
"nin": "12345678901",
"modification_type": "name",
"status": "submitted_self_service",
"status_label": "Completed",
"admin_note": "Modification completed successfully.",
"slip_url_1": "https://ambverify.com.ng/uploads/admin/final_6701a2b.pdf",
"slip_url_2": "https://ambverify.com.ng/uploads/admin/final2_891bc3.jpg",
"created_at": "2026-09-27 12:45:00"
}
}
Automated Webhook Notification
When our team completes the job or marks it failed, your Webhook URL automatically receives a POST event:
{
"event": "status_update",
"service": "nin_modification",
"nin": "12345678901",
"request_id": 503,
"status": "submitted_self_service",
"reply": "Modification completed successfully.",
"timestamp": "2026-09-27T13:10:00Z"
}
failed, the fee is automatically refunded back to your API wallet.
Submit tracking IDs for Normal IPE or HIT Clearance processing. You can receive your final cleared NIN and status through Webhooks or by Polling the Status Check endpoint.
| Field | Type | Requirement | Description |
|---|---|---|---|
tracking_ids | array | req | Array of Tracking IDs (Max 100 per request) |
clearance_type | string | opt | IPE (Normal Clearance) or HIT (HIT Clearance). Default is IPE. |
Example Submission Request
{
"clearance_type": "IPE",
"tracking_ids": [
"WYZ123456789",
"ABC987654321"
]
}
Submission Response 201 Created
If an item clears immediately upon submission, its status will be Successful with the resolved 11-digit NIN. Otherwise, it queues as Pending.
{
"success": true,
"batch_id": "8F2B1A9C",
"api_request_id": 104,
"items_submitted": 2,
"clearance_type": "IPE",
"amount_charged": 6000.00,
"wallet_balance": 44000.00,
"items": [
{
"id": 1201,
"tracking_id": "WYZ123456789",
"status": "Successful",
"reply": "12345678901",
"nin": "12345678901"
},
{
"id": 1202,
"tracking_id": "ABC987654321",
"status": "Pending",
"reply": "",
"nin": ""
}
]
}
Query the status of any clearance request at any time using your tracking_id, request_id, or batch_id.
GET https://ambverify.com.ng/api/v1/ipe_clearance.php?tracking_id=WYZ123456789
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"id": 1201,
"api_request_id": 104,
"tracking_id": "WYZ123456789",
"clearance_type": "IPE",
"status": "Successful",
"reply": "Cleared successfully",
"nin": "12345678901",
"reply_tid": "12345678901",
"amount": 3000.00,
"created_at": "2026-09-27 10:15:30"
}
}
nin and reply_tid contain the resolved 11-digit NIN. If a request is marked Failed, the service fee is automatically refunded to your wallet.
Submit applicant details to retrieve a lost BVN. Results are delivered either via Webhook upon completion or by polling the Status Endpoint.
| Field | Type | Requirement | Description |
|---|---|---|---|
first_name | string | req | Applicant First Name (e.g. JOHN) |
last_name | string | req | Applicant Surname / Last Name (e.g. DOE) |
phone_number | string | req | 11-digit linked phone number (e.g. 08012345678) |
Example Submission Request
curl -X POST "https://ambverify.com.ng/api/v1/bvn_retrieval.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"first_name": "JOHN",
"last_name": "DOE",
"phone_number": "08012345678"
}'
<?php
$payload = [
'first_name' => 'JOHN',
'last_name' => 'DOE',
'phone_number' => '08012345678'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/bvn_retrieval.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/bvn_retrieval.php', {
first_name: 'JOHN',
last_name: 'DOE',
phone_number: '08012345678'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/bvn_retrieval.php"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"first_name": "JOHN",
"last_name": "DOE",
"phone_number": "08012345678"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Submission Response 201 Created
{
"success": true,
"message": "BVN retrieval request submitted successfully. Your request is now pending processing.",
"data": {
"status": "pending",
"transaction_id": "8F2B1A9C",
"first_name": "JOHN",
"last_name": "DOE",
"phone_number": "08012345678"
}
}
Query status anytime using transaction_id or phone_number via GET or POST.
GET https://ambverify.com.ng/api/v1/bvn_retrieval_status.php?transaction_id=8F2B1A9C
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"transaction_id": "8F2B1A9C",
"request_id": 482,
"status": "completed",
"bvn_number": "22223333444",
"bvn": "22223333444",
"first_name": "JOHN",
"last_name": "DOE",
"phone_number": "08012345678",
"message": "Cleared successfully.",
"created_at": "2026-09-27 10:30:15"
}
}
Automated Webhook Notification
When completed or rejected, your Webhook URL automatically receives:
{
"event": "status_update",
"service": "bvn_retrieval",
"phone_number": "08012345678",
"request_id": 482,
"api_request_id": 105,
"status": "Completed",
"bvn_number": "22223333444",
"bvn": "22223333444",
"reply": "Cleared successfully.",
"timestamp": "2026-09-27T10:45:00Z"
}
rejected (e.g. no BVN linked to phone), the service fee is automatically refunded to your wallet.
Submit Bank Verification Number modifications across any of our 7 supported Agency Banks. Status updates and resolution reports are returned via Webhooks or by Polling the GET endpoint.
Supported Agency Banks
Supported Modification Types
Request Parameters
| Field | Type | Requirement | Description |
|---|---|---|---|
bank_type | string | req | Target bank: Standard Agency, First Bank, Bank of Agric, Heritage Bank, NIBSS, Microfinance Bank, LAPO |
modification_type | string | req | Name Only, Date of Birth Only, Phone Number Only, Name and Date of Birth, Date of Birth and Phone Number, Name and Phone Number |
bvn | string | req | 11-digit BVN to modify |
nin | string | req | 11-digit linked National Identification Number |
nin_slip_base64 | string | req | Base64 encoded NIN slip document (JPG, PNG, or PDF) |
old_first_name / new_first_name | string | opt | Old and new first name (as applicable) |
old_last_name / new_last_name | string | opt | Old and new surname (as applicable) |
old_dob / new_dob | string | opt | Format: YYYY-MM-DD (as applicable) |
old_phone / new_phone | string | opt | 11-digit phone numbers (as applicable) |
Example Submission Request
curl -X POST "https://ambverify.com.ng/api/v1/bvn_agency_modification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_bank": "First Bank",
"modification_type": "Name and Date of Birth",
"bvn": "22223333444",
"nin": "12345678901",
"old_first_name": "JOHN",
"new_first_name": "JONATHAN",
"old_last_name": "DOE",
"new_last_name": "SMITH",
"old_dob": "1990-05-15",
"new_dob": "1992-06-20",
"nin_slip_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}'
<?php
$payload = [
'target_bank' => 'First Bank',
'modification_type' => 'Name and Date of Birth',
'bvn' => '22223333444',
'nin' => '12345678901',
'old_first_name' => 'JOHN',
'new_first_name' => 'JONATHAN',
'old_last_name' => 'DOE',
'new_last_name' => 'SMITH',
'old_dob' => '1990-05-15',
'new_dob' => '1992-06-20',
'nin_slip_base64' => 'data:image/jpeg;base64,/9j/4AAQSkZJRg...'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/bvn_agency_modification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
const payload = {
target_bank: 'First Bank',
modification_type: 'Name and Date of Birth',
bvn: '22223333444',
nin: '12345678901',
old_first_name: 'JOHN',
new_first_name: 'JONATHAN',
old_last_name: 'DOE',
new_last_name: 'SMITH',
old_dob: '1990-05-15',
new_dob: '1992-06-20',
nin_slip_base64: 'data:image/jpeg;base64,/9j/4AAQSkZJRg...'
};
axios.post('https://ambverify.com.ng/api/v1/bvn_agency_modification.php', payload, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/bvn_agency_modification.php"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"target_bank": "First Bank",
"modification_type": "Name and Date of Birth",
"bvn": "22223333444",
"nin": "12345678901",
"old_first_name": "JOHN",
"new_first_name": "JONATHAN",
"old_last_name": "DOE",
"new_last_name": "SMITH",
"old_dob": "1990-05-15",
"new_dob": "1992-06-20",
"nin_slip_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Submission Response 201 Created
{
"success": true,
"message": "BVN Agency Modification request submitted successfully.",
"data": {
"request_id": 240,
"batch_id": "D7E1B4C9",
"bvn": "22223333444",
"nin": "12345678901",
"bank_type": "First Bank",
"modification_type": "Name and Date of Birth",
"status": "PENDING",
"amount_charged": "4,500.00",
"wallet_balance": "45,500.00"
}
}
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/bvn_agency_modification.php?bvn=22223333444
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"request_id": 240,
"bvn": "22223333444",
"nin": "12345678901",
"modification_type": "First Bank - Name and Date of Birth",
"status": "COMPLETED",
"admin_note": "Modification treated successfully.",
"report_file_url": "https://ambverify.com.ng/uploads/reports/report_17109283.jpg",
"created_at": "2026-09-27 14:00:00"
}
}
| Field | Type | Requirement | Description |
|---|---|---|---|
tracking_ids | array | req | Array of Tracking IDs (Max 100 per request) |
modification_type | string | req | Name, Address, Date of Birth, Phone |
curl -X POST "https://ambverify.com.ng/api/v1/ipe_modification.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"modification_type": "Name",
"tracking_ids": ["WYZ123456789"]
}'
<?php
$payload = [
'modification_type' => 'Name',
'tracking_ids' => ['WYZ123456789']
];
$ch = curl_init('https://ambverify.com.ng/api/v1/ipe_modification.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/ipe_modification.php', {
modification_type: 'Name',
tracking_ids: ['WYZ123456789']
}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }
}).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"modification_type": "Name", "tracking_ids": ["WYZ123456789"]}
print(requests.post("https://ambverify.com.ng/api/v1/ipe_modification.php", json=payload, headers=headers).json())
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/ipe_modification.php?tracking_id=WYZ123456789
Authorization: Bearer YOUR_API_KEY
Submit one or more 11-digit NIN records for expedited manual special validation.
| Field | Type | Requirement | Description |
|---|---|---|---|
nins | array | req | Array of 11-digit NINs (Max 100 per request) |
validation_type | string | req | No record found, Mod validation, Photography error, Bank validation |
Example Request (JSON Body)
{
"validation_type": "No record found",
"nins": [
"12345678901",
"09876543212"
]
}
Submission Response 201 Created
{
"success": true,
"batch_id": "E8C1D4A2",
"api_request_id": 310,
"items_submitted": 2,
"validation_type": "No record found",
"amount_charged": 1400.00,
"wallet_balance": 48600.00,
"items": [
{
"nin": "12345678901",
"status": "New",
"id": 1401
}
]
}
Query live status using nin or request_id.
GET https://ambverify.com.ng/api/v1/special_validation.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"items": [
{
"id": 1401,
"nin": "12345678901",
"request_type": "No record found",
"status": "Successful",
"reply": "YUSUF MOHAMMED : 15-06-1995",
"tracking_id": "TRK9823471029-Cr-new",
"track": "TRK9823471029-Cr-new",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"created_at": "2026-09-28 12:00:00"
}
],
"data": {
"id": 1401,
"nin": "12345678901",
"status": "Successful",
"reply": "YUSUF MOHAMMED : 15-06-1995",
"tracking_id": "TRK9823471029-Cr-new",
"track": "TRK9823471029-Cr-new",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
}
items[0] delivers the verified applicant full name & DOB in reply, the NIMC reference in tracking_id, and the applicant's photograph in photo.
data, Special Validation returns an array of objects inside items. Inspect items[0].status. Possible status values are:
NeworPending: Item is in queue awaiting manual clearance.Successful: Request cleared. The resolution note is initems[0].reply.Failed: Request rejected. Fee is automatically refunded to your API wallet.
Submit tracking IDs to retrieve verified citizen data and generate official personal slips. Supports instant database caching to eliminate redundant upstream billing.
| Field | Type | Requirement | Description |
|---|---|---|---|
tracking_ids | array | req | Array of Tracking IDs (Max 100 per request) |
slip_type | string | opt | regular, standard, premium, vnin (default: premium) |
curl -X POST "https://ambverify.com.ng/api/v1/personalization.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tracking_ids": ["WYZ12345678901"],
"slip_type": "premium"
}'
<?php
$payload = [
'tracking_ids' => ['WYZ12345678901'],
'slip_type' => 'premium'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/personalization.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/personalization.php', {
tracking_ids: ['WYZ12345678901'],
slip_type: 'premium'
}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }
}).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"tracking_ids": ["WYZ12345678901"], "slip_type": "premium"}
print(requests.post("https://ambverify.com.ng/api/v1/personalization.php", json=payload, headers=headers).json())
Check Status / Poll Result Endpoint
POST https://ambverify.com.ng/api/v1/personalization.php
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"tracking_id": "WYZ12345678901",
"action": "status"
}
Submit BVN CRM queries to resolve failed enrollments. Track status updates and retrieve resolution documents via Webhooks or by Polling the GET endpoint.
| Field | Type | Requirement | Description |
|---|---|---|---|
ticket_id | string | req | Exactly 8 digits (e.g. 12345678) |
batch_id | string | req | Exactly 7 digits (e.g. 1234567) |
enrollment_screenshot_base64 | string | req | Base64 encoded screenshot of the enrollment error (JPG, PNG, or PDF) |
Example Request
curl -X POST "https://ambverify.com.ng/api/v1/bvn_crm.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ticket_id": "12345678",
"batch_id": "1234567",
"enrollment_screenshot_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}'
<?php
$payload = [
'ticket_id' => '12345678',
'batch_id' => '1234567',
'enrollment_screenshot_base64' => 'data:image/jpeg;base64,/9j/4AAQSkZJRg...'
];
$ch = curl_init('https://ambverify.com.ng/api/v1/bvn_crm.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/bvn_crm.php', {
ticket_id: '12345678',
batch_id: '1234567',
enrollment_screenshot_base64: 'data:image/jpeg;base64,/9j/4AAQSkZJRg...'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/bvn_crm.php"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"ticket_id": "12345678",
"batch_id": "1234567",
"enrollment_screenshot_base64": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Submission Response 201 Created
{
"success": true,
"message": "BVN CRM request submitted successfully.",
"data": {
"request_id": 42,
"reference": "CRM-92B8F4A1",
"ticket_id": "12345678",
"batch_id": "1234567",
"status": "pending",
"amount_charged": "1,000.00",
"wallet_balance": "49,000.00"
}
}
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/bvn_crm.php?reference=CRM-92B8F4A1
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"request_id": 42,
"reference": "CRM-92B8F4A1",
"ticket_id": "12345678",
"batch_id": "1234567",
"status": "successful",
"comment": "Ticket resolved successfully by NIBSS CRM.",
"file_url": "https://ambverify.com.ng/uploads/crm_results/crm_resolution_42.pdf",
"created_at": "2026-09-27 15:30:00"
}
}
Automated Webhook Notification
{
"event": "status_update",
"service": "bvn_crm",
"reference": "CRM-92B8F4A1",
"ticket_id": "12345678",
"batch_id": "1234567",
"request_id": 42,
"status": "successful",
"file_url": "https://ambverify.com.ng/uploads/crm_results/crm_resolution_42.pdf",
"comment": "Ticket resolved successfully by NIBSS CRM.",
"timestamp": "2026-09-27T16:00:00Z"
}
Submit requests to modify NIMC backend records for Gender or Date of Birth (DOB). Track status updates via Webhooks or Polling.
| Field | Type | Requirement | Description |
|---|---|---|---|
nin | string | req | 11-digit NIN |
service_type | string | req | GENDER MOD or DOB MOD |
gender | string | req (if gender) | Male or Female |
dob_time | string | req (if dob) | first time or second time |
dob_age | string | req (if dob) | 0-5yrs, 6-10yrs, 11-15yrs |
new_dob | string | opt | Target date: YYYY-MM-DD |
curl -X POST "https://ambverify.com.ng/api/v1/backend_mod.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"nin": "12345678901",
"service_type": "GENDER MOD",
"gender": "Female"
}'
<?php
$ch = curl_init('https://ambverify.com.ng/api/v1/backend_mod.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode([
'nin' => '12345678901',
'service_type' => 'GENDER MOD',
'gender' => 'Female'
])
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/backend_mod.php', {
nin: '12345678901',
service_type: 'GENDER MOD',
gender: 'Female'
}, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
}
}).then(res => console.log(res.data))
.catch(err => console.error(err.response ? err.response.data : err));
import requests
url = "https://ambverify.com.ng/api/v1/backend_mod.php"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"nin": "12345678901",
"service_type": "GENDER MOD",
"gender": "Female"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Submission Response 201 Created
{
"success": true,
"message": "Backend GENDER MOD request submitted successfully.",
"data": {
"request_id": 184,
"batch_id": "8B1D4F9A",
"nin": "12345678901",
"service_type": "GENDER MOD",
"gender": "Female",
"status": "New"
}
}
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/backend_mod.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Submit a NIN for Modification bundled with Delink processing. Track status via Webhooks or by Polling the GET endpoint.
| Field | Type | Requirement | Description |
|---|---|---|---|
nin | string | req | 11-digit NIN |
service_type | string | req | Name with Delink, phone with Delink, address with Delink, DOB with Delink |
first_name / surname | string | opt | Target names (Required for Name with Delink) |
new_phone | string | opt | Target phone (Required for phone with Delink) |
new_address | string | opt | Target address (Required for address with Delink) |
new_dob / old_dob | string | opt | Date format: YYYY-MM-DD (Required for DOB with Delink) |
attestation_file_base64 | string | opt | Base64 encoded attestation image/PDF (For DOB with Delink) |
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/mod_delink.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Status Response 200 OK
{
"success": true,
"data": {
"request_id": 142,
"nin": "12345678901",
"service_type": "Name with Delink",
"status": "Successful",
"reply": "Delinked and modified successfully.",
"document_url": "https://ambverify.com.ng/uploads/admin_mod_delink/admin_file_171.pdf",
"created_at": "2026-09-27 15:10:00"
}
}
| Field | Type | Requirement | Description |
|---|---|---|---|
nins | array | req | Array of 11-digit NINs (Max 100 per request) |
request_type | string | req | Delink only or Delink & retrieval |
email | string | req (if Delink only) | Target email address to unlink |
curl -X POST "https://ambverify.com.ng/api/v1/delink.php" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"request_type": "Delink only",
"email": "user@example.com",
"nins": ["12345678901"]
}'
<?php
$payload = [
'request_type' => 'Delink only',
'email' => 'user@example.com',
'nins' => ['12345678901']
];
$ch = curl_init('https://ambverify.com.ng/api/v1/delink.php');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload)
]);
echo curl_exec($ch);
curl_close($ch);
?>
const axios = require('axios');
axios.post('https://ambverify.com.ng/api/v1/delink.php', {
request_type: 'Delink only',
email: 'user@example.com',
nins: ['12345678901']
}, {
headers: { 'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' }
}).then(res => console.log(res.data));
import requests
headers = {"Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json"}
payload = {"request_type": "Delink only", "email": "user@example.com", "nins": ["12345678901"]}
print(requests.post("https://ambverify.com.ng/api/v1/delink.php", json=payload, headers=headers).json())
Status Polling Endpoint
GET https://ambverify.com.ng/api/v1/delink.php?nin=12345678901
Authorization: Bearer YOUR_API_KEY
Webhook Events
When your clearance, modification, or validation requests change status (e.g. from Pending to Successful or Failed), an automated POST request is dispatched to your configured Webhook URL.
Outbound Webhook Payload Example
{
"event": "status_update",
"service": "special_validation",
"nin": "12345678901",
"request_id": 1401,
"status": "Successful",
"status_code": "COMPLETED",
"reply": "CHUKWUDI EMMANUEL : 10-08-1992",
"tracking_id": "TRK8492019482-Cr-new",
"track": "TRK8492019482-Cr-new",
"photo": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"image": "data:image/jpeg;base64,/9j/4AAQSkZJRg...",
"timestamp": "2026-09-30T08:07:30Z"
}
Supported Webhook Service Identifiers
Switch on the service key to route the update to the correct table in your database:
| Service Key | Target Operation | Identifying Field |
|---|---|---|
special_validation | Special NIN Validation | nin |
nin_validation | Standard NIN Validation | nin |
ipe_clearance | Normal & HIT IPE Clearance | tracking_id |
nin_modification | NIN Modification Requests | nin |
bvn_retrieval | BVN Retrieval | phone_number |
bvn_crm | BVN CRM Queries | ticket_id or reference |
Delivery Guarantee
Your webhook endpoint must return an HTTP 200 OK response. If your server is down or times out, our retry engine automatically retries up to 5 times using exponential backoff.
NIN Extraction
For completed clearance requests, the cleared 11-digit NIN is returned in both nin and reply_tid for universal compatibility with VTU scripts.
Signature Verification
Always verify the X-AmbVerify-Signature header sent with every webhook to confirm that the payload was genuinely generated by AmbVerify.
PHP Webhook Receiver Example
<?php
// 1. Retrieve the raw payload and signature
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_AMBVERIFY_SIGNATURE'] ?? '';
// 2. Your Webhook Secret from your AmbVerify API Partner Dashboard
$secret = 'YOUR_WEBHOOK_SECRET';
// 3. Compute expected hash
$expected = hash_hmac('sha256', $payload, $secret);
// 4. Verify match
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('Invalid signature');
}
// 5. Parse data
$data = json_decode($payload, true);
$tracking_id = $data['tracking_id'] ?? '';
$status = $data['status'] ?? '';
$nin = $data['nin'] ?? $data['reply_tid'] ?? '';
if ($status === 'Successful') {
// Update your customer's order with the resolved NIN
}
http_response_code(200);
echo json_encode(['received' => true]);
?>
Rate Limits
Current limits per API client:
- 100 items per submission request (NIN, IPE, Tracking IDs)
- 200 items max returned per status check query
Support
Need help getting started, or have questions about the API?