Gauntlet API

Public read-only REST API (v1) for Gauntlet vault data, user positions, and event analytics — vault metrics, definitions and timeseries, user positions with PnL and ROI, wallet activity logs, aggregate TVL, and token prices. JSON responses with a request_id/refreshed_at meta envelope, cursor pagination, and per-key rate limits.

OpenAPI Specification

gauntlet-openapi-original.json Raw ↑
{"openapi":"3.1.0","info":{"title":"Gauntlet API","description":"Gauntlet vault data, user positions, and event analytics API.","contact":{"name":"Gauntlet","url":"https://gauntlet.xyz"},"license":{"name":""},"version":"1.0.0"},"paths":{"/health":{"get":{"tags":["System"],"summary":"Liveness check","description":"Returns service version + uptime. Use `/health/chains` for indexer freshness per chain.","operationId":"health","responses":{"200":{"description":"Service is live","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/health/chains":{"get":{"tags":["System"],"summary":"Chain sync status","description":"Returns per-chain indexer sync status with freshness indicators.","operationId":"chain_sync_status","responses":{"200":{"description":"Chain sync status","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChainSyncStatus"}}}}}}}},"/v1/prices":{"get":{"tags":["Prices"],"summary":"Get latest token price","description":"Returns the latest USD price for a token. Query parameters: `address` (required), `chain_id` (required), `at` (optional ISO 8601 timestamp).","operationId":"get_latest_price","responses":{"200":{"description":"Token price","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestPriceResponse"}}}},"404":{"description":"Token not found"},"422":{"description":"Invalid parameters"},"503":{"description":"Pricing service not configured"}}}},"/v1/prices/timeseries":{"get":{"tags":["Prices"],"summary":"Get historical token prices","description":"Returns a USD price timeseries for a token. Query parameters: `address` (required), `chain_id` (required), `start` (required ISO 8601), `end` (required ISO 8601), `granularity` (optional: `raw` | `hour` | `day` | `week` | `month`), `limit` (optional, default 1000, max 5000).","operationId":"get_price_history","responses":{"200":{"description":"Price timeseries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimeseriesResponse"}}}},"422":{"description":"Invalid parameters"},"503":{"description":"Pricing service not configured"}}}},"/v1/tvl":{"get":{"tags":["TVL"],"summary":"Get live aggregate TVL","description":"Returns live aggregate Gauntlet TVL composed from indexed Gaia vault data and configured external TVL sources. Source totals are always returned; pass `?include_breakdown=true` for chain and external-source explainability rows.","operationId":"get_tvl","parameters":[{"name":"include_breakdown","in":"query","description":"Include chain and external-source TVL breakdown rows.","required":false,"schema":{"type":"boolean"}},{"name":"include_sources","in":"query","description":"Deprecated alias for include_breakdown.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"Live aggregate TVL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TvlResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Data source unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/users/{wallet_address}/activity":{"get":{"tags":["Users"],"summary":"Get user wallet activity (deposits, withdrawals, transfers)","description":"Immutable log of on-chain events that affected the wallet's vault position. Each row is a frozen-in-time record; rows never mutate after emission. \n\n`?vault_id=` narrows to one vault; omitted = activity across every vault the wallet has touched. Each row echoes its `vault_id` so wallet-wide consumers can distinguish per-vault activity. \n\nAsync deposit/redeem lifecycles emit multiple rows (one at request time with `status=pending`, a later one with `status=settled` or `refunded`). Consumers correlate them via `request_hash` to follow a single action across rows. Sync flows emit one row directly in the settled state. \n\nPagination is cursor-only. Default order is `desc` (newest first). Default page size 100, max 1000.","operationId":"get_user_activity","parameters":[{"name":"wallet_address","in":"path","description":"Ethereum wallet address","required":true,"schema":{"type":"string"}},{"name":"vault_id","in":"query","description":"CAIP-10 vault identifier. Optional — omit for wallet-wide activity across every vault the wallet has touched.","required":false,"schema":{"type":"string"}},{"name":"next","in":"query","description":"Opaque cursor from previous `meta.next_cursor`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–1000, default 100).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"order","in":"query","description":"Sort direction: `desc` (default) or `asc`.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"User wallet activity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserActivityResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/users/{wallet_address}/positions":{"get":{"tags":["Users"],"summary":"Get all current positions for a wallet","description":"Returns every vault position the wallet currently holds or has pending exposure in (pending deposit or redeem). Fully-exited positions (zero shares, no pending escrow) are excluded.\n\nAll monetary metrics include a `usd` field (null when pricing is unavailable). `value.usd` and `pending_deposit_assets.usd` use the current spot price. `cost_basis.usd` and `pnl.realized.usd` are computed by replaying on-chain events against the token's historical price series — the same method used by `GET /v1/users/{wallet}/positions/{vault_id}`. `pnl.unrealized.usd`, `pnl.total.usd`, and `roi_pct.usd` are derived from those.\n\nCursor-paginated on internal position ID. Default page size 100, max 500.","operationId":"get_user_all_positions","parameters":[{"name":"wallet_address","in":"path","description":"Ethereum wallet address","required":true,"schema":{"type":"string"}},{"name":"next","in":"query","description":"Opaque cursor from previous `meta.next_cursor`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–500, default 100).","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"All wallet positions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAllPositionsResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/users/{wallet_address}/positions/{vault_id}":{"get":{"tags":["Users"],"summary":"Get user position in a specific vault","description":"Returns the current position snapshot for a wallet in a single vault. Historical points live on `/positions/{vault_id}/timeseries`.","operationId":"get_user_vault_position","parameters":[{"name":"wallet_address","in":"path","description":"Ethereum wallet address","required":true,"schema":{"type":"string"}},{"name":"vault_id","in":"path","description":"Vault identifier","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Single vault position","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPositionLatestResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Position not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/users/{wallet_address}/positions/{vault_id}/timeseries":{"get":{"tags":["Users"],"summary":"Get user position timeseries for a specific vault","description":"Returns historical value, cost basis, grouped PnL, and ROI data for a single vault position. Default order is `asc` (oldest first, chart-friendly); pass `?order=desc` for newest-first list views. Cursor-paginated — pass `meta.next_cursor` back as `?next=` for the next page (cursor is bound to the order it was created with). Defaults to `granularity=day` (one UTC-midnight snapshot per day); `week` returns Monday 00:00 UTC snapshots, `month` returns first-of-month 00:00 UTC snapshots, and `hour` returns the raw hourly cadence. Default page size is 1000.","operationId":"get_user_vault_position_timeseries","parameters":[{"name":"wallet_address","in":"path","description":"Ethereum wallet address","required":true,"schema":{"type":"string"}},{"name":"vault_id","in":"path","description":"Vault identifier","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","description":"Window start: ISO 8601 date (`2026-01-01`, read as 00:00:00 UTC) or RFC 3339 timestamp (`2026-01-01T00:00:00Z`).","required":false,"schema":{"type":"string"}},{"name":"end","in":"query","description":"Window end: ISO 8601 date (`2026-01-01`, read as 00:00:00 UTC) or RFC 3339 timestamp (`2026-01-01T00:00:00Z`).","required":false,"schema":{"type":"string"}},{"name":"next","in":"query","description":"Opaque cursor from previous `meta.next_cursor`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–10000, default 1000).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"order","in":"query","description":"Sort direction: `asc` (default) or `desc`.","required":false,"schema":{"type":"string"}},{"name":"granularity","in":"query","description":"Sampling granularity: `day` (default), `hour`, `week`, or `month`. Day/week/month buckets start at 00:00 UTC; weeks start Monday and months start on the 1st.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Position timeseries","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPositionsTimeseriesResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/vaults":{"get":{"tags":["Vaults"],"summary":"List Gauntlet-curated vaults","description":"Returns identification-only rows for the admin-curated visible vaults, ordered most-recent-first; pass `?include_hidden=true` for every enabled vault (hidden included, disabled never). Use `/{vault_id}` for current metrics, `/{vault_id}/definition` for the full vault definition, `/{vault_id}/timeseries` for history.\n\nCursor-paginated, but the default page size is the cap so most callers don't need to think about it — pass `meta.next_cursor` back as `?next=` only if the result exceeds 1000 vaults.","operationId":"list_vaults","parameters":[{"name":"next","in":"query","description":"Opaque cursor from previous `meta.next_cursor`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–1000, default 1000).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"include_hidden","in":"query","description":"Include hidden (enabled but unlisted) vaults alongside visible ones. Disabled vaults are never listed.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of vaults"},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/vaults/featured":{"get":{"tags":["Vaults"],"summary":"List featured vaults","description":"Returns the admin-curated featured shortlist, one card per logical vault in curated order: display name, marketing description, deployed chains (highest-TVL first), supply token, aggregate TVL, and the highest 7/30/90-day APY across deployments. `vault_ids` carries per-deployment `{chainId}:{address}` ids for `/v1/vaults/{vault_id}` links, in the same order as `chains`.","operationId":"list_featured_vaults","responses":{"200":{"description":"Featured vault cards","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeaturedVaultsResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Data source unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/vaults/{vault_id}":{"get":{"tags":["Vaults"],"summary":"Get current vault metrics","description":"Returns the current metrics snapshot for a vault — same metric shape that `/timeseries` emits per point, so this is `current point` and timeseries is `historical points`. The vault's protocol-specific definition (fees, hooks, curator, etc.) lives on `/{vault_id}/definition`.","operationId":"get_vault","parameters":[{"name":"vault_id","in":"path","description":"Vault identifier (CAIP-10 `chainId:address`)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current vault metrics","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultDetailResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Vault not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/vaults/{vault_id}/definition":{"get":{"tags":["Vaults"],"summary":"Get vault definition","description":"Returns the vault's identity + protocol-specific definition: name, owner, numeraire token, hooks, fees, curator, etc., merged inline based on `vault_type`. Aera carries hooks/feeCalculator, Morpho V1/V2 carry curator + WAD-scaled fees, Symbiotic carries identity only.","operationId":"get_vault_definition","parameters":[{"name":"vault_id","in":"path","description":"Vault identifier (CAIP-10 `chainId:address`)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vault definition"},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Vault not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/vaults/{vault_id}/timeseries":{"get":{"tags":["Vaults"],"summary":"Get vault timeseries data","description":"Returns historical metric data points. Default order is `asc` (oldest first, chart-friendly); pass `?order=desc` for newest-first list views. Supports date range filtering and cursor pagination — pass `meta.next_cursor` back as `?next=` for the next page (cursor is bound to the order it was created with). Defaults to `granularity=day` (one UTC-midnight snapshot per day); `week` returns Monday 00:00 UTC snapshots, `month` returns first-of-month 00:00 UTC snapshots, and `hour` returns the raw hourly cadence. Default page size is 1000.","operationId":"get_vault_timeseries","parameters":[{"name":"vault_id","in":"path","description":"Vault identifier","required":true,"schema":{"type":"string"}},{"name":"start","in":"query","description":"Window start: ISO 8601 date (`2026-01-01`, read as 00:00:00 UTC) or RFC 3339 timestamp (`2026-01-01T00:00:00Z`).","required":false,"schema":{"type":"string"}},{"name":"end","in":"query","description":"Window end: ISO 8601 date (`2026-01-01`, read as 00:00:00 UTC) or RFC 3339 timestamp (`2026-01-01T00:00:00Z`).","required":false,"schema":{"type":"string"}},{"name":"next","in":"query","description":"Opaque cursor from previous `meta.next_cursor`.","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Page size (1–10000, default 1000).","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"order","in":"query","description":"Sort direction: `asc` (default) or `desc`.","required":false,"schema":{"type":"string"}},{"name":"granularity","in":"query","description":"Sampling granularity: `day` (default), `hour`, `week`, or `month`. Day/week/month buckets start at 00:00 UTC; weeks start Monday and months start on the 1st.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Timeseries data points","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultTimeseriesResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Vault not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AmountPair":{"type":"object","description":"Decimal-string metric paired across native (numeraire-token) and USD.\n`native` is always present; `usd` is JSON null when pricing is unavailable.","required":["native"],"properties":{"native":{"type":"string"},"usd":{"type":["string","null"]}}},"AssetDelta":{"type":"object","description":"Asset-delta envelope on user activity rows. `native` is always present;\n`token` is present when the indexer knows the row's asset token.\nThe struct shape is kept stable so derived denominations (usd,\nnumeraire token) can be added later without breaking integrators.","required":["native"],"properties":{"native":{"type":"string"},"token":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TokenRef"}]}}},"BasicMeta":{"type":"object","required":["request_id","refreshed_at"],"properties":{"refreshed_at":{"type":"string","format":"date-time"},"request_id":{"type":"string"}}},"ChainSyncStatus":{"type":"object","required":["chain_id","latest_block","latest_timestamp","lag_seconds","freshness"],"properties":{"chain_id":{"type":"integer","format":"int64"},"freshness":{"type":"string"},"lag_seconds":{"type":"integer","format":"int64"},"latest_block":{"type":"integer","format":"int64"},"latest_timestamp":{"type":"integer","format":"int64"}}},"CuratedTvl":{"type":"object","description":"USD amount on curated aggregates: decimal string, `null` when the\npricing service is not configured.","properties":{"usd":{"type":["string","null"]}}},"ErrorBody":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code (e.g. `NOT_FOUND`, `UNAUTHORIZED`)"},"details":{},"message":{"type":"string","description":"Human-readable error message"}}},"ErrorResponse":{"type":"object","description":"Standard error response envelope returned on 4xx/5xx","required":["error"],"properties":{"error":{"$ref":"#/components/schemas/ErrorBody"}}},"FeaturedVault":{"type":"object","required":["slug","name","chains","tvl","vault_ids"],"properties":{"apy_30d_max":{"type":["number","null"],"format":"double","description":"Highest 30-day APY across the vault's deployments."},"apy_7d_max":{"type":["number","null"],"format":"double","description":"Highest 7-day APY across the vault's deployments, fraction\n(0.0573 = 5.73%). `null` while every window is warming up."},"apy_90d_max":{"type":["number","null"],"format":"double","description":"Highest 90-day APY across the vault's deployments."},"chains":{"type":"array","items":{"type":"string"},"description":"Chain slugs the vault is deployed on, highest-TVL first."},"description":{"type":["string","null"],"description":"Curated marketing description; `null` when the curator hasn't\nwritten one."},"name":{"type":"string","description":"Curated display name."},"short_description":{"type":["string","null"],"description":"Card-length copy (e.g. \"Conservative lending yield with low\nrisk\"). `null` when the curator hasn't written any; consumers\ndecide whether to fall back to `description`."},"slug":{"type":"string","description":"Admin registry slug for the logical vault (stable identifier)."},"supply_token":{"type":["string","null"],"description":"Supply (numeraire) token symbol, from the highest-TVL deployment\nthat reports one."},"tvl":{"$ref":"#/components/schemas/CuratedTvl","description":"Aggregate TVL across the vault's deployments (\"Total Supply\")."},"updated_at":{"type":["string","null"],"format":"date-time","description":"Most recent indexer snapshot among the vault's deployments;\n`null` when no deployment carried a usable timestamp."},"vault_ids":{"type":"array","items":{"type":"string"},"description":"Per-deployment API vault ids (`{chainId}:{address}`, same order\nas `chains`) for `/v1/vaults/{vault_id}` links."}}},"FeaturedVaultsResponse":{"type":"object","required":["meta","data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FeaturedVault"}},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"HealthResponse":{"type":"object","required":["status","version","uptime_seconds"],"properties":{"status":{"type":"string"},"uptime_seconds":{"type":"integer","format":"int64","minimum":0},"version":{"type":"string"}}},"HistoricalPriceValue":{"type":"object","required":["usd"],"properties":{"usd":{"type":"number","format":"double"}}},"LatestPriceResponse":{"type":"object","required":["address","chain_id","symbol","price","currency","timestamp"],"properties":{"address":{"type":"string"},"chain_id":{"type":"integer","format":"int64","minimum":0},"currency":{"type":"string"},"price":{"$ref":"#/components/schemas/PriceValue"},"symbol":{"type":"string"},"timestamp":{"type":"string"}}},"ListMeta":{"type":"object","required":["request_id","refreshed_at","count"],"properties":{"count":{"type":"integer","format":"int64","description":"Rows in this response."},"refreshed_at":{"type":"string","format":"date-time"},"request_id":{"type":"string"}}},"PartialResponseError":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Machine-readable error code for the isolated item failure."},"message":{"type":"string","description":"Human-readable error message."},"resource_id":{"type":["string","null"],"description":"Resource that failed inside the aggregate response, when known."}}},"PnlBreakdown":{"type":"object","required":["total","unrealized","realized"],"properties":{"realized":{"$ref":"#/components/schemas/AmountPair","description":"Locked-in PnL from past disposals."},"total":{"$ref":"#/components/schemas/AmountPair","description":"`unrealized` + `realized`."},"unrealized":{"$ref":"#/components/schemas/AmountPair","description":"`value` − `cost_basis`."}}},"PositionTimeseriesPoint":{"type":"object","required":["timestamp","shares_owned","value","cost_basis","pnl","roi_pct"],"properties":{"cost_basis":{"$ref":"#/components/schemas/AmountPair","description":"Cumulative cost of held shares (`usd` uses per-event historical pricing)."},"pnl":{"$ref":"#/components/schemas/PnlBreakdown","description":"Profit and loss grouped by total, unrealized, and realized values."},"roi_pct":{"$ref":"#/components/schemas/RatioPair","description":"ROI ratio (`native` is in-kind; `usd` is null when pricing unavailable)."},"shares_owned":{"type":"string","description":"Shares currently held by the wallet at this timestamp."},"timestamp":{"type":"string","format":"date-time"},"value":{"$ref":"#/components/schemas/AmountPair","description":"Position value at this timestamp (`native` = numeraire-token units,\n`usd` = `native` × historical USD price; null when unavailable)."}}},"PriceValue":{"type":"object","required":["usd","decimals"],"properties":{"decimals":{"type":"integer","format":"int32","minimum":0},"usd":{"type":"number","format":"double"}}},"RatioPair":{"type":"object","description":"JSON-number ratio paired across native (in-kind) and USD denominations.\nNull when event history is unavailable or cannot support ROI replay.","properties":{"native":{"type":["number","null"],"format":"double"},"usd":{"type":["number","null"],"format":"double"}}},"TimeseriesMeta":{"type":"object","required":["request_id","refreshed_at","count","limit"],"properties":{"count":{"type":"integer","format":"int64","description":"Number of points in this response."},"end":{"type":["string","null"],"format":"date-time"},"limit":{"type":"integer","format":"int64","description":"Page-size cap actually applied."},"next_cursor":{"type":["string","null"],"description":"Set when more pages exist; pass back as `?next=`."},"partial_errors":{"type":["array","null"],"items":{"$ref":"#/components/schemas/PartialResponseError"},"description":"Item-scoped failures isolated from an aggregate response."},"refreshed_at":{"type":"string","format":"date-time"},"request_id":{"type":"string"},"start":{"type":["string","null"],"format":"date-time","description":"Window bounds the response covers (echoes the request when set)."}}},"TimeseriesPoint":{"type":"object","required":["timestamp","price"],"properties":{"price":{"$ref":"#/components/schemas/HistoricalPriceValue"},"timestamp":{"type":"string"}}},"TimeseriesResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimeseriesPoint"}}}},"TokenRef":{"type":"object","required":["address"],"properties":{"address":{"type":"string"},"decimals":{"type":["integer","null"],"format":"int32"},"symbol":{"type":["string","null"]}}},"TvlAmount":{"type":"object","required":["usd"],"properties":{"usd":{"type":"string"}}},"TvlBreakdown":{"type":"object","required":["id","label","source_id","tvl","updated_at"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"source_id":{"type":"string"},"tvl":{"$ref":"#/components/schemas/TvlAmount"},"updated_at":{"type":"string","format":"date-time"}}},"TvlResponse":{"type":"object","required":["meta","data"],"properties":{"data":{"$ref":"#/components/schemas/TvlSummary"},"meta":{"$ref":"#/components/schemas/BasicMeta"}}},"TvlSummary":{"type":"object","required":["tvl","updated_at","totals"],"properties":{"breakdown":{"type":["array","null"],"items":{"$ref":"#/components/schemas/TvlBreakdown"}},"totals":{"type":"array","items":{"$ref":"#/components/schemas/TvlTotal"}},"tvl":{"$ref":"#/components/schemas/TvlAmount"},"updated_at":{"type":"string","format":"date-time"}}},"TvlTotal":{"type":"object","required":["id","label","tvl","updated_at"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"tvl":{"$ref":"#/components/schemas/TvlAmount"},"updated_at":{"type":"string","format":"date-time"}}},"UserActivity":{"type":"object","description":"One immutable entry in the wallet's activity log.\n\nEach row represents a single on-chain event that affected the\nwallet's vault position. Async deposit/redeem lifecycles emit\nmultiple rows (one per lifecycle event — request, solve, refund);\neach row is frozen at emission time and never mutates. To follow\nan async action across rows, correlate via `request_hash`.","required":["block_timestamp","type","vault_id","tx_hash","block_number","block_hash","shares_delta","assets_delta"],"properties":{"assets_delta":{"$ref":"#/components/schemas/AssetDelta","description":"Signed asset delta in the row's asset-token units, using a\ndeposit-ledger sign convention (NOT wallet-flow direction):\n- Positive = a deposit-direction action (`deposit`,\n  `deposit_pending`, `transfer_in`).\n- Negative = a withdraw-direction action (`withdraw`,\n  `deposit_refunded`, `transfer_out`).\n- `0` = no asset movement at this event\n  (`deposit` on Aera async solve, `withdraw_pending`,\n  `withdraw_refunded`).\n\nNote: under this convention `deposit_refunded` is negative\n(a deposit was unwound) even though tokens flow back INTO the\nwallet, and async `withdraw` (Aera redeem_solved) is negative\neven though tokens flow back INTO the wallet — the sign tracks\nthe deposit-ledger direction, not the user's wallet balance.\n\nSumming across rows for a single async lifecycle gives the net\nsigned asset movement of that lifecycle (no double-counting).\n`assets_delta.token` identifies the asset token when known. Emitted\nas a struct (`{ native: \"...\", token: { address, symbol } }`) so\nderived denominations (e.g. usd) can be added later without breaking\nthe response shape."},"block_hash":{"type":"string","description":"Block hash — 1:1 identifier for the block this event was mined\nin. Consumers needing to detect reorgs should key off this rather\nthan `block_number` (multiple blocks can share a number across a\nreorg)."},"block_number":{"type":"integer","format":"int64","description":"Block number — kept alongside `block_timestamp` for on-chain\nreconciliation / explorer linking."},"block_timestamp":{"type":"integer","format":"int64","description":"Unix seconds, block time (`block.timestamp` from the chain)."},"request_hash":{"type":["string","null"],"description":"Aera async-flow correlation hash. Links a `*_pending` row to\nits later terminal row (bare `deposit`/`withdraw` for settled,\nor `*_refunded`) of the same lifecycle. Emitted only on rows\nthat participate in an async flow; omitted on sync rows and on\nsecondary-market transfers."},"shares_delta":{"type":"string","description":"Signed share delta in 18-decimal units, reported at the event\nwhere the shares actually moved. Conventions by row type:\n- `deposit` — positive (shares minted to the wallet).\n- `deposit_pending` / `deposit_refunded` — `0` (no share\n  movement; deposit requests touch assets only).\n- `withdraw_pending` — negative for Aera async redeems (shares\n  leave the wallet at request time, escrowed to the Provisioner).\n- `withdraw` — negative for sync (Morpho) withdraws (shares\n  burn on the same row that pays out assets); `0` for Aera\n  async redeems (the share movement is recorded on the paired\n  `withdraw_pending` row).\n- `withdraw_refunded` — positive (escrowed shares return).\n- `transfer_in` — positive; `transfer_out` — negative.\n\nSumming across rows for a single async lifecycle gives the net\nshare movement of that lifecycle — there is no double-counting."},"tx_hash":{"type":"string","description":"Transaction hash of the on-chain event."},"type":{"type":"string","description":"What happened. One of:\n- `deposit` — settled deposit (sync vault flow or async terminal solve).\n- `deposit_pending` — async deposit request submitted; awaiting solver.\n- `deposit_refunded` — async deposit returned without settling; assets bounced back.\n- `withdraw` — settled withdrawal (sync vault flow or async terminal solve).\n- `withdraw_pending` — async redeem request submitted; awaiting solver.\n- `withdraw_refunded` — async redeem returned without settling; shares bounced back.\n- `transfer_in` — vault shares received from another EOA (secondary market).\n- `transfer_out` — vault shares sent to another EOA.\n\nAsync deposit/redeem lifecycles emit two rows (a `*_pending` at\nrequest time, then a separate terminal row — bare `deposit` or\n`_refunded` — at solve time). Rows are immutable; the pending\nrow never mutates. Correlate the pair via `request_hash`."},"vault_id":{"type":"string","description":"CAIP-10 vault identifier this row belongs to. Always emitted."}}},"UserActivityResponse":{"type":"object","required":["meta","data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserActivity"}},"meta":{"$ref":"#/components/schemas/TimeseriesMeta"}}},"UserAllPositionsResponse":{"type":"object","required":["meta","data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserPosition"}},"meta":{"$ref":"#/components/schemas/TimeseriesMeta"}}},"UserPosition":{"type":"object","required":["vault_id","wallet_address","metrics"],"properties":{"metrics":{"$ref":"#/components/schemas/UserPositionMetrics"},"numeraire_token":{"oneOf":[{"type":"null"},{"$ref":"#/components/schemas/TokenRef"}]},"vault_id":{"type":"string"},"wallet_address":{"type":"string"}}},"UserPositionLatestResponse":{"type":"object","required":["meta","data"],"properties":{"data":{"$ref":"#/components/schemas/UserPosition"},"meta":{"$ref":"#/components/schemas/BasicMeta"}}},"UserPositionMetrics":{"type":"object","required":["pending_deposit_assets","shares_owned","pending_redeem_shares","value","cost_basis","pnl","roi_pct"],"properties":{"cost_basis":{"$ref":"#/components/schemas/AmountPair","description":"Cumulative cost of currently-held shares."},"pend

# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/gauntlet/refs/heads/main/openapi/gauntlet-openapi-original.json