Documentation menu
Result API
The source of truth. Your backend reads the result server to server and acts on it — never on the copy the device reports.
Request
curl -s https://kyc-api.blink-pay.net/api/blink/session/[SESSION_ID]/result \
-H 'X-Blink-Client-Key: bkyc_live_…' \
-H 'X-Blink-Client-Secret: bksec_…'Response
The verdict is the top-level result. On a COMPLETED session the response also carries
the extracted identity document, the faceMatch and the
liveness outcome. The document, faceMatch and liveness
objects are present only when that step ran and produced a reading; treat every field inside them as optional.
{
"sessionId": "[SESSION_ID]",
"status": "COMPLETED",
"result": "VERIFIED",
"resultJson": "{\"sessionId\":\"[SESSION_ID]\",\"purpose\":\"FULL_CAPTURE\",\"result\":\"VERIFIED\",\"faceScore\":0.66,\"detail\":\"…\"}",
"document": {
"type": "NATIONAL_ID",
"side": "BOTH",
"fullName": "…",
"fullNameAr": "…",
"dateOfBirth": "1990-12-10",
"nationalId": "784-1990-1801840-0",
"documentNumber": "156964864",
"expiryDate": "2028-08-17",
"issueDate": "2026-08-18",
"issuingState": "ARE",
"issuingCountry": "ARE",
"nationality": "Sudan",
"sex": "M",
"occupation": "…",
"employerSponsor": "…",
"mrzVerified": true,
"machineReadable": { "detected": true, "verified": true, "status": "VERIFIED" },
"countryVerification": { "matched": true, "detectedCountry": "ARE", "source": "MRZ" },
"engine": "blink-advanced-ar",
"extractionConfidence": 1.0
},
"faceMatch": { "score": 0.66, "decision": "MATCH", "threshold": 0.4 },
"liveness": { "passed": true, "score": 0.93 }
}| Field | Values | Use |
|---|---|---|
sessionId | UUID | The session you asked for. |
status | CREATED · IN_PROGRESS · COMPLETED · EXPIRED · SUSPENDED | Where the session is. Only COMPLETED carries a result. |
result | VERIFIED · REJECTED · REVIEW · null | The decision to act on. null until completed. |
resultJson | string or null | A JSON record encoded as a string, for logs and support. Never branch on it. |
document | object or absent | The extracted identity fields. See Document details. |
faceMatch | object or absent | Selfie-to-portrait comparison: score, decision, threshold. |
liveness | object or absent | Liveness outcome: passed and score. |
Inside resultJson
Decode it as a second step (JSON.parse, jsonDecode):
| Field | Description |
|---|---|
sessionId | The session. |
purpose | The session's purpose. |
result | Same as the top-level result. |
faceScore | Present only when a face match ran. |
detail | A neutral, human-readable reason. |
Document details
The document object holds the identity fields Blink extracted from the captured document (MRZ and
visual zone reconciled). It is present once a document has been read; individual fields depend on the document
type and what the document itself carries, so treat each as optional. Names are returned in the document's own
script — Latin in fullName, and Arabic in fullNameAr when the document is bilingual.
| Field | Type | Description |
|---|---|---|
type | string | Neutral document type, e.g. NATIONAL_ID, PASSPORT, DRIVING_LICENCE. |
side | string | Which side(s) were read: FRONT, BACK or BOTH. |
fullName | string | Full name in Latin script. |
fullNameAr | string | Full name in Arabic, when the document carries it. |
dateOfBirth | string | Date of birth, YYYY-MM-DD. |
nationalId | string | National identity number, when present. |
documentNumber | string | The document's own number. |
expiryDate | string | Expiry date, YYYY-MM-DD. |
issueDate | string | Issue date, YYYY-MM-DD, when present. |
issuingState · issuingCountry | string | Issuer, ISO 3166-1 alpha-3 (e.g. ARE, SDN). |
nationality | string | Holder's nationality, as printed. |
sex | string | M · F · X. |
occupation · employerSponsor | string | Occupation and sponsor/employer, on documents that carry them (e.g. UAE residency IDs). |
mrzVerified | boolean | Whether the machine-readable zone check digits validated. |
machineReadable | object | detected, verified, status for the MRZ read. |
countryVerification | object | matched, detectedCountry and source — whether the detected issuer matched the session's expectation. |
engine | string | The extraction engine that produced this reading. |
extractionConfidence | number | Overall extraction confidence, 0.0–1.0. |
Face match and liveness
| Object | Field | Description |
|---|---|---|
faceMatch | score | Similarity of the selfie to the document portrait, 0.0–1.0. |
decision | MATCH · NO_MATCH. | |
threshold | The score at or above which decision is MATCH. | |
liveness | passed | Whether the action-guided liveness check passed. |
score | Liveness confidence, 0.0–1.0. |
These objects are an aid for your records and review UI. The decision to act on is still the
top-level result; a faceMatch.decision or liveness.passed is already
reflected there. Never re-derive the verdict yourself from these scores.
Polling
The endpoint is idempotent. Call it when the app reports that run() finished, and from a background
job for sessions still IN_PROGRESS — customers do close apps half-way. Stop when
status is COMPLETED, EXPIRED or SUSPENDED.
async function readBlinkResult(sessionId) {
const r = await fetch(`https://kyc-api.blink-pay.net/api/blink/session/${sessionId}/result`, {
headers: {
'X-Blink-Client-Key': process.env.BLINK_CLIENT_KEY,
'X-Blink-Client-Secret': process.env.BLINK_CLIENT_SECRET,
},
});
if (r.status === 404) throw new Error('Unknown session or wrong credentials');
if (!r.ok) throw new Error(`Blink returned ${r.status}`);
const { status, result, resultJson, document, faceMatch, liveness } = await r.json();
return { status, result, record: resultJson ? JSON.parse(resultJson) : null, document, faceMatch, liveness };
}404 responses
An unknown session, a session belonging to another client and wrong credentials all return 404 with
BLINK_RESULT_NOT_FOUND — deliberately indistinguishable. Check the sessionId you
stored and the credentials you sent.
KYC details & images
The extracted identity fields come back in the document object above. To get
the captured document scans and selfies, list and download them with the
Documents API.
The document, faceMatch and liveness objects are
personal data. Read them server to server, store them under your own retention and access controls, and never
expose them to the device or a browser.