1 Visão geral
A WantsPay é uma camada única de infraestrutura financeira: uma integração dá acesso a um catálogo completo de serviços financeiros e de compliance. Todos os valores em reais trafegam em centavos (amount_cents); quantidades de cripto e moedas estrangeiras são strings decimais.
📤 Cash-out
Receba USDT/USDC e liquide em PIX. Serviço-base de toda chave.
⚡ Payouts PIX
Envie PIX direto a partir do saldo, sem passar por cripto.
📥 Cash-in
O cliente paga PIX e você entrega cripto ou guarda como saldo.
🌎 SWIFT
Cripto → transferência internacional em 20+ moedas (USD, EUR, GBP…).
🪙 Compra de cripto
On-ramp com KYC/KYB obrigatório e trava de 24h na saída.
🏦 Custódia BRL
Saldo em reais por subconta, com extrato e conciliação.
🧾 Boletos
Emita e concilie boletos bancários pela mesma API.
🪪 KYC / KYB
Verificação de pessoas e empresas com decisão e trilha de auditoria.
🔎 Consulta de dados
Enriquecimento e validação de CPF, CNPJ, chave PIX e listas restritivas.
/catalog, /*/limits e /keys/me em vez de assumir valores fixos. Cotações são devolvidas antes de cada operação, já com a taxa aplicada.2 Autenticação
Toda requisição autenticada envia a sua chave no header X-API-Key. Requisições com corpo usam Content-Type: application/json. Uma chave só acessa os serviços aprovados para ela (ver Escopos).
curl --fail-with-body https://api.wantspay.pro/keys/me \
-H "X-API-Key: $WANTSPAY_API_KEY"
.env commitado. O navegador nunca deve falar direto com a API — passe sempre por um route handler do seu backend.Verificar a chave, os escopos e o saldo
/keys/meescopos, limites e taxas/saldosaldo da conta{
"key_id": "key_9f2e…",
"env": "live",
"account_type": "business",
"scopes": ["cashout.pix", "payout.pix"],
"scopes_pending": ["swift.payout", "onramp.buy"],
"partner_fee_bps": 0,
"webhook_url": null,
"limits": { "cashout_max_brl_cents": 5000000 }
}
3 Ambientes & chaves
Existe um ambiente de sandbox (determinístico, sem dinheiro real) e o de produção. Distinga-os pelo prefixo da chave e mantenha-os totalmente separados.
| Ambiente | Como obter a chave | Prefixo |
|---|---|---|
| Sandbox | POST /keys/sandbox — sem e-mail obrigatório | wp_test_… |
| Produção | POST /keys — com e-mail de operação | wp_live_… |
Criar chave de sandbox
curl --fail-with-body https://api.wantspay.pro/keys/sandbox \
-H 'Content-Type: application/json' \
-d '{"name":"Minha integração de teste"}'
Criar chave de produção
curl --fail-with-body https://api.wantspay.pro/keys \
-H 'Content-Type: application/json' \
-d '{
"name":"Integração de produção",
"email":"operacao@suaempresa.com",
"account_type":"business"
}'
A resposta traz api_key, scopes (os já aprovados), limits e uma monitor_url (painel privado de acompanhamento, somente leitura). Guarde a api_key como WANTSPAY_API_KEY no ambiente do servidor.
4 Escopos & aprovação de serviços
Cada chave carrega um conjunto de escopos — os serviços que a WantsPay aprovou para aquele cliente. Uma chamada a um serviço não aprovado responde 403 com erro: "scope_nao_aprovado".
cashout.pix (receber cripto e pagar PIX) e payout.pix ativos. Os demais serviços entram em scopes_pending e são liberados após análise — por API ou no portal do parceiro.| Escopo | Serviço | Padrão |
|---|---|---|
cashout.pix | Cash-out cripto → PIX | ativo |
payout.pix | Payouts PIX a partir do saldo | ativo |
cashin.crypto | Cash-in PIX → cripto | sob aprovação |
custody.brl | Custódia em reais & subcontas | sob aprovação |
swift.payout | Transferência SWIFT em 20+ moedas | sob aprovação |
onramp.buy | Compra de cripto (KYC/KYB + trava 24h) | sob aprovação |
boleto.issue | Emissão e conciliação de boletos | sob aprovação |
kyc | Verificação de pessoas (KYC) | sob aprovação |
kyb | Verificação de empresas (KYB) | sob aprovação |
data.lookup | Consulta e enriquecimento de dados | sob aprovação |
Solicitar um serviço adicional
/keys/me/scopes/requestpede aprovação de um serviço{
"scopes": ["swift.payout", "onramp.buy"],
"note": "Vamos oferecer remessa internacional aos nossos clientes PJ."
}
Enquanto um escopo está em análise ele aparece em scopes_pending. Você pode acompanhar por GET /keys/me ou receber o evento key.scope_approved por webhook. A aprovação final é da WantsPay e pode exigir documentação adicional do cliente.
403 scope_nao_aprovado como estado normal do fluxo — mostre ao usuário que o serviço precisa ser habilitado, não como erro de código.5 Comece agora
Do zero à primeira liquidação em quatro passos — usando o serviço-base (cash-out cripto → PIX).
Gere a chave de sandbox
Uma chamada a POST /keys/sandbox devolve uma chave wp_test_…. Exporte como WANTSPAY_API_KEY.
Confira chave, escopos e saldo
GET /keys/me e GET /saldo validam a autenticação e mostram serviços aprovados, limites e taxas vigentes.
Cote um cash-out
POST /cashout/preview devolve quanto o cliente recebe em PIX por um valor em USDT — sem criar ordem.
Crie e acompanhe até liquidar
POST /cashout gera o endereço de depósito. Acompanhe por GET /cashout/{id} ou receba o webhook cashout.completed.
curl --fail-with-body https://api.wantspay.pro/cashout/preview \
-H "X-API-Key: $WANTSPAY_API_KEY" \
-H 'Content-Type: application/json' \
-d '{ "asset":"USDT", "network":"polygon", "amount":"100.00", "pix_key":"cliente@example.com" }'
POST /sandbox/cashout/{id}/deposit para simular o depósito de cripto e ver o ciclo completo sem transferir dinheiro real.6 Cash-out · cripto → PIX cashout.pix
O serviço-base da WantsPay: alguém envia cripto de uma carteira externa e você paga em PIX. O fluxo tem três passos — cotar, aceitar (recebe o endereço de depósito) e acompanhar.
Cotar — POST /cashout
Informe asset, network, a chave PIX de destino e um entre amount (cripto) ou brl_amount. Recebe cashout_id, deposit_address e a validade.
Aceitar — POST /cashout/{id}/accept
Confirma os termos e devolve o endereço/estado atualizados para o depósito.
Acompanhar — GET /cashout/{id}
Ao concluir, a resposta traz pix_e2e, pix_paid_at e receipt_url.
{
"asset": "USDT",
"network": "polygon",
"amount": "100.00",
"pix_key": "recebedor@example.com",
"pix_key_type": "email",
"customer_ref": "cliente-42",
"external_id": "cashout-001"
}
Ciclo de estados
Estados terminais: COMPLETED, MANUAL_REVIEW, REFUNDING_CRYPTO, REFUNDED, EXPIRED, FAILED. Estimativa sem criar ordem: POST /cashout/preview.
7 Payouts · PIX via API payout.pix
Envie PIX direto a partir do saldo em custódia — sem intermediar cripto. Requer saldo suficiente (valor + taxas).
/payoutsenvia o PIX/payouts/{payout_id}acompanha{
"amount_cents": 5000,
"pix_key": "recebedor@example.com",
"pix_key_type": "email",
"tax_number": "00000000191",
"customer_ref": "cliente-42",
"external_id": "saque-pix-cliente42-001"
}
Estados: processing → sent / failed / refunded. Quando disponível, o comprovante traz e2e, paid_at, receiver_name e verify_url. Dica: valide o titular da chave antes com POST /data/pix-key.
8 Cash-in · PIX → cripto / custódia cashin.crypto
Uma única cobrança (POST /cashin/charge) atende dois destinos, controlados pelo campo destino:
💰 destino: "saldo"
O PIX vira saldo em reais na custódia (opcionalmente numa subconta via customer_ref). A saída fica para depois.
🪙 destino: "cripto"
Entrega imediata de USDT/USDC no endereço informado. Requer asset, chain e payout_address.
/cashin/chargecria a cobrança PIX{
"amount_cents": 10000,
"payer_tax_number": "00000000191",
"destino": "cripto",
"asset": "usdt",
"chain": "polygon",
"payout_address": "0x1111111111111111111111111111111111111111",
"external_id": "compra-cripto-001"
}
A resposta traz cashin_id, qr_copypaste, qr_image_url e expires_at. Gerar o QR confirma a criação — não o recebimento.
Acompanhar o status
/cashin/{cashin_id}/statusestado da cobrança| Campo | Valores |
|---|---|
status | pending under_review paid expired refunded failed |
settlement_status | pending sending sent incerto failed |
status = paid E settlement_status = sent. Um paid com liquidação sending/incerto ainda não está entregue — não mostre "entregue" ao cliente nem reenvie a operação.9 SWIFT · cripto → 20+ moedas swift.payout
Receba cripto e liquide uma transferência internacional na conta bancária do beneficiário, em mais de 20 moedas. O fluxo espelha o cash-out: cotar → aceitar → depositar → acompanhar.
/swift/currenciesmoedas, países e campos exigidosO catálogo de moedas é dinâmico. Exemplos suportados: USD EUR GBP CHF JPY CAD AUD CNY HKD SGD AED MXN ZAR SEK NOK DKK PLN TRY INR NZD ILS …
Cotar — POST /swift/quote
Informe asset/network de entrada e a currency de saída. Recebe câmbio, taxas e validade.
Criar — POST /swift/transfers
Com os dados do beneficiário (SWIFT/BIC, IBAN, país, endereço) recebe deposit_address para a cripto.
Depositar & acompanhar — GET /swift/transfers/{id}
Ao liquidar, a resposta traz mt103_ref, value_date e receipt_url.
{
"asset": "USDT",
"network": "ethereum",
"currency": "EUR",
"amount_fiat": "2500.00",
"beneficiary": {
"name": "Acme GmbH",
"type": "business",
"country": "DE",
"address": "Friedrichstrasse 100, Berlin"
},
"bank": {
"swift_bic": "DEUTDEFFXXX",
"iban": "DE89370400440532013000"
},
"purpose_code": "GDDS",
"external_id": "swift-eur-001"
}
Ciclo de estados
iban, outros account_number + routing (ABA/Sort Code/BSB). Sempre leia GET /swift/currencies para saber os campos obrigatórios e limites de cada moeda antes de montar o payload.10 Compra de cripto · on-ramp onramp.buy
Compra de criptoativos com KYC/KYB obrigatório, política amplamente descritiva e trava de segurança de 24 horas antes de qualquer saída — proteção contra fraude e conta-laranja.
Cotar — POST /onramp/quote
Quanto de cripto o cliente recebe por um valor em BRL (via PIX ou saldo), com taxa e validade.
Criar a ordem — POST /onramp/orders
Requer customer_ref com KYC/KYB aprovado. Se for pago por PIX, devolve o QR.
Trava de 24h — GET /onramp/orders/{id}
Após o pagamento a cripto é comprada e fica LOCKED_24H. A saída (saque on-chain) só libera em unlock_at.
{
"amount_cents": 200000,
"pay_with": "pix",
"asset": "USDT",
"network": "polygon",
"customer_ref": "cliente-42",
"payout_address": "0x1111111111111111111111111111111111111111",
"external_id": "onramp-001"
}
{
"order_id": "onr_9f2e…",
"status": "LOCKED_24H",
"asset": "USDT",
"crypto_amount": "366.20",
"locked_at": "2026-09-30T14:00:00Z",
"unlock_at": "2026-10-01T14:00:00Z",
"kyc_status": "approved"
}
Ciclo de estados
A trava de 24h é contada a partir de locked_at. Enquanto status=LOCKED_24H, exiba ao cliente a data/hora de unlock_at — não é erro. A liberação pode ser automática (em unlock_at) ou manual via POST /onramp/orders/{id}/release quando RELEASABLE.
11 Custódia BRL & saldo custody.brl
O saldo em reais fica organizado por subconta (customer_ref) sobre a "casa". Consulte, extraia, transfira entre subcontas e saque como cripto ou PIX.
/saldocasa ou ?customer_ref=/saldo/consolidadocasa + subcontas/saldo/extratolançamentos/saldo/transferirentre subcontas/saldo/sacar-criptosaque em USDT/USDC/saldo/clientessaldos por clientetotal_cents, disponivel_cents (sacável, após retenções) e bloqueado_cents. Respeite carencia_ate — mostre ao cliente a data prevista de liberação em vez de tratar como erro.12 Boletos boleto.issue
Emita boletos bancários registrados e concilie o pagamento pela mesma API. O crédito cai na custódia em reais (ou dispara o webhook para o seu fluxo).
/boletosemite o boleto/boletos/{id}status & linha digitável/boletos/{id}/cancelcancela antes do vencimento/boletoslista / concilia{
"amount_cents": 15000,
"due_date": "2026-10-15",
"payer": {
"name": "João da Silva",
"tax_number": "00000000191"
},
"instructions": "Não receber após o vencimento.",
"customer_ref": "cliente-42",
"external_id": "boleto-001"
}
A resposta traz boleto_id, linha_digitavel, barcode, pdf_url e expires_at. Estados: registered → paid / expired / canceled. Pagamento confirmado dispara boleto.paid.
13 KYC · verificação de pessoas kyc
Verificação de identidade de pessoas físicas: documento, selfie com prova de vida, validação de CPF e checagem em listas restritivas. Retorna uma decisão auditável que você pode vincular a um customer_ref (pré-requisito da compra de cripto).
/kyc/sessionscria sessão (URL hospedada)/kyc/sessions/{id}decisão & motivos{
"customer_ref": "cliente-42",
"person": {
"name": "João da Silva",
"tax_number": "00000000191",
"birth_date": "1990-01-01"
},
"level": "full",
"redirect_url": "https://suaempresa.com/kyc/callback",
"external_id": "kyc-cliente42-001"
}
| Campo | Valores |
|---|---|
status | created pending processing approved rejected review expired |
checks | document · liveness · face_match · cpf_status · watchlist · pep |
A resposta traz session_url (fluxo hospedado, pronto para abrir num iframe/redirect), decision, reasons[] e expires_at. Conclusões disparam kyc.approved / kyc.rejected / kyc.review por webhook.
14 KYB · verificação de empresas kyb
Verificação de pessoas jurídicas (CNPJ): situação cadastral, quadro societário (QSA), beneficiários finais (UBO), checagem de sócios em listas restritivas e documentos societários.
/kyb/checksinicia a verificação (CNPJ)/kyb/checks/{id}dados, UBO & decisão{
"customer_ref": "empresa-7",
"company": {
"tax_number": "60281018000130",
"legal_name": "Acme Serviços Ltda"
},
"require_ubo": true,
"require_documents": true,
"external_id": "kyb-empresa7-001"
}
| Campo | Conteúdo |
|---|---|
status | processing approved rejected review |
company | situação cadastral · natureza jurídica · CNAE · endereço · data de abertura |
partners[] | QSA com nome, documento e participação |
ubo[] | beneficiários finais & screening em watchlist/PEP |
Conclusões disparam kyb.approved / kyb.rejected / kyb.review. A decisão aprovada habilita onramp.buy e swift.payout para o customer_ref vinculado.
15 Consulta de dados data.lookup
Enriquecimento e validação em tempo real, roteados para os bureaus da malha WantsPay. Use antes de pagar, cobrar ou aprovar — reduz erro de titularidade e fraude.
| Método | Endpoint | Retorna |
|---|---|---|
| POST | /data/cpf | Nome, situação cadastral, faixa etária, óbito |
| POST | /data/cnpj | Razão social, situação, QSA, CNAE, endereço |
| POST | /data/pix-key | Titular da chave PIX (nome mascarado, banco, tipo) |
| POST | /data/bank-account | Validação de conta bancária & titularidade |
| POST | /data/watchlist | Screening em listas restritivas / PEP / sanções |
{ "pix_key": "recebedor@example.com" }
// resposta
{
"pix_key": "recebedor@example.com",
"owner_name": "J*** da S***",
"owner_tax_masked": "***.000.001-**",
"bank": "Nubank",
"key_type": "email"
}
16 Catálogo, limites & cotações
Nunca fixe redes, moedas, mínimos ou taxas no código — leia-os por API antes de cada operação.
| Endpoint | Para quê |
|---|---|
GET /catalog | Ativos e redes para receber cripto (cash-out/SWIFT), com mínimos/máximos e taxas. |
GET /cashin/catalog | Ativos/redes entregáveis no cash-in (entregavel, instant, min_brl_cents). |
GET /swift/currencies | Moedas SWIFT, países, campos bancários exigidos e limites. |
GET /cashin/limits | Limite do pagador: faixa_instantanea_cents, min_brl_cents. |
POST /cashout/preview | Cotação de cripto → PIX por amount ou brl_amount. |
POST /swift/quote | Cotação de cripto → moeda estrangeira com câmbio e taxas. |
POST /onramp/quote | Cotação de BRL → cripto (on-ramp). |
17 Comissão (partner fee)
Você pode embutir uma comissão própria sobre cada operação, definida em basis points (partner_fee_bps; 200 = 2%). Ela é calculada sobre a base após a taxa da WantsPay e creditada num saldo de comissão separado.
{ "partner_fee_bps": 200 } // 2%
/comissao/comissao/extrato/comissao/sacarA comissão é apurada após a liquidação da operação. Consulte disponivel_cents, min_saque_cents e pode_sacar_agora antes de sacar. Fórmula: floor(base_cents × (10000 − wantspay_bps − partner_bps) / 10000).
18 Webhooks
Configure a URL de recepção em PATCH /keys/me. A resposta devolve o webhook_secret uma única vez — guarde com segurança. Um só endpoint recebe os eventos de todos os serviços da chave.
{ "webhook_url": "https://suaempresa.com/api/wantspay/webhook" }
Assinatura (HMAC-SHA256)
Cada entrega traz o header X-WantsPay-Signature: t=1700000000,v1=<hmac_hex>. Valide o HMAC-SHA256 de timestamp.raw_body — capture o corpo bruto antes de fazer o parse do JSON.
const crypto = require('crypto');
function verify(header, rawBody, secret) {
const t = header.split(',')[0].split('=')[1];
const v1 = header.split(',')[1].split('=')[1];
const expected = crypto
.createHmac('sha256', secret)
.update(`${t}.${rawBody}`)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(v1), Buffer.from(expected) // comparação em tempo constante
);
}
Outros headers: X-WantsPay-Event-Id (dedupe por ele), X-WantsPay-Delivery-Id e X-WantsPay-Attempt (até 12 tentativas em ~7h).
Formato do evento
{
"event": "cashout.completed",
"event_id": "evt_exemplo",
"created_at": "2026-09-30T20:00:00.000Z",
"data": {
"cashout_id": "co_exemplo",
"status": "COMPLETED",
"pix_e2e": "E00000000202609302000…"
}
}
| Grupo | Eventos |
|---|---|
cashout | awaiting_deposit · deposit_detected · processing · under_review · refunding · completed · refunded · expired · failed |
payout | sent · failed · refunded |
cashin | paid · settled · settlement_failed · expired · refunded · failed |
swift | awaiting_deposit · fx_locked · compliance_check · wire_sent · settled · refunded · failed |
onramp | paid · buying · locked · releasable · released · refunded · failed |
boleto | registered · paid · expired · canceled |
kyc / kyb | approved · rejected · review |
saldo | liberado · congelado · transferido |
key | scope_approved · scope_rejected |
webhook | test |
event_id com restrição de unicidade (dedupe); responda 2xx em até 10s e faça o trabalho pesado de forma assíncrona; releia o estado canônico com um GET no recurso antes de atualizar a UI. Recupere entregas falhas em GET /webhooks/deliveries e reenvie com POST /webhooks/deliveries/{event_id}/retry. Dispare um teste com POST /webhooks/test.19 Idempotência & erros
Envie external_id em toda operação financeira (cash-out, payout, cash-in, swift, on-ramp, boleto, transferência). Em retry, reutilize o mesmo external_id com o corpo idêntico.
external_id no endpoint de listagem do serviço (/cashout, /payouts, /swift/transfers, /boletos…). Se existir, acompanhe; se não, repita com o mesmo corpo/ID respeitando backoff.Códigos de erro
| HTTP | Campo | Significado | Ação |
|---|---|---|---|
401 | — | Autenticação inválida | Verifique a chave e o ambiente |
403 | scope_nao_aprovado | Serviço não habilitado para a chave | Solicite em /keys/me/scopes/request |
402 | saldo_insuficiente | Saldo insuficiente | Cheque disponível, subconta e taxas |
409 | external_id_divergente | ID já usado com parâmetros diferentes | Não repita com o mesmo ID |
423 | kyc_pendente / trava_24h | KYC/KYB pendente ou trava ativa | Mostre kyc_session_url / unlock_at |
429 | — | Rate limit | Respeite o header Retry-After |
5xx | — | Erro de servidor / timeout | Consulte a operação antes de repetir |
O corpo de erro inclui erro, acao, detail, request_id e agent_guidance. Ao pedir suporte, informe ambiente, id da operação, external_id, horário com fuso e request_id — nunca a chave, o segredo do webhook ou o CPF/CNPJ completo.
20 Referência de endpoints
Resumo das rotas por serviço. Base: https://api.wantspay.pro.
| Serviço | Método | Endpoint | Descrição |
|---|---|---|---|
| Conta & chaves | POST | /keys/sandbox | Cria chave de teste |
| POST | /keys | Cria chave de produção | |
| GET | /keys/me | Escopos, limites e taxas | |
| POST | /keys/me/scopes/request | Solicita serviço adicional | |
| Cash-out | POST | /cashout | Cota cripto → PIX (passo 1) |
| POST | /cashout/{id}/accept | Aceita e recebe endereço | |
| GET | /cashout/{id} | Acompanha | |
| POST | /cashout/preview | Cotação sem criar ordem | |
| Payouts | POST | /payouts | Envia PIX do saldo |
| GET | /payouts/{id} | Acompanha o payout | |
| Cash-in | POST | /cashin/charge | Cria cobrança PIX |
| GET | /cashin/{id}/status | Estado da cobrança | |
| SWIFT | GET | /swift/currencies | Moedas & campos exigidos |
| POST | /swift/transfers | Cria a transferência internacional | |
| GET | /swift/transfers/{id} | Acompanha | |
| On-ramp | POST | /onramp/quote | Cotação BRL → cripto |
| POST | /onramp/orders | Cria ordem (KYC/KYB + trava 24h) | |
| GET | /onramp/orders/{id} | Acompanha & trava | |
| Boletos | POST | /boletos | Emite boleto |
| GET | /boletos/{id} | Status & linha digitável | |
| POST | /boletos/{id}/cancel | Cancela | |
| Compliance & dados | POST | /kyc/sessions | Verificação de pessoa |
| POST | /kyb/checks | Verificação de empresa | |
| POST | /data/{cpf|cnpj|pix-key|…} | Consulta & enriquecimento | |
| Custódia & plataforma | GET | /saldo | Saldo (casa ou subconta) |
| POST | /saldo/sacar-cripto | Saque do saldo em cripto | |
| POST | /webhooks/test | Dispara webhook de teste | |
| GET | /ping | Health check |
21 Suporte
🟢 Status
wantspay.pro/status — disponibilidade da API.
✉️ WantsPay
suporte@wantspay.pro — integração e dúvidas comerciais.
📘 Especificação
OpenAPI 3.1 em /openapi.json.
/keys/me; webhook validando HMAC + timestamp, deduplicando e respondendo em 10s; IDs persistidos e retries preservando corpo + external_id; UI lendo catálogo/limites atuais e distinguindo PIX pago de cripto entregue; KYC/KYB aprovado antes de on-ramp; conciliação tratando carência, trava de 24h, câmbio e erros de saldo sem duplicar operações.