PagnovoPagnovodocs

Referência da API

Saque em cripto

Solicita um saque em criptomoeda (multi-rede). O valor + a taxa de cripto da sua conta são debitados e travados na hora; o envio é liquidado MANUALMENTE pela nossa operação, que informa o hash on-chain. Status inicial WITHDRAW_PROCESSING → WITHDRAW_APPROVED (com cryptoTxHash) ou WITHDRAW_REJECTED (valor estornado). Exige o módulo de cripto habilitado e valor mínimo de R$ 10.000. Webhooks: na liquidação dispara cashout.success com o hash e os dados da rede (tx_hash, network, asset, wallet no payload, além de end_to_end_id = hash); na rejeição dispara cashout.failed (valor estornado). Mesmos eventos do saque PIX, só com os campos de cripto a mais.

POST/withdraws/crypto
IP allowlist obrigatório
Authorization Como todo saque, a API key precisa da permissão createWithdraw pareada com IP allowlist no dashboard. Requisições de outro IP são rejeitadas com 400 IP unauthorized.

Autenticação

HTTP Basic Auth. Envie sua secret key no header:

Authorization: Basic {base64(secret:SUA_SECRET_KEY)}

Parâmetros

amountnumberobrigatório

Valor do saque em centavos (BRL). A taxa de cripto da sua conta é somada por cima (debita valor + taxa, precisa ter saldo). Mínimo R$ 10.000 (1000000 centavos).

Exemplo: 1000000

network'TRX' | 'ETH' | 'BSC' | 'POLYGON' | 'SOL' | 'BTC'obrigatório

Rede blockchain de destino.

Exemplo: TRX

asset'USDT' | 'USDC' | 'TRX' | 'ETH' | 'BNB' | 'POL' | 'SOL' | 'BTC'obrigatório

Ativo enviado. A combinação rede×ativo é validada: TRX→USDT,TRX · ETH→USDT,USDC,ETH · BSC→USDT,USDC,BNB · POLYGON→USDT,USDC,POL · SOL→USDT,USDC,SOL · BTC→BTC.

Exemplo: USDT

walletstringobrigatório

Endereço de destino, validado pelo formato da rede: TRON começa com 'T' (34 chars); ETH/BSC/POLYGON '0x' + 40 hex; Solana base58 32–44; Bitcoin 'bc1', '1' ou '3'.

Exemplo: TJ...endereco...

Body da requisição

Content-Type: application/json

JSON
{
  "amount": 1000000,
  "network": "TRX",
  "asset": "USDT",
  "wallet": "TJ...endereco..."
}

Respostas

201

Saque aceito e travado. Status WITHDRAW_PROCESSING até a liquidação manual. fee e total em centavos.

JSON
{
  "id": "withdraw-id-1234",
  "status": "WITHDRAW_PROCESSING",
  "network": "TRX",
  "asset": "USDT",
  "wallet": "TJ...endereco...",
  "amount": 1000000,
  "fee": 40000,
  "total": 1040000,
  "createdAt": "2026-10-19T15:00:00.000Z"
}
400

Body inválido, rede×ativo não suportado, carteira inválida, abaixo do mínimo, módulo de cripto desabilitado, saque bloqueado, saldo insuficiente ou IP fora do allowlist.

JSON
{
  "statusCode": 400,
  "message": "Carteira inválida para Tron (TRC-20) — começa com 'T' e tem 34 caracteres."
}
401

API key inválida ou ausente.

JSON
{ "statusCode": 401, "message": "Unauthorized" }
403

API key sem a permissão createWithdraw.

JSON
{
  "statusCode": 403,
  "message": "You do not have permission to access this resource"
}

Exemplos

cURL
curl -X POST "https://api.pagnovo.com/withdraws/crypto" \
  -H "Authorization: Basic $(echo -n 'secret:SUA_SECRET_KEY' | base64)" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 1000000,
    "network": "TRX",
    "asset": "USDT",
    "wallet": "TJ...endereco..."
  }'
JavaScript
const token = Buffer.from("secret:" + process.env.PAGNOVO_SECRET_KEY).toString("base64");

const res = await fetch("https://api.pagnovo.com/withdraws/crypto", {
  method: "POST",
  headers: {
    Authorization: `Basic ${token}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    amount: 1000000,
    network: "TRX",
    asset: "USDT",
    wallet: "TJ...endereco...",
  }),
});

if (!res.ok) {
  const err = await res.json();
  throw new Error(`saque cripto falhou: ${err.message}`);
}

const w = await res.json();
console.log("saque cripto:", w.id, w.status);
// liquidacao e manual: acompanhe por webhook / consulta do saque