---
title: "Accounts (v2)"
description: "Choose the recipe for opening a v2 account for a customer: USD, EUR, GBP, NGN or Kenya-held, wallet-backed or fiat-only, and what to do until it is active."
---
Each recipe on this page opens a bank account in a customer's name and follows it until a payer can send money to it. Every recipe starts the same way. You [find what the customer can open](/recipes/accounts-v2/find-what-a-customer-can-open), then send one create request.

**API version:** v2. These recipes open accounts with `POST /v2/accounts`.

**Money example.** Ada, a UK freelancer, wants a US client to pay her 1,200.00 USD. Capabilities lists the USD options a GB individual can have. Requirements says the default option needs 13 fields and 2 documents. One `POST /v2/accounts` call returns `pending`. When `applications.accounts.completed` arrives, you read the account number and routing number, and Ada's client pays 1,200.00 USD into the account.

## Two words used everywhere

- **Wallet-backed.** The bank turns each deposit into USDC and puts it in a wallet that belongs to the account, on the network you choose. The option has a non-empty `token_wallets`, and the create request **must** carry `network` (or `wallet_id`).
- **Fiat-only.** The money stays in the account's currency at the bank. The option has `token_wallets: []`, and the create request **must not** carry `network` or `wallet_id`.

You never send a "backing" flag. You choose the backing by choosing the option, and you name the option in `bank_code`.

## Choose your recipe

| Currency | Wallet-backed | Fiat-only |
| :-- | :-- | :-- |
| USD, a person | Available. See [Open a wallet-backed USD account for a person](/recipes/accounts-v2/open-a-wallet-backed-usd-account-for-a-person) | Available for US residents. See [Open a fiat-only USD account in the US](/recipes/accounts-v2/open-a-fiat-only-usd-account-in-the-us). For Kenya residents, see [Kenya-held](/recipes/accounts-v2/open-an-account-held-in-kenya). Not supported elsewhere |
| USD, a business | Available. See [Open a wallet-backed USD account for a business](/recipes/accounts-v2/open-a-wallet-backed-usd-account-for-a-business) | Available for US companies. See [Open a fiat-only USD account in the US](/recipes/accounts-v2/open-a-fiat-only-usd-account-in-the-us). For Kenya, see [Kenya-held](/recipes/accounts-v2/open-an-account-held-in-kenya). Not supported elsewhere |
| EUR or GBP | Available. See [Open a wallet-backed EUR or GBP account](/recipes/accounts-v2/open-a-wallet-backed-eur-or-gbp-account) | Available, one IBAN per customer. See [Open a EUR or GBP account with its own IBAN](/recipes/accounts-v2/open-a-eur-or-gbp-account-with-its-own-iban) |
| NGN | Not supported | Available for Nigeria. See [Open an NGN account](/recipes/accounts-v2/open-an-ngn-account) |
| KES, TZS, UGX | Not supported | Available for Kenya residents. See [Open an account held in Kenya](/recipes/accounts-v2/open-an-account-held-in-kenya) |
| CNY, RWF | Not supported | Not yet available |
| MXN, BRL, COP and others | Not supported | Not supported |

The options a customer sees depend on their country. Read `excluded_countries` from capabilities for each customer. Never rely on a fixed list.

After you send the create request:

| Situation | Recipe |
| :-- | :-- |
| The account is `pending` with `requires_user_action: true`, or you received `applications.accounts.blocked` | [Unblock an application](/recipes/accounts-v2/unblock-an-application) |
| You want a second account for the same customer, or you got a 409 | [Open a second account](/recipes/accounts-v2/open-a-second-account) |
| The account is `active`, and you need to know what to give the payer and how to see the money arrive | [Share account details and receive a deposit](/recipes/accounts-v2/share-account-details-and-receive-a-deposit) |
| You want to test deposits in sandbox | [Test accounts with a simulated deposit](/recipes/accounts-v2/test-accounts-with-a-simulated-deposit) |

## Rules every recipe relies on

- Send every request to `https://api.gravv.xyz` with your key in the `Api-Key` header. A key that starts with `grvSec_sandbox_` reaches sandbox. Any other key is live.
- The customer's `basic` KYC must be `completed`. For a business, every associated person's KYC must be `completed` first, then the business's. See [Customers and KYC](/recipes/customers-and-kyc/overview).
- Send a new `Idempotency-Key` with every POST. Gravv replays a 4xx for 24 hours under its key, so **use a new key after you fix a request**. After a 5xx or a timeout, retry with the **same** key. Gravv does not duplicate the account.
- A 400 response to a create request lists **every** problem in `details`, keyed by field. Fix them all at once.
- `network` and `wallet_id` go at the top level, never in `data.root`. Always send `customer_type`. Send `citizenship_country` (a person) or `incorporation_country` (a business) in `data.root`.
- Use `category` `sub_account` for a customer's account.
- The create response has no `application_id`. Read it from `GET /v2/accounts/{id}`.
- v2 never sends `account.activated` for an account you open. Wait for `applications.accounts.completed`, then read the account for its bank details.
- Deduplicate webhooks on the body's `event_id`.
- **Sandbox KYC does not complete today.** Until Gravv fixes it, every sandbox create request returns `CUSTOMER_KYC_INCOMPLETE`. Capabilities, requirements, reads and error paths work.
