curl --request POST \
--url https://api.qbank.cl/platform/v1/kyc/submissions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"external_customer_id": "cust_789",
"idempotency_key": "kyc-sub-cust-789-1",
"person": {
"first_name": "Ana",
"last_name": "Perez",
"email": "ana@example.com",
"phone": "+56912345678",
"nationality": "CHL",
"date_of_birth": "1990-04-12",
"tax_id": "12.345.678-5",
"id_type": "id_card",
"id_number": "12345678",
"address": {
"line1": "Av. Siempre Viva 123",
"city": "Santiago",
"state": "RM",
"postal_code": "8320000",
"country": "CHL"
},
"primary_purpose": "personal_or_living_expenses",
"most_recent_occupation": "Engineer",
"source_of_funds": "salary"
}
}
'import requests
url = "https://api.qbank.cl/platform/v1/kyc/submissions"
payload = {
"external_customer_id": "cust_789",
"idempotency_key": "kyc-sub-cust-789-1",
"person": {
"first_name": "Ana",
"last_name": "Perez",
"email": "ana@example.com",
"phone": "+56912345678",
"nationality": "CHL",
"date_of_birth": "1990-04-12",
"tax_id": "12.345.678-5",
"id_type": "id_card",
"id_number": "12345678",
"address": {
"line1": "Av. Siempre Viva 123",
"city": "Santiago",
"state": "RM",
"postal_code": "8320000",
"country": "CHL"
},
"primary_purpose": "personal_or_living_expenses",
"most_recent_occupation": "Engineer",
"source_of_funds": "salary"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
external_customer_id: 'cust_789',
idempotency_key: 'kyc-sub-cust-789-1',
person: {
first_name: 'Ana',
last_name: 'Perez',
email: 'ana@example.com',
phone: '+56912345678',
nationality: 'CHL',
date_of_birth: '1990-04-12',
tax_id: '12.345.678-5',
id_type: 'id_card',
id_number: '12345678',
address: {
line1: 'Av. Siempre Viva 123',
city: 'Santiago',
state: 'RM',
postal_code: '8320000',
country: 'CHL'
},
primary_purpose: 'personal_or_living_expenses',
most_recent_occupation: 'Engineer',
source_of_funds: 'salary'
}
})
};
fetch('https://api.qbank.cl/platform/v1/kyc/submissions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/v1/kyc/submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'external_customer_id' => 'cust_789',
'idempotency_key' => 'kyc-sub-cust-789-1',
'person' => [
'first_name' => 'Ana',
'last_name' => 'Perez',
'email' => 'ana@example.com',
'phone' => '+56912345678',
'nationality' => 'CHL',
'date_of_birth' => '1990-04-12',
'tax_id' => '12.345.678-5',
'id_type' => 'id_card',
'id_number' => '12345678',
'address' => [
'line1' => 'Av. Siempre Viva 123',
'city' => 'Santiago',
'state' => 'RM',
'postal_code' => '8320000',
'country' => 'CHL'
],
'primary_purpose' => 'personal_or_living_expenses',
'most_recent_occupation' => 'Engineer',
'source_of_funds' => 'salary'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/v1/kyc/submissions"
payload := strings.NewReader("{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/v1/kyc/submissions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/kyc/submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}"
response = http.request(request)
puts response.read_body{
"submission_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"kind": "kyc",
"external_customer_id": "cust_789",
"status": "pending_review",
"liveness_pending": true,
"verification_fee": "1.500000",
"idempotency_key": "kyc-sub-cust-789-1",
"created_at": "2026-07-10T12:05:00Z",
"updated_at": "2026-07-10T12:05:00Z"
}{
"error": "invalid_payload",
"message": "external_customer_id is required (your reference for the customer being verified)"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "insufficient_funds",
"message": "account balance is not enough for this operation"
}{
"error": "company_account_required",
"message": "third-party KYC/KYB verification is available to company accounts only"
}Create a KYC submission with API data
Company accounts only: verifies one of YOUR end customers sending the data directly (no wizard). Countries in ISO alpha-3, dates YYYY-MM-DD, id_type passport | id_card | drivers_license. Documents are optional at creation (upload them via the presign flow); no liveness is required at creation — the submission carries liveness_pending: true, close it with a liveness link. Re-sending with the same external_customer_id while the submission is open updates it without charging again. Bills the fixed kyc_verification fee; idempotency_key required.
curl --request POST \
--url https://api.qbank.cl/platform/v1/kyc/submissions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"external_customer_id": "cust_789",
"idempotency_key": "kyc-sub-cust-789-1",
"person": {
"first_name": "Ana",
"last_name": "Perez",
"email": "ana@example.com",
"phone": "+56912345678",
"nationality": "CHL",
"date_of_birth": "1990-04-12",
"tax_id": "12.345.678-5",
"id_type": "id_card",
"id_number": "12345678",
"address": {
"line1": "Av. Siempre Viva 123",
"city": "Santiago",
"state": "RM",
"postal_code": "8320000",
"country": "CHL"
},
"primary_purpose": "personal_or_living_expenses",
"most_recent_occupation": "Engineer",
"source_of_funds": "salary"
}
}
'import requests
url = "https://api.qbank.cl/platform/v1/kyc/submissions"
payload = {
"external_customer_id": "cust_789",
"idempotency_key": "kyc-sub-cust-789-1",
"person": {
"first_name": "Ana",
"last_name": "Perez",
"email": "ana@example.com",
"phone": "+56912345678",
"nationality": "CHL",
"date_of_birth": "1990-04-12",
"tax_id": "12.345.678-5",
"id_type": "id_card",
"id_number": "12345678",
"address": {
"line1": "Av. Siempre Viva 123",
"city": "Santiago",
"state": "RM",
"postal_code": "8320000",
"country": "CHL"
},
"primary_purpose": "personal_or_living_expenses",
"most_recent_occupation": "Engineer",
"source_of_funds": "salary"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
external_customer_id: 'cust_789',
idempotency_key: 'kyc-sub-cust-789-1',
person: {
first_name: 'Ana',
last_name: 'Perez',
email: 'ana@example.com',
phone: '+56912345678',
nationality: 'CHL',
date_of_birth: '1990-04-12',
tax_id: '12.345.678-5',
id_type: 'id_card',
id_number: '12345678',
address: {
line1: 'Av. Siempre Viva 123',
city: 'Santiago',
state: 'RM',
postal_code: '8320000',
country: 'CHL'
},
primary_purpose: 'personal_or_living_expenses',
most_recent_occupation: 'Engineer',
source_of_funds: 'salary'
}
})
};
fetch('https://api.qbank.cl/platform/v1/kyc/submissions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.qbank.cl/platform/v1/kyc/submissions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'external_customer_id' => 'cust_789',
'idempotency_key' => 'kyc-sub-cust-789-1',
'person' => [
'first_name' => 'Ana',
'last_name' => 'Perez',
'email' => 'ana@example.com',
'phone' => '+56912345678',
'nationality' => 'CHL',
'date_of_birth' => '1990-04-12',
'tax_id' => '12.345.678-5',
'id_type' => 'id_card',
'id_number' => '12345678',
'address' => [
'line1' => 'Av. Siempre Viva 123',
'city' => 'Santiago',
'state' => 'RM',
'postal_code' => '8320000',
'country' => 'CHL'
],
'primary_purpose' => 'personal_or_living_expenses',
'most_recent_occupation' => 'Engineer',
'source_of_funds' => 'salary'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.qbank.cl/platform/v1/kyc/submissions"
payload := strings.NewReader("{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.qbank.cl/platform/v1/kyc/submissions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/kyc/submissions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"external_customer_id\": \"cust_789\",\n \"idempotency_key\": \"kyc-sub-cust-789-1\",\n \"person\": {\n \"first_name\": \"Ana\",\n \"last_name\": \"Perez\",\n \"email\": \"ana@example.com\",\n \"phone\": \"+56912345678\",\n \"nationality\": \"CHL\",\n \"date_of_birth\": \"1990-04-12\",\n \"tax_id\": \"12.345.678-5\",\n \"id_type\": \"id_card\",\n \"id_number\": \"12345678\",\n \"address\": {\n \"line1\": \"Av. Siempre Viva 123\",\n \"city\": \"Santiago\",\n \"state\": \"RM\",\n \"postal_code\": \"8320000\",\n \"country\": \"CHL\"\n },\n \"primary_purpose\": \"personal_or_living_expenses\",\n \"most_recent_occupation\": \"Engineer\",\n \"source_of_funds\": \"salary\"\n }\n}"
response = http.request(request)
puts response.read_body{
"submission_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
"kind": "kyc",
"external_customer_id": "cust_789",
"status": "pending_review",
"liveness_pending": true,
"verification_fee": "1.500000",
"idempotency_key": "kyc-sub-cust-789-1",
"created_at": "2026-07-10T12:05:00Z",
"updated_at": "2026-07-10T12:05:00Z"
}{
"error": "invalid_payload",
"message": "external_customer_id is required (your reference for the customer being verified)"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "insufficient_funds",
"message": "account balance is not enough for this operation"
}{
"error": "company_account_required",
"message": "third-party KYC/KYB verification is available to company accounts only"
}Authorizations
Session JWT (from register/login) or API key (pk_...).
X-API-Key: <token> is accepted as an alternative header.
Body
Your reference for the verified customer.
Person fields (first_name, last_name, email, phone, nationality, date_of_birth, tax_id, id_type, id_number, address, primary_purpose, most_recent_occupation, source_of_funds).
Response
Submission created (enters the compliance review queue).
kyc, kyb pending_review, in_review, changes_requested, more_info_required, escalated, approved, approved_partial, rejected KYC only. True until the video liveness check passes.
KYB only.