Verify NFC
Verifies a completed chip read against the C06 national police database and closes the transaction. This is the only authoritative verdict in the NFC flow — decide on this result, not on what the SDK reported.
Endpoint
POST /v1/verify_nfc
Content-Type: application/json{
"document_id": "001xxxxxxxxx",
"ref_id": "ref_00000001",
"verification_key": "<VERIFICATION_KEY>"
}Parameters:
| Param | Type | Required | Default | Description |
|---|---|---|---|---|
document_id | string | Yes | — | The Document ID. Max length 64. |
ref_id | string | Yes | — | The transaction reference ID. Max length 64. |
verification_key | string | Yes | — | The verification key returned by Read NFC. Max length 128. |
force_rar_verify | bool | No | false | Verify with C06 regardless of the current verification status. |
verify_transaction_only | bool | No | false | Verify the integrity of the Read NFC response only, without calling C06. |
Returns: VerifyNfcResponse
Authenticate this call with HMAC — see Overview § Authentication.
INFO
verify_transaction_only checks that the read was not tampered with, but skips the C06 lookup entirely — it does not confirm the citizen exists in the national database. Use it for integrity-only checks, never as a substitute for a full verification.
Sample Request
curl --location '<BASE_URL>/v1/verify_nfc' \
--header 'Authorization: ATV <ACCESS_ID>:<SIGNATURE>' \
--header 'X-TV-Timestamp: <TIMESTAMP>' \
--header 'Content-Type: application/json' \
--data '{
"document_id": "001xxxxxxxxx",
"ref_id": "ref_00000001",
"verification_key": "<VERIFICATION_KEY>"
}'Response
{
"success": true,
"code": 0,
"message": "success",
"request_id": "50e34861-d362-46ac-bf93-119e8dc6f2bf",
"data": {
"citizen_identify": "001xxxxxxxxx",
"old_citizen_identify": "xxxxxxxxx",
"full_name": "Nguyễn Văn A",
"date_of_birth": "12/12/1990",
"date_of_expiry": "12/12/2030",
"gender": "Nam",
"nationality": "Việt Nam",
"ethnic": "Kinh",
"religion": "Không",
"place_of_origin": "Xã An Khánh, Huyện Châu Thành, Tỉnh Bến Tre",
"place_of_residence": "Tổ 1, Phường Bến Nghé, Quận 1, TP. Hồ Chí Minh",
"personal_identification": "Sẹo chấm cách 1cm trên đuôi mày trái",
"date_provide": "01/01/2021",
"father_name": "Nguyễn Văn B",
"mother_name": "Trần Thị C",
"partner_name": "",
"face_image": "/9j/4AAQSkZJRgABAQA…",
"is_verified": true,
"verified_at": 1672531200
}
}| Field | Type | Description |
|---|---|---|
code | int | The error code — 0 means no error. Max length 10. |
request_id | string | The server request ID, used for tracing. Max length 64. |
data.is_verified | bool | The NFC verification status against C06. |
data.verified_at | int | Unix timestamp of when the NFC read was verified. Max length 10. |
The remaining data fields carry the cardholder identity, identical in shape to the Read NFC response.
On success the transaction status moves to VERIFIED.
WARNING
Verify the X-Signature header before trusting is_verified — an unsigned or unverified response is an unauthenticated one. See Overview § Response Signing.
Errors
| Code | Description |
|---|---|
2001010 | The API key is incorrect. |
2001019 | Reference ID not found. |
2001020 | Transaction lock failed. |
2001021 | Invalid transaction request. |
2001023 | Invalid transaction key. |
5001000 | Internal server error. |
| Code | Description |
|---|---|
401 | You are not authorized to perform the action. |
500 | Some unexpected error occurs while processing the request. |
Next Steps
- Get NFC — retrieve the stored raw and parsed chip data afterwards
- NID Field Definitions — how to normalize and store the verified fields