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:

  1. Select which Application Name you want to try this DEMO on. Make sure you have created one, tho.
  2. 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
  1. 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.
  2. Click on the "Check Now" button to check the ID with the details.
  3. 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:

ColumnDefinition
IDVerihubs e-cert IDs that are auto-generated
Liveness IDVerihubs Liveness ID from the selected e-cert
Application NameApplication Name used to hit Verihubs API
Reference IDID that can be generated from your side to indicate your company's transaction. Must be unique
Date SentDate & time when transaction made
StatusThe status will define when the transaction is a success or not. There are 2 status which is SUCCESS and FAILED
ModeYour 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 ServiceE-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:

DataDefinition
Send DateRange of Date to limit the transactions shown on the table. Selectable transaction period 31 days. Maximum account transaction up to 90 days ago.
Application NameSelect Application Name which you want to filter
StatusSelect transactions based on selected status (SUCCESS or FAILED)
ModeSelect 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 CodeCasereject_field
200NIK not foundnik
200Full name not matchname
200Birth date not matchbirth_date
200Selfie is invalidselfie_photo
200Selfie not matchselfie_photo
200KTP not matchktp_photo
200Phone conflict/already used to other NIKphone
200Email conflict/already used to other NIKemail
200Liveness check falseliveness_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).

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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)

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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

RequestResponseRemarks
{
"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:

LivenessE-certLiveness ChargedE-cert Charged
executed, passedsuccessvv
executed, passedfailed to executexx
executed, failedwill not be forwarded to e-certvx
failed to executewill not be forwarded to e-certxx

🎈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

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:

  1. Showing the whole face (eyes, nose, and mouth) and having good lighting
  1. Selfie sample that cannot be processed: The user's face is partially/fully blocked by other objects (KTP, full masks, etc)
  1. Selfie sample that cannot be processed: Multiple faces in one frame and a selfie is taken from another device (image from another phone/screen)
  1. Selfie sample that cannot be processed: Selfie taken is too far or too dark

ID Card (KTP)

  1. Make sure the photo of KTP is clearly visible
  1. If your mobile application has border, make sure the KTP is inside the border.
  1. KTP sample that cannot be processed: The card is physically broken
  1. KTP sample that cannot be processed: The photo is a blur
  1. KTP sample that cannot be processed: KTP photo is edited
  1. KTP sample that cannot be processed: KTP photo is black & white (photocopy)
  1. 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:

  1. Only one face exists in the image sent
  2. The face in the image must not be blocked by anything, i.e., take off masks, sunglasses/light reflection on glasses, hat
  3. Make sure the image has good quality (avoid blur & dark)
  4. The minimum resolution of the image is Height: 640 x Width: 480
  5. Minimum size for each image: it’s recommended to be 200kb with minimum quality is JPEG 90%
  6. Avoid backlight
  7. Avoid taking images in a dark environment
  8. 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:

  1. Look straight (face should be looking straight)

  1. Lighting condition (avoid taking images in backlight or low light conditions. It may reduce the visibility of the facial features)

  1. Orientation (the orientation of the face should be portrait with the correct orientation)

  1. Face in the center (the face should be in the center to avoid half-face images which might lead to no face detected)

  1. Background condition (avoid taking the image in a crowded background as it might affect the result)

  1. 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)
  1. No blur (the blurrier the face photo, the less liveness accuracy)

  1. No holding identity card (do not hold identity cards as it will affect the liveness result)