Início rápido
Crie uma chave de API e envie sua primeira requisição de KYC em três minutos.
Este é o caminho mais rápido de "tenho uma conta na Certivant" até "uma requisição de verificação já está em andamento". Se você concluir esta página, terá uma integração funcionando de ponta a ponta.
O que você precisa
- Uma organização na Certivant (cadastre-se na URL do seu locatário — o período de teste inclui créditos gratuitos).
- A função de Owner (proprietário) ou Admin (administrador) nessa organização. Membros não podem criar chaves de API.
- Uma forma de fazer requisições HTTPS —
curl, Postman ou o cliente HTTP da sua linguagem.
1 — Criar uma chave de API
Clique em Nova chave, dê a ela um nome, escolha Live ou Test (por exemplo, um nome como staging-server) e selecione os escopos de que você precisa:
kyc:read— ler requisições, documentos e sinais de fraudekyc:write— criar requisições e enviar documentoskyc:submit— enviar uma requisição para processamento automatizadokyc:manage— substituir decisões e excluir solicitantes (GDPR)
ck_live_ (ou ck_test_, se você tiver escolhido o ambiente de teste). Copie-a agora — a Certivant armazena apenas um hash, então você não poderá recuperá-la depois. Se a perder, revogue a chave e crie uma nova.Trate as chaves de API como senhas. Armazene-as no seu gerenciador de segredos, nunca as envie ao git e use uma chave separada para cada ambiente (homologação e produção). Revogue uma chave no momento em que suspeitar de exposição.
2 — Criar uma requisição de KYC
O corpo mínimo da requisição precisa apenas de um type. Inclua os dados do solicitante na própria chamada, se você já os tiver — caso contrário, o solicitante os preenche por meio de uma sessão hospedada. Veja abaixo o mesmo fluxo completo de ponta a ponta (criar → enviar documentos → submeter → consultar) em oito linguagens:
# 1. Create a verification request
curl -X POST https://app.certivant.com/api/v1/kyc/requests \
-H "Authorization: Bearer ck_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"type": "INDIVIDUAL",
"externalRef": "user_123",
"applicant": {
"fullName": "Jane Doe", "email": "jane@example.com", "nationality": "US",
"emailVerified": false, "phoneVerified": false
}
}'
# -> { "id": "req_...", "status": "PENDING_UPLOAD", ... }
# 2 & 3. Upload an identity document (front) + a selfie
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/documents \
-H "Authorization: Bearer ck_live_your_key_here" \
-F "file=@passport.jpg" -F "documentType=PASSPORT" -F "side=front"
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/documents \
-H "Authorization: Bearer ck_live_your_key_here" \
-F "file=@selfie.jpg" -F "documentType=SELFIE"
# 4. Submit for AI processing (email + phone must already be verified if your org requires it)
curl -X POST https://app.certivant.com/api/v1/kyc/requests/{requestId}/submit \
-H "Authorization: Bearer ck_live_your_key_here"
# 5. Poll for the decision (or just listen for the webhook)
curl https://app.certivant.com/api/v1/kyc/requests/{requestId} \
-H "Authorization: Bearer ck_live_your_key_here"
const BASE = "https://app.certivant.com/api/v1/kyc";
const headers = { Authorization: "Bearer ck_live_your_key_here" };
// 1. Create
const { id } = await fetch(BASE + "/requests", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
type: "INDIVIDUAL",
externalRef: "user_123",
applicant: { fullName: "Jane Doe", email: "jane@example.com", nationality: "US" },
}),
}).then((r) => r.json());
// 2 & 3. Upload documents
async function upload(file, documentType, side) {
const form = new FormData();
form.append("file", file);
form.append("documentType", documentType);
if (side) form.append("side", side);
await fetch(BASE + "/requests/" + id + "/documents", { method: "POST", headers, body: form });
}
await upload(passportFile, "PASSPORT", "front");
await upload(selfieFile, "SELFIE");
// 4. Submit
await fetch(BASE + "/requests/" + id + "/submit", { method: "POST", headers });
// 5. Poll (production: listen for the webhook instead)
let result;
do {
await new Promise((r) => setTimeout(r, 3000));
result = await fetch(BASE + "/requests/" + id, { headers }).then((r) => r.json());
} while (result.status === "PROCESSING");
console.log(result.status, result.riskScore);
const BASE = "https://app.certivant.com/api/v1/kyc";
const headers = { Authorization: "Bearer ck_live_your_key_here" };
type KycStatus = "PENDING_UPLOAD" | "DOCUMENTS_READY" | "PROCESSING"
| "APPROVED" | "REJECTED" | "ESCALATED" | "CANCELLED";
interface KycRequest {
id: string;
status: KycStatus;
riskScore?: { overallScore: number; decision: string } | null;
}
const created: KycRequest = await fetch(BASE + "/requests", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({
type: "INDIVIDUAL",
externalRef: "user_123",
applicant: { fullName: "Jane Doe", email: "jane@example.com", nationality: "US" },
}),
}).then((r) => r.json());
await fetch(BASE + "/requests/" + created.id + "/submit", { method: "POST", headers });
import time, requests
BASE = "https://app.certivant.com/api/v1/kyc"
headers = {"Authorization": "Bearer ck_live_your_key_here"}
# 1. Create
r = requests.post(f"{BASE}/requests", headers=headers, json={
"type": "INDIVIDUAL",
"externalRef": "user_123",
"applicant": {"fullName": "Jane Doe", "email": "jane@example.com", "nationality": "US"},
})
request_id = r.json()["id"]
# 2 & 3. Upload documents
def upload(path, document_type, side=None):
data = {"documentType": document_type}
if side:
data["side"] = side
with open(path, "rb") as f:
requests.post(f"{BASE}/requests/{request_id}/documents",
headers=headers, files={"file": f}, data=data)
upload("passport.jpg", "PASSPORT", "front")
upload("selfie.jpg", "SELFIE")
# 4. Submit
requests.post(f"{BASE}/requests/{request_id}/submit", headers=headers)
# 5. Poll
while True:
result = requests.get(f"{BASE}/requests/{request_id}", headers=headers).json()
if result["status"] != "PROCESSING":
break
time.sleep(3)
print(result["status"])
<?php
$BASE = "https://app.certivant.com/api/v1/kyc";
$auth = ["Authorization: Bearer ck_live_your_key_here"];
// 1. Create
$ch = curl_init("$BASE/requests");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => array_merge($auth, ["Content-Type: application/json"]),
CURLOPT_POSTFIELDS => json_encode([
"type" => "INDIVIDUAL",
"externalRef" => "user_123",
"applicant" => ["fullName" => "Jane Doe", "email" => "jane@example.com", "nationality" => "US"],
]),
]);
$req = json_decode(curl_exec($ch), true);
$id = $req["id"];
// 2. Upload a document
$ch = curl_init("$BASE/requests/$id/documents");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => $auth,
CURLOPT_POSTFIELDS => [
"file" => new CURLFile("passport.jpg"),
"documentType" => "PASSPORT",
"side" => "front",
],
]);
curl_exec($ch);
// 4. Submit
$ch = curl_init("$BASE/requests/$id/submit");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $auth]);
curl_exec($ch);
using System.Net.Http;
using System.Net.Http.Json;
using System.Net.Http.Headers;
var http = new HttpClient { BaseAddress = new Uri("https://app.certivant.com/api/v1/kyc/") };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "ck_live_your_key_here");
// 1. Create
var created = await http.PostAsJsonAsync("requests", new {
type = "INDIVIDUAL",
externalRef = "user_123",
applicant = new { fullName = "Jane Doe", email = "jane@example.com", nationality = "US" }
});
var request = await created.Content.ReadFromJsonAsync<Dictionary<string, object>>();
var id = request["id"].ToString();
// 2. Upload a document
using var form = new MultipartFormDataContent();
form.Add(new ByteArrayContent(File.ReadAllBytes("passport.jpg")), "file", "passport.jpg");
form.Add(new StringContent("PASSPORT"), "documentType");
form.Add(new StringContent("front"), "side");
await http.PostAsync($"requests/{id}/documents", form);
// 4. Submit
await http.PostAsync($"requests/{id}/submit", null);
import java.net.http.*;
import java.net.URI;
var http = HttpClient.newHttpClient();
String BASE = "https://app.certivant.com/api/v1/kyc";
String auth = "Bearer ck_live_your_key_here";
// 1. Create
var createBody = """
{"type":"INDIVIDUAL","externalRef":"user_123",
"applicant":{"fullName":"Jane Doe","email":"jane@example.com","nationality":"US"}}""";
var created = http.send(HttpRequest.newBuilder(URI.create(BASE + "/requests"))
.header("Authorization", auth).header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(createBody)).build(),
HttpResponse.BodyHandlers.ofString());
// parse created.body() -> id with your JSON library (Jackson/Gson)
// 4. Submit
http.send(HttpRequest.newBuilder(URI.create(BASE + "/requests/" + id + "/submit"))
.header("Authorization", auth).POST(HttpRequest.BodyPublishers.noBody()).build(),
HttpResponse.BodyHandlers.ofString());
package main
import (
"bytes"
"net/http"
)
const base = "https://app.certivant.com/api/v1/kyc"
const auth = "Bearer ck_live_your_key_here"
func main() {
// 1. Create
body := []byte(`{"type":"INDIVIDUAL","externalRef":"user_123",
"applicant":{"fullName":"Jane Doe","email":"jane@example.com","nationality":"US"}}`)
req, _ := http.NewRequest("POST", base+"/requests", bytes.NewReader(body))
req.Header.Set("Authorization", auth)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
// decode resp.Body -> { "id": "..." }
// 4. Submit
submit, _ := http.NewRequest("POST", base+"/requests/"+id+"/submit", nil)
submit.Header.Set("Authorization", auth)
http.DefaultClient.Do(submit)
}
Uma resposta bem-sucedida tem este formato:
{
"id": "req_01HXY...",
"status": "PENDING_UPLOAD",
"type": "INDIVIDUAL",
"externalRef": "order-12345",
"pendingDocTypes": ["GOVERNMENT_ID", "SELFIE"],
"applicant": { "fullName": "Jane Doe", "email": "jane@example.com" },
"createdAt": "2026-05-27T10:00:00.000Z"
}
Guarde o id — todas as chamadas seguintes precisam dele.
O campo externalRef é a sua chave estrangeira. Use o ID do seu pedido,
o ID do seu usuário ou qualquer outro valor que permita relacionar a
requisição da Certivant a um registro do seu próprio banco de dados. Ele
é retornado em todos os eventos de webhook.
3 — Obter para o solicitante uma sessão hospedada
A forma mais simples de coletar documentos é enviar ao solicitante uma URL de curta duração. A Certivant cuida da captura de documentos, da prova de vida e da interface de envio; você apenas entrega o link.
curl -X POST https://app.certivant.com/api/v1/kyc/requests/req_01HXY.../session-url \
-H "Authorization: Bearer ck_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"expiresInHours": 72,
"redirectUrl": "https://yourapp.example.com/onboarding/complete"
}'
Retorna:
{
"sessionUrl": "https://app.certivant.com/s/01HZ...",
"expiresAt": "2026-05-30T10:00:00.000Z"
}
Envie-o por e-mail ao solicitante, incorpore-o no seu próprio fluxo de cadastro ou abra-o em um iframe — o que se encaixar melhor na sua experiência. Quando o solicitante enviar os dados, a Certivant move a requisição para PROCESSING, executa as verificações e dispara o webhook.
Nesse caminho de sessão hospedada, o solicitante também conclui a
verificação de e-mail e telefone quando sua organização exige, então você
não precisa passar emailVerified / phoneVerified por conta própria. No
caminho servidor a servidor (veja Sua primeira requisição),
verifique cada canal exigido — ou defina essas flags na criação — antes de
chamar submit.
4 — Receber o resultado
Configure um endpoint de webhook em KYC → Configurações → Webhooks com uma URL sob seu controle. A Certivant enviará um POST para ela sempre que o estado da requisição mudar.
{
"event": "kyc.request.approved",
"requestId": "req_01HXY...",
"organizationId": "org_01HW...",
"externalRef": "order-12345",
"status": "APPROVED",
"timestamp": "2026-05-27T10:04:21.000Z",
"data": { "score": 92, "decision": "approve" }
}
Use o externalRef para encontrar o registro no seu banco de dados e prosseguir com o cadastro. Veja Webhooks para a verificação de assinatura, o comportamento de novas tentativas e o catálogo completo de eventos.
Próximos passos
- Autenticação — escopos, rotação de chaves, boas práticas de ambiente.
- Sua primeira requisição — o mesmo fluxo sem a sessão hospedada (você envia os documentos por conta própria).
- Referência de requisições de KYC — todos os endpoints, todos os campos.
- Webhooks — configure a verificação de assinatura antes de ir para produção.
Documentação para desenvolvedores da Certivant
Crie integrações com a API da Certivant — KYC, KYB, envio de documentos, sessões hospedadas e eventos de webhook.
Autenticação
Autentique cada chamada à API da Certivant com uma chave de API Bearer — cobre a criação de chaves, escopos, o formato do cabeçalho Authorization, rotação sem interrupção, revogação e boas práticas de segurança.