Skip to main content
Um Payout (repasse) agrega todas as Comissões aprovadas e não pagas de um Afiliado em um único pagamento, valida elegibilidade (perfil fiscal completo, sem fraude em aberto, sem nota fiscal pendente, saldo acima do mínimo), agenda e executa via provedor PIX. Cada payout é um fato financeiro independente, com snapshot congelado do destino (chave PIX) no momento da criação, e marca atomicamente todas as comissões incluídas como pagas quando liquidado. O ciclo tem dois passos distintos:
  1. Fechamento: POST /payouts/run, manual, com dry-run por padrão. Cria os payouts scheduled e reserva as comissões.
  2. Execução: liquida os payouts scheduled via PIX, em lote.
IDs de payout usam o prefixo pay_ (ULID): pay_01J9X.... Valores monetários são sempre inteiros em centavos (amountCents) na moeda BRL.

Ciclo de vida

Um payout nasce scheduled no fechamento, é promovido a processing quando a execução inicia e termina em completed ou failed. O operador pode cancelar (scheduled) ou reagendar (failed).
Um payout só pode ser cancelado enquanto está scheduled. Se a execução já o tiver promovido para processing, o cancel falha com 409. Isso evita que um cancelamento aconteça depois que o pagamento já começou.

Fechamento de ciclo

O fechamento agrega o saldo de cada afiliado e decide quem é elegível. Use POST /payouts/preview (ou POST /payouts/run com dryRun: true) para inspecionar o resultado sem persistir nada. As duas chamadas retornam exatamente o mesmo resumo. Para efetivar, chame POST /payouts/run com dryRun: false.
dryRun tem default true. Um POST /payouts/run sem corpo (ou sem dryRun) não cria payouts: apenas calcula a prévia. Você precisa enviar dryRun: false explicitamente para fechar o ciclo.
Cada elegível da prévia traz também destination (chave PIX/método atual do afiliado), para você conferir “quem recebe onde” antes de efetivar.

Lote do fechamento (histórico de ciclos)

Um fechamento real cria um lote (payout_batch, prefixo cyc_) que agrupa os payouts daquele run. É o histórico de ciclos: liste com GET /payout-batches e abra um com GET /payout-batches/:id (expand=payouts,invoices). O status do lote é derivado dos payouts-membro: processing enquanto algum estiver agendado/processando, completed quando todos liquidam, partial se houver falha/cancelamento. Para a contabilidade, GET /payouts/accounting-report?from=…&to=… devolve uma linha por payout liquidado no período (afiliado, valor, comprovante, situação da NF).

Agregação líquida

O payout soma todas as comissões approved, sem payout associado e fora de revisão de fraude, incluindo clawbacks (comissões negativas). O amountCents é o líquido e precisa ser > 0 para o payout ser criado.
Resposta (run dryRun=false)
O body de preview e run aceita programId opcional para restringir o fechamento aos afiliados de um único Programa. Sem ele, o ciclo cobre toda a organização.

Threshold mínimo e política

A política de payout fica na configuração da organização, consultável em GET /settings/payout-policy e ajustável via PUT /settings/payout-policy (vale para os próximos ciclos).
string
default:"monthly"
monthly, biweekly ou manual. Hoje serve como configuração de referência: o fechamento é sempre disparado manualmente via POST /payouts/run.
integer
default:"1"
Dia de fechamento (1 a 28). Também serve como configuração de referência.
integer
default:"5000"
Valor mínimo de saque em centavos. Saldo abaixo disso bloqueia com below_minimum e acumula para o próximo ciclo. Default 5000 (R$ 50,00).
string
default:"pix"
Método de pagamento padrão sugerido para novos afiliados.

Reserva (sem dupla cobrança)

No fechamento real, a criação de cada payout reserva as comissões incluídas. Se alguma comissão deixou de ser pagável entre o cálculo e a criação (refund, ban, outro run concorrente), o fechamento é abortado com 409 conflict. Basta re-rodar. Reexecutar o run não duplica: comissões já reservadas saem do conjunto pagável, então um segundo run não encontra nada elegível.

Bloqueios

Um afiliado é excluído do ciclo (aparece em blocked, sem payout criado) por um destes motivos:
A nota fiscal do próprio ciclo nunca se bloqueia: o cálculo de elegibilidade roda antes da criação da invoice, então só NFs de payouts anteriores não resolvidas geram pending_invoice. NF cancelada (junto com o payout) não conta como pendência.

Snapshot do destino

No fechamento, o payout congela o destination: { method, pixKey?, pixKeyType? }, copiado do perfil do afiliado. Trocar a chave PIX do afiliado depois não afeta payouts já criados. Os métodos pix, bank_transfer, wise e paypal são aceitos e congelados no snapshot; atualmente, apenas PIX tem caminho de liquidação disponível.

Nota fiscal antes do pagamento

Quando a política fiscal exige NF (nfMode: "affiliate_uploads"), o fechamento cria uma invoice pending junto do payout, e a execução só liquida depois que a NF fica validated. Enquanto a NF não é validada, a execução pula o payout (permanece scheduled). Veja Fiscal para o detalhe da política nfMode, do upload e da validação da NF.

Execução em lote (PIX)

A execução processa os payouts scheduled em lote. Para cada payout liquidado, marca todas as comissões incluídas como paid, com um paidAt único.
Uma falha (failed) mantém as comissões reservadas (associadas ao payout, não pagas, não liberadas) até um retry ou cancel. Não há cobrança ao afiliado em saldo não positivo: o débito rola para o próximo ciclo.

Operações do payout

Todas as rotas exigem autenticação via API key (Authorization: Bearer rstr_...). As operações que mudam estado (run, retry, cancel e o PUT /settings/payout-policy) exigem papel owner ou admin; preview, listagens e detalhe estão abertos a qualquer membro. As rotas POST aceitam Idempotency-Key (replays retornam a resposta armazenada com Idempotent-Replay: true).
1

Listar e inspecionar

GET /payouts lista com paginação por cursor e filtros affiliate_id, status, method. GET /payouts/:payoutId traz o detalhe e aceita expand[]=commissions (anexa até 100 comissões do payout).
2

Cancelar

POST /payouts/:payoutId/cancel só é permitido em scheduled. Libera as comissões (voltam a approved não pago) e cancela a invoice associada. Qualquer outro estado retorna 409 conflict.
3

Reagendar

POST /payouts/:payoutId/retry só é permitido em failed. Limpa failureReason/failedAt e repõe o status scheduled para uma nova tentativa de liquidação. O retry é sempre disparado manualmente.
4

Comprovante

GET /payouts/:payoutId/receipt retorna o comprovante do provedor apenas quando o payout está completed e há providerReceiptUrl; caso contrário, 404 resource_not_found.
Para os campos completos de requisição e resposta de cada endpoint, veja a aba Referência da API.

Erros comuns

Veja o envelope completo em Erros.

Eventos de domínio

Cada mudança de estado emite eventos. O ciclo completo gera, na ordem: Assine esses eventos via Webhooks ou consulte o histórico no Event store.

Próximos passos

Comissões

O que entra no saldo de um payout e como clawbacks afetam o líquido.

Fiscal

Política nfMode, upload de NF e o gate de validação antes da liquidação.

Refund e clawback

Como estornos reduzem o saldo a pagar nos próximos ciclos.

Catálogo de eventos

Payloads dos eventos payout.* e commission.paid.