POST /customers/:id/accounts/crypto/virtual
Request a wallet for this customer on the chosen rail. Asynchronous: only the AccountCreationRequest is written at POST time. The on-chain address lands once it is provisioned. Partner polls GET /customers/:id/accounts/requests/:request_id until request.status === "completed" and account_id is set.
Shape is inferred from rail ("ethereum"/"base"/"polygon"/"arbitrum"/"optimism" → "evm", "solana" → "sol").
Shared semantics live on the create-account index.
Uniqueness
A customer holds at most one virtual wallet per currency + rail pair — USDC on Ethereum and USDC on Base coexist, as do USDC and USDT on Ethereum. Requesting a second one for a pair the customer already holds returns a 400 naming the existing account.
Requesting one you deleted restores it, address and id intact, with an account.created webhook. A wallet deleted before its address was ever provisioned has nothing to restore, so that request provisions a new one. See getting a deleted account back.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
rail | string | number | yes | Currency-or-rail reference. By name ("base", "ethereum", …) or numeric id. |
currency | string | number | yes | Currency the minted wallet will hold ("USDC", …). Must be settleable on the chosen rail. |
Headers
| Header | Value |
|---|---|
Idempotency-Key | Optional, up to 256 characters. Re-POSTing the same (org, key) returns the existing creation request unchanged. |
Response 200
{
"request": {
"id": "req_…",
"customer_id": "2f10…",
"kind": "crypto",
"shape": "evm",
"origin": "virtual",
"currency": "USDC",
"rails": ["base"],
"status": "pending",
"idempotency_key": "abc-123",
"account_id": null,
"created_at": "2026-05-20T19:45:00Z",
"updated_at": "2026-05-20T19:45:00Z"
},
"account": null
}account is Account | null: null until Seismic finishes provisioning the wallet, then populated with the materialized Account shape.
Errors
- 400 InvalidAccountFields
rail: rail isn't crypto, or its inferred shape isn't one Seismic can provision a wallet for today (evmorsol). - 400 InvalidAccountFields
currency: currency isn't a stablecoin / crypto kind, or isn't settleable on the chosen rail. - 404: unknown currency or rail.
Example
curl -X POST "$SEISMIC_ORCHESTRATION_URL/v0/customers/2f10…/accounts/crypto/virtual" \
-H "Api-Key: $SEISMIC_ORCHESTRATION_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{
"rail": "base",
"currency": "USDC"
}'