Pular para o conteúdo principal

KYC

Integracao de verificacao de identidade (Know Your Customer) no template. Suporta multiplos operadores via o pacote @cactus-agents/kyc.

Visao geral

Usuario clica "Iniciar verificacao"


useKycFlow → POST /api/kyc/start


API retorna URL do iframe + kycId + operador


KycModal renderiza iframe do operador


Polling: POST /api/kyc/status (a cada 5s)

├── PROCESSING / LIVENESS_PENDING → continua polling
├── APPROVED / MANUAL_APPROVED → step: "validated" → onValidated()
├── REPROVED / MANUAL_REPROVED → step: "failed"
└── MANUAL_APPROVE_PENDING → step: "manual_refresh"

Arquivos principais

ArquivoTipoDescricao
hooks/useKycFlow.tsHookOrquestra start, iframe, polling de status
store/kyc.tsStore (Zustand)Estado completo do fluxo KYC
components/kyc/KycModal.tsxComponentModal com iframe do operador
components/kyc/LazyKycModal.tsxComponentLazy wrapper para o modal
services/kyc.client.tsService (client)Chama API routes de KYC
services/kyc.server.tsService (server)Chama SDK KYC no server
routes/api.kyc.start.tsAPI RouteInicia KYC via SDK
routes/api.kyc.status.tsAPI RouteConsulta status via SDK

Store — useKycStore

interface KycState {
open: boolean;
source: string; // contexto que disparou (global, deposit, etc.)
recoveryToken: string | null; // token de link de recuperacao

kycId: number | null; // ID da verificacao
operator: KycOperatorName | null; // operador ativo
iframeUrl: string; // URL do iframe
flow: KycFlowType; // "default" | "mobile" | "manual_approve_pending"
step: KycVerificationStep; // estado atual do fluxo

isKycLoading: boolean;
isCheckStatusLoading: boolean;
isPollingRunning: boolean;
error: string | null;

reloadOnValidated: boolean;
onValidated: ((payload) => void) | null;

openKycModal(options?: OpenKycOptions): void;
closeKycModal(): void;
// ... setters
}

Steps do fluxo

StepDescricao
initialEstado inicial, aguardando usuario clicar
startedKYC iniciado, iframe carregando
checkingPolling de status ativo
finishedOperador finalizou (aguardando resultado)
validatedKYC aprovado
failedKYC reprovado
expiredSessao expirada
manual_refreshAprovacao manual pendente
internal_start_errorErro ao iniciar
internal_status_errorErro ao consultar status

Abrindo o KYC programaticamente

O modal KYC pode ser aberto de qualquer lugar via store:

import { useKycStore } from "~/store/kyc";

const openKycModal = useKycStore((s) => s.openKycModal);

openKycModal({
source: "deposit",
autoStart: true,
reloadOnValidated: false,
onValidated: async (payload) => {
// payload.kyc_id disponivel
console.log("KYC aprovado", payload);
},
});

Dentro do sistema de validacoes

O KycStep (em components/validation/steps/KycStep.tsx) abre o modal com autoStart: true e reloadOnValidated: false, usando o callback onValidated para notificar a resolucao ao sistema de steps.

Rota de recuperacao

A rota user/validate/:type/:token permite que o usuario complete o KYC via link enviado por e-mail/SMS:

/user/validate/kyc/abc123

O type identifica o tipo de validacao e o token e o token de recuperacao. O componente abre o modal KYC com recoveryToken preenchido.