Dpaverify Docs
API ReferenceVerification APIs

Identity

People's identity records: national ID, alien ID and passport (IPRS), and driving licences and PSV badges (NTSA).

POST
/v1/verifications/identity.national-id

Looks up a national ID, alien ID or passport in IPRS by its document type and number, and returns the holder's registered names, date of birth, gender and citizenship.

Price: set by your bundle; one charge per call. "Not found" answers (result.found: false) are charged. Source failures return 502 and are refunded.

Try it: choose a scenario from the example menu under the code sample and press Test Request. Paste your test key into Authentication in the window that opens (it is remembered); test keys return sandbox sample data, free.

Authorization

ApiKey
headerAuthorizationBearer <token>

Your API key. sk_test_… keys use the sandbox (sample data, free); sk_live_… keys query the real sources and are charged.

Header Parameters

Idempotency-Key?string

Makes retries safe: a repeat with the same key and body returns the original verification without charging again. Up to 255 characters.

Lengthlength <= 255

Request Body

application/json
  1. body
idType*string

Kind of document idNumber belongs to.

Value in"NATIONAL_ID""ALIEN_ID""PASSPORT"
idNumber*string

Document number. National IDs are 6-10 digits.

Match^[A-Z0-9]{4,20}$

Response Body

Verification completed; see result.

application/json
  1. response

One verification. Returned by every verification API, by GET /v1/verifications/{id}, and in webhooks.

id*string

Unique id; use it to fetch the verification again.

api*string

The verification API that was called, e.g. identity.national-id.

status*string

COMPLETED includes "not found" answers; FAILED means the source failed and the charge was refunded.

Value in"PENDING""COMPLETED""FAILED"
environment*string

TEST for test keys (sandbox data), LIVE for live keys.

Value in"LIVE""TEST"
result*|

The answer, specific to each API (see its examples). Always has found: false when the source holds no record.

error*|

Set when status is FAILED.

cost*string

Amount charged in KES, as a decimal string. "0" for test keys and failed verifications.

latencyMs?|

Time the source took to answer, in milliseconds.

createdAt*string
Formatdate-time
completedAt?|
Formatdate-time
curl -X POST 'https://restapi.nilinde.com/v1/verifications/identity.national-id' \  -H 'Idempotency-Key: 6f1c2a90-order-1042' \  -H 'Content-Type: application/json' \  -d '{  "idType": "NATIONAL_ID",  "idNumber": "12345678"}'
Example Response
{  "id": "cmhd2k7q80001s60h3x9f2a1b",  "api": "identity.national-id",  "status": "COMPLETED",  "environment": "LIVE",  "result": {    "found": true,    "idType": "NATIONAL_ID",    "person": {      "idNumber": "12345678",      "firstName": "JANE",      "middleName": "WANJIKU",      "lastName": "DOE",      "dateOfBirth": "1990-01-15",      "gender": "F",      "citizenship": "KENYAN"    }  },  "error": null,  "cost": "50",  "latencyMs": 412,  "createdAt": "2026-10-30T09:15:02.118Z",  "completedAt": "2026-10-30T09:15:02.530Z"}
POST
/v1/verifications/identity.driving-licence

Looks up the driving licence held under a Kenyan national ID number in NTSA: holder name, licence number, status, classes and expiry date, plus the PSV badge (number, status, expiry, licensed for) when the holder has one (psvLicence, otherwise null).

Price: set by your bundle; one charge per call. "Not found" answers (result.found: false) are charged. Source failures return 502 and are refunded.

Try it: choose a scenario from the example menu under the code sample and press Test Request. Paste your test key into Authentication in the window that opens (it is remembered); test keys return sandbox sample data, free.

Authorization

ApiKey
headerAuthorizationBearer <token>

Your API key. sk_test_… keys use the sandbox (sample data, free); sk_live_… keys query the real sources and are charged.

Header Parameters

Idempotency-Key?string

Makes retries safe: a repeat with the same key and body returns the original verification without charging again. Up to 255 characters.

Lengthlength <= 255

Request Body

application/json
  1. body
idNumber*string

National ID number of the licence holder.

Match^\d{6,10}$

Response Body

Verification completed; see result.

application/json
  1. response

One verification. Returned by every verification API, by GET /v1/verifications/{id}, and in webhooks.

id*string

Unique id; use it to fetch the verification again.

api*string

The verification API that was called, e.g. identity.national-id.

status*string

COMPLETED includes "not found" answers; FAILED means the source failed and the charge was refunded.

Value in"PENDING""COMPLETED""FAILED"
environment*string

TEST for test keys (sandbox data), LIVE for live keys.

Value in"LIVE""TEST"
result*|

The answer, specific to each API (see its examples). Always has found: false when the source holds no record.

error*|

Set when status is FAILED.

cost*string

Amount charged in KES, as a decimal string. "0" for test keys and failed verifications.

latencyMs?|

Time the source took to answer, in milliseconds.

createdAt*string
Formatdate-time
completedAt?|
Formatdate-time
curl -X POST 'https://restapi.nilinde.com/v1/verifications/identity.driving-licence' \  -H 'Idempotency-Key: 6f1c2a90-order-1042' \  -H 'Content-Type: application/json' \  -d '{  "idNumber": "12345678"}'
Example Response
{  "id": "cmhd2k7q80001s60h3x9f2a1b",  "api": "identity.driving-licence",  "status": "COMPLETED",  "environment": "LIVE",  "result": {    "found": true,    "idNumber": "12345678",    "holderName": "JANE WANJIKU DOE",    "drivingLicence": {      "referenceNumber": "DL-0000001",      "status": "valid",      "classes": [        "B",        "C1"      ],      "expiryDate": "2030-01-15"    },    "psvLicence": {      "referenceNumber": "PSV-0000001",      "status": "valid",      "expiryDate": "2027-06-30",      "licensedFor": "PSV DRIVER"    }  },  "error": null,  "cost": "50",  "latencyMs": 412,  "createdAt": "2026-10-30T09:15:02.118Z",  "completedAt": "2026-10-30T09:15:02.530Z"}