Verificação de carteira
Comprove que o seu cliente controla uma carteira autocustodiada antes de liberar um saque, sem enviar dados pessoais para a Clav.
Para que serve
A verificação de carteira comprova que um cliente final controla o endereço de autocustódia para onde quer sacar. Ela atende à exigência do art. 76-A, §5º da Resolução BCB 277/2022, com a redação dada pela Resolução BCB 521/2025.
O cliente assina uma mensagem com a própria carteira. A Clav confere a assinatura, guarda a prova e passa a responder, a cada saque, se aquele endereço está verificado.
Sem dados pessoais
Você envia apenas um identificador opaco do cliente. Quem é a pessoa por trás dele continua só no seu sistema.
Prova criptográfica
A Clav confere a assinatura contra o endereço informado e guarda a mensagem assinada como evidência.
Trilha de auditoria
Cada emissão, tentativa, aprovação, falha e revogação vira um evento imutável, consultável na plataforma.
Recurso habilitado por organização
A verificação de carteira vem desligada por padrão. Se o menu Carteiras verificadas não aparece para você, peça à equipe da Clav para habilitar o recurso na sua organização.
Redes suportadas
Rede (chain) | Padrão de assinatura aceito |
|---|---|
EVM | EIP-191 (personal_sign), em qualquer rede compatível com Ethereum |
BITCOIN | BIP-322, com BIP-137 como alternativa |
TRON | signMessageV2 (a versão 1 é recusada) |
SOLANA | Ed25519 |
O endereço é aceito com qualquer capitalização e normalizado para a forma canônica da rede antes de ser gravado. Use sempre o endereço que volta na resposta, não o que você enviou.
Como funciona
Você abre um desafio
Quando o cliente cadastra um endereço de saque, você cria um desafio informando a rede, o endereço e o identificador do cliente no seu sistema. A Clav devolve a mensagem exata que precisa ser assinada e um link para a página de assinatura.
O cliente assina
Você manda o cliente para o link. A página conecta a carteira dele e pede a assinatura, mostrando o nome da sua organização em destaque para que ele reconheça o pedido. Se preferir, exiba a mensagem na sua própria interface e colete a assinatura por lá.
A Clav confere e registra
A assinatura é verificada contra o endereço. Se bater, o endereço vira uma carteira verificada. Se não bater, o desafio termina como falho e o motivo fica registrado.
Você consulta antes de cada saque
Na hora de liberar o saque, pergunte à API se o endereço está verificado. A resposta leva em conta revogações feitas depois da prova.
Pela plataforma, sem integração
Para um piloto, dá para usar sem escrever código. Em Carteiras verificadas, clique em Verificar carteira, preencha Identificador do cliente, Rede e Endereço, e clique em Criar link. Envie o link ao cliente pelo canal que você já usa com ele.
A tela tem duas abas: as carteiras já verificadas e os desafios aguardando assinatura. Ao abrir uma carteira, você vê a mensagem assinada, o método usado e a trilha completa de eventos.
Pela API
A integração usa a API REST em https://api.clav.tech/v1, autenticada com uma
chave de API que tenha o escopo wallet:verify. O guia de chaves de
API mostra como emitir uma. Todas as consultas ficam
restritas à organização dona da chave.
Abrir um desafio
POST /v1/wallet-proofs
Authorization: Bearer <token>
Content-Type: application/json
{
"externalCustomerId": "customer-8842",
"chain": "EVM",
"address": "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4",
"ttlSeconds": 600
}ttlSeconds define por quanto tempo o desafio aceita assinatura, entre 60 e
86400 segundos. Sem ele, o prazo é de 600 segundos (10 minutos).
{
"id": "65f0a1b2c3d4e5f60718293a",
"nonce": "a3f1c0d9e8b7a6f5e4d3c2b1a0998877665544332211ffeeddccbbaa99887766",
"message": "...",
"expiresAt": "2026-09-16T12:10:00.000Z",
"verificationUrl": "https://.../p/a3f1c0d9..."
}Envie o cliente para verificationUrl. Se você mesmo for coletar a
assinatura, exiba message exatamente como veio: um caractere diferente gera
outra assinatura e a prova falha.
A mensagem é assinada byte a byte
Não traduza, não reformate e não remova quebras de linha de message. A Clav
reconstrói o texto original para conferir a assinatura.
Acompanhar um desafio
GET /v1/wallet-proofs/{nonce}O campo status passa por estes estados:
status | Significado |
|---|---|
PENDING | Aguardando a assinatura. |
VERIFIED | Assinatura conferida. O endereço virou carteira verificada. |
FAILED | A assinatura foi recusada. Veja failureReason. |
EXPIRED | Uma assinatura chegou depois do prazo. |
Um desafio que ninguém tentou assinar continua como PENDING mesmo depois do
prazo. Para saber se ele ainda vale, compare expiresAt com o horário atual.
Um desafio aceita uma única assinatura. Se ela for recusada, abra um novo
desafio. Para ser avisado sem precisar consultar, assine os
webhooks wallet.verified e wallet.failed.
Consultar antes do saque
GET /v1/wallets?chain=EVM&address=0x5b38da6a701c568545dcfcb03fcb875f56beddc4{
"verified": true,
"wallet": {
"id": "65f0a1b2c3d4e5f60718293b",
"chain": "EVM",
"address": "0x5b38da6a701c568545dcfcb03fcb875f56beddc4",
"externalCustomerId": "customer-8842",
"method": "SIGNATURE",
"status": "ACTIVE",
"challengeId": "65f0a1b2c3d4e5f60718293a",
"verifiedAt": "2026-09-16T12:04:11.000Z",
"revokedAt": null
}
}Libere o saque olhando apenas para verified. Ele só é true quando existe uma
prova com status ACTIVE. Uma carteira revogada ainda aparece em wallet,
mas com verified: false. Um endereço inválido para a rede também responde
verified: false, sem erro HTTP.
Revogar uma carteira
POST /v1/wallets/{id}/revoke
Content-Type: application/json
{ "reason": "Ticket 4412: cliente removeu o endereço" }A partir da resposta, a consulta passa a devolver verified: false e o cliente
precisa provar o endereço de novo. A prova continua registrada, com status
REVOKED, e o motivo vai para a trilha de auditoria.
Motivos de falha
failureReason | O que aconteceu |
|---|---|
INVALID_ADDRESS | O endereço não pertence à rede informada. |
MALFORMED_SIGNATURE | A assinatura não pôde ser lida ou não é válida. |
ADDRESS_MISMATCH | A assinatura é válida, mas foi feita por outro endereço. |
UNSUPPORTED_SCHEME | A carteira usou um padrão de assinatura que não aceitamos. |
CHALLENGE_EXPIRED | O prazo do desafio acabou. |
ATTEMPTS_EXCEEDED | O desafio recebeu tentativas demais. |
VERIFIER_UNAVAILABLE | Não foi possível verificar a assinatura naquele momento. |
Em ADDRESS_MISMATCH, a Clav guarda o endereço que de fato assinou. É um dado
útil numa investigação de prevenção à lavagem de dinheiro.
Perguntas frequentes
A Clav recebe o nome ou o CPF do cliente?
Não. Você envia só externalCustomerId, um identificador que faz sentido no
seu sistema. A Clav guarda e devolve esse valor, mas nunca o interpreta.
O cliente precisa criar conta na Clav?
Não. A página de assinatura é aberta pelo link do desafio e não pede login.
O que acontece se o cliente verificar o mesmo endereço de novo?
A carteira verificada existente é atualizada com a nova prova. Não surge um registro duplicado.
Posso usar a consulta de carteira no caminho do saque?
Sim, ela foi pensada para isso. É uma leitura única e indexada.
Um desafio VERIFIED basta para liberar o saque?
Não. O desafio é o registro de como a carteira foi provada. Para decidir o
saque, use GET /v1/wallets, que também considera revogações posteriores.
Avaliação de documentos com IA
Confira se os documentos de uma evidência atendem ao requisito antes da auditoria, com cada achado apoiado em um trecho do arquivo.
Arquitetura dos relatórios regulatórios
Os dois modelos de operação dos relatórios ao Banco Central: o agente que roda na infraestrutura da PSAV e o modelo gerenciado pela Clav.