Electronic Certificate Issuance
Verify identity that shows legal subjects in order to issue an Electronic Certificate with the purpose of doing verification of citizenship data through legal sources
Electronic Certificate Issuance will allow you to check whether the NIK from your Indonesian ID is registered in the government database and create an Electronic Certificate as proof.
🎈Dashboard Features
Demo
Access Verihubs Dashboard, and click on DEMO on the sidebar menu. You can easily try to check your ID just a click away.
To try DEMO you can follow these steps:
- Select which Application Name you want to try this DEMO on. Make sure you have created one, tho.
- Input the fields you need to check with the following information :
- NIK should be 16 digits number.
- Name should be the full name based on the identity card in string format.
Allowed strings: Alphabet [a-z][A-Z], dot (.), comma (,), single quote ('), slash (/), dash (-).
Minimum length: 2 character alphabet - Date of Birth format should be 'DD-MM-YYYY'.
- Email should be in email format and unique per NIK.
- Phone number must be a valid phone number, use the country code but without the (+) symbol. Phone number must be unique per NIK.
- Selfie Photo should be min 100kB - max 4MB, or minimum 480x640 pixels. Image format should be in .jpg, .jpeg, .png
- KTP Photo should be min 100kB - max 2MB, or minimum 480x360 pixels. Image format should be in .jpg, .jpeg, .png
- You will be given a quota for each Application Name to try the DEMO. Your remaining quota will also be shown at the top of the Application Name.
- Click on the "Check Now" button to check the ID with the details.
- Click on the "Contact Us" button when you feel like need more information about the service. It will redirect you to the Verihubs Representative WhatsApp number.
Transaction Details

The transaction details menu will show every detail of your transaction in the table. The table will consist of the following data:
Column | Definition |
---|---|
ID | Verihubs e-cert IDs that are auto-generated |
Liveness ID | Verihubs Liveness ID from the selected e-cert |
Application Name | Application Name used to hit Verihubs API |
Reference ID | ID that can be generated from your side to indicate your company's transaction. Must be unique |
Date Sent | Date & time when transaction made |
Status | The status will define when the transaction is a success or not. There are 2 status which is SUCCESS and FAILED |
Mode | Your transaction mode: Testing or Live. Testing mode is when you use your testing quota. This mode is quota based. Live mode is not limited by quota. Live mode is usually used when you are ready to use our service. |
Charged Service | E-Cert, Liveness On Certificate Electronic service you will be charged for 2 services: e-cert & liveness (mandatory). If your liveness is successful & e-cert is successful then the charged service will be: E-cert, Liveness If your liveness is successful & e-cert is failed, then the charged service will be: Liveness Here is for more details. |
You can also filter the transaction based on the following data:
Data | Definition |
---|---|
Send Date | Range of Date to limit the transactions shown on the table. Selectable transaction period 31 days. Maximum account transaction up to 90 days ago. |
Application Name | Select Application Name which you want to filter |
Status | Select transactions based on selected status (SUCCESS or FAILED) |
Mode | Select transactions based on selected mode (TESTINGor LIVE) |
Don't forget to click on the Apply button to view transactions based on the selected filter.
The transactions can be exported into CSV or XLSX by clicking Export as CSV button or Export as XLSX button.
🎈Response Details
Reject Field
The reject field indicates if a parameter is returned incorrectly after being checked from the data source side.
HTTP Code | Case | reject_field |
---|---|---|
200 | NIK not found | nik |
200 | Full name not match | name |
200 | Birth date not match | birth_date |
200 | Selfie is invalid | selfie_photo |
200 | Selfie not match | selfie_photo |
200 | KTP not match | ktp_photo |
200 | Phone conflict/already used to other NIK | phone |
200 | Email conflict/already used to other NIK | |
200 | Liveness check false | liveness_check |
Detail for Success Transaction
This case occurs if all parameters get successful results from the results of checking the data source (all valid data).
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":”” } | { "message": "Certificate electronic verification has been done", "data": { "id": "8e31a91c-7437-4ed1-b086-06cbe247d6e7", "status": "verified", "reject_field": [], "reference_id": "ref_certel#e87c8bc2-5d10-455b-98a0-187d60f72873" } } | Success (verified) |
Detail for Success but Not Verified Transaction
This is a response that indicates there is an incorrect parameter after checking the data source. Below are also some examples of requests/responses.
Invalid NIK
Request | Response | Remarks |
---|---|---|
{ "nik":"INVALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "channel":"VALID_CHANNEL", "reference_id":”transaction1”, } | { "message": "Certificate electronic verification has been done", "data": { "id": "22273b8b-f99c-48be-aeaf-ac5ef9402fea", "status": "not_verified", "reject_field": [ "nik" ], "reference_id": "transaction1" } } | Success (not_verified) Note: The transaction has been successfully checked against the data source and obtained some parameters with a value of 'false' which can be seen through the reject_field in the response |
Invalid Name
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"INVALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "channel":"VALID_CHANNEL", "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "22273b8b-f99c-48be-aeaf-ac5ef9402fea", "status": "not_verified", "reject_field": [ "name" ], "reference_id": "transaction1" } } | Success (not_verified) Note: The transaction has been successfully checked against the data source and obtained some parameters with a value of 'false' which can be seen through the reject_field in the response |
Invalid Birth Date
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"INVALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "channel":"VALID_CHANNEL", "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "22273b8b-f99c-48be-aeaf-ac5ef9402fea", "status": "not_verified", "reject_field": [ "birth_date" ], "reference_id": "transaction1" } } | Success (not_verified) Note: The transaction has been successfully checked against the data source and obtained some parameters with a value of 'false' which can be seen through the reject_field in the response |
Invalid Selfie Photo
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"INVALID_SELFIE_PHOTO”, "ktp_photo":"base64 format”, "channel":"VALID_CHANNEL", "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "22273b8b-f99c-48be-aeaf-ac5ef9402fea", "status": "not_verified", "reject_field": [ "selfie_photo" ], "reference_id": "transaction1" } } | Success (not_verified) Note: The transaction has been successfully checked against the data source and obtained some parameters with a value of 'false' which can be seen through the reject_field in the response |
Invalid KTP Photo
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"INVALID_KTP_PHOTO”, "channel":"VALID_CHANNEL", "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "22273b8b-f99c-48be-aeaf-ac5ef9402fea", "status": "not_verified", "reject_field": [ "ktp_photo" ], "reference_id": "transaction1" } } | Success (not_verified) Note: The transaction has been successfully checked against the data source and obtained some parameters with a value of 'false' which can be seen through the reject_field in the response |
Detail for Success but Verified with Reason Transaction
This case occurs where email, phone, or both have been correlated with a certain NIK, causing the status "verified_with_reason". If this case occurs, please contact Privy's customer support directly ([email protected]).
Conflict Email
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"CONFLICT_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "7c5de075-739e-46c8-9aee-487696776c76", "status": "verified_with_reason", "reject_field": [ "email" ], "reference_id": "ref_certel#dfb8b449-4d83-41e8-b2f4-0343ead765f4" } } | Success (verified_with_reason) Note: It means that the email, phone number, or both have been used by another NIK (identification number), and the user is advised to contact Privy's customer service |
Conflict Phone
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"CONFLICT_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "7c5de075-739e-46c8-9aee-487696776c76", "status": "verified_with_reason", "reject_field": [ "phone" ], "reference_id": "ref_certel#dfb8b449-4d83-41e8-b2f4-0343ead765f4" } } | Success (verified_with_reason) Note: It means that the email, phone number, or both have been used by another NIK (identification number), and the user is advised to contact Privy's customer service |
Conflict Email and Phone
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"CONFLICT_EMAIL", "phone":"CONFLICT_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "a9b2fd4a-780e-425c-a67b-a52d5febc2c2", "status": "verified_with_reason", "reject_field": [ "phone", "email" ], "reference_id": "ref_certel#3c42fa6b-c2c9-4705-8117-cf9d08c8d2aa" } } | Success (verified_with_reason) Note: It means that the email, phone number, or both have been used by another NIK (identification number), and the user is advised to contact Privy's customer service |
Detail for Failed Transaction
Here are some examples of cases for validating the format of existing parameters. If validation fails, the transaction will receive a 400 response along with details such as:
- error_code
- error_fields
- message
VALIDATION FORMAT NIK
Request | Response | Remarks |
---|---|---|
{ "nik":"INVALID_FORMAT_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "nik", "message": "nik length should consist of 16 digit(s)" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to a validation error |
VALIDATION FORMAT BIRTH DATE
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"INVALID_FORMAT_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "birth_date", "message": "birth_date format is incorrect, should be DD-MM-YYYY" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to a validation error |
VALIDATION FORMAT SELFIE PHOTO
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"INVALID_FORMAT_SELFIE_PHOTO”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "selfie_photo", "message": "selfie_photo format is incorrect in body, should be in a valid base64 or URL format" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to a validation error |
VALIDATION FORMAT SELFIE PHOTO (NO FACE DETECTED)
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"INVALID_FORMAT_SELFIE_PHOTO_NO_FACE”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "selfie_photo", "message": "No face detected in image" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to validation error |
VALIDATION FORMAT KTP PHOTO
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"INVALID_FORMAT_KTP_PHOTO”, "reference_id":””, } | { "message": "Invalid payload", "error_code"": "INVALID_PAYLOAD", "error_fields": [ { "field": "ktp_photo", "message": "ktp_photo format is incorrect in body, should be in a valid base64 or URL format" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to validation error |
VALIDATION FORMAT EMAIL
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"INVALID_FORMAT_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "email", "message": "email must be email format" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to validation error |
VALIDATION FORMAT PHONE
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"INVALID_FORMAT_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Invalid payload", "error_code": "INVALID_PAYLOAD", "error_fields": [ { "field": "phone", "message": "phone must be numeric" } ] } | Transaction error Note: The transaction was not processed and received a code 400 due to validation error |
Detail for Success Transaction but Liveness Check False/Failed
Request | Response | Remarks |
---|---|---|
{ "nik":"VALID_NIK", "name":"VALID_NAME", "birth_date":"VALID_BIRTH_DATE", "email":"VALID_EMAIL", "phone":"VALID_PHONE", "selfie_photo":"base64 format”, "ktp_photo":"base64 format”, "reference_id":””, } | { "message": "Certificate electronic verification has been done", "data": { "id": "a9b2fd4a-780e-425c-a67b-a52d5febc2c2", "status": "not_verified", "reject_field": [ "liveness_check” ], "reference_id": "ref_certel#3c42fa6b-c2c9-4705-8117-cf9d08c8d2aa" } } | Success (not_verified) Note: Failed because of liveness check, only liveness will be charged |
🎈Transaction Status
All transactions with response code 200 will be charged, with further explanations:
Liveness | E-cert | Liveness Charged | E-cert Charged |
---|---|---|---|
executed, passed | success | v | v |
executed, passed | failed to execute | x | x |
executed, failed | will not be forwarded to e-cert | v | x |
failed to execute | will not be forwarded to e-cert | x | x |
🎈Recommended Timeout Setting
This service depends on connection to Data Source. Based on our monitoring, the recommended setting for timeout is 60 seconds.
🎈Status Page
We also provide a website to monitor this service, which can be viewed or accessed via Status Page. Incidents or if there is a problem with the service will be updated on that page.
🎈Channel Payload for Brand Name
If channel
payload is used in the request parameter, your users will get email containing a PRIVY ID with channel payload as the brand name. If you did not include your brand on the payload, YOUR COMPANY SHORT NAME will be used as the brand’s name in the email (highlighted below).

use
Channel payload will also be used as a brand name when the user is using another email address to verify identity (the user did not verify using the same email when signing up to privy). The example is highlighted below.
🎈Best Practice
Here are some of the best practices for taking selfies, ID Card (KTP), and Liveness
Selfie Image
To help the process of checking images run optimally, here are some examples of right and wrong in taking selfies:
- Showing the whole face (eyes, nose, and mouth) and having good lighting


- Selfie sample that cannot be processed: The user's face is partially/fully blocked by other objects (KTP, full masks, etc)


- Selfie sample that cannot be processed: Multiple faces in one frame and a selfie is taken from another device (image from another phone/screen)


- Selfie sample that cannot be processed: Selfie taken is too far or too dark


ID Card (KTP)
- Make sure the photo of KTP is clearly visible


- If your mobile application has border, make sure the KTP is inside the border.

- KTP sample that cannot be processed: The card is physically broken

- KTP sample that cannot be processed: The photo is a blur

- KTP sample that cannot be processed: KTP photo is edited

- KTP sample that cannot be processed: KTP photo is black & white (photocopy)

- KTP sample that cannot be processed: KTP is NOT inside the border of your mobile application.

Liveness
Liveness detection is the ability of a system to detect if a face is real or fake. Here are some examples of performing liveness:
- Only one face exists in the image sent
- The face in the image must not be blocked by anything, i.e., take off masks, sunglasses/light reflection on glasses, hat
- Make sure the image has good quality (avoid blur & dark)
- The minimum resolution of the image is Height: 640 x Width: 480
- Minimum size for each image: it’s recommended to be 200kb with minimum quality is JPEG 90%
- Avoid backlight
- Avoid taking images in a dark environment
- No editing on the image
- prioritize for users to directly capture face images from mobile phone camera
- do not compress or crop the image
- do not add any elements to the image, i.e., padding
Case examples:
- Look straight (face should be looking straight)
- Lighting condition (avoid taking images in backlight or low light conditions. It may reduce the visibility of the facial features)
- Orientation (the orientation of the face should be portrait with the correct orientation)
- Face in the center (the face should be in the center to avoid half-face images which might lead to no face detected)
- Background condition (avoid taking the image in a crowded background as it might affect the result)
- No attributes covering the face (avoid wearing attributes or anything that cover your faces such as sunglasses/glasses with light reflection, face masks, hat, and hair)


- No blur (the blurrier the face photo, the less liveness accuracy)
- No holding identity card (do not hold identity cards as it will affect the liveness result)
Updated 25 days ago