Open your card account
Opens your business's one card account, which backs every card you issue. Send type card, currency USD and your business's own customer ID, which is the customer_id on your account whose category is main. The API refuses an end customer's ID and a second card account. The account starts pending. Wait for the account.activated webhook, or read the account until it is active, before you activate cards with it.
This is the only use of POST /v1/accounts that Gravv documents. Open every other account with POST /v2/accounts. Every error is HTTP 400.
Headers
Required for POST requests. The key is 1 to 255 printable ASCII characters. A retry with the same key and body within 24 hours returns the first response, including a 400. After you fix a failed request, send a new key.
Request Body
Always USD
Possible values: USD
Always card
Possible values: card
Label for the account
Your business's own customer ID. It is the customer_id on your account whose category is main.
Network of the account's wallet, in lower case
Possible values: polygon, ethereum, solana, stellar, avalanche_c_chain
Bank that holds the card account
Possible values: lead_bank, cross_river_bank
Request Examples
{
"currency": "USD",
"type": "card",
"label": "cards",
"customer_id": "550e8400-e29b-41d4-a716-446655440178",
"blockchain_network": "polygon",
"bank": "cross_river_bank"
}
Responses
| Status | Description |
|---|---|
200 |
Account created |
400 |
The request failed. These account routes return every error as HTTP 400, including not found. Read the error message for the cause. |
200 response
An internal account. The API leaves out empty fields. It also returns accounts opened with /v2/accounts, without their v2-only fields.
Type of account.
Possible values: regular, savings, card, auto_sweep, collection, default, non_custodial
What the account can do. It depends on the account type.
Possible values: transfer, receive, remittance, card_payment, sweep_collection
pending while the bank sets the account up, then active. frozen means suspended or set-up failed, manual_review means held for review, and deleted is closed and final. reason explains a status other than active.
Possible values: active, pending, frozen, manual_review, deleted
Why the account is not active. Omitted for active accounts.
main for your own accounts, sub_account for your customers' accounts.
Possible values: main, sub_account
Balance as a decimal string in major units. For USD it is the USDC balance. For EUR it is that balance converted to EUR. For NGN it is the token balance. For other currencies it is the USDC amount, not converted. The API omits it when it cannot read the balance, so treat a missing value as unknown, not zero.
True for NGN accounts
Set for NGN accounts only
Possible values: settle, auto_onramp
The token wallet of an NGN account
Deposit account number. The US account number for USD, the IBAN for EUR, the account number for GBP, the CLABE for MXN and the BR code for BRL. Bank details appear only once the account is active.
The ABA routing number for USD, the BIC for EUR and the sort code for GBP.
Balance per token
{
"data": {
"id": "6f1c2b8e-9a43-4f0e-8d35-2b7f0f6c1a90",
"label": "cards",
"date_created": "2026-10-13T09:12:44Z",
"wallet_address": "0x25a4c9853e761753ae18d6871731e305b8b0b2a4",
"blockchain_network": "polygon",
"type": "card",
"customer_id": "550e8400-e29b-41d4-a716-446655440178",
"capabilities": [
"transfer",
"receive",
"remittance"
],
"currency": "USD",
"tenant_name": "Acme Payments",
"tenant_id": "b8b2f7f4-3c2a-4f3e-9d61-0c5a7d1e2f33",
"status": "pending",
"category": "sub_account"
},
"error": null
}
400 response
Human-readable error message.
Authorization
- ApiKeyAuth