Fluxo de KYC
Como dirigir o KYC de plataforma do cliente final, da criação do usuário ao status approved, com webhooks ou polling.
Não conhece KYC?
A página de Visão geral cobre os dois níveis de KYC (plataforma e cripto), os estados e os erros. Esta página é o guia prático do KYC de plataforma, que é o que sua integração dirige.
Saiba mais →Todo cliente final BlendFi precisa completar o KYC de plataforma antes de movimentar dinheiro. É exigência regulatória: sem kyc_status: approved, qualquer cotação ou transação retorna kyc_required (422). A BlendFi conduz a verificação por trás do endpoint; sua integração só conversa com a API da BlendFi.
Como tudo se encaixa
Sua aplicação BlendFi Verificação de identidade
│ │ │
├── POST /v1/users ────►│ │
│◄── usuário criado ────┤ │
│ (kyc: not_started) │ │
│ │ │
├── POST /v1/users/{id}/kyc ─► │
│ ├── inicia submissão ─────────►│
│ │◄────── link assinado ────────┤
│◄── submissão criada ──┤ │
│ (kyc: pending, │ │
│ websdk_url) │ │
│ │ │
├── redireciona cliente final para websdk_url ─────────►
│ │ (cliente envia documentos) │
│ │◄──── webhook de resultado ───┤
│ │ │
│◄── webhook user.kyc_approved ─┤ │
│ (kyc: approved) │ │
│ │ │
│ ├── inicia KYC cripto em segundo plano
│ │Você só chama a BlendFi. A BlendFi conduz a verificação e reflete os resultados de volta via webhook.
Cinco resultados
`not_started`
Usuário existe; submissão ainda não foi iniciada. Não pode transacionar.
`pending`
Submissão em andamento, sob análise. Não pode transacionar.
`approved`
Cliente final passou no KYC de plataforma. Pode transacionar. Validade padrão de 12 meses; é renovada antes do vencimento.
`rejected`
Verificação rejeitou os documentos. Cliente final não pode transacionar. Pode reenviar (volta para pending), exceto em casos terminais.
`expired`
KYC aprovado ultrapassou a validade. Cliente final precisa reverificar antes de transacionar.
O caminho completo
1. Crie o usuário
curl -X POST $BLENDFI_BASE/v1/users \
-H "Authorization: Bearer $BLENDFI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{
"external_id": "seu-usuario-001",
"name": "Ada Lovelace",
"cpf": "52998224725"
}'O usuário é criado com kyc_status: not_started. O CPF é armazenado de forma criptografada e nunca é devolvido em texto plano.
2. Inicie a submissão de KYC
A chamada gera uma URL assinada de uso único hospedada pela BlendFi para o cliente final completar a verificação.
curl -X POST $BLENDFI_BASE/v1/users/01J.../kyc \
-H "Authorization: Bearer $BLENDFI_KEY" \
-H "Idempotency-Key: $(uuidgen)"Resposta:
{
"user_id": "01J...",
"status": "pending",
"websdk_url": "https://verify.blendfi.com.br/start/eyJ...",
"websdk_url_expires_at": "2026-04-29T13:30:00Z"
}kyc_status muda para pending imediatamente, antes mesmo de os documentos serem enviados. Esse é o estado de "tem submissão em andamento".
Tempo de vida do link
O websdk_url vale até websdk_url_expires_at. Se o cliente final não abrir a tempo, chame POST /v1/users/{id}/kyc de novo para gerar um novo link. O estado da submissão continua em pending, sem perda de progresso.
3. Redirecione o cliente final
Abra websdk_url em uma aba do navegador, em iframe ou em webview mobile. O fluxo guia o cliente pela captura de documento, selfie e prova de vida, e fecha sozinho.
O cliente final não volta para o seu app com um status; a verificação não conhece suas URLs. O resultado chega via webhook (próximo passo) ou por polling em GET /v1/users/{id}/kyc.
4. Receba o resultado por webhook
Quando a verificação termina a análise, a BlendFi atualiza kyc_status e dispara um webhook para a sua URL registrada.
{
"type": "user.kyc_approved",
"user_id": "01J...",
"external_id": "seu-usuario-001",
"kyc_status": "approved",
"approved_at": "2026-04-29T13:08:00Z",
"expires_at": "2027-04-29T13:08:00Z"
}Tipos de evento possíveis:
user.kyc_pending: submissão registradauser.kyc_approved: aprovadouser.kyc_rejected: rejeitado, comrejection_reasonno payloaduser.kyc_expired: validade do aprovado caducou
Se ainda não tem webhooks configurados, faça polling como fallback:
curl $BLENDFI_BASE/v1/users/01J.../kyc \
-H "Authorization: Bearer $BLENDFI_KEY"{
"user_id": "01J...",
"status": "approved",
"approved_at": "2026-04-29T13:08:00Z",
"expires_at": "2027-04-29T13:08:00Z"
}5. (Para offramp) Aguarde o KYC cripto rodar
A BlendFi inicia o KYC cripto automaticamente assim que o KYC de plataforma é aprovado. Você não precisa de nenhuma chamada adicional. Em condições normais, quando o cliente final tenta a primeira operação offramp, o KYC cripto já está aprovado e a operação segue.
Se a tentativa de offramp acontecer durante a janela em que o KYC cripto ainda está rodando, você recebe crypto_kyc_pending (422). Aguarde alguns segundos e retente. Em casos raros, o KYC cripto pode ser recusado e você recebe crypto_kyc_declined (422); nesse caso, contate o suporte com o user_id.
Para clientes apenas onramp, o KYC cripto não é exigido e não bloqueia operações.
6. Transacione
Com kyc_status: approved (e KYC cripto pronto, para offramp), o cliente final pode ser sujeito de cotação, transação e qualquer endpoint que movimente dinheiro. Antes disso, esses endpoints respondem com erro claro apontando de volta para o passo do KYC.
Forçando resultados de KYC no sandbox
O sandbox usa um espelho da verificação. Para evitar esperar uma análise de documento real, use o test helper para forçar qualquer resultado:
curl -X POST $BLENDFI_BASE/v1/test_helpers/users/01J.../kyc \
-H "Authorization: Bearer $BLENDFI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{"status": "approved"}'Valores aceitos: "approved", "rejected", "expired". O webhook é disparado exatamente como em produção, então sua lógica de handler é exercitada de ponta a ponta.
Apenas no sandbox
/v1/test_helpers/* não existe em produção. Garanta que os caminhos de código que forçam resultados de KYC estejam marcados como test-only e nunca rodem contra api.blendfi.com.br.
Renovação e expiração
KYCs aprovados valem por 12 meses por padrão. A BlendFi monitora a expiração e move o usuário para kyc_status: expired no dia do limite. Você recebe um webhook user.kyc_expired 7 dias antes da expiração para avisar o cliente final com antecedência.
Reverificação é uma chamada POST /v1/users/{id}/kyc nova. O cliente final passa pelo mesmo fluxo. Não há endpoint separado de "renovação".
Rejeições
Resultado rejected inclui um rejection_reason:
{
"user_id": "01J...",
"status": "rejected",
"rejected_at": "2026-04-29T13:08:00Z",
"rejection_reason": "document_unreadable"
}Razões comuns:
rejection_reason | O que aconteceu | O que dizer ao cliente final |
|---|---|---|
document_unreadable | Fotos borradas, com reflexo ou cortadas | Refazer com luz melhor e o documento inteiro em quadro |
document_expired | Documento enviado fora da validade | Enviar documento atual |
liveness_failed | Selfie não bateu com o documento ou era foto-de-foto | Tentar com o rosto real diante da câmera |
pep_match | Cliente final bateu em lista de pessoas politicamente expostas | Caso escalado pela BlendFi; você ouve do suporte |
sanctions_match | Cliente final bateu em lista de sanções | Cliente final não pode ser cadastrado |
data_mismatch | Dados do documento não batem com o nome ou CPF informado | Verifique inputs de external_id, name, cpf |
Cliente final rejected pode reenviar (POST /v1/users/{id}/kyc de novo). A nova submissão substitui a rejeição; status volta para pending.
pep_match e sanctions_match são terminais; reenvio não resolve. Tratamos caso a caso.
Próximos passos
Visão geral do KYC
Os dois níveis (plataforma e cripto), estados, webhooks e erros em uma página.
Início rápido
Crie o primeiro usuário e dispare o primeiro KYC.
Webhooks
Verificação de assinatura via X-Blendfi-Signature, retentativas e janela de replay.
Erros e retentativas
Como tratar kyc_required, crypto_kyc_pending e os demais códigos.
FAQ
O cliente final pode reenviar se for rejeitado?
Pode, para a maioria das razões. Chame POST /v1/users/{id}/kyc de novo para gerar novo link; o cliente final passa pelo fluxo de novo. Casos terminais: pep_match e sanctions_match, que exigem revisão humana.
O que acontece se o cliente final fechar a verificação no meio?
kyc_status continua pending. O fluxo guarda o estado parcial por cerca de 24 horas; reabrir o mesmo link dentro dessa janela retoma de onde parou. Após expirar, gere um novo link.
Eu preciso verificar a assinatura do webhook?
Precisa. Os webhooks da BlendFi carregam o cabeçalho X-Blendfi-Signature (HMAC-SHA-256 sobre {t}.{raw_body}, com segredo por endpoint). Rejeite qualquer entrega cuja assinatura não bata. Detalhes em Webhooks.
Por que not_started existe se eu sempre inicio o KYC logo após criar o usuário?
Algumas integrações criam o usuário cedo (ex.: lista de espera) e só disparam o KYC quando o cliente final faz uma ação relevante. Os dois passos suportam esse padrão. Se você sempre inicia na hora, trate not_started como transiente que sua UI nunca mostra.
Posso ver as imagens dos documentos rejeitados? Não. As imagens ficam com a verificação. A BlendFi recebe apenas o veredicto e a razão de rejeição. É uma fronteira de privacidade intencional.
O cliente final passou no KYC em outro produto que eu opero, posso pular o KYC da BlendFi? Não. Reverificamos por organização BlendFi, independente de o mesmo cliente final ter sido verificado em outro lugar. Exigência regulatória.
Preciso fazer alguma chamada para o KYC cripto?
Não. O KYC cripto é iniciado automaticamente após o KYC de plataforma ser aprovado. Você só observa o resultado quando uma operação offramp falha com crypto_kyc_required, crypto_kyc_pending ou crypto_kyc_declined, que são situações de borda.
