• eKYC Platform
    About TrustVision
    SDK Integration
    Trust Central
TrustVision API Documentation

Platform API

The Platform API allows clients to drive the eKYC journey programmatically via direct HTTP calls, without using WebView or mobile SDKs.

Base endpoint:

Authentication Mechanism

  • Call Initialization API first to obtain an access_token.
  • Pass access_token as a Bearer token in subsequent calls:
    Authorization: Bearer <access_token>
    

Initialization API

Initializes an eKYC session from the client-generated encrypted token. This single call handles token parsing, application creation (or lookup), bootstrap configuration, and access token issuance.

1. Request

MethodPathContent-TypeAuth Required
GET/ekyc/platform/initNo

Query Parameters:

NameTypeRequiredDescription
encrypted_tokenstringYesThe ENCODED_VALUE generated by the Authentication mechanism above (AES-256 CBC encrypted user identity, Base64 URL encoded with key ID prefix)
flow_idstringNoSpecific flow to initialize
card_typesstringNoComma-separated list of allowed card types (e.g. vn.national_id,vn.passport)
langstringNoLanguage code (e.g. vi, en)

2. Response

Success (200):

json
{
  "data": {
    "token": "<unique_token>",
    "access_token": "<JWT>",
    "bootstrap": {
      "lender_code": "lender_vn",
      "lender_country": "VN",
      "lender_language": "vi",
      "ui_version": "4.0",
      "masked_phone_number": "09*****123",
      "required_steps": [],
      "flow_selected_at": 1700000000,
      "lead_source": "sms",
      "client_custom_settings": {}
    }
  },
  "message": "platform init successfully",
  "time": "2026-01-01T00:00:00Z",
  "verdict": "success"
}
verdictStatus codeDescription
success200Session initialized successfully.
invalid_parameters400encrypted_token is missing or has invalid format.
record_not_found404Encryption key, lender, or application not found / expired.
limit_exceeded429Concurrent init request in progress — retry shortly.
failure500Internal server error.

ID Verification API

Uploads ID card images (and optional QR images), runs OCR and tampering checks, and returns the final verification result synchronously.

1. Request

MethodPathContent-TypeAuth Required
POST/ekyc/platform/verify_idapplication/jsonYes

Request Body:

NameTypeRequiredDescription
card_typestringYesCard type to verify (e.g. vn.national_id, vn.passport, ph.philhealth)
imageobjectYesFront side image: { "base64": "<base64_string>", "metadata": "<string>", "qr_code": [{"result": "...", "from_image_type": "..."}] }
image2objectNoBack side image: same structure as image
qrsarrayNoQR code images: [{ "base64": "<base64_string>", "metadata": "<string>" }]

2. Response

Success (200):

json
{
  "data": {
    "status": "success",
    "error_code": "",
    "error_message": {},
    "label": "vn.national_id.front",
    "next_action": "",
    "application_state": ""
  },
  "message": "verify id card completed",
  "time": "2026-01-01T00:00:00Z",
  "verdict": "success"
}

Response data fields:

FieldTypeDescription
statusstringVerification result: success, failure, partial_success, etc.
error_codestringError code when status is failure (omitted on success)
error_messageobjectHuman-readable error details (omitted on success)
labelstringImage label that was processed (e.g. vn.national_id.front)
next_actionstringAction the client should take next (e.g. process_qr_code) — if applicable
application_statestringUpdated application state after verification
verdictStatus codeDescription
success200Verification completed (check data.status for result).
invalid_parameters400Missing or invalid card_type, image, or base64 data.
missing_authorization401Bearer access_token is missing.
expired_token401Access token expired — call Initialization API again.
record_not_found404Session referenced by the access token no longer exists (expired or reset).
limit_exceeded429A verification is already in progress for this session.
failure500Internal server error or verification timeout.

Selfie Verification API

Uploads selfie images, runs liveness detection and face matching, and returns the final verification result synchronously. The last image in the images array is treated as the primary selfie.

1. Request

MethodPathContent-TypeAuth Required
POST/ekyc/platform/verify_selfieapplication/jsonYes

Request Body:

NameTypeRequiredDescription
imagesarrayYesArray of selfie images: [{ "base64": "<base64_string>", "metadata": "<string>" }]. The last element is the primary selfie.
selfie_typestringNoType of selfie flow (e.g. passive, flash)

2. Response

Success (200):

json
{
  "data": {
    "status": "success",
    "error_code": "",
    "error_message": {},
    "label": "portrait",
    "next_action": "",
    "application_state": ""
  },
  "message": "verify selfie completed",
  "time": "2026-01-01T00:00:00Z",
  "verdict": "success"
}

Response data fields are identical to the ID Verification API.

verdictStatus codeDescription
success200Verification completed (check data.status for result).
invalid_parameters400images is empty or contains invalid base64 data.
missing_authorization401Bearer access_token is missing.
expired_token401Access token expired — call Initialization API again.
record_not_found404Session referenced by the access token no longer exists (expired or reset).
limit_exceeded429A verification is already in progress for this session.
failure500Internal server error or verification timeout.

Onboard API

Bundles the three calls above (Init → ID Verification → Selfie Verification) into a single synchronous request. It imports a complete dossier, runs the configured ID and selfie checks in sequence (waiting for each), drives the application to a terminal state so the configured Post-check / AML / Government checks run, and returns the full TS-native result — the same shape as API Application Detail — in the response.

Use this when you already hold a user's ID/selfie assets (e.g. captured on another channel or by another vendor) and want to re-check them through the TrustVision pipeline in one call, without driving Init / Verify ID / Verify Selfie separately.

Authentication: unlike Verify ID / Verify Selfie, this endpoint does not require a prior Init or a Bearer access_token — it authenticates with the encrypted_token in the body (the same token as Init). The response still returns an access_token you can use to re-pull API Application Detail later.

Note: the request blocks until all checks finish (ID + selfie run sequentially), so allow a generous client timeout.

1. Request

MethodPathContent-TypeAuth Required
POST/ekyc/platform/onboardapplication/jsonNo

Request Body:

NameTypeRequiredDescription
encrypted_tokenstringYesThe ENCODED_VALUE from the Authentication mechanism (same as Init). Identifies the user; the user reference inside it is the idempotency key.
flow_idstringNoSpecific flow to use.
card_typesstringNoComma-separated allowed card types (e.g. vn.national_id,vn.passport).
langstringNoLanguage code (e.g. vi, en).
card_typestringYes (for ID)Card type to verify (e.g. vn.national_id). Must be within card_types when that is provided.
image1objectYes (for ID)ID front: { "base64": "<base64>", "metadata": "<string>", "qr_code": [{"result": "...", "from_image_type": "..."}] }.
image2objectNoID back: same structure as image1.
qrsarrayNoStandalone QR images: [{ "base64": "<base64>", "metadata": "<string>" }].
selfiesarrayYes (for selfie)Frontal selfie image(s): [{ "base64" \| "id", "metadata" }]. The last element is the primary selfie used for face compare. An element with id references a pre-uploaded image.
selfie_typestringNoSelfie / liveness type (e.g. passive, passive_v2, flash).
videosarrayNoLiveness video frames: [{ "id"?, "metadata"?, "frames": [{ "base64", "label", "index", "metadata"? }] }] (≤ 10). Required for passive/flash liveness to pass — a still-only selfie gives the engine nothing to score.
client_metadataobjectNoOptional prepared metadata (e.g. applicant identity PII: applicant_name, id_number, dob, gender, phone_number, email), already encrypted by you. JSON ≤ 8 KB. Stored raw and echoed back raw only — never decrypted, and never fed into any check or the verdict.

At least one of image1 (ID) or selfies (selfie) must be present — supply only one group for an ID-only or selfie-only re-check. Put liveness frames in videos, not in selfies.

2. Response

The endpoint blocks until all checks complete, then returns the full result — the same TS-native shape as API Application Detail (overall verdict plus each module's status). Conditional blocks (ekyc_ocr / ekyc_face / id_tampering / file_ids / form_data / client_metadata) appear only when the corresponding data exists.

Success (200):

json
{
  "data": {
    "verdict": "approve",
    "application_id": 10,
    "application_unique_token": "ad083945-...",
    "application_user_id": "0123456789",
    "ekyc_ocr": {
      "card_info": {},
      "process_status": "success",
      "sanity_check_status": "success"
    },
    "ekyc_face": {
      "compare_status": "matched",
      "compare_score": 0.98,
      "liveness_status": "live",
      "search_face_status": "not_found"
    },
    "id_tampering": { "score": 0.01, "verdict": "genuine" },
    "client_metadata": {
      "applicant_name": "Jane Doe",
      "gender": "female"
    },
    "access_token": "<JWT>"
  },
  "message": "onboard completed",
  "time": "2026-01-01T00:00:00Z",
  "verdict": "success"
}

Response data fields:

FieldDescription
data.verdictOverall application verdict: approve, review, reject, or pending.
ekyc_ocr / ekyc_face / id_tamperingPer-module results + status (same as API Application Detail). Present only when run.
client_metadataThe prepared metadata you supplied, echoed back raw (omitted if none).
access_tokenJWT to re-pull API Application Detail for this application later.

See API Application Detail for the full field reference (the verdict, file_ids, and form_data mappings).

verdictStatus codeDescription
success200Processing completed — read data.verdict for the outcome.
missing_parameters400encrypted_token is missing.
invalid_parameters400Token undecodable, no ID/selfie assets, bad card_type, or invalid base64.
record_not_found404Encryption key or lender not found / inactive.
limit_exceeded429Another submission for the same user is in progress, or rate limit reached.
failure500Internal server error.

Dedupe / indexing-only mode: when enabled for the lender (client_custom_settings.onboard_dedupe_only), the endpoint runs only face index/search, leaves data.verdict as pending, and returns the match result on data.ekyc_face.search_face_result / search_face_status (the Post-check / AML / verdict pipeline is skipped).