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

# Payout

> Money leaving to a counterparty, the states it passes through, and the two that only one event reveals.

A payout draws on a virtual account's available balance and sends it to a counterparty you saved earlier. It is the lifecycle with the most states, and two of them surface in only one place.

## What advances it

| Status        | Meaning                                                                                      |
| ------------- | -------------------------------------------------------------------------------------------- |
| `CREATED`     | Recorded, not started                                                                        |
| `PENDING`     | Queued                                                                                       |
| `PROCESSING`  | Handed to the rail                                                                           |
| `COMPLETED`   | The counterparty has the money. **Not an ending** — a bank return still moves it to `FAILED` |
| `FAILED`      | It did not go through — including returned by the receiving bank                             |
| `CANCELLED`   | Stopped before sending                                                                       |
| `IN_REVIEW`   | Held for a manual check                                                                      |
| `KYT_PENDING` | Held while a compliance check runs                                                           |
| `EXPIRED`     | A crypto-funded payout was never funded in time                                              |

<Warning>
  **`COMPLETED` is not terminal.** A bank rail can return an already-posted payout — for a request for information, an account error, or a post-settlement claw-back. That arrives as `payout.returned` and the payout becomes `FAILED`. Only `FAILED`, `CANCELLED` and `EXPIRED` are endings, so an integration that tells its customer the money landed on `COMPLETED` needs a path back from that.
</Warning>

<Warning>
  **`IN_REVIEW` and `KYT_PENDING` arrive through `payout.status_changed` and nothing else.** There is no dedicated event for either. An integration that subscribes only to the named events will see a payout leave `PROCESSING` and never learn where it went.
</Warning>

## What announces it

| Event                     | Resulting status                                                  |
| ------------------------- | ----------------------------------------------------------------- |
| `payout.created`          | `CREATED`                                                         |
| `payout.pending`          | `PENDING`                                                         |
| `payout.processing`       | `PROCESSING`                                                      |
| `payout.completed`        | `COMPLETED`                                                       |
| `payout.failed`           | `FAILED`                                                          |
| `payout.returned`         | `FAILED`, with the returned-by-bank error code                    |
| `payout.expired`          | `EXPIRED` — crypto only                                           |
| `payout.deposit_received` | None — a crypto-funded payout's funding was seen                  |
| `payout.status_changed`   | Carries `status` and `previous_status`. **Subscribe to this one** |

Compare status values **case-insensitively** rather than matching exact strings.

## Corridors

| Counterparty | Rail                          | Funded from                              | What identifies it afterwards   |
| ------------ | ----------------------------- | ---------------------------------------- | ------------------------------- |
| `ACH`        | A US bank account             | The account balance                      | The rail's own reference        |
| `WIRE`       | A bank account by wire        | The account balance                      | The wire's end-to-end reference |
| `WALLET`     | `solana`, `polygon` or `tron` | The balance, or a fresh on-chain funding | The transaction hash            |

A bank payout never carries a transaction hash, and a crypto payout never carries a wire reference. Which identifiers arrive is a property of the rail, not of the payout going well — see [The payout object](/reference/payouts/the-payout-object).

## Where an RFI interrupts it

`KYT_PENDING` is the compliance hold on this lifecycle, and it can also raise a request for information against the sub-client. Until it clears, the payout does not move.

Treat a hold as a state you display, not one you resolve by retrying. Retrying with the same idempotency key returns the same held payout; retrying with a fresh one creates a second payout that will be held for the same reason.

<Card title="States" icon="arrow-right" href="/lifecycles/states">
  Every status on every resource, and what moves it.
</Card>
