KYC/KYB Verification
KYC (Know Your Customer) and KYB (Know Your Business) verification ensures that beneficiaries are identity-verified before they can execute certain transactions. The Caliza API uses an interactive verification flow where end users are redirected to a third-party provider to complete the process.
This page covers the full interactive verification lifecycle: creating a verification session, redirecting the user, and tracking the result.
Prerequisites
- Authentication: A valid access token. See Authenticate.
- Beneficiary: A created beneficiary (individual or business). See Beneficiaries.
How interactive verification works
- Create a verification session — The API returns a
verificationUrlpointing to the third-party provider. - Redirect the user — Send the end user to the
verificationUrlto complete identity verification. - Track the result — Poll the verification status or listen for webhook notifications.
The system automatically selects KYC for individual beneficiaries and KYB for business beneficiaries.
Step 1: Create a verification session
Create an interactive verification session by sending a POST request to /v1/beneficiaries/{beneficiaryId}/verification:
curl -X POST 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{{BENEFICIARY_ID}}/verification' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {{ACCESS_TOKEN}}'const response = await axios.post(
`https://api.sandbox.caliza.com/core-api/v1/beneficiaries/${beneficiaryId}/verification`,
{},
{
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
}
);
const { verificationUrl } = response.data;response = requests.post(
f'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{beneficiary_id}/verification',
headers={
'Content-Type': 'application/json',
'Authorization': f'Bearer {access_token}'
}
)
verification_url = response.json()['verificationUrl']The request body is optional. If omitted, the verification defaults to interactive mode.
Example response
{
"id": "6925dd986a93002882da640b",
"beneficiaryId": "6925dd986a93002882da640b",
"type": "INDIVIDUAL",
"verificationType": "INTERACTIVE",
"verificationUrl": "https://verification.aiprise.com/session/abc123",
"status": "PENDING",
"createdDate": "2025-01-15T16:47:20.568Z",
"lastModifiedDate": "2025-01-15T16:47:20.568Z"
}Response fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier of the verification session |
beneficiaryId | string | Identifier of the beneficiary being verified |
type | string | Beneficiary type: INDIVIDUAL or BUSINESS |
verificationType | string | Verification mode (INTERACTIVE) |
verificationUrl | string | null | URL to redirect the user to. Present when status is PENDING |
status | string | Current verification status (see table below) |
createdDate | string | ISO 8601 timestamp of session creation |
lastModifiedDate | string | ISO 8601 timestamp of last status update |
If the beneficiary already has an active verification session (status
PENDING), the API returns the existing session instead of creating a new one.
Step 2: Redirect the user
Take the verificationUrl from the response and redirect the end user to it. The user will complete the identity verification process on the third-party provider's interface (e.g., uploading ID documents, taking a selfie).
Once the user finishes, the third-party provider notifies Caliza asynchronously. The verification status will update from PENDING to either SUCCEEDED or FAILED.
Step 3: Track verification status
After redirecting the user, track the verification result by polling or subscribing to webhooks.
Polling
Send a GET request to /v1/beneficiaries/{beneficiaryId}/verification:
curl -X GET 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{{BENEFICIARY_ID}}/verification' \
-H 'Authorization: Bearer {{ACCESS_TOKEN}}'const response = await axios.get(
`https://api.sandbox.caliza.com/core-api/v1/beneficiaries/${beneficiaryId}/verification`,
{
headers: {
'Authorization': `Bearer ${accessToken}`
}
}
);
console.log(response.data.status); // PENDING, PROCESSING, SUCCEEDED, or FAILEDresponse = requests.get(
f'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{beneficiary_id}/verification',
headers={
'Authorization': f'Bearer {access_token}'
}
)
print(response.json()['status']) # PENDING, PROCESSING, SUCCEEDED, or FAILEDVerification statuses
| Status | Description |
|---|---|
PENDING | Verification session created, waiting for the user to complete it |
PROCESSING | User completed the flow, verification is being processed |
SUCCEEDED | Verification completed successfully — the beneficiary is automatically approved and can execute transactions |
FAILED | Verification failed — review the beneficiary status for details |
Webhooks
Subscribe to the following webhook events to receive real-time notifications:
| Event | Description |
|---|---|
BENEFICIARY_APPROVED | Beneficiary has been verified and approved |
BENEFICIARY_FAILED | Beneficiary verification has failed |
See Webhook Events for details on configuring webhook endpoints.
Next steps
Updated 2 days ago
