Skip to content
Logo

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

FieldTypeRequiredNotes
railstring | numberyesCurrency-or-rail reference. By name ("base", "ethereum", …) or numeric id.
currencystring | numberyesCurrency the minted wallet will hold ("USDC", …). Must be settleable on the chosen rail.

Headers

HeaderValue
Idempotency-KeyOptional, 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 (evm or sol).
  • 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"
  }'