Primeiros passosInício rápido

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

Entre no painel e abra a sua organização.
Acesse KYC → Desenvolvedor no menu lateral esquerdo.

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 fraude
  • kyc:write — criar requisições e enviar documentos
  • kyc:submit — enviar uma requisição para processamento automatizado
  • kyc:manage — substituir decisões e excluir solicitantes (GDPR)
Clique em Criar. A chave completa é exibida uma única vez e começa com 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