Account by User+Asset
GET /v1/account/{user_id}/{asset}
Read a single account row by user + asset.
Dev-only. This user-scoped route only answers when the gateway runs with
DEV_TOOLS_ENABLED=true(orPERP_DEV_TOOLS_ENABLED=true); otherwise it returns403user-scoped account routes are disabled; use exchange session routes. It takes no authentication. The session-scoped equivalent isGET /v1/account/me/{asset}withAuthorization: Bearer <session_token>(same response shape;spot_free/spot_lockedare real there).
Request
GET /v1/account/{user_id}/{asset}
user_id is a UUID. asset is case-insensitive; CUSD, USDA and USDC-X are aliases of the funding asset USDC, which is reported back as CUSD.
Response — 200
{
"user_id": "5cfb031b593644679533cd2df576dbb8",
"asset": "CUSD",
"available": "85.230000",
"locked": "14.770000",
"spot_free": "0",
"spot_locked": "0"
}
user_id is returned as 32 hex chars (no hyphens). spot_free / spot_locked are always "0" on this route. Ledger-side failures surface as 500.
Internal tooling endpoint; web UI uses the FAPI balance instead.