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

# Internal Transfer Statuses

> Lifecycle of an internal transfer, what each status means, where core transactions are created, and how to tell when money has moved.

Lead manages every internal transfer status. You create the transfer. After that, Lead moves it from `processing` to `posted` or `rejected`, and you can't change it.

## Lifecycle

The diagram shows every status and transition.

```mermaid theme={null}
flowchart LR
    processing --> posted
    processing --> rejected
```

## Statuses

The table lists each status.

| Status | Description | Notes |
| - | - | - |
| `processing` | Lead accepted the transfer and is executing it. | Transfers leave this status within seconds. Both core transaction IDs are `null`. |
| `posted` | Money moved from the sender's core balance to the receiver's. Terminal. | `sender_core_transaction_id` and `receiver_core_transaction_id` are set. |
| `rejected` | The transfer did not complete and isn't retried. Terminal. | See `rejection.reason` and `rejection.details` on [The Internal Transfer Object](https://docs.lead.bank/v2/products/internal-transfer/internal-transfer-object.md). Both core transaction IDs stay `null`. |

A request that fails the create checks returns an error and creates no transfer. The `rejected` status is for transfers Lead accepted and then could not post, for example because the sender's balance no longer had enough available funds.

## Where core transactions are created

A transfer that moves to `posted` creates two core transactions at once: a debit on `sender_core_balance_id` and a credit on `receiver_core_balance_id`. The transfer returns them as `sender_core_transaction_id` and `receiver_core_transaction_id`. A `rejected` transfer creates none.

## Observing changes

Treat `processing` as pending. Do not assume success from the `200` on create.

* **`internal_transfer.posted` webhook.** Sent when the transfer moves to `posted`. The payload is the internal transfer object. This is your signal that money moved.
* **`internal_transfer.rejected` webhook.** Sent when the transfer moves to `rejected`. The payload includes the `rejection` block.
* **Polling.** `GET /v2/internal_transfers/{internal_transfer_id}` returns the current status.

`processing` doesn't emit an event.

## Related

* [The Internal Transfer Object](https://docs.lead.bank/v2/products/internal-transfer/internal-transfer-object.md)
* [Internal Transfer Overview](https://docs.lead.bank/v2/products/internal-transfer/overview.md)
* [Core Balance Statuses](https://docs.lead.bank/products/core-balance/statuses.md)
* [Webhooks & Events](https://docs.lead.bank/api-reference/using-the-api/webhooks.md)
