Skip to Content
KnowaKYC
Tenant API (KYC)

Verification links

Verification links are single-use or time-limited URLs through which a user starts verification. You create links through the Tenant API or the admin panel and deliver them to the user (by email, SMS, QR code, or in your customer portal). When the user opens the link, a verification session is automatically created or attached, and the user is redirected to the KnowaKYC verification page.

POST
/v1/kyc/verification-links

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Request Body

Link options (flow_id required)

application/json
  1. body
expires_in?integer

seconds

external_reference?string
external_user_id?string
flow_id?string
locale?string
metadata?
prefilled?
redirect_url?string
utm_campaign?string
utm_medium?string
utm_source?string

Response Body

Created or reused link

application/json
  1. response
data?
success?boolean
Example Request
curl -X POST 'https://example.com/tenant/v1/kyc/verification-links' \  -H 'X-Timestamp: string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "success": true,  "data": {    "created_at": "string",    "delivery_eligible": true,    "expires_at": "string",    "external_reference": "string",    "external_user_id": "string",    "flow_id": "string",    "id": "string",    "link_url": "string",    "locale": "string",    "qr_code_url": "string",    "redirect_url": "string",    "reuse_reason": "external_reference",    "reused": true,    "session_id": "string",    "session_resumable": true,    "session_status": "string",    "short_url": "string",    "status": "string",    "url": "string",    "verification_link": "string",    "verification_url": "string"  }}

Identity and unresolved review

external_user_id identifies an applicant within a tenant; it is not a session ID. Multiple historical sessions may belong to one applicant. Journey reuse is scoped by tenant, environment, external user ID, flow, and KYC/KYB entity type.

If that scoped identity already has an unresolved manual review, creating a fresh link returns HTTP 409 with error.code = "session_review_pending" and error.existing_session_id. Finish the existing review or use its resubmit action. Expiration of a link does not resolve a pending reviewer decision. Link duplication and activation of a previously created fresh link cannot bypass this check.

For a session still in progress, normal link creation continues to reuse that session. A final approved/declined decision permits a later independent verification. external_reference only reuses an eligible active link when the supplied external_user_id is empty or matches the link; a different external user receives an independent link. It is not a lifetime session-deduplication key. Batch creation reports review conflicts per item.

Correlate webhook outcomes by session_id as well as external_id. A historical session's later reviewer decision is an outcome for that historical session; it must not silently overwrite the result of another session solely because the external ID matches.

Legacy compatibility

The canonical KYC path is /tenant/v1/kyc/verification-links. For existing tenant integrations, KnowaKYC also intentionally keeps /tenant/v1/verification-links and /tenant/v1/verificationLinks as KYC aliases. Verification-link create and batch-create request bodies also accept legacy field aliases with different casing or separators, such as flowId, FlowID, externalUserId, redirectUrl, and prefilledData.

Do not treat these aliases as dead code. They are a supported compatibility contract and may be removed only after a separately versioned Tenant API deprecation and migration window.

Creates several verification links in a single request.

POST
/v1/kyc/verification-links/batch

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Request Body

Batch create request

application/json
  1. body
defaults?
items?array<>

Response Body

Created links

application/json
  1. response
data?
success?boolean
Example Request
curl -X POST 'https://example.com/tenant/v1/kyc/verification-links/batch' \  -H 'X-Timestamp: string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "success": true,  "data": {    "failed": [      {        "error": "string",        "error_code": "string",        "existing_session_id": "string",        "index": 0,        "link": {          "created_at": "string",          "delivery_eligible": true,          "expires_at": "string",          "external_reference": "string",          "external_user_id": "string",          "flow_id": "string",          "id": "string",          "link_url": "string",          "locale": "string",          "qr_code_url": "string",          "redirect_url": "string",          "reuse_reason": "external_reference",          "reused": true,          "session_id": "string",          "session_resumable": true,          "session_status": "string",          "short_url": "string",          "status": "string",          "url": "string",          "verification_link": "string",          "verification_url": "string"        }      }    ],    "successful": [      {        "error": "string",        "error_code": "string",        "existing_session_id": "string",        "index": 0,        "link": {          "created_at": "string",          "delivery_eligible": true,          "expires_at": "string",          "external_reference": "string",          "external_user_id": "string",          "flow_id": "string",          "id": "string",          "link_url": "string",          "locale": "string",          "qr_code_url": "string",          "redirect_url": "string",          "reuse_reason": "external_reference",          "reused": true,          "session_id": "string",          "session_resumable": true,          "session_status": "string",          "short_url": "string",          "status": "string",          "url": "string",          "verification_link": "string",          "verification_url": "string"        }      }    ],    "summary": {      "failed": 0,      "successful": 0,      "total": 0    }  }}
GET
/v1/kyc/verification-links

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Query Parameters

page?integer

Page (1-based)

page_size?integer

Page size (1-100)

status?string

Filter by status (active, consumed, revoked)

external_user_id?string

Filter by external user ID

external_reference?string

Filter by external reference

flow_id?string

Filter by flow UUID

sort_by?string

Sort field (default created_at)

sort_order?string

Sort order: asc, desc (default desc)

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Response Body

Verification links

*/*
  1. response
data?
success?boolean
Example Request
curl -X GET 'https://example.com/tenant/v1/kyc/verification-links' \  -H 'X-Timestamp: string'
Example Response
{  "success": true,  "data": {    "items": [      {        "activated_at": "string",        "consumed_at": "string",        "created_at": "string",        "created_by": "string",        "expires_at": "string",        "external_reference": "string",        "external_user_id": "string",        "flow_id": "string",        "flow_session_id": "string",        "id": "string",        "locale": "string",        "metadata": {          "property1": null,          "property2": null        },        "prefilled_data": {          "property1": null,          "property2": null        },        "redirect_url": "string",        "revoked_at": "string",        "revoked_reason": "string",        "short_code": "string",        "status": "string",        "token": "string",        "updated_at": "string",        "utm_campaign": "string",        "utm_medium": "string",        "utm_source": "string"      }    ],    "pagination": {      "page": 0,      "page_size": 0,      "total": 0,      "total_pages": 0    }  }}
GET
/v1/kyc/verification-links/{id}

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Path Parameters

id*string

Link UUID

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Response Body

Verification link details

*/*
  1. response
data?
success?boolean
Example Request
curl -X GET 'https://example.com/tenant/v1/kyc/verification-links/string' \  -H 'X-Timestamp: string'
Example Response
{  "success": true,  "data": {    "activated_at": "string",    "consumed_at": "string",    "created_at": "string",    "created_by": "string",    "expires_at": "string",    "external_reference": "string",    "external_user_id": "string",    "flow_id": "string",    "flow_session_id": "string",    "id": "string",    "locale": "string",    "metadata": {      "property1": null,      "property2": null    },    "prefilled_data": {      "property1": null,      "property2": null    },    "redirect_url": "string",    "revoked_at": "string",    "revoked_reason": "string",    "short_code": "string",    "status": "string",    "token": "string",    "updated_at": "string",    "utm_campaign": "string",    "utm_medium": "string",    "utm_source": "string"  }}

A revoked link becomes invalid and cannot be used to start verification.

POST
/v1/kyc/verification-links/{id}/revoke

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Path Parameters

id*string

Link UUID

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Request Body

Optional revoke reason

application/json
  1. body
reason?string

Response Body

Revoked link info

application/json
  1. response
data?
success?boolean
Example Request
curl -X POST 'https://example.com/tenant/v1/kyc/verification-links/string/revoke' \  -H 'X-Timestamp: string' \  -H 'Content-Type: application/json' \  -d '{}'
Example Response
{  "success": true,  "data": {    "id": "string",    "revoked_at": "string",    "status": "string"  }}

Get a QR code

Returns the QR code for a verification link. Use it for the cross-device flow: the user scans the QR code on a mobile device and continues verification there.

GET
/v1/kyc/verification-links/{id}/qr

Authorization

ApiKeyAuth
headerAuthorization<token>

HMAC-SHA256 Credential=<key_id>, Signature=<hex_signature>. SignedHeaders=x-timestamp is optional. Requires X-Timestamp header.

Path Parameters

id*string

Link UUID

Query Parameters

size?integer

QR size in pixels (1-1024, default 256)

Header Parameters

X-Timestamp*string

Unix timestamp (seconds, max 5 min drift)

Response Body

PNG image

response?unknownimage/png
Example Request
curl -X GET 'https://example.com/tenant/v1/kyc/verification-links/string/qr' \  -H 'X-Timestamp: string'
Example Response
null

[Created] → [Activated] → [Consumed]
    ↓            ↓            ↓
[Expired]   [Expired]   [Completed]
    ↓            ↓
[Revoked]   [Revoked]

Link statuses:

StatusDescription
activeLink created; the user has not opened it yet
activatedThe user opened the link; a session was created and verification is in progress
consumedVerification completed (approved, rejected, or routed to review)
expiredThe link's TTL (ttl_seconds) elapsed; the link is no longer usable
revokedThe link was revoked manually through the API or the admin panel

Note. After creating the link, deliver it to the user (by email, SMS, or QR code). Opening the link automatically creates a verification session. For the cross-device flow, use the QR code (GET /v1/kyc/verification-links/{id}/qr).


Redirect after verification completes

When you create a link, you can pass the redirect_url parameter — the URL the user is redirected to once verification completes (for example, a customer portal or an application form).

How it works

  1. When creating the link, pass redirect_url in the request body (POST /v1/kyc/verification-links or batch).
  2. On activation, redirect_url is stored in the session and returned in the activation response (the redirect_url field).
  3. On the completion screen (after approval, rejection, or routing to review) the user sees:
    • a return button — the user clicks it and is redirected to redirect_url; or
    • an automatic redirect after a configured delay.

Configuring behaviour

Redirect behaviour is set in the flow parameters in the admin panel:

  • Redirect behaviour on completion — redirect mode: "Show button" or "Auto redirect".
  • Redirect delay (seconds) — delay before the automatic redirect (applies when "Auto redirect" is selected).

Defaults: button is shown; automatic mode delay is 3 seconds. For details, see Flows (admin).

On this page