Peleza β€” Trust built on data
KYC Verification
On this page

Manual Submissions

Submit an individual national ID for manual verification. Step 1: call List Countries below for supported ISO codes. Step 2: POST with country, type, and id (biodata and files optional). Step 3: fetch results with GET /api/v1/kyc/manual/{batch_token}. Use the sandbox sample IDs below when testing against the sandbox host.

Test data

Sandbox test data

Use these values against the sandbox host. Click a value to copy it.

Sandbox eligible countries
Sandbox β€” Complete (RW)
Sandbox β€” Complete (TZ)
Sandbox β€” Processing (stays in_progress)
Sandbox β€” Unable to verify
More complete IDs (sandbox)

List countries

Returns the countries where Peleza supports manual national ID verification. Call this endpoint before submitting to obtain valid ISO country codes (for example RW, TZ). Optional query: ?q= filters by country name or ISO code (case-insensitive). Auth required; this call is not billed.

GET/api/v1/kyc/countries
{{baseUrl}}/api/v1/kyc/countries

List all eligible countries

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Countries retrieved successfully",
  "data": {
    "countries": [
      { "code": "RW", "name": "Rwanda" },
      { "code": "TZ", "name": "Tanzania" }
    ]
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Filter by name or code (q=rw)

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Countries retrieved successfully",
  "data": {
    "countries": [
      { "code": "RW", "name": "Rwanda" }
    ]
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}
FieldTypeDescription
data.countriesarrayEligible countries for manual national ID verification, sorted alphabetically by name
data.countries[].codestringISO 3166-1 alpha-2 country code β€” use this value as country on POST /api/v1/kyc/manual
data.countries[].namestringHuman-readable country name

Submit verification

POST/api/v1/kyc/manual
{{baseUrl}}/api/v1/kyc/manual
HeaderTypeDescription
AuthorizationstringBearer YOUR_ACCESS_TOKEN from the OAuth client-credentials flow
Content-Typestringapplication/json

Body Parameters

ParameterTypeDescriptionRequired
countrystringISO country code β€” e.g. RW, TZrequired
typestringnational_id (only supported type today)required
idstringNational ID / document numberrequired
first_namestringGiven name. Omit the field, or send null / empty string.optional
middle_namestringMiddle name. Omit the field, or send null / empty string.optional
last_namestringFamily name. Omit the field, or send null / empty string.optional
date_of_birthstringDate of birth as YYYY-MM-DD. Must be in the past if provided.optional
genderstringMale, Female, M, or F (any case)optional
filesarraySupporting documents as base64 in the JSON body. Max 10 files, 10 MB decoded each.optional
files[].filenamestringOriginal file name β€” e.g. id-front.jpgoptional
files[].mime_typestringMIME type β€” e.g. image/jpegoptional
files[].contentstringRaw base64 or a data URIoptional

Sandbox sample β€” Complete (RW)

Request payload for Sandbox sample β€” Complete (RW):

Sample dataRequest payload
{
  "country": "RW",
  "type": "national_id",
  "id": "85940685"
}

Expected response for Sandbox sample β€” Complete (RW):

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 202,
  "message": "Manual verification submitted successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "note": "This verification requires manual processing and is typically completed within 24-48 hours.",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sandbox sample β€” Complete (TZ)

Request payload for Sandbox sample β€” Complete (TZ):

Sample dataRequest payload
{
  "country": "TZ",
  "type": "national_id",
  "id": "8594068345"
}

Expected response for Sandbox sample β€” Complete (TZ):

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 202,
  "message": "Manual verification submitted successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "note": "This verification requires manual processing and is typically completed within 24-48 hours.",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sandbox sample β€” Processing (RW)

Request payload for Sandbox sample β€” Processing (RW):

Sample dataRequest payload
{
  "country": "RW",
  "type": "national_id",
  "id": "MANUAL0001"
}

Expected response for Sandbox sample β€” Processing (RW):

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 202,
  "message": "Manual verification submitted successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "note": "This verification requires manual processing and is typically completed within 24-48 hours.",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

With optional biodata and files (TZ sandbox)

Request payload for With optional biodata and files (TZ sandbox):

Sample dataRequest payload
{
  "country": "TZ",
  "type": "national_id",
  "id": "8594068345",
  "first_name": "Jane",
  "last_name": "Doe",
  "date_of_birth": "1991-06-12",
  "gender": "Female",
  "files": [
    {
      "filename": "id-front.jpg",
      "mime_type": "image/jpeg",
      "content": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU"
    }
  ]
}

Expected response for With optional biodata and files (TZ sandbox):

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 202,
  "message": "Manual verification submitted successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "note": "This verification requires manual processing and is typically completed within 24-48 hours.",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Duplicate in-progress request (HTTP 200)

Request payload for Duplicate in-progress request (HTTP 200):

Sample dataRequest payload
{
  "country": "RW",
  "type": "national_id",
  "id": "85940685"
}

Expected response for Duplicate in-progress request (HTTP 200):

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Manual verification already in progress",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Response Fields

FieldTypeDescription
successbooleanWhether the request succeeded
response_codenumberApplication response code (typically mirrors HTTP)
messagestringHuman-readable status message
dataobjectPayload for the verified resource
request_idstringUUID for support and audit trails
data.batch_tokenstringUUID β€” fetch results with GET /api/v1/kyc/manual/{batch_token}
data.typestringnational_id
data.statusstringin_progress on accept; complete or unable_to_verify after processing
data.submitted_atstringISO 8601 timestamp
data.notestringProcessing SLA note (returned on HTTP 202 only)
data.waiting_timeintegerPresent when status is in_progress β€” estimated turnaround in days (currently 2, i.e. 24–48 hours). Returned on HTTP 202 submit and on status polls while in_progress.

Fetch results

Fetch results using the batch_token from the submit response. On sandbox, use the sample IDs above β€” complete IDs return verification_result; MANUAL0001/MANUAL0002 stay in_progress; UNKNOWN999/UNKNOWN888 return unable_to_verify.

GET/api/v1/kyc/manual/{token}
{{baseUrl}}/api/v1/kyc/manual/{token}

Sandbox β€” Complete (RW Β· ${MANUAL_RW_COMPLETE_ID})

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Status retrieved successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "complete",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "verification_result": {
      "first_name": "John",
      "last_name": "Doe",
      "other_name": null,
      "gender": "Male",
      "dob": "1990-01-08",
      "citizenship": "Rwandan",
      "id_number": "85940685",
      "valid": true,
      "name": "Doe John"
    }
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sandbox β€” Complete (TZ Β· ${MANUAL_TZ_COMPLETE_ID})

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Status retrieved successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "complete",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "verification_result": {
      "first_name": "Jane",
      "last_name": "Doe",
      "other_name": null,
      "gender": "Female",
      "dob": "1991-06-12",
      "citizenship": "Tanzanian",
      "id_number": "8594068345",
      "valid": true,
      "name": "Doe Jane"
    }
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sandbox β€” Processing (RW Β· ${MANUAL_RW_PROCESSING_ID})

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Status retrieved successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "in_progress",
    "submitted_at": "2026-08-27T10:56:00.000000Z",
    "waiting_time": 2
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}

Sandbox β€” Unable (RW Β· ${MANUAL_RW_UNABLE_ID})

200 OKSample dataExpected response
{
  "success": true,
  "response_code": 200,
  "message": "Status retrieved successfully",
  "data": {
    "batch_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "type": "national_id",
    "status": "unable_to_verify",
    "submitted_at": "2026-08-27T10:56:00.000000Z"
  },
  "request_id": "550e8400-e29b-41d4-a716-446655440000"
}
FieldTypeDescription
data.batch_tokenstringUUID from the submit response
data.typestringnational_id
data.statusstringin_progress | complete | unable_to_verify
data.submitted_atstringISO 8601 timestamp
data.waiting_timeintegerPresent when status is in_progress β€” estimated turnaround in days (currently 2)
data.verification_resultobjectOmitted while in_progress or unable_to_verify; present when status is complete
data.verification_result.first_namestringVerified given name
data.verification_result.last_namestringVerified family name
data.verification_result.other_namestring|nullVerified other / middle name
data.verification_result.genderstringVerified gender
data.verification_result.dobstringVerified date of birth (YYYY-MM-DD)
data.verification_result.citizenshipstringCitizenship label, e.g. Rwandan
data.verification_result.id_numberstringVerified national ID number
data.verification_result.validbooleantrue when the ID was successfully verified
data.verification_result.namestringDisplay name β€” last_name first_name other_name

Set {{baseUrl}} to https://api.peleza.com (production) or https://sandbox.peleza.com (sandbox). Authenticated calls need a Bearer token from POST /api/v1/oauth/token.