Skip to main content
POST
Create Payout
Send funds from your business wallet to a bank account in any country supported by Vita. The amount is deducted from your source wallet and credited to the beneficiary’s bank account through the destination country’s banking rails.
Dynamic fields. The fields required to create a payout vary by destination country. Call GET /api/businesses/withdrawal_rules before creating the transaction to retrieve the exact fields and validation rules for the destination you’re sending to.
This endpoint shares its URL with the other transaction creation flows. The transactions_type field is the discriminator — set it to "withdrawal" for a bank payout.
Concurrent requests are serialized, not rate-limited. Vita processes each business’s payouts one at a time. If you submit multiple POST /transactions calls in parallel for the same account, the later ones wait in queue — they are not rejected. Configure your HTTP client with a generous timeout (60–90s+) and rely on order for idempotency, not on response time.
Final Customers service. If your account has Final Customers enabled, include the additional fields prefixed with fc_ describing the person or business actually initiating the transaction. The required fields are returned by /withdrawal_rules.

Request structure

Beneficiary and (optional) Final Customer fields are returned dynamically by /withdrawal_rules and vary per country.

Request examples by destination

Each destination country has its own required fields (returned by /withdrawal_rules). The following tabs show real payloads for the most common destinations.
Argentina, individual beneficiary, settled in USD from a USD-denominated amount destination.
amount vs amount_destination. Send exactly one of these with a value greater than zero. The other must be 0 (or omitted). amount is denominated in currency (source); amount_destination is denominated in the destination country’s local currency.

Response — Success (201)

Common errors

A field required by /withdrawal_rules for this country is missing.
amount and amount_destination cannot both be greater than zero.
A field value does not match the required format returned by /withdrawal_rules.
Call GET /api/businesses/prices to refresh rates before retrying.

Idempotency & timeout handling

1

Submit with a long timeout

Use a client timeout of 60–90s+. Vita’s queue takes a few extra seconds under load.
2

On timeout or 500, do NOT retry with a new order

The order field is your idempotency key. Reusing it protects you from duplicates; replacing it does not.
3

Query by order

GET /api/businesses/transactions?order=<your_order_id> to find out whether the payout was actually created.
4

Resolve

If found → save the Vita transaction ID and continue. If not found → safely retry the original POST with the same order.

Test environment — automated status resolution

In test environments only, include a keyword in purpose_comentary to auto-complete or auto-deny the transaction: Keywords must match exactly (including capitalization). Status change is reflected within 0–15 minutes. This mechanism does not apply in production.

Quick recap

  1. GET /api/businesses/withdrawal_rules → fields required for the destination country.
  2. GET /api/businesses/prices → rates to calculate the final amount.
  3. (Optional) POST /api/businesses/beneficiaries/validate_beneficiary → confirm identifier-based recipients (PIX, Bre-B, CLABE, IBAN, ABA).
  4. Generate a unique order ID.
  5. POST /api/businesses/transactions with transactions_type: "withdrawal" and a generous timeout.
  6. On timeout → query by order before retrying; never reuse with a new order.