Pular para o conteúdo principal

Webhook de payout

A A55 envia um POST para a webhook_url definida no payout sempre que o status muda. O payload é intencionalmente minimalista — use o payout_uuid para buscar o payout completo em Consultar payout.

A webhook_url é informada por payout no corpo da requisição de Criar payout. URLs privadas e localhost são rejeitadas.

Campos do payload

CampoTipoDescrição
payout_uuidUUIDIdentificador único do payout
statusstringNovo status do payout (ver tabela abaixo)
transaction_referencestringChave de idempotência enviada na criação
external_idstringID do payout no provider
type_payoutstringRail do payout (pix, bank_transfer, ted, spei, cash_pickup)
payment_codestring ou nullCódigo de retirada (apenas cash payouts)
authorization_codestring ou nullCódigo de autorização do provider, quando disponível

Exemplo de payload

{
"payout_uuid": "9b1f0c88-3a3c-4f2f-9d6e-1f0a2d4e88c1",
"status": "realized",
"transaction_reference": "PAY-2048",
"external_id": "MN-20260616-0001",
"type_payout": "pix",
"payment_code": null,
"authorization_code": "AUTH-55812"
}

Todos os status possíveis

StatusDescrição
pendingCriado, aguardando processamento
issuedEnviado ao provider
realizedConfirmado e liquidado
returnedDevolvido pelo banco receptor
canceledCancelado
errorFalhou no processamento
expiredExpirado

Buscando os detalhes completos do payout

O payload do webhook é minimalista por design. Após recebê-lo, chame a API com seu token Bearer para obter o objeto completo do payout:

curl "https://api.a55.tech/api/v1/bank/wallet/payout/{payout_uuid}/{wallet_uuid}/" \
-H "Authorization: Bearer $ACCESS_TOKEN"
O webhook é o gatilho, a API é a fonte da verdade

Use o webhook para saber quando um payout mudou e então chame GET /api/v1/bank/wallet/payout/{payout_uuid}/{wallet_uuid}/ para obter detalhes completos como fee, confirmed_date e destination.

Exemplos de handler

from flask import Flask, request, jsonify

app = Flask(__name__)
processed = set()

@app.route("/webhooks/a55/payouts", methods=["POST"])
def payout_webhook():
data = request.get_json()
payout_uuid = data.get("payout_uuid")
status = data.get("status")

# Deduplicação
if payout_uuid in processed:
return jsonify(status="duplicate"), 200
processed.add(payout_uuid)

if status == "realized":
mark_payout_settled(payout_uuid)
elif status in ("returned", "error", "expired"):
flag_payout_failure(payout_uuid, status)

return jsonify(status="accepted"), 200

Boas práticas

PráticaPor quê
Retorne 200 imediatamenteEvita timeouts e entregas duplicadas
Processe em backgroundMantém o tempo de resposta baixo
Deduplique por payout_uuidLida com webhooks reentregues com segurança
Busque detalhes completos via APIO payload do webhook é minimalista por design
Use uma URL pública e acessívelURLs privadas/localhost são rejeitadas