Clav
Produtos

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
EVMEIP-191 (personal_sign), em qualquer rede compatível com Ethereum
BITCOINBIP-322, com BIP-137 como alternativa
TRONsignMessageV2 (a versão 1 é recusada)
SOLANAEd25519

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:

statusSignificado
PENDINGAguardando a assinatura.
VERIFIEDAssinatura conferida. O endereço virou carteira verificada.
FAILEDA assinatura foi recusada. Veja failureReason.
EXPIREDUma 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

failureReasonO que aconteceu
INVALID_ADDRESSO endereço não pertence à rede informada.
MALFORMED_SIGNATUREA assinatura não pôde ser lida ou não é válida.
ADDRESS_MISMATCHA assinatura é válida, mas foi feita por outro endereço.
UNSUPPORTED_SCHEMEA carteira usou um padrão de assinatura que não aceitamos.
CHALLENGE_EXPIREDO prazo do desafio acabou.
ATTEMPTS_EXCEEDEDO desafio recebeu tentativas demais.
VERIFIER_UNAVAILABLENã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.