Tamino Docs

Payouts (PIX out)

Payout é a retirada de saldo via transferência PIX — o inverso de uma cobrança: em vez de receber, a plataforma envia dinheiro pra uma chave PIX. /v1/payouts usa a mesma API key do resto desta documentação — sempre saca o saldo do merchant dono da chave, nunca de uma conta escolhida por parâmetro.

Solicitar um saque

cURL
curl -X POST https://api.tamino.com.br/v1/payouts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: payout-2024-08-01" \
  -d '{
    "amountInCents": 10000,
    "pixKey": "11999999999",
    "pixKeyType": "phone",
    "externalId": "saque-2026-000123"
  }'
TypeScript
const payout = await gateway.payouts.create(
  { amountInCents: 10000, pixKey: "11999999999", pixKeyType: "phone", externalId: "saque-2026-000123" },
  { idempotencyKey: "payout-2024-08-01" },
);
{
  "id": "8f1c2a4e-3b7d-4c1a-9e2f-5d6a7b8c9d0e",
  "object": "payout",
  "externalId": "saque-2026-000123",
  "status": "processing",
  "merchantId": "0d303c3b-cb6d-417e-8aa7-2a5cc8fde653",
  "amountInCents": 10000,
  "feeAmountInCents": 100,
  "netAmountInCents": 9900,
  "feeMode": "deducted",
  "currency": "BRL",
  "pixKey": "11999999999",
  "pixKeyType": "phone",
  "recipientDocument": null,
  "endToEndId": null,
  "recipient": null,
  "failureReason": null,
  "approvedAt": null,
  "createdAt": "2026-10-27T12:00:00.000Z",
  "updatedAt": "2026-10-27T12:00:00.312Z",
  "processedAt": "2026-10-27T12:00:00.312Z"
}

pixKeyType aceita cpf, cnpj, email, phone ou random. recipientDocument (CPF/CNPJ do destinatário) é opcional, mas recomendado: com ele, o saque é recusado se a chave Pix não pertencer a esse CPF/CNPJ, em vez de cair na conta de outra pessoa. Idempotency-Key é opcional mas recomendado, mesmo header de qualquer outro endpoint transacional desta API — um retry de rede nunca saca duas vezes.

Nota

O saldo debitado é o mesmo saldo do ledger interno — o mesmo número que aparece na tela Saldo do Backoffice. Um payout só é aceito se houver saldo disponível suficiente.

Seu id do pedido (externalId) e timeout

Mande em externalId o id do pedido de saque no seu sistema (até 64 caracteres: letras, números, ., _, : e -). Ele volta em todas as respostas e webhooks, e é único por conta: repetir o POST com o mesmo externalId devolve o saque que já existe, sem criar outro. O mesmo externalId com outro valor ou outra chave Pix responde 409.

Se o pedido der timeout ou erro de rede, você não recebe o nosso id, mas não perde o saque:

Com Idempotency-Key, um reenvio que chega enquanto o primeiro pedido ainda está sendo processado responde 409 — espere alguns segundos e tente de novo (ou consulte pelo externalId). Erros não ficam guardados na chave.

curl https://api.tamino.com.br/v1/payouts/external/saque-2026-000123 \
  -H "Authorization: Bearer sk_test_..."

Consultar e listar

curl https://api.tamino.com.br/v1/payouts/8f1c2a4e-... \
  -H "Authorization: Bearer sk_test_..."

curl https://api.tamino.com.br/v1/payouts?limit=20 \
  -H "Authorization: Bearer sk_test_..."

Depois que o banco confirma, a consulta traz o end-to-end do Pix (o identificador do comprovante no Bacen) e os dados de quem recebeu:

{
  "id": "8f1c2a4e-3b7d-4c1a-9e2f-5d6a7b8c9d0e",
  "object": "payout",
  "externalId": "saque-2026-000123",
  "status": "paid",
  "merchantId": "0d303c3b-cb6d-417e-8aa7-2a5cc8fde653",
  "amountInCents": 51675,
  "feeAmountInCents": 517,
  "netAmountInCents": 51158,
  "feeMode": "deducted",
  "currency": "BRL",
  "pixKey": "11222333000181",
  "pixKeyType": "cnpj",
  "recipientDocument": "11222333000181",
  "endToEndId": "E60701190202610262102abcdef123456",
  "recipient": {
    "name": "Fornecedor Exemplo LTDA",
    "document": "11222333000181",
    "documentType": "cnpj",
    "ispb": "60701190",
    "bankName": "Itaú Unibanco"
  },
  "failureReason": null,
  "approvedAt": null,
  "createdAt": "2026-10-26T21:02:42.926Z",
  "updatedAt": "2026-10-26T21:02:48.610Z",
  "processedAt": "2026-10-26T21:02:48.610Z"
}

GET /v1/payouts pagina por cursor, mesmo formato do resto da API: { "data": [...], "nextCursor": "...", "hasMore": true } — mande cursor=<nextCursor> pra próxima página. Aceita limit (padrão 20), status (ex.: ?status=paid) e externalId.

Campos

CampoConteúdo
idId do saque.
externalIdId do pedido no seu sistema, como enviado no POST (null se não enviado).
statusVer Status abaixo.
amountInCentsValor pedido, em centavos (51675 = R$ 516,75).
feeAmountInCentsTarifa cobrada, em centavos.
netAmountInCentsO que saiu de fato via Pix (amountInCents - feeAmountInCents; com feeMode: "separate", o valor cheio). null antes do envio.
feeModeComo a taxa foi cobrada: deducted = descontada do valor enviado; separate = o Pix saiu com o valor cheio e a taxa foi debitada do saldo numa transação à parte. null antes do envio.
pixKey / pixKeyTypeChave de destino informada no pedido.
recipientDocumentCPF/CNPJ do destinatário informado no pedido (quando informado).
endToEndIdEnd-to-end do Pix no SPI/Bacen — o identificador do comprovante. null até o banco confirmar.
recipientTitular da conta que recebeu, como o banco informou na confirmação (ver abaixo). null até lá.
failureReasonMotivo, quando failed.
approvedAtQuando o saque foi aprovado (só pra saques que exigem aprovação).
createdAt / updatedAt / processedAtCriação, última atualização e envio/confirmação.

Objeto recipient (quem recebeu)

Cada campo só aparece quando o banco do recebedor informa — nunca é preenchido com o que foi pedido. Nome, CPF/CNPJ e ISPB vêm em praticamente todo saque; agência e conta dependem do banco.

CampoConteúdo
nameNome do titular da conta que recebeu.
documentCPF ou CNPJ do titular, só dígitos.
documentTypecpf | cnpj.
ispbISPB (8 dígitos) da instituição de destino.
bankNameNome da instituição de destino.
bankCodeCódigo COMPE (3 dígitos), quando informado.
branchAgência.
accountConta (com dígito, como o banco informou).
accountTypeTipo de conta (ex.: CACC corrente, SVGS poupança, TRAN conta de pagamento).
Nota

Em vez de consultar o saque repetidamente, assine o webhook payout.paid — ele traz o mesmo formato (com endToEndId e recipient) assim que o banco confirma. Ver Webhooks.

Limites configuráveis

Além do saldo disponível, um super_admin ou tenant_admin pode configurar até três tetos independentes por tenant/merchant — por transação, por dia e por mês — pelo Backoffice ou pela API administrativa (/admin/payout-limit-rules, sessão de admin, não API key — essa é a única parte deste fluxo que continua exclusiva do Backoffice, já que é uma configuração operacional, não uma ação de cobrança/saque em si). Qualquer campo omitido não limita aquela dimensão. Quando mais de uma regra se aplica (ex.: uma regra geral da plataforma e uma específica de um merchant), vale a mais específica; em empate, a de maior priority. Um payout que excede algum limite configurado é rejeitado com um erro claro — pela API pública ou pelo Backoffice, o mesmo motor de limite vale pros dois — antes de qualquer tentativa de envio.

Limitação desta entrega

Contagem de dia/mês usa UTC, não o fuso horário do Brasil (não existe infraestrutura de timezone na plataforma ainda).

Status

StatusSignificado
pendingRecebido, ainda não processado.
pending_approvalAcima do valor que exige aprovação manual — aguardando um administrador aprovar.
processingEnviado, aguardando a confirmação do banco.
paidTransferência confirmada — o dinheiro já saiu.
failedNão efetivado (chave inválida, recusa do banco do recebedor, etc.) — o motivo vem em failureReason e o valor volta pro seu saldo. Com alguns bancos, a falha informada passa antes por uma revisão da nossa equipe; até lá o saque continua processing.
cancelledCancelado antes do envio — ou devolvido pelo banco do recebedor depois de pago (ex.: Pix duplicado, conta encerrada). Nos dois casos o valor volta pro seu saldo e o motivo vem em failureReason.

A passagem pra failed ou cancelled chega pelo webhook payout.failed — exemplos dos dois casos em Webhooks.

Disponibilidade

O saque via API depende do recurso estar habilitado na sua conta. Se não estiver, a chamada retorna um erro indicando que o recurso não está disponível — fale com o suporte.