Send with PIX

POST /pixout sends BRL from your balance to a PIX key. The request returns as soon as the transfer is accepted. The final result (paid or canceled) arrives at your baasPostbackUrl.

PIX-OUT needs live credentials. Sandbox credentials get HTTP 403.

Request

{
  "token": "YOUR_TOKEN",
  "secret": "YOUR_SECRET",
  "amount": 100.00,
  "pixKey": "12345678909",
  "pixKeyType": "cpf",
  "baasPostbackUrl": "https://example.com/callbacks/pix-out"
}
FieldRequiredDescription
token, secretYesLive credentials.
amountYesAmount in BRL.
pixKeyYes, unless pixQrCode is sentDestination PIX key.
pixKeyTypeYes, unless pixQrCode is sentOne of cpf, email, telefone (phone), aleatoria (random key).
pixQrCodeNoPIX copy and paste code to pay instead of a key. Support depends on the acquirer that serves your account; confirm with support before relying on it.
baasPostbackUrlYesURL that receives the result callback.

Response (200)

{
  "status": "ok",
  "idTransaction": "F3A9C2D18B7E4C6A9D0E1F2A3B4C5D6E",
  "external_id": "wd_0000000000",
  "amount": 100.00,
  "pixKey": "12345678909",
  "pixKeyType": "cpf",
  "withdrawStatusId": "PendingProcessing",
  "createdAt": "2026-10-01T13:30:00-03:00",
  "updatedAt": "2026-10-01T13:30:00-03:00"
}

The exact fields depend on the acquirer that serves your account. On some acquirers the transaction id comes in id instead of idTransaction, and status and external_id are not present. Read idTransaction when present, otherwise id, and store it.

withdrawStatusId: PendingProcessing means accepted, not paid.

Result callback

We POST to baasPostbackUrl:

{
  "status": "paid",
  "idTransaction": "F3A9C2D18B7E4C6A9D0E1F2A3B4C5D6E",
  "typeTransaction": "PAYMENT"
}

status is paid or canceled (spelled with one l on PIX-OUT). On canceled, the amount returns to your balance.

You can also check GET /transactions/pixout/{idTransaction}. See Transaction status.

Order of checks

The checks run in this order, which matters when you read errors:

  1. Credentials (400, 401, 403).
  2. Per IP rate limit: 1 request per minute (429, no error_code).
  3. Per account lock: one attempt every 60 seconds (429, RATE_LIMITED). The lock starts here, so a request that fails a later check still blocks the next attempt for 60 seconds.
  4. Balance: INSUFFICIENT_BALANCE (401).
  5. Field validation: VALIDATION_ERROR (422).
  6. Daily count limit: DAILY_LIMIT_EXCEEDED (401).
  7. Minimum and maximum amount: MINIMUM_AMOUNT_NOT_MET, MAXIMUM_AMOUNT_EXCEEDED (401).
  8. Acquirer checks, for example INSUFFICIENT_BALANCE_FOR_FEE when the balance does not cover amount plus fee.

Error example:

{
  "status": "error",
  "message": "Saldo Insuficiente.",
  "error_code": "INSUFFICIENT_BALANCE",
  "reason": "Saldo disponível menor que o valor solicitado"
}

Retries

There is no idempotency key on this endpoint. If the request times out or returns 500, do not resend blindly: check your balance (GET /account/balance, field pending_withdrawals) and wait for the callback first. Sending again can pay twice.


Did this page help you?