> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rheon.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Pay out from a virtual account

> POST /v1/virtual-accounts/{id}/payouts - send a bank transfer for a user who already holds a virtual account.

Sends a bank transfer for a user who already holds a virtual account. The money
comes from the stablecoins their wallet sends, exactly as in a
[bank payout](/api-reference/bank-payout) - what the virtual account adds is the
user's existing identity, corridor and settlement setup, so nothing is collected
twice.

<Warning>
  **The virtual account never holds a fiat balance, so this is not a withdrawal.**
  Money that arrives on the account is converted and settled the moment it lands.
  Paying out means the user's wallet sends stablecoins back and we transfer fiat to
  the beneficiary you name - the account itself has nothing to draw on.
</Warning>

<Note>
  Needs the **virtual-accounts permission** on your API key. See
  [Authentication](/api-reference/authentication).
</Note>

## Path parameter

<ParamField path="id" type="string" required>
  The virtual account id from
  [POST /v1/virtual-accounts](/api-reference/virtual-account-create).
</ParamField>

## Request

<ParamField body="fiatCurrency" type="string" required>
  ISO 4217 code the beneficiary is credited in. It does **not** have to match the
  currency the virtual account receives - a user funded in AED can pay out in BRL.
</ParamField>

<ParamField body="fiatAmount" type="string">
  The amount that must arrive. Send this **or** `cryptoAmount`.
</ParamField>

<ParamField body="cryptoAmount" type="string">
  The stablecoin the user gives up, if you would rather pin that side.
</ParamField>

<ParamField body="beneficiary" type="object" required>
  Who gets paid - the user themselves or a third party. Same shape as
  [bank payouts](/api-reference/bank-payout): `name` plus the fields the rail
  needs.
</ParamField>

<ParamField body="reference" type="string">
  Your idempotency key, up to 64 characters. **Send one** - a retry without it is
  a second transfer.
</ParamField>

## Response

<ResponseField name="id" type="string">
  The payout id. Poll with
  [POST /v1/bank/payout/status](/api-reference/bank-payout-status) - virtual
  account payouts share that endpoint and vocabulary.
</ResponseField>

<ResponseField name="depositAddress" type="string">
  Where the user's wallet sends the stablecoins. Single-use, derived per payout.
</ResponseField>

<ResponseField name="depositAmount" type="string">
  The exact amount to send.
</ResponseField>

<ResponseField name="chain" type="number">
  The chain `depositAddress` lives on - the network the account settles on.
</ResponseField>

<ResponseField name="fiatAmount" type="string">
  What the beneficiary receives, after fees.
</ResponseField>

<ResponseField name="rail" type="string">
  The rail chosen for the destination country and currency.
</ResponseField>

<ResponseField name="status" type="string">
  `pending` on creation.
</ResponseField>

<Note>
  The corridor a virtual account was opened with governs what arrives, not what
  leaves. A payout to a country or currency outside your account's agreed corridors
  is refused with `422 no_route` rather than routed anyway.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "$RHEON_API/v1/virtual-accounts/va_8f2c91d0a4/payouts" \
    -H "Authorization: Bearer $RHEON_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "fiatCurrency": "BRL",
      "fiatAmount": "1500.00",
      "beneficiary": {
        "name": "Ana Ribeiro",
        "pixKey": "ana.ribeiro@example.com"
      },
      "reference": "payout-2026-09-02-116"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "bpo_9f0c4e2a18",
    "depositAddress": "0x5E81c0A7fB29d6431aC08e57D2b96f10E4c7a3B2",
    "depositAmount": "281.44",
    "chain": 42161,
    "fiatAmount": "1500.00",
    "rail": "pix",
    "status": "pending"
  }
  ```
</ResponseExample>

## Errors

| HTTP | `code`              | When                                                             |
| ---- | ------------------- | ---------------------------------------------------------------- |
| 400  | `invalid_request`   | A field is missing or malformed, or both amounts were sent.      |
| 401  | `unauthorized`      | Missing, malformed, or unknown API key.                          |
| 403  | `permission_denied` | Your key does not carry the virtual-accounts permission.         |
| 404  | `not_found`         | No such virtual account under your key.                          |
| 422  | `no_route`          | The destination country and currency are outside your corridors. |
| 422  | `requires_action`   | The user needs a higher verification tier before paying out.     |
| 429  | `rate_limited`      | Over your key's rate limit.                                      |
| 502  | `upstream_error`    | The banking partner is unavailable.                              |
| 500  | `internal`          | Unexpected server error.                                         |
