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

# Account opening

> Turning an approved sub-client into a virtual account that can receive money.

An approved sub-client cannot be paid yet. It needs a virtual account, and opening one is a lifecycle of its own: you ask for the account, a bank decides, and only then does it have details a payer can use.

Creating it and opening it are two steps. The call returns immediately with an account that exists and is yours. The bank details arrive when the bank assigns them and are `null` until then, so nothing can be paid into it in the meantime.

## What advances it

| From                     | To            | What moves it                                                            |
| ------------------------ | ------------- | ------------------------------------------------------------------------ |
| `pending`                | `activating`  | The sub-client reaching a terminal approval                              |
| `activating`             | `active`      | The bank approves the application                                        |
| `pending` / `activating` | `failed`      | The account could not be opened                                          |
| `active`                 | `deactivated` | The account is closed — terminal                                         |
| `activating` / `active`  | `frozen`      | An operator freezes it. Reversible, and it blocks payouts while it lasts |

There is no upper bound on the `activating` step. It is a bank decision, not a queue you can hurry.

<Warning>
  **Wait for the account to report open, not to exist.** An account that exists but has not activated cannot receive anything, and its bank details are `null` until the bank assigns them. `virtual_account.activated` is the only funds-ready signal.
</Warning>

## What announces it

| Event                       | When                                                                   |
| --------------------------- | ---------------------------------------------------------------------- |
| `virtual_account.created`   | The account exists, possibly still activating                          |
| `virtual_account.activated` | **The only funds-ready signal.** Nothing before this can receive money |

## Choose the mode before you open it

An account is opened in either **fiat** or **crypto** mode, and the mode is permanent. It decides whether an arrival is converted on the way in, and therefore whether a conversion fee applies to every deposit — see [Virtual account](/overview/model/virtual-account).

## Sandbox

An account activates in sandbox the same way it does in production, and you can then credit it for real with [Simulate a deposit](/api-reference/virtual-accounts/simulate-a-deposit) — see [Inbound transaction or deposit](/lifecycles/deposit).

<Card title="Inbound transaction or deposit" icon="arrow-right" href="/lifecycles/deposit">
  Money arriving into an open account.
</Card>
