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.

O que a PayGrid verifica
  • 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.
Quando algo fica ambíguo (ex.: o OCR não lê a data), a sessão vai para análise manual no dashboard.

Como funciona (visão geral)

  1. Seu backend cria uma sessão e recebe um facelink_url.
  2. Você abre o facelink para o usuário (redirect, webview ou iframe).
  3. O usuário faz a prova de vida — e envia o documento, se for pedido.
  4. No fim, a página volta para o seu callback_url com status e session_id.
  5. 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"
  }'
CampoTipoDescrição
subjectstringObrigatório. Identificador da pessoa no seu sistema.
flowstringliveness (só prova de vida) ou facematch (selfie × documento). Default: liveness.
min_agenumberIdade mínima. Quando informado, a idade é validada (estimativa e, se preciso, o documento).
referencestringReferência livre sua (pedido, conta…). Aparece na sessão.
callback_urlstringPara onde a página volta no fim (com status e session_id).
cancel_urlstringPara 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"
}
Guarde o 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

O documento só é pedido quando realmente precisa: na validação de idade, se a estimativa for precisa e estiver claramente acima do mínimo, a sessão é aprovada sem documento. Se a precisão for baixa ou a idade ficar perto do limite, o documento é solicitado — e aí valida a idade via OCR (sem facematch).

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…
O callback traz só aprovado/negado. Ele não é assinado — então não decida só por ele. Confirme sempre consultando a sessão (passo 5), que é a fonte da verdade.

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:

CampoDescrição
statusResultado da sessão (ver tabela de status).
livenessis_live + liveness_score.
ageestimated_age + age_confidence (0–1).
face_matchmatch + similarity_score (só no fluxo facematch).
documentDados do OCR: cpf, name, birthdate.
selfie_url / document_urlURLs assinadas das imagens (expiram em ~15 min).
denied_reasonMotivo, quando negada ou enviada para análise manual.

Status da sessão

StatusSignificado
initiatedCriada; o usuário ainda não enviou nada.
processingFrames recebidos, sendo processados.
requires_documentÉ preciso enviar o documento para concluir.
requires_manualAmbíguo — aguarda análise no dashboard.
approvedAprovada.
deniedNegada (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

flowO que fazDocumento
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

Erros comuns

SituaçãoO 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.
Resumo: criar sessão → abrir o facelink → receber o callback → consultar a sessão. A consulta à sessão é a fonte da verdade.