Payout é a conversão Crypto → BRL. O receiver deposita crypto em um endereço fornecido pela plataforma e recebe BRL via PIX.
Etapas
- Cotação payout.
- Criação da ordem — plataforma gera endereço de depósito.
- Depósito crypto — receiver envia para o endereço.
- Conversão — swap para USDC (ou já USDC) → BRL.
- PIX outbound — plataforma envia BRL para a chave PIX configurada.
- Webhook —
order.completed.
Cotação
O campo sourceToken indica o token que o receiver vai depositar. O padrão é "USDC".
Criação da ordem
A resposta inclui dois campos críticos para o passo seguinte:
depositAddress — endereço Solana da plataforma para onde o crypto deve ser enviado. É o mesmo endereço para todas as orders de payout, então não basta apenas transferir o valor: você também precisa marcar essa transferência como pertencente a esta order específica usando o paymentReference abaixo.
paymentReference — uma PublicKey Solana não custodial (sem chave privada, sem saldo associado) gerada exclusivamente para esta order. É um identificador no padrão Solana Pay que permite à plataforma correlacionar o depósito on-chain com a sua order.
Valores acima do cotado entram como over-deposit e ficam em conciliação manual. Valores abaixo não disparam a conversão — a ordem expira.
Construindo a transação de depósito
Caminho recomendado: POST /payout/build-transfer-tx
A maneira mais simples — e que evita as armadilhas mais comuns (esquecer o reference, blockhash expirado, instruction malformada) — é deixar a plataforma montar a transação para você:
Resposta:
Em seguida, envie a transaction para POST /merchant/wallet/sign-and-send-transaction (se estiver usando a wallet gerenciada do merchant) ou para POST /receivers/{id}/wallet/sign-and-send-transaction. A plataforma assina, paga o gas, transmite e devolve o hash on-chain.
Caminho avançado: montar a transação por conta própria
Se você precisa de controle total (por exemplo, somar instruções extras na mesma transação ou usar uma wallet self-custodial), pode construir a transação manualmente. Para que o depósito seja detectado, a SPL Transfer precisa incluir o paymentReference como account read-only e não-signer. Sem esse account na lista de keys da instruction, a plataforma não tem como vincular a transferência on-chain à sua order — a order fica em AWAITING_DEPOSIT por 24h e expira.
Em seguida, envie txBase64 para um dos endpoints de assinatura — POST /merchant/wallet/sign-and-send-transaction se a origem for a wallet gerenciada do merchant, ou POST /receivers/{id}/wallet/sign-and-send-transaction se for a wallet gerenciada de um receiver.
Gas patrocinado
Quando você usa as wallets gerenciadas pela plataforma (createPrivyWallet: true na criação do receiver, ou a wallet do merchant), o fee da Solana é patrocinado pela plataforma. Isso significa:
- Você não precisa manter SOL nessas wallets para pagar fees.
- Não defina
transaction.feePayer — a plataforma substitui pela sponsor wallet ao enviar.
- Não chame
connection.simulateTransaction() localmente antes de mandar pro nosso endpoint. O RPC público da Solana não enxerga a sponsorship — ele assume que o feePayer da sua tx vai pagar o fee, e a simulação falha com Blockhash not found ou insufficient lamports for fee mesmo quando a transação iria executar normalmente em produção.
- Pegue o
recentBlockhash imediatamente antes de chamar o endpoint (não reutilize um blockhash de mais de ~30s atrás — eles expiram em ~60s).
Se você gerencia a wallet por fora (passou walletAddress na criação do receiver), o gas é por sua conta — mantenha SOL suficiente na wallet pra cobrir os fees (≈ 0.000005 SOL por SPL Transfer).
Status
Mesmo conjunto do payin (ver Ciclo de vida das ordens). Os principais para payout são:
Chaves PIX suportadas
Webhooks recebidos
order.deposit_received
order.processing
order.pix_sending
order.completed
order.failed
Payloads completos em Eventos de webhook.
Consultando uma ordem