Accounts (v2)
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, 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 carrynetwork(orwallet_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 carrynetworkorwallet_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 | Available for US residents. See Open a fiat-only USD account in the US. For Kenya residents, see Kenya-held. Not supported elsewhere |
| USD, a business | Available. See Open a wallet-backed USD account for a business | Available for US companies. See Open a fiat-only USD account in the US. For Kenya, see Kenya-held. Not supported elsewhere |
| EUR or GBP | Available. See Open a wallet-backed EUR or GBP account | Available, one IBAN per customer. See Open a EUR or GBP account with its own IBAN |
| NGN | Not supported | Available for Nigeria. See Open an NGN account |
| KES, TZS, UGX | Not supported | Available for Kenya residents. See 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 |
| You want a second account for the same customer, or you got a 409 | 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 |
| You want to test deposits in sandbox | Test accounts with a simulated deposit |
Rules every recipe relies on
- Send every request to
https://api.gravv.xyzwith your key in theApi-Keyheader. A key that starts withgrvSec_sandbox_reaches sandbox. Any other key is live. - The customer's
basicKYC must becompleted. For a business, every associated person's KYC must becompletedfirst, then the business's. See Customers and KYC. - Send a new
Idempotency-Keywith 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. networkandwallet_idgo at the top level, never indata.root. Always sendcustomer_type. Sendcitizenship_country(a person) orincorporation_country(a business) indata.root.- Use
categorysub_accountfor a customer's account. - The create response has no
application_id. Read it fromGET /v2/accounts/{id}. - v2 never sends
account.activatedfor an account you open. Wait forapplications.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.