BlendFi
KYC

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 registrada
  • user.kyc_approved: aprovado
  • user.kyc_rejected: rejeitado, com rejection_reason no payload
  • user.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_reasonO que aconteceuO que dizer ao cliente final
document_unreadableFotos borradas, com reflexo ou cortadasRefazer com luz melhor e o documento inteiro em quadro
document_expiredDocumento enviado fora da validadeEnviar documento atual
liveness_failedSelfie não bateu com o documento ou era foto-de-fotoTentar com o rosto real diante da câmera
pep_matchCliente final bateu em lista de pessoas politicamente expostasCaso escalado pela BlendFi; você ouve do suporte
sanctions_matchCliente final bateu em lista de sançõesCliente final não pode ser cadastrado
data_mismatchDados do documento não batem com o nome ou CPF informadoVerifique 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

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.

Nesta página