KYC Verificação de identidade
Como pedir a verificação de identidade de uma pessoa — prova de vida, comparação do rosto com o documento e idade mínima — e como ler o resultado.
- Prova de vida (liveness): garante que é uma pessoa real na câmera, com movimento entre os frames (anti-spoofing).
- Facematch: compara o rosto da selfie com a foto do
documento (só no fluxo
facematch). - Documento (OCR): lê CPF, nome e data de nascimento.
- Idade mínima: valida a idade estimada e, se necessário, a data de nascimento do documento.
Como funciona (visão geral)
- Seu backend cria uma sessão e recebe um
facelink_url. - Você abre o facelink para o usuário (redirect, webview ou iframe).
- O usuário faz a prova de vida — e envia o documento, se for pedido.
- No fim, a página volta para o seu
callback_urlcomstatusesession_id. - Seu backend consulta a sessão para ler o resultado completo.
1. Crie a sessão
Chamada servidor-a-servidor com a sua chave de API
(X-Api-Key: sk_…). O subject é o identificador
da pessoa no seu sistema.
curl -X POST https://api.paygrid.tech/v1/kyc/sessions \
-H "X-Api-Key: sk_sua_chave" \
-H "Content-Type: application/json" \
-d '{
"subject": "user_123",
"flow": "liveness",
"min_age": 18,
"reference": "pedido-4211",
"callback_url": "https://sua-loja.com/kyc/retorno",
"cancel_url": "https://sua-loja.com/kyc/cancelado"
}'
| Campo | Tipo | Descrição |
|---|---|---|
subject | string | Obrigatório. Identificador da pessoa no seu sistema. |
flow | string | liveness (só prova de vida) ou facematch (selfie × documento). Default: liveness. |
min_age | number | Idade mínima. Quando informado, a idade é validada (estimativa e, se preciso, o documento). |
reference | string | Referência livre sua (pedido, conta…). Aparece na sessão. |
callback_url | string | Para onde a página volta no fim (com status e session_id). |
cancel_url | string | Para onde voltar se o usuário fechar/cancelar. |
Resposta (201):
{
"session_id": "0f2c…",
"subject": "user_123",
"flow": "liveness",
"min_age": 18,
"status": "initiated",
"facelink_url": "https://kyc.paygrid.tech/verify/0f2c…?tenant_id=acme&signature=…",
"signature": "…",
"callback_url": "https://sua-loja.com/kyc/retorno",
"expires_at": "2026-09-24T18:00:00Z",
"created_at": "2026-09-24T17:00:00Z"
}
session_id. O facelink_url já vem
pronto — não monte a URL manualmente. A sessão expira em
60 minutos.
2. Abra o facelink para o usuário
Redirecione o navegador do usuário para o facelink_url
(ou abra numa webview/iframe). A página é responsiva, pede acesso à
câmera e guia a captura. Não é preciso passar nada além da URL.
<a href="https://kyc.paygrid.tech/verify/0f2c…?tenant_id=acme&signature=…">
Verificar minha identidade
</a>
3. O que acontece na página
- Introdução: explica os passos.
- Prova de vida: o usuário enquadra o rosto na máscara e segue as instruções (olhar para a câmera, virar à esquerda, virar à direita). Tudo automático.
- Documento (quando necessário): fotos da frente e do verso. O OCR é feito no servidor.
- Fim: a página redireciona para o seu callback.
4. Receba o callback
No fim, a página volta para o seu callback_url (ou
cancel_url), com o resultado na query string:
https://sua-loja.com/kyc/retorno?status=approved&session_id=0f2c…
https://sua-loja.com/kyc/retorno?status=denied&session_id=0f2c…
https://sua-loja.com/kyc/cancelado?status=cancelled&session_id=0f2c…
5. Leia o resultado
Consulte a sessão para ver o desfecho completo:
curl https://api.paygrid.tech/v1/kyc/sessions/{session_id} \
-H "X-Api-Key: sk_sua_chave"
{
"session_id": "0f2c…",
"subject": "user_123",
"flow": "liveness",
"min_age": 18,
"status": "approved",
"liveness": { "is_live": true, "liveness_score": 0.98 },
"age": { "estimated_age": 33, "age_confidence": 0.8 },
"face_match": { "match": true, "similarity_score": 0.62 },
"document": { "cpf": "03127085567", "name": "LEONARDO R. DA SILVA CASTRO", "birthdate": "1992-06-11" },
"selfie_url": "https://… (URL assinada, expira)",
"document_url": "https://… (URL assinada, expira)",
"denied_reason": "idade estimada abaixo do mínimo",
"created_at": "2026-09-24T17:00:00Z",
"updated_at": "2026-09-24T17:03:10Z"
}
Campos da resposta:
| Campo | Descrição |
|---|---|
status | Resultado da sessão (ver tabela de status). |
liveness | is_live + liveness_score. |
age | estimated_age + age_confidence (0–1). |
face_match | match + similarity_score (só no fluxo facematch). |
document | Dados do OCR: cpf, name, birthdate. |
selfie_url / document_url | URLs assinadas das imagens (expiram em ~15 min). |
denied_reason | Motivo, quando negada ou enviada para análise manual. |
Status da sessão
| Status | Significado |
|---|---|
initiated | Criada; o usuário ainda não enviou nada. |
processing | Frames recebidos, sendo processados. |
requires_document | É preciso enviar o documento para concluir. |
requires_manual | Ambíguo — aguarda análise no dashboard. |
approved | Aprovada. |
denied | Negada (ver denied_reason). |
Enquanto a sessão estiver em processing /
requires_document, consulte de novo depois — o usuário pode
estar no meio do fluxo. Trate como final apenas
approved, denied e
requires_manual.
Fluxos
| flow | O que faz | Documento |
|---|---|---|
liveness |
Prova de vida. Com min_age, valida a idade. |
Só se a idade precisar de confirmação (sem facematch). |
facematch |
Prova de vida + comparação do rosto com o documento. | Sempre (é o que compara a selfie com o documento). |
Análise manual
Quando a sessão fica requires_manual, ela aparece no
dashboard com as imagens (selfie e documento) e o motivo. Um operador
aprova ou nega:
curl -X POST https://api.paygrid.tech/v1/kyc/sessions/{session_id}/approve \
-H "X-Api-Key: sk_sua_chave" -H "Content-Type: application/json" \
-d '{"reason": "documento legível e idade confirmada"}'
# ou negar
curl -X POST https://api.paygrid.tech/v1/kyc/sessions/{session_id}/deny \
-H "X-Api-Key: sk_sua_chave" -H "Content-Type: application/json" \
-d '{"reason": "documento ilegível"}'
Imagens e privacidade
- As imagens ficam em armazenamento privado e são destruídas em ~1 hora.
selfie_urledocument_urlsão URLs assinadas de curta duração (~15 min) — baixe o que precisar logo após a decisão.- Use as imagens apenas para a finalidade da verificação (LGPD).
Erros comuns
| Situação | O que fazer |
|---|---|
| Callback não chegou | O usuário pode ter fechado a página. Consulte a sessão pelo session_id; se ainda estiver processing, aguarde. |
denied_reason: "não foi possível estimar a idade" |
O rosto não ficou legível o bastante. Peça para refazer a captura em local bem iluminado. |
| Sessão expirada | Sessões duram 60 min. Crie uma nova e reenvie o facelink. |