Pular para o conteúdo
LeztyPay docs
Painel

Cobrança em cripto (USDT e USDC)

Com payment_method: "crypto" a cobrança é paga em USDT ou USDC, para quem não tem PIX. O comprador recebe um endereço de depósito e um QR Code; o dinheiro vai direto para a carteira que você cadastrou, na hora.

Esta página descreve o contrato público da cobrança em cripto. A feature só vale depois de liberada na sua conta; até lá a criação responde 503 crypto_charges_paused ou 503 crypto_unavailable.

Repasse direto: a Lezty nunca guarda

  • Cada cobrança ganha um endereço de depósito próprio. O que o comprador envia é dividido na origem: sua parte vai para a sua carteira e a taxa da Lezty Pay vai para a carteira dela, no mesmo envio.
  • A cobrança em cripto não gera saldo na Lezty Pay: o dinheiro nunca passa por ela.
  • Estorno não é suportado. POST /v1/transactions/{id}/refund responde 409 refund_unsupported_for_payment_method. Devolução é combinada entre você e o comprador, fora da Lezty Pay. Também não existe chargeback nem MED em cripto.
  • Split entre sellers não vale em cripto: splits[] é 400 splits_unsupported_for_payment_method.

Redes, moeda e mínimo

Moeda USDT ou USDC, escolhida em crypto.coin (padrão usdt). As duas valem US$ 1
Redes bsc (BEP20), polygon, arbitrum (Arbitrum One) e optimism (OP Mainnet). Não há Tron nem Base
Moedas por rede bsc, polygon e arbitrum: USDT e USDC. optimism: só USDC (a rede tem duas versões de USDT e o comprador poderia mandar a errada); usdt na Optimism é 400 unsupported_coin
Taxa 4% + US$ 0,50 por venda, igual em todas as redes e moedas
Mínimo por cobrança US$ 5 (500 centavos de dólar da moeda escolhida). Abaixo disso é 400 amount_too_small
Prazo 30 minutos, fixo. expires_in é ignorado
Quem pode Conta com KYC aprovado

Taxa

A taxa padrão é de 4% + US$ 0,50 por venda. Ela já inclui os custos do provedor e da rede: não há cobrança extra para você nem para o comprador. Quem tem taxa negociada paga a negociada. A taxa é congelada na criação, como no PIX. amount, fee e net da cobrança vêm em reais, convertidos pela cotação do dia, e o valor na stablecoin vem em crypto. USDT e USDC têm a mesma taxa, o mesmo mínimo, o mesmo prazo e o mesmo tratamento de pagamento a menor.

Sua carteira

Antes de vender em cripto você cadastra uma carteira no painel, em polygon ou bsc. O mesmo endereço recebe USDT e USDC: não existe carteira por moeda. Arbitrum e Optimism não pedem cadastro: a cobrança nessas redes usa o endereço 0x da sua carteira ativa e fora da carência em polygon (ou, sem ela, em bsc), sem carência nova. O cadastro é só pelo painel (sessão), não por chave de API: POST /v1/me/crypto-wallets pede network, address e confirm_network: true. Regras:

  • Uma carteira ativa por rede. Trocar é remover e cadastrar de novo.
  • Cada carteira diz para que serve em uses: polygon só recebe cobrança (["charge"]), bsc recebe e saca (["withdrawal", "charge"]) e tron só saca (["withdrawal"]). Carteira tron não serve para cobrança: não existe Tron aqui.
  • Carteira nova ou trocada tem carência de 48 h (usable_from) antes de poder receber. Até lá a criação responde 409 crypto_wallet_not_usable, com details.usable_from.
  • Sem carteira na rede pedida, a resposta é 409 crypto_wallet_missing. Em arbitrum e optimism isso quer dizer sem carteira 0x ativa em polygon nem em bsc; com a carteira ainda na carência, 409 crypto_wallet_not_usable.
  • Use carteira comum (MetaMask, Trust, corretora). Carteira de contrato (por exemplo uma Safe) pode não existir em outra rede: o endereço é o mesmo, mas o contrato só vive onde foi criado, e o que chegar em Arbitrum ou Optimism pode ficar preso.
  • O endereço é congelado na cobrança: remover a carteira depois não muda para onde as cobranças pendentes são repassadas.
  • Confira a rede ao cadastrar. Uma carteira de corretora que não aceita a rede escolhida pode não receber o dinheiro.

Moeda da cobrança: USDT ou USDC

crypto.coin é opcional e aceita usdt ou usdc. Sem ele a cobrança é em USDT, como sempre foi: nenhuma integração existente muda. Outro valor é 400 validation_failed.

  • A moeda escolhida vale para a cobrança inteira: o endereço de depósito, o valor exato e o aviso ao comprador são dessa moeda.
  • Os campos que terminam em _usdt (amount_usdt, received_usdt, min_usdt...) não foram renomeados. Em cobrança USDC eles valem centavos de dólar do USDC. Leia crypto.coin (ou o fim de crypto.ticker) para saber qual moeda o número representa.
  • crypto.ticker reflete a moeda e a rede: bep20/usdt, bep20/usdc, polygon/usdt, polygon/usdc, arbitrum/usdc, arbitrum/usdt0 ou optimism/usdc. arbitrum/usdt0 é o USDT oficial da Arbitrum (USDT0): para o comprador e para o campo crypto.coin continua sendo usdt. Cobranças criadas antes do USDC leem coin: "usdt".
  • Repetir uma Idempotency-Key com coin: "usdc" sobre um corpo que não tinha coin é 409 idempotency_conflict. Já coin: "usdt" explícito repete uma chave que foi usada sem coin.

Valor em reais ou em dólar da stablecoin

Você informa o valor em uma das duas formas:

  • currency ausente ou BRL: amount em centavos de reais. A Lezty Pay converte para a stablecoin pela cotação do momento da criação, e essa cotação vale por 30 minutos (o prazo da cobrança).
  • currency: "USDT": amount em centavos de dólar da moeda escolhida (5000 são 50,00 USDT ou 50,00 USDC, conforme crypto.coin). O nome USDT aqui é o de sempre; vale também para USDC.

O valor na stablecoin é fixado na criação e não muda mais. Qualquer outra moeda é 400 unsupported_currency.

Criar a cobrança

curl "$LM_API_URL/v1/transactions" \
  -H "Authorization: Bearer $LM_API_KEY" \
  -H "Idempotency-Key: pedido-1042" \
  -H "Content-Type: application/json" \
  -d '{
    "payment_method": "crypto",
    "amount": 27000,
    "currency": "BRL",
    "crypto": { "network": "polygon", "coin": "usdc" },
    "customer": { "name": "Ana", "email": "[email protected]" }
  }'

O corpo, sozinho:

{
  "payment_method": "crypto",
  "amount": 27000,
  "currency": "BRL",
  "crypto": { "network": "polygon", "coin": "usdc" },
  "customer": { "name": "Ana", "email": "[email protected]" }
}
  • crypto.network é obrigatório: bsc, polygon, arbitrum ou optimism. Outro valor é 400 unsupported_network; sem ele, 400 validation_failed.
  • crypto.coin é opcional: usdt (padrão) ou usdc. Em optimism só usdc existe: com usdt (ou sem coin) a resposta é 400 unsupported_coin.
  • Idempotency-Key é obrigatório, como no PIX.
  • customer.email é obrigatório: é o único canal de contato quando o pagamento chega a menor. customer.document é opcional e não é validado (o comprador pode ser estrangeiro).
  • O objeto pix não é aceito (400 validation_failed).
  • O replay da mesma chave e do mesmo corpo devolve a mesma cobrança, com o mesmo endereço; corpo diferente é 409 idempotency_conflict.

Na resposta, payment_method é crypto, pix e voucher vêm null e o bloco crypto traz os dados de pagamento:

"crypto": {
  "network": "polygon",
  "ticker": "polygon/usdc",
  "coin": "usdc",
  "amount_usdt": 5000,
  "received_usdt": 0,
  "detected_usdt": 0,
  "missing_usdt": 5000,
  "partial": false,
  "price_brl_per_usdt": "5.400000",
  "requested": { "currency": "BRL", "amount": 27000 },
  "address_in": "0x76f3…6f6A5",
  "minimum_usdt": 133,
  "qr_base64": "iVBOR…",
  "seller_address_masked": "0xFB19…93Ebd",
  "expires_at": "2026-10-20T15:30:00.000Z",
  "partial_deadline": null,
  "paid_late": false,
  "deposits": [{ "txid": "0x…", "value_usdt": 2500, "confirmed": true, "at": "2026-10-20T15:10:00.000Z" }]
}

Os valores *_usdt são inteiros em centavos de dólar da moeda da cobrança (coin). address_in e qr_base64 vêm completos só enquanto a cobrança está pending; depois, null. O endereço da sua carteira vem sempre mascarado. deposits traz no máximo os 20 últimos. Mostre ao comprador o valor exato, a moeda, a rede e o endereço, e avise o que está em "Moeda ou rede errada" abaixo. O mesmo objeto vem em todas as consultas e no webhook (no webhook, qr_base64 vem sempre null).

Estados

Os status são os mesmos do PIX. refunded e chargeback não acontecem em cripto.

Situação O que acontece
Pagamento detectado na rede, sem confirmação Continua pending; crypto.detected_usdt sobe
Pago por inteiro (tolerância de 1%) paid, e transaction.paid é emitido. O dinheiro já está na sua carteira
Pagamento a menor (parcial) Continua pending, com crypto.partial: true e crypto.received_usdt. O comprador completa no mesmo endereço em até 24 h do primeiro depósito (crypto.partial_deadline)
Prazo acabou sem pagar expired. Se houve parcial, o que chegou já foi repassado a você; nada é desfeito
Pago depois de expired, completando o valor paid, com crypto.paid_late: true. Vale a cotação da criação
Depósito extra em cobrança paid Nada muda. O excedente já foi repassado; devolver é com você
Depósito em outra moeda ou outra rede da cobrança (USDT numa cobrança USDC, ou o inverso) Não paga e não é registrado. A cobrança segue como estava; a Lezty Pay é alertada. Devolver é combinado à mão entre você e o comprador

partial não é um status novo: é um sinal dentro de pending. Decida a entrega do pedido só em paid.

Moeda ou rede errada, ou valor abaixo do mínimo: dinheiro parado

Cripto não tem estorno. Avise o comprador, na sua tela, que:

  • Só a moeda e a rede da cobrança contam. Se a cobrança é USDC na Polygon, mandar USDT na Polygon também perde o dinheiro, assim como USDC em outra rede (por exemplo em Tron, ou em BSC para um endereço Polygon; os endereços de BSC, Polygon, Arbitrum e Optimism têm a mesma forma, mas cada envio só vale na rede da cobrança). O dinheiro fica parado ou se perde, e a Lezty Pay não tem como recuperar.
  • Existe um envio mínimo da rede (crypto.minimum_usdt, por exemplo 1,33 USDT em BSC e 1,00 em Arbitrum e Optimism): abaixo dele a rede descarta o valor.
  • Enviar a menos não perde nada: o comprador completa no mesmo endereço.

Onde está o meu dinheiro

  • O dinheiro vai direto para a sua carteira, na hora, na rede da venda. A Lezty Pay não segura nada. Na API, crypto.deposits[].txid_out traz a transação do repasse quando a rede já a informou (null antes disso); no painel ela vira o link "Ver o repasse" no explorador da rede (polygonscan.com, bscscan.com, arbiscan.io ou optimistic.etherscan.io).
  • Para ver na MetaMask: escolha a rede da venda (por exemplo Polygon) e importe o token pelo contrato oficial. Confira sempre o contrato no explorador antes de importar.
Rede USDT USDC
Polygon 0xc2132D05D31c914a87C6611C10748AEb04B58e8F 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359
BSC (BEP20) 0x55d398326f99059fF775485246999027B3197955 0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d
Arbitrum One 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 (USDT0) 0xaf88d065e77c8cC2239327C5EDb3A432268e5831
Optimism não existe 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85
  • Se o endereço cadastrado é de corretora (por exemplo Coinbase), ela só credita a moeda e a rede que aceita. A Coinbase credita USDT na Polygon (testado em 21/10/2026). Confirme na sua corretora antes de cadastrar.
  • Para transformar em reais: mande para uma corretora na mesma rede, venda e saque por PIX. Mover o dinheiro exige um pouco da moeda de gas da rede: POL na Polygon, BNB na BSC e ETH na Arbitrum e na Optimism.

Link de pagamento

Em links de pagamento você marca cripto por link, com accepted_methods: ["pix", "crypto"]. O comprador escolhe PIX ou cripto e, em cripto, a moeda (USDT ou USDC; na Optimism só USDC) e a rede. Você não configura a moeda por link: o link oferece as que estão prontas (cotação e mínimo da rede atendidos). Quem integra a página própria lê crypto.coins e crypto.offers em GET /pay/v1/links/{slug} (veja links de pagamento). Vale só para produto em BRL e link sem buyer_pays_fee (senão 400 validation_failed com param: accepted_methods). Se o preço do produto fica abaixo de US$ 5, a opção cripto não aparece.

Erros

Resposta Quando
400 amount_too_small Menos de US$ 5
400 unsupported_network crypto.network fora de bsc, polygon, arbitrum e optimism
400 unsupported_coin Moeda que a rede não tem (usdt na optimism)
400 unsupported_currency currency fora de BRL e USDT
400 validation_failed Sem crypto.network, crypto.coin fora de usdt e usdc, ou com objeto pix
400 splits_unsupported_for_payment_method splits[] em cobrança cripto
403 kyc_required Conta sem KYC aprovado
409 crypto_wallet_missing Sem carteira ativa na rede
409 crypto_wallet_not_usable Carteira em carência (details.usable_from)
409 crypto_fee_below_cost Taxa da conta abaixo do custo (só com taxa negociada errada)
409 idempotency_conflict Mesma chave com corpo diferente (inclui trocar a moeda para usdc)
409 refund_unsupported_for_payment_method Pedido de estorno
503 crypto_charges_paused Cobrança em cripto pausada na plataforma (details.reason)
503 crypto_unavailable Rede indisponível agora (details.reason: fee_address_missing, acquirer_missing, fx_rate_unavailable, fee_address_changed ou quote_failed)
503 acquirer_unavailable O provedor demorou para responder. Espere 60 s e repita com a mesma chave: a mesma cobrança e o mesmo endereço voltam

Próximo passo

Expiração e Consultar: o ciclo é o mesmo do PIX.

Referência: Cria uma cobrança (PIX, voucher, cripto, cartão ou carteira).