> ## 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.

# Create a card payout

> POST /v1/card/payout - execute a quoted payout to a card and get the deposit address.

Creates the payout and answers with the address the user sends stablecoins to.
Nothing moves until they send. See [Payouts](/products/payouts) for the whole
order, and [POST /v1/card/payout/quote](/api-reference/card-payout-quote) for the
price.

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

## Request

<ParamField body="quoteId" type="string" required>
  From the quote. Expired quotes are refused rather than silently repriced.
</ParamField>

<ParamField body="accountId" type="string" required>
  The user being paid out. Same id as the incoming direction - see
  [Rheon ID](/rheon-id). A user onboarded for deposits does not onboard again.
</ParamField>

<ParamField body="card" type="object" required>
  Where the money lands. Send `token` when you hold a tokenised card from the
  hosted collection page, or `cardId` when the user's card is already on file
  from a previous payout. Raw card numbers are never accepted here.
</ParamField>

<ParamField body="reference" type="string">
  Your own idempotency key, up to 64 characters. Repeating a request with the
  same `reference` returns the original payout instead of creating a second one.
  Send one - a network timeout is otherwise indistinguishable from a failure.
</ParamField>

## Response

<ResponseField name="id" type="string">
  The payout id. Poll it with
  [POST /v1/card/payout/status](/api-reference/card-payout-status).
</ResponseField>

<ResponseField name="depositAddress" type="string">
  Where the user sends the stablecoins. **Single-use and tied to this payout.**
</ResponseField>

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

<ResponseField name="chain" type="number">
  The chain `depositAddress` lives on. Sending on any other chain loses the funds.
</ResponseField>

<ResponseField name="status" type="string">
  `pending` on creation. See [Statuses](/transactions/statuses).
</ResponseField>

<ResponseField name="expiresAt" type="string">
  ISO 8601. Stablecoins arriving after this are converted at the rate current on
  arrival, not the quoted one.
</ResponseField>

<Warning>
  **The address is single-use.** A second payout gets its own address. Money sent to
  a spent address has no order to attribute it to and has to be recovered by hand.
</Warning>

<Note>
  Some cards cannot receive a payout even when the country and currency are open -
  issuer policy decides, not us. That surfaces as a `rejected` status carrying the
  issuer's reason, and the stablecoins are returned to the sending wallet.
</Note>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "$RHEON_API/v1/card/payout" \
    -H "Authorization: Bearer $RHEON_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "quoteId": "cpq_7d31a80f5c",
      "accountId": "acct_8f2c91d0a4",
      "card": { "token": "tok_9c14ba7e02" },
      "reference": "payout-2026-09-02-114"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "cpo_41b8e0d7a2",
    "depositAddress": "0x9A3f1e77C0B4d2A8e5F16b09D7c34E82aB519d06",
    "depositAmount": "100.00",
    "chain": 42161,
    "status": "pending",
    "expiresAt": "2026-09-02T18:11:05Z"
  }
  ```
</ResponseExample>

## Errors

| HTTP | `code`              | When                                                 |
| ---- | ------------------- | ---------------------------------------------------- |
| 400  | `invalid_request`   | A field is missing or malformed.                     |
| 401  | `unauthorized`      | Missing, malformed, or unknown API key.              |
| 403  | `permission_denied` | Your key does not carry the card-payouts permission. |
| 404  | `account_not_found` | No such `accountId` under your key.                  |
| 409  | `quote_expired`     | The quote is past `expiresAt`. Quote again.          |
| 422  | `requires_action`   | The user needs a higher verification tier first.     |
| 429  | `rate_limited`      | Over your key's rate limit.                          |
| 502  | `upstream_error`    | The payout partner is unavailable.                   |
| 500  | `internal`          | Unexpected server error.                             |
