curl --request POST \
--url https://api-prod.blaaiz.com/api/external/compliance/kyc/sessions/{sessionId}/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filename": "passport-front.jpg",
"content_type": "image/jpeg",
"id_doc_type": "PASSPORT",
"country": "NGA",
"file_name": "4a7f1c92e0_passport front.jpg"
}
'{
"message": "Verification session document uploaded successfully.",
"data": {
"id": "9f2c7b41-6d3e-4c8a-9a20-1e6f0b5d7c33",
"business_id": "9d4c4ec5-572d-49de-a362-f01ed09f2b1b",
"customer_reference": "user_10482",
"requirements": [
"DOCUMENTS"
],
"fulfilment_mode": "HEADLESS",
"status": "AWAITING_INPUT",
"steps": {
"documents": "SUBMITTED",
"selfie": null,
"proof_of_address": null
},
"rejection": null,
"expires_at": "2026-08-30T09:14:22.000Z",
"completed_at": null,
"created_at": "2026-08-29T09:14:22.000Z"
}
}{
"message": "Invalid or missing access token"
}{
"message": "The Signa feature is not enabled for this business.",
"status": 403
}{
"message": "Verification session not found."
}{
"message": "No uploaded file was found under that name; upload to the presigned URL before confirming."
}Upload a verification document
Add one document to a session. Send the bytes one of two ways, never both: file_name names a file you already staged through the upload-url endpoint, and content_base64 carries the bytes inline. Use file_name for every real document, because a request body larger than about 8 KB is rejected at the network edge. An inline document must be 700 KB or smaller after decoding, and a staged file must be 5 MB or smaller. The session must be AWAITING_INPUT, and it must be HEADLESS. A HOSTED session refuses the call with a 422, because the end customer supplies the documents on the verification link. The response is the session, with steps.documents set to SUBMITTED. Signa must be enabled for your business. Required scope: compliance-kyc:create.
curl --request POST \
--url https://api-prod.blaaiz.com/api/external/compliance/kyc/sessions/{sessionId}/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"filename": "passport-front.jpg",
"content_type": "image/jpeg",
"id_doc_type": "PASSPORT",
"country": "NGA",
"file_name": "4a7f1c92e0_passport front.jpg"
}
'{
"message": "Verification session document uploaded successfully.",
"data": {
"id": "9f2c7b41-6d3e-4c8a-9a20-1e6f0b5d7c33",
"business_id": "9d4c4ec5-572d-49de-a362-f01ed09f2b1b",
"customer_reference": "user_10482",
"requirements": [
"DOCUMENTS"
],
"fulfilment_mode": "HEADLESS",
"status": "AWAITING_INPUT",
"steps": {
"documents": "SUBMITTED",
"selfie": null,
"proof_of_address": null
},
"rejection": null,
"expires_at": "2026-08-30T09:14:22.000Z",
"completed_at": null,
"created_at": "2026-08-29T09:14:22.000Z"
}
}{
"message": "Invalid or missing access token"
}{
"message": "The Signa feature is not enabled for this business.",
"status": 403
}{
"message": "Verification session not found."
}{
"message": "No uploaded file was found under that name; upload to the presigned URL before confirming."
}Authorizations
Use your OAuth client credentials to obtain a short-lived Bearer token from POST /oauth/token.
Path Parameters
The verification session id returned by the create endpoint.
Body
The name Blaaiz stores the document under.
191The media type of the file.
image/jpeg, image/png, image/webp, application/pdf What the document is. UTILITY_BILL and BANK_STATEMENT satisfy the proof-of-address step. Every other type except SELFIE satisfies the documents step. Which types a session accepts depends on its requirement set. A session that includes SELFIE rejects a SELFIE upload, because Blaaiz captures the selfie.
PASSPORT, ID_CARD, DRIVERS, RESIDENCE_PERMIT, UTILITY_BILL, BANK_STATEMENT, SELFIE The country of the document, as an ISO 3166-1 alpha-3 code.
3The data.file_name value the upload-url endpoint returned. Send this or content_base64, never both.
150^[a-zA-Z0-9_ -]+\.(jpg|jpeg|png|webp|pdf)$The file, base64 encoded. The decoded file must be 700 KB or smaller. Send this or file_name, never both.
Was this page helpful?