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"
}| Field | Required | Description |
|---|---|---|
token, secret | Yes | Live credentials. |
amount | Yes | Amount in BRL. |
pixKey | Yes, unless pixQrCode is sent | Destination PIX key. |
pixKeyType | Yes, unless pixQrCode is sent | One of cpf, email, telefone (phone), aleatoria (random key). |
pixQrCode | No | PIX 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. |
baasPostbackUrl | Yes | URL 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:
- Credentials (400, 401, 403).
- Per IP rate limit: 1 request per minute (429, no
error_code). - 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. - Balance:
INSUFFICIENT_BALANCE(401). - Field validation:
VALIDATION_ERROR(422). - Daily count limit:
DAILY_LIMIT_EXCEEDED(401). - Minimum and maximum amount:
MINIMUM_AMOUNT_NOT_MET,MAXIMUM_AMOUNT_EXCEEDED(401). - Acquirer checks, for example
INSUFFICIENT_BALANCE_FOR_FEEwhen 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.
Updated about 2 hours ago
