@sharpe-terminal/mcp-server 1.7.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/contracts/manifest.d.ts.map +1 -1
- package/dist/contracts/manifest.js +1 -1
- package/dist/contracts/manifest.js.map +1 -1
- package/dist/endpoint-tools.d.ts +3 -1
- package/dist/endpoint-tools.d.ts.map +1 -1
- package/dist/endpoint-tools.js +7 -1
- package/dist/endpoint-tools.js.map +1 -1
- package/dist/resources.d.ts +8 -0
- package/dist/resources.d.ts.map +1 -1
- package/dist/resources.js +2 -0
- package/dist/resources.js.map +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* the same document (packages/mcp-server-python/sharpe_mcp/sharpe_contract.json).
|
|
6
6
|
*/
|
|
7
7
|
// A string parsed once at load: a 0.8 MB object literal would cost the type checker, not the runtime.
|
|
8
|
-
export const MANIFEST = JSON.parse("{\"version\":2,\"source\":\"src/contracts (generated by scripts/contracts/agent-manifest.ts)\",\"publish_output_schemas\":false,\"tools\":[{\"name\":\"get_api_coverage\",\"title\":\"API data coverage\",\"description\":\"Get public metadata about what data is available across all Sharpe Terminal products, including supported exchanges, coins, timeframes, and chart types. This coverage endpoint does not require an API key.\",\"endpoint\":\"meta-coverage\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/meta/coverage\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/CoveragePayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CoveragePayload\":{\"type\":\"object\",\"properties\":{\"product_count\":{\"type\":\"integer\"},\"status_counts\":{\"type\":\"object\",\"properties\":{\"production\":{\"type\":\"integer\"},\"shared\":{\"type\":\"integer\"},\"planned\":{\"type\":\"integer\"}},\"required\":[\"production\",\"shared\",\"planned\"]},\"products\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/definitions/ProductCoverage\"}}},\"required\":[\"product_count\",\"status_counts\",\"products\"]},\"ProductCoverage\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"production\",\"shared\",\"planned\"]},\"ui_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"public_api_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"v1_api_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"docs_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"openapi_paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"mcp_tools\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"cli_commands\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"data_sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"tests\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"freshness_sla\":{\"type\":\"string\"},\"datasets\":{\"description\":\"The datasets behind the product with their writer cadence and freshness SLA: the numbers `freshness_sla` states in words.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"]},\"cadence_seconds\":{\"type\":\"integer\",\"minimum\":0,\"description\":\"Seconds between two runs of the dataset's writer; 0 when it is fetched per request.\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"Seconds after its as_of past which the dataset's answers say `freshness_status: \\\"stale\\\"` (the writer's cadence plus one skipped run).\"}},\"required\":[\"id\",\"cadence_seconds\",\"freshness_sla_seconds\"]}},\"notes\":{\"type\":\"string\"}},\"required\":[\"name\",\"status\",\"ui_routes\",\"public_api_routes\",\"v1_api_routes\",\"docs_routes\",\"openapi_paths\",\"mcp_tools\",\"cli_commands\",\"data_sources\",\"tests\",\"freshness_sla\"]}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":null,\"freshness_sla_seconds\":null,\"behaviour\":[],\"cli\":{\"command\":\"sharpe coverage\",\"options\":[]}},{\"name\":\"get_arbitrage_cex_spot_transfer\",\"title\":\"CEX spot-transfer arbitrage scanner\",\"description\":\"Get live CEX spot-transfer arbitrage rows after common network and token-contract matching, fee, status, depth, slippage, and spread-lifetime checks.\",\"endpoint\":\"arbitrage-cex-spot-transfer\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/cex-spot-transfer\",\"public\":\"/api/arbitrage/cex-spot-transfer\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum fee-adjusted APR, roll APY, carry edge, or CEX transfer net-profit threshold in percentage points.\",\"type\":\"number\"},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its top-of-book depth and any reported open interest are at least this notional. The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CexSpotTransferRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CexSpotTransferRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CexSpotTransferRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"buyExchange\":{\"type\":\"string\"},\"sellExchange\":{\"type\":\"string\"},\"buyAsk\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"sellBid\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"grossSpreadPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"network\":{\"type\":\"string\"},\"contractAddress\":{\"type\":[\"string\",\"null\"]},\"withdrawFee\":{\"type\":\"number\"},\"depositStatus\":{\"type\":\"string\",\"enum\":[\"Open\",\"Closed\"]},\"withdrawStatus\":{\"type\":\"string\",\"enum\":[\"Open\",\"Closed\"]},\"transferEta\":{\"type\":\"string\"},\"depthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"slippagePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"netProfitPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"spreadLifetimeSeconds\":{\"type\":[\"number\",\"null\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"buyExchange\",\"sellExchange\",\"buyAsk\",\"sellBid\",\"grossSpreadPct\",\"network\",\"contractAddress\",\"withdrawFee\",\"depositStatus\",\"withdrawStatus\",\"transferEta\",\"depthUsd\",\"slippagePct\",\"netProfitPct\",\"spreadLifetimeSeconds\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minDepthUsd\":\"min_depth_usd\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"arbitrage_tickers\",\"freshness_sla_seconds\":60,\"behaviour\":[\"Only positive net-profit routes are returned, each with the buy venue's withdrawal and the sell venue's deposit open.\",\"Routes whose every input is current (`isStale: false`) and whose book depth covers the notional rank first, then the rest; each group by `netProfitPct`, highest first; `rank` numbers that order from 1.\",\"Transfer routes run between KuCoin, Bitget, HTX and CoinEx only.\",\"`coin` keeps only that coin's routes.\"],\"cli\":{\"command\":\"sharpe arb spot-transfer\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minDepthUsd\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_cross_exchange\",\"title\":\"Cross-exchange arbitrage\",\"description\":\"Get cross-exchange funding arbitrage across every funding venue and asset class (crypto plus RWA perps: equity, commodity, FX, index — pairs never cross classes), ranked with executable rows (book-priced netApr) first by netApr, then indicative rows by gross annualized funding differential (apr); pairs whose two legs' prices differ by more than 20% are indicative (likely different instruments). Spread uses real books where available (spreadSource: book) or reference prices (reference); netApr is present only on book-priced rows; unknown spread/OI/volume are null, never zero. Rows carry pairStatus, fundingAsOf (the older leg's funding write) and pricesAsOf; limit keeps the first N rows of the board.\",\"endpoint\":\"arbitrage-cross-exchange\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/cross-exchange\",\"public\":\"/api/arbitrage/cross-exchange\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchanges\":{\"description\":\"Comma-separated list of venues to compare. Omit for all 32 funding venues (the funding tracker's venue registry).\",\"type\":\"string\"},\"assetClass\":{\"default\":\"all\",\"description\":\"Underlying filter: \\\"all\\\" (default), \\\"crypto\\\", or \\\"rwa\\\" (equity, commodity, FX and index perps).\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"minOiUsd\":{\"default\":0,\"description\":\"Minimum open interest in USD on the smaller leg. Default 0 (no floor). Legs with unknown OI fail a positive floor.\",\"type\":\"number\",\"minimum\":0},\"minVolUsd\":{\"default\":0,\"description\":\"Minimum 24h perp volume in USD on the smaller leg. Default 0 (no floor). Legs with unknown volume fail a positive floor.\",\"type\":\"number\",\"minimum\":0},\"limit\":{\"description\":\"Return at most this many rows, the first in board order (executable rows first by netApr, then the rest by apr). Default: every row.\",\"type\":\"integer\",\"minimum\":1}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CrossExchangeOpportunity\"}},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CrossExchangeOpportunity\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"assetClass\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"],\"description\":\"Underlying category from the funding book: `crypto`, `equity`, `commodity`, `fx` or `index`. A pair's two legs always share it.\"},\"longExchange\":{\"type\":\"string\"},\"shortExchange\":{\"type\":\"string\"},\"longRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"shortRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"netFundingRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"apr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"grossApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"netApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"spreadRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"spreadSource\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"book\",\"reference\"]},{\"type\":\"null\"}],\"description\":\"Where `spreadRate` comes from: `book` (both legs' order books), `reference` (last or mark prices), or `null` when either leg has no price.\"},\"longAsk\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"shortBid\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"executableDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"holdingDays\":{\"type\":\"number\",\"x-unit\":\"days\"},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded on the figures shown. \\\"executable\\\" needs a book-priced spread (spreadSource \\\"book\\\") and leg prices within 20% of each other. A larger gap is treated as a possible contract-identity or unit mismatch, so the row is \\\"indicative\\\" with a null netApr. Indicative rows keep every figure and sort below executable ones.\"},\"oiLong\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiShort\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"volumeLong24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"24h perp turnover in USD on the long venue; `null` when the venue does not report it.\"},\"volumeShort24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"24h perp turnover in USD on the short venue; `null` when the venue does not report it.\"},\"nextSettlement\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"intervalHours\":{\"type\":\"number\"},\"pairStatus\":{\"type\":\"string\",\"enum\":[\"eligible\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\"],\"description\":\"Whether the two legs are one instrument: `eligible` (or not checked, when a leg has no price), else the first check that failed; `price_gap` means the legs' prices are more than 20% apart.\"},\"fundingAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the older leg's funding rate was written; `null` when either is unknown.\"},\"pricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the venues' tickers behind the spread and depth were read; `null` when neither leg has a quote.\"}},\"required\":[\"symbol\",\"assetClass\",\"longExchange\",\"shortExchange\",\"longRate\",\"shortRate\",\"netFundingRate\",\"apr\",\"grossApr\",\"netApr\",\"spreadRate\",\"spreadSource\",\"longAsk\",\"shortBid\",\"executableDepthUsd\",\"holdingDays\",\"executionStatus\",\"oiLong\",\"oiShort\",\"volumeLong24hUsd\",\"volumeShort24hUsd\",\"nextSettlement\",\"intervalHours\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"exchanges\":\"exchanges\",\"assetClass\":\"asset_class\",\"minOiUsd\":\"min_oi_usd\",\"minVolUsd\":\"min_vol_usd\",\"limit\":\"limit\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":[\"funding_rates_current\",\"arbitrage_tickers\"],\"freshness_sla_seconds\":60,\"behaviour\":[\"Executable rows (book-priced `netApr`) rank first by `netApr`, then indicative rows by gross annualized funding differential (`apr`).\",\"`netApr` is present only on executable, book-priced rows (`spreadSource: book`); every other row has `netApr: null`.\",\"Pairs whose two legs' book prices differ by more than 20% are indicative.\",\"Unknown open interest is `null`, never `0`.\",\"`apr` is the gross annualized differential, |netFundingRate| × 8760 / intervalHours, and `grossApr` repeats it.\",\"`assetClass=rwa` keeps only equity, commodity, FX and index pairs.\",\"`exchanges` restricts both legs to the listed venues.\",\"`minOiUsd` keeps pairs whose smaller leg reports at least that open interest; a leg with unknown open interest fails the floor.\"],\"cli\":{\"command\":\"sharpe arb cross-exchange\",\"options\":[\"exchanges\",\"minOiUsd\"]}},{\"name\":\"get_arbitrage_dated_futures_basis\",\"title\":\"Dated futures basis scanner\",\"description\":\"Get cash-and-carry arbitrage rows for buying spot and selling dated futures, ranked by net annualized basis after fees.\",\"endpoint\":\"arbitrage-dated-futures-basis\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/dated-futures-basis\",\"public\":\"/api/arbitrage/dated-futures-basis\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum fee-adjusted APR, roll APY, carry edge, or CEX transfer net-profit threshold in percentage points.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its top-of-book depth and any reported open interest are at least this notional. The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"aggregate\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisAggregate\"}},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"aggregate\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisAggregate\"}}},\"required\":[\"data\",\"meta\",\"pagination\",\"aggregate\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesBasisRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"spotVenue\":{\"type\":\"string\"},\"futuresVenue\":{\"type\":\"string\"},\"contract\":{\"type\":\"string\"},\"expiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"days\":{\"type\":\"number\",\"x-unit\":\"days\"},\"spotAsk\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"futureBid\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basisUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualizedBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"netAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiToVolume\":{\"type\":[\"number\",\"null\"]},\"depthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: a snapshot inside the freshness SLA; known top-of-book depth behind the spot ask and futures bid of at least notional; and no reported open interest on the contract below notional (unknown open interest does not demote). Otherwise \\\"indicative\\\": every figure is kept, but each quote is first-level only and a notional-sized order would fill deeper. Indicative rows sort below executable ones.\"},\"feesPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"marginType\":{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"spotVenue\",\"futuresVenue\",\"contract\",\"expiry\",\"days\",\"spotAsk\",\"futureBid\",\"basisUsd\",\"basisPct\",\"annualizedBasisPct\",\"netAprPct\",\"volume24hUsd\",\"openInterestUsd\",\"oiToVolume\",\"depthUsd\",\"executionStatus\",\"feesPct\",\"marginType\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]},\"FuturesBasisAggregate\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\"},\"totalOpenInterestUsd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"oiWeightedAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"bestVenue\":{\"type\":\"string\"},\"bestAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"contractCount\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"coin\",\"totalOpenInterestUsd\",\"oiWeightedAprPct\",\"bestVenue\",\"bestAprPct\",\"contractCount\"],\"description\":\"Per-coin summary over the ranked contracts at least one day from expiry. Contracts inside their last day stay in rows but are left out, because a round-trip fee annualized over hours runs toward minus infinity; a coin with no qualifying contract has no entry.\"}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination, aggregate }` at the top level (rows, scanner meta, page, per-coin strip); v1 wraps the same four objects as `data: { rows, scannerMeta, pagination, aggregate }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"futures_term_structure\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"`coin` keeps only that coin's rows and aggregate entries.\",\"Rows executable at the requested notional rank first, then by fee-adjusted net APR (`netAprPct`), highest first; `rank` numbers that order from 1.\",\"A row is `executable` exactly when its snapshot is fresh, its top-of-book `depthUsd` is known and at least `notional`, and its reported open interest, if any, is at least `notional`; otherwise it is `indicative`.\",\"Basis rows come from Binance, OKX and Bybit only: Deribit has no spot leg.\",\"`basisPct = (futureBid − spotAsk) / spotAsk × 100` and `netAprPct = (basisPct − feesPct) × 365 / days`.\",\"The per-coin aggregate covers only contracts at least one day from expiry, and a coin with no such contract has no entry.\"],\"cli\":{\"command\":\"sharpe arb dated-basis\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_futures_calendar_spread\",\"title\":\"Futures calendar spread scanner\",\"description\":\"Get near-versus-far dated futures calendar spread rows with forward yield, curve direction, and net roll APY.\",\"endpoint\":\"arbitrage-futures-calendar-spread\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/futures-calendar-spread\",\"public\":\"/api/arbitrage/futures-calendar-spread\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum fee-adjusted APR, roll APY, carry edge, or CEX transfer net-profit threshold in percentage points.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its top-of-book depth and any reported open interest are at least this notional. The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCalendarSpreadRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCalendarSpreadRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesCalendarSpreadRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"nearContract\":{\"type\":\"string\"},\"nearExpiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"farContract\":{\"type\":\"string\"},\"farExpiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"nearBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"farBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"forwardYieldPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"curve\":{\"type\":\"string\",\"enum\":[\"Contango\",\"Backwardation\",\"Flat\"]},\"direction\":{\"type\":\"string\",\"enum\":[\"Buy Near / Sell Far\",\"Sell Near / Buy Far\"]},\"netRollApyPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"minOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"minDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: a snapshot inside the freshness SLA; known top-of-book depth behind both legs of at least notional; and no reported open interest on the smaller leg below notional (unknown open interest does not demote). Otherwise \\\"indicative\\\": every figure is kept, but each quote is first-level only and a notional-sized order would fill deeper. Indicative rows sort below executable ones.\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"exchange\",\"nearContract\",\"nearExpiry\",\"farContract\",\"farExpiry\",\"nearBasisPct\",\"farBasisPct\",\"forwardYieldPct\",\"curve\",\"direction\",\"netRollApyPct\",\"minOpenInterestUsd\",\"minDepthUsd\",\"executionStatus\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"futures_term_structure\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"Rows executable at the requested notional rank first, then by signed post-fee net roll APY (`netRollApyPct`), highest first; `rank` numbers that order from 1.\",\"A row is `executable` exactly when both legs' snapshots are fresh, `minDepthUsd` is known and at least `notional`, and the smaller leg's reported open interest (`minOpenInterestUsd`), if any, is at least `notional`; otherwise it is `indicative`.\",\"Each row pairs a nearer contract with a later-expiring one.\",\"`netRollApyPct` is `forwardYieldPct` less annualized round-trip fees, so it is never above it.\"],\"cli\":{\"command\":\"sharpe arb calendar-spread\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_perp_dated_carry\",\"title\":\"Perp versus dated futures carry scanner\",\"description\":\"Get perp funding versus dated futures basis carry rows, comparing expected funding to expiry against locked dated basis.\",\"endpoint\":\"arbitrage-perp-dated-carry\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/perp-dated-carry\",\"public\":\"/api/arbitrage/perp-dated-carry\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum fee-adjusted APR, roll APY, carry edge, or CEX transfer net-profit threshold in percentage points.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its top-of-book depth and any reported open interest are at least this notional. The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PerpDatedCarryRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PerpDatedCarryRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PerpDatedCarryRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"perpVenue\":{\"type\":\"string\"},\"datedVenue\":{\"type\":\"string\"},\"datedContract\":{\"type\":\"string\"},\"expiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"days\":{\"type\":\"number\",\"x-unit\":\"days\"},\"perpFundingAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"expectedFundingToExpiryPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"datedBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"carryEdgePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"netCarryEdgePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"grossCarryAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"netCarryAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"bestLeg\":{\"type\":\"string\",\"enum\":[\"Perp Carry\",\"Dated Cash-and-Carry\"]},\"nextFunding\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"funding7dStabilityPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"executableDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"minOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Legacy compatibility metric. Use executableDepthUsd and minOpenInterestUsd.\",\"deprecated\":true},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: a snapshot inside the freshness SLA; known top-of-book depth behind the spot and dated legs of at least notional; and no reported open interest on the smaller leg below notional (unknown open interest does not demote). Otherwise \\\"indicative\\\": every figure is kept, but each quote is first-level only and a notional-sized order would fill deeper. Indicative rows sort below executable ones.\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"perpVenue\",\"datedVenue\",\"datedContract\",\"expiry\",\"days\",\"perpFundingAprPct\",\"expectedFundingToExpiryPct\",\"datedBasisPct\",\"carryEdgePct\",\"netCarryEdgePct\",\"grossCarryAprPct\",\"netCarryAprPct\",\"bestLeg\",\"nextFunding\",\"funding7dStabilityPct\",\"executableDepthUsd\",\"minOpenInterestUsd\",\"oiDepthUsd\",\"executionStatus\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA, the envelope's `freshness_sla_seconds` on the basis and calendar boards), 3,600 on the CEX transfer board (its order books and transfer networks).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored term-structure snapshot, a stored snapshot past its SLA, the venues on request (always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":[\"futures_term_structure\",\"funding_rates_current\",\"funding_accumulated\"],\"freshness_sla_seconds\":600,\"behaviour\":[\"Rows executable at the requested notional rank first, then by fee-adjusted annualized net carry (`netCarryAprPct`), highest first; `rank` numbers that order from 1.\",\"A row is `executable` exactly when both legs are fresh, `executableDepthUsd` is known and at least `notional`, and `minOpenInterestUsd`, if reported, is at least `notional`; otherwise it is `indicative`.\",\"A positive carry edge favors the perp carry leg and a negative one dated cash-and-carry (`bestLeg`).\",\"`expectedFundingToExpiryPct = perpFundingAprPct × days / 365`, `carryEdgePct = expectedFundingToExpiryPct − datedBasisPct` and `netCarryAprPct = netCarryEdgePct × 365 / days`.\",\"`meta.rowCount` is the number of rows across every page, the same figure as `pagination.total`.\"],\"cli\":{\"command\":\"sharpe arb perp-dated\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_spot_perp\",\"title\":\"Spot-perp arbitrage\",\"description\":\"Get structurally executable spot-perpetual funding-capture rows with live funding, verified spot or margin availability, diagnostic basis, gross APR, and fee-adjusted net APR, in the board's order (rows with a net APR first by net APR, then by gross APR). Each row carries perpSymbol, perpOpenInterestUsd, fundingIsStale, executionStatus, pairStatus (price_gap when the spot and perp prices are more than 20% apart: no net APR), fundingAsOf and pricesAsOf. minOiUsd floors the perp leg's open interest (unknown fails a positive floor).\",\"endpoint\":\"arbitrage-spot-perp\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/spot-perp\",\"public\":\"/api/arbitrage/spot-perp\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"default\":\"all\",\"description\":\"Filter by exchange name, or \\\"all\\\" for all exchanges.\",\"type\":\"string\"},\"direction\":{\"default\":\"all\",\"description\":\"Filter by perpetual-leg direction: short for positive funding capture, long for negative funding capture.\",\"type\":\"string\",\"enum\":[\"all\",\"long\",\"short\"]},\"minOiUsd\":{\"default\":0,\"description\":\"Minimum open interest in USD on the perpetual leg (`perpOpenInterestUsd`). Default 0 (no floor). A row whose open interest is unknown fails a positive floor.\",\"type\":\"number\",\"minimum\":0}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SpotPerpOpportunity\"}},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"SpotPerpOpportunity\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"fundingRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\",\"description\":\"Funding rate as a decimal fraction per settlement interval.\"},\"cumRate7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"apr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"Annualized funding return as a decimal fraction (0.30 = 30%).\"},\"basisRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Spot/perpetual basis as a decimal fraction (0.001 = 0.1%).\"},\"netApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Fee-adjusted annualized return as a decimal fraction (0.30 = 30%); null when the venue's spot and perp prices are more than 20% apart (larger / smaller − 1 > 0.20), which reads as two instruments under one ticker.\"},\"intervalHours\":{\"type\":\"number\"},\"direction\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]},\"portfolio\":{\"type\":\"object\",\"properties\":{\"spotSide\":{\"type\":\"string\",\"enum\":[\"buy\",\"sell\"]},\"perpSide\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]}},\"required\":[\"spotSide\",\"perpSide\"]},\"nextFundingTime\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"perpSymbol\":{\"type\":\"string\",\"description\":\"The venue's perpetual contract the row trades (its own symbol, e.g. `1000PEPEUSDT`).\"},\"perpOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest of that perpetual in USD: the venue ticker's figure, else the latest stored open interest of the contract (at most ~10 minutes old). `null` when neither is known, never 0.\"},\"fundingIsStale\":{\"type\":\"boolean\",\"description\":\"`true` when `fundingAsOf` is older than the funding book's 10-minute freshness SLA at the time of the request.\"},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"`executable` when the legs pass the pair check (`pairStatus` `eligible`) and the row therefore has a fee-adjusted `netApr`; `indicative` otherwise (prices more than 20% apart): its figures stand, but it is not a verified trade. A row with an unknown price is not price-checked (`pricesAsOf` or `basisRate` null).\"},\"pairStatus\":{\"type\":\"string\",\"enum\":[\"eligible\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\"],\"description\":\"Whether the spot and perpetual legs are one instrument: `eligible` (or not checked, when a price is missing), else the first check that failed; `price_gap` means the two prices are more than 20% apart.\"},\"fundingAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the funding rate behind the row was written; `null` when unknown.\"},\"pricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the spot and perpetual prices behind `basisRate` were read; `null` when the row has neither price.\"}},\"required\":[\"symbol\",\"exchange\",\"fundingRate\",\"cumRate7d\",\"apr\",\"basisRate\",\"netApr\",\"intervalHours\",\"direction\",\"portfolio\",\"nextFundingTime\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"exchange\":\"exchange\",\"direction\":\"direction\",\"minOiUsd\":\"min_oi_usd\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":[\"funding_rates_current\",\"arbitrage_tickers\"],\"freshness_sla_seconds\":60,\"behaviour\":[\"Rows with a fee-adjusted `netApr` rank first, highest first; rows without one (spot and perp more than 20% apart) follow by gross `apr`, highest first.\",\"`direction` is `short` (buy spot, short perp) when the funding rate is ≥ 0 and `long` (sell spot, long perp) when it is negative.\",\"`apr` annualizes the funding rate over the row's own `intervalHours` (|fundingRate| × 8760 / intervalHours), never an assumed 8 hours.\",\"`netApr` is `null` exactly when the spot and perp prices are more than 20% apart (`basisRate` is known and 1 + `basisRate` is above 1.2 or below 1 / 1.2): every other row has a fee-adjusted `netApr`, including a row with no `basisRate`.\",\"`exchange` keeps only that venue's rows.\",\"`direction=long` keeps only negative-funding rows (sell spot, long perp).\"],\"cli\":{\"command\":\"sharpe arb spot-perp\",\"options\":[\"exchange\",\"direction\"]}},{\"name\":\"get_correlation_matrix\",\"title\":\"Correlation matrix\",\"description\":\"Get a price correlation matrix for crypto and supported TradFi assets over a specified calendar period. Useful for portfolio analysis and diversification.\",\"endpoint\":\"correlation-matrix\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/correlation/matrix\",\"public\":\"/api/correlation/matrix\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"period\":{\"default\":\"30d\",\"description\":\"Lookback period for correlation calculation.\",\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"ids\":{\"description\":\"Comma-separated asset ids: CoinGecko ids for crypto (e.g. bitcoin) and short ids for TradFi (e.g. sp500, gold). Maximum 10. If omitted, returns the default set. Ids no source recognises are listed in an optional `unresolved` array (partial success, as on the free route); a selection none of whose ids is recognised returns 404 resource_not_found naming them.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/CorrelationMatrixData\"},{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CorrelationAsset\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]}}},\"dataPoints\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":\"number\",\"x-unit\":\"count\"}}},\"period\":{\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Requested ids no source recognises (no TradFi config, coin metadata, CoinGecko row or stored returns). Present only when non-empty; each still gets a row and column, with null correlations.\"},\"_debug\":{\"type\":\"object\",\"properties\":{\"assetCounts\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"earliest\":{\"type\":\"string\"},\"latest\":{\"type\":\"string\"}},\"required\":[\"count\"]}},\"totalRows\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"cutoff\":{\"type\":\"string\",\"format\":\"date\"}},\"required\":[\"assetCounts\",\"totalRows\",\"cutoff\"],\"description\":\"Present only with `debug=1`: stored return rows per asset and the window's first date.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"assets\",\"matrix\",\"dataPoints\",\"period\",\"computedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CorrelationMatrixData\":{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CorrelationAsset\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]}}},\"dataPoints\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":\"number\",\"x-unit\":\"count\"}}},\"period\":{\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Requested ids no source recognises (no TradFi config, coin metadata, CoinGecko row or stored returns). Present only when non-empty; each still gets a row and column, with null correlations.\"}},\"required\":[\"assets\",\"matrix\",\"dataPoints\",\"period\",\"computedAt\"]},\"CorrelationAsset\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"crypto\",\"tradfi\"]},\"logoUrl\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"symbol\",\"type\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"v1's payload plus `_debug` with `debug=1` (both read the correlation read model, src/engine/serve/models/research/correlation.ts).\",\"public_params\":[\"period\",\"ids\",\"debug\"],\"python_params\":{\"period\":\"period\",\"ids\":\"ids\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"correlation_prices\",\"freshness_sla_seconds\":172800,\"behaviour\":[\"The matrix is square over `assets` and symmetric; the diagonal is 1 for an asset with stored returns and null for one without.\",\"Without `ids`, the default set is bitcoin, ethereum, solana, sp500 and gold.\",\"`ids` returns exactly the requested assets, in the order asked.\"],\"cli\":{\"command\":\"sharpe correlation\",\"options\":[\"period\",\"ids\"]}},{\"name\":\"get_derivatives_overview\",\"title\":\"Market-wide derivatives overview\",\"description\":\"Get a derivatives market overview including aggregated open interest, 8-hour-equivalent funding rates, top coins by open interest (each top_coins_oi entry is an asset, its lot spellings included), and exchange/coin counts. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"market-derivatives-overview\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/market/derivatives-overview\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/DerivativesOverview\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"DerivativesOverview\":{\"type\":\"object\",\"properties\":{\"total_oi_usd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\",\"description\":\"The market-wide open interest GET /v1/global/overview publishes (metrics.openInterestUsd): one-sided USD over every crypto asset holding at least $100K plus the RWA perps, venues in oi_excluded_venues left out.\"},\"avg_funding_rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\",\"description\":\"Simple mean of the 8-hour-equivalent rate over each (venue, asset) primary contract with a fresh rate.\"},\"oi_weighted_funding_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The same primaries' rates, each weighted by its own contract's one-sided open interest. `null` when no primary carries open interest (nothing to weight by), never the simple mean.\"},\"top_coins_oi\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\",\"description\":\"The asset's symbol. Every contract of the asset counts once, lot spellings included (PEPE sums Binance and Bybit 1000PEPEUSDT and Hyperliquid kPEPE); two assets sharing a ticker are two entries (CAT the stock, CAT the coin). While the instrument master is unavailable, the stored base coin.\"},\"open_interest_usd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"coin\",\"open_interest_usd\",\"exchange_count\"]}},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"coin_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues left out of total_oi_usd, top_coins_oi and the open-interest funding weights, with the reason.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"total_oi_usd\",\"avg_funding_rate\",\"oi_weighted_funding_rate\",\"top_coins_oi\",\"exchange_count\",\"coin_count\",\"oi_excluded_venues\",\"updated_at\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":[\"futures_open_interest\",\"funding_rates_current\"],\"freshness_sla_seconds\":600,\"behaviour\":[],\"cli\":{\"command\":\"sharpe derivatives\",\"options\":[]}},{\"name\":\"get_ecosystems\",\"title\":\"Ecosystems data\",\"description\":\"Get ecosystem-level market data (Ethereum, Solana, BNB, Arbitrum, Base, etc.) including market cap, volume, TVL, and performance metrics.\",\"endpoint\":\"ecosystems-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/ecosystems/data\",\"public\":\"/api/ecosystems/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"ecosystem\":{\"description\":\"Ecosystem to return detail for: the config id (e.g. bnb) or the URL slug (e.g. bnb-chain, ethereum, solana). An unknown value returns 400 invalid_parameter listing the valid values.\",\"type\":\"string\"},\"correlation\":{\"description\":\"Set to \\\"true\\\" to include correlation data.\",\"type\":\"string\"},\"timeframe\":{\"description\":\"Timeframe for correlation data.\",\"type\":\"string\"},\"excludeNative\":{\"description\":\"Set to \\\"true\\\" to exclude the native token from aggregated metrics.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/EcosystemOverviewPayload\"},{\"$ref\":\"#/definitions/EcosystemDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"}]},{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, where a token in several ecosystems counts once in each: the denominator of `dominance`. `totalEcosystemMcap` counts each token once.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` is computed: every fetched constituent counted once.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-overlapping-ecosystem-exposures` after a complete sync. A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, where a token in several ecosystems counts once in each: the denominator of `dominance`. `totalEcosystemMcap` counts each token once.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` is computed: every fetched constituent counted once.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-overlapping-ecosystem-exposures` after a complete sync. A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"ecosystem_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"funding_rate\":{\"type\":[\"number\",\"null\"]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"coin_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]}},\"required\":[\"ecosystem_id\",\"snapshot_at\",\"market_cap\",\"volume_24h\",\"open_interest\",\"funding_rate\",\"tvl\",\"coin_count\"]}},\"series\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"ecosystem_id\":{\"type\":\"string\"},\"data\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}}},\"required\":[\"ecosystem_id\",\"data\"]}},\"seriesMetric\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"market_cap\",\"volume_24h\",\"open_interest\",\"tvl\"]},{\"type\":\"null\"}]},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"windowSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"windowSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\",\"series\",\"seriesMetric\",\"coverage\"],\"description\":\"History mode (`historical` or `tvl=true`): a compact `[epoch ms, value]` series per ecosystem when `chart` names a series metric, otherwise the raw hourly snapshot rows.\"},{\"type\":\"object\",\"properties\":{\"mindshareSnapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"mindshare_pct\"]}},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"mindshareSnapshots\",\"coverage\"]}]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"EcosystemOverviewPayload\":{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, where a token in several ecosystems counts once in each: the denominator of `dominance`. `totalEcosystemMcap` counts each token once.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` is computed: every fetched constituent counted once.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-overlapping-ecosystem-exposures` after a complete sync. A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\"]},\"EcosystemMarketRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest across every venue, summed over the constituents' assets (each once).\"},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"mcapFdvRatio\":{\"type\":[\"number\",\"null\"]},\"volMcapRatio\":{\"type\":[\"number\",\"null\"]},\"oiMcapRatio\":{\"type\":[\"number\",\"null\"]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/EcosystemTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Sentiment percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"mindsharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Mindshare percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"watchlistUsers\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Watchlist users merged from the mindshare sync, or null when there is no measurement (never 0 as a stand-in).\"}},\"required\":[\"id\",\"name\",\"slug\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"median1h\",\"median24h\",\"median7d\",\"median30d\",\"median200d\",\"median1y\",\"marketCap\",\"volume24h\",\"openInterest\",\"fundingRate\",\"mcapFdvRatio\",\"volMcapRatio\",\"oiMcapRatio\",\"tvl\",\"topCoin\",\"coinCount\",\"dominance\",\"momentum\",\"sentimentPct\",\"mindsharePct\",\"watchlistUsers\"]},\"EcosystemTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"CategoryBasePrices\":{\"type\":\"object\",\"properties\":{\"btc\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"eth\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"sol\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]}},\"required\":[\"btc\",\"eth\",\"sol\"],\"description\":\"BTC, ETH and SOL percent price changes from CoinGecko, used to re-base category returns into BTC, ETH or SOL terms. There are no USD prices here.\"},\"CategorySyncCoverage\":{\"type\":\"object\",\"properties\":{\"expectedCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"failedIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"retainedPreviousAggregate\":{\"type\":\"boolean\"}},\"required\":[\"expectedCount\",\"freshCount\",\"failedIds\",\"retainedPreviousAggregate\"],\"description\":\"How many configured categories the last sync refreshed. When a category fetch failed and a previous aggregate existed, the previous rows are served unchanged (`retainedPreviousAggregate`).\"},\"EcosystemDetailPayload\":{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, where a token in several ecosystems counts once in each: the denominator of `dominance`. `totalEcosystemMcap` counts each token once.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` is computed: every fetched constituent counted once.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-overlapping-ecosystem-exposures` after a complete sync. A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"EcosystemCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The coin's funding across venues, 8-hour-equivalent (fraction per 8 hours), open-interest-weighted over each venue's primary contract; null when no venue has a fresh rate.\"},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"sparkline7d\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"ath\",\"athDistance\",\"fundingRate\",\"fundingApr\",\"openInterest\",\"sparkline7d\"]},\"CategoryCorrelationPayload\":{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},\"CategoryCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"]},\"requestedSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"bucketSeconds\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}]},\"usablePairCount\":{\"type\":\"integer\"}},\"required\":[\"status\",\"requestedSince\",\"availableSince\",\"availableUntil\",\"computedAt\",\"pointCount\",\"bucketSeconds\",\"usablePairCount\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"The list, detail and correlation bodies are v1's `data`: both routes answer from one read model (src/engine/serve/models/trackers/ecosystems.ts), mindshare merged and the correlation matrix padded on both since engine L5 WP-S3. The free body also carries the freshness envelope in `meta` (WP-S12). The free route also answers `historical`/`tvl` (history) and `mindshare_history`, which v1 does not accept.\",\"public_params\":[\"ecosystem\",\"excludeNative\",\"mindshare_history\",\"historical\",\"tvl\",\"chart\",\"correlation\",\"timeframe\"],\"python_params\":{\"ecosystem\":\"ecosystem\",\"correlation\":\"correlation\",\"timeframe\":\"timeframe\",\"excludeNative\":\"exclude_native\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"ecosystems\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`ecosystem` adds that ecosystem's constituent `coins` and its market-cap `sparkline` beside the full list.\",\"`excludeNative=true` serves the constituent list without the native token's ticker (SOL on Solana).\",\"`correlation=true` returns a square matrix: one row and one column per ecosystem label.\",\"`chart=mcap-trend` answers the history mode with one compact market-cap series per ecosystem, oldest point first, instead of snapshot rows.\",\"`mindshare_history` returns the ecosystem mindshare series (ids `eco_*`), whatever its value.\"],\"cli\":{\"command\":\"sharpe ecosystems\",\"options\":[\"ecosystem\",\"excludeNative\"]}},{\"name\":\"get_exchange_listings\",\"title\":\"New listings hub data\",\"description\":\"Get the New Listings hub payload: weekly + monthly aggregated counts by narrative and exchange, plus the last-90-day recent listings. Optionally filter by narrative slug or single exchange. Useful for tracking where venues are adding listing slots.\",\"endpoint\":\"listings-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/data\",\"public\":\"/api/listings/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Filter to a single narrative slug (e.g. `ai-agents`, `memes`, `layer-1`).\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to a single exchange.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingsHubPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingsHubPayload\":{\"type\":\"object\",\"properties\":{\"weekly\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingBucket\"}},\"monthly\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingBucket\"}},\"recent\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RecentListingRow\"}},\"lastListingAt\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"lastUpdatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"totals\":{\"type\":\"object\",\"properties\":{\"thisWeek\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"lastWeek\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"thisMonth\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"lastMonth\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"thisWeek\",\"lastWeek\",\"thisMonth\",\"lastMonth\"]},\"topNarrativesThisMonth\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingCount\"}},\"topExchangesThisMonth\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExchangeListingCount\"}}},\"required\":[\"weekly\",\"monthly\",\"recent\",\"lastListingAt\",\"lastUpdatedAt\",\"totals\",\"topNarrativesThisMonth\",\"topExchangesThisMonth\"]},\"ListingBucket\":{\"type\":\"object\",\"properties\":{\"bucket_date\":{\"type\":\"string\",\"format\":\"date\"},\"exchange\":{\"type\":\"string\"},\"narrative_slug\":{\"type\":\"string\"},\"listing_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"bucket_date\",\"exchange\",\"narrative_slug\",\"listing_count\"]},\"RecentListingRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_coingecko_id\":{\"type\":[\"string\",\"null\"]},\"exchange\":{\"type\":\"string\"},\"listing_date\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"listing_date_source\":{\"type\":\"string\"},\"narrative_slug\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"token_symbol\",\"token_name\",\"token_coingecko_id\",\"exchange\",\"listing_date\",\"listing_date_source\",\"narrative_slug\"]},\"ListingCount\":{\"type\":\"object\",\"properties\":{\"narrative_slug\":{\"type\":\"string\"},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"narrative_slug\",\"count\"]},\"ExchangeListingCount\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"exchange\",\"count\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"narrative\":\"narrative\",\"exchange\":\"exchange\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"`recent` holds the last 90 days of active listings, newest listing date first.\",\"`topNarrativesThisMonth` and `topExchangesThisMonth` hold at most five entries each, largest count first.\",\"`exchange` scopes every weekly and monthly bucket and every recent row to that venue.\"],\"cli\":{\"command\":\"sharpe listings\",\"options\":[\"narrative\",\"exchange\"]}},{\"name\":\"get_funding_rates\",\"title\":\"Funding rates\",\"description\":\"Get perpetual funding rates across every supported venue (see sharpe://exchanges for the current list). Returns current snapshots, accumulated rates over multiple windows, or per-coin historical rates. Units: `rate` is a decimal fraction settled over that row's own `interval_hours` (1h, 2h, 4h, 8h or 24h depending on venue and market). It is not a percent and never implicitly 8h, so compare or rank venues on the served rate_8h (rate × 8 / interval_hours) or apr (rate × 8760 / interval_hours), both null when the row has no usable interval. Accumulated rows carry realized sums (acc_1d/acc_7d/acc_30d/acc_90d/acc_1y) instead of a per-interval rate, and per window a `coverage` entry (coverage_ratio, complete, listed_within_window, halted_within_window): compare acc_* across contracts only on complete windows. Filter with coin, exchange, margin (linear/inverse) and asset_class; asset_class is unfiltered by default, so tokenized-equity, commodity, index and FX perps are included alongside crypto. `coin` names an asset: PEPE returns every PEPE contract, the 1000PEPE and KPEPE lot contracts included. Current and accumulated rows carry asset_id, asset_symbol, lot_multiplier (asset units per contract unit, e.g. 1000 on 1000PEPEUSDT), instrument_status (the venue's own status) and is_live (null = unknown). Page the full book with limit and cursor, or order it by open interest with sort. For type=current the API also answers with aggregates instead of rows: extremes (the highest and lowest markets by rate_8h above an optional min_oi_usd floor), stats (the whole book's mean and OI-weighted funding APR and the positive/negative counts) and summary (with coin: the coin's average and median funding across venues, the funding grid's Avg Rate).\",\"endpoint\":\"funding-rates\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/funding/rates\",\"public\":\"/api/funding/rates\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"current\",\"description\":\"Type of funding rate data to retrieve.\",\"type\":\"string\",\"enum\":[\"current\",\"accumulated\",\"history\"]},\"coin\":{\"description\":\"The coin to return: a ticker (e.g. BTC), a lot or venue spelling (e.g. `1000PEPE`, `kPEPE`), or the full name (e.g. `bitcoin`, resolved to BTC). Case-insensitive, one coin per request. `coin` names an asset, not a base_coin string: every contract of that asset is returned whatever its base_coin spelling, so `PEPE` also returns the 1000PEPE and KPEPE lot contracts (read `lot_multiplier`), and a ticker two assets share (BB is BounceBit and BlackBerry) returns both, narrowed by `asset_class`. Optional filter for type=current and type=accumulated; required when type=history. A value that no perpetual in the funding book has ever settled returns 400 rather than an empty result set; GET /api/funding/coins lists every ticker carried.\",\"type\":\"string\",\"maxLength\":64},\"days\":{\"default\":30,\"description\":\"Number of days of history to retrieve (type=history only).\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1095},\"exchange\":{\"description\":\"Filter to a single venue. Accepts the slug (e.g. `gate-io`), the display name as returned in the `exchange` field (e.g. `Gate.io`), or the ccxt id. The venue registry is not frozen, so read the `sharpe://exchanges` MCP resource or /api/funding/rates for the current list. An unrecognized value returns 400.\",\"type\":\"string\",\"maxLength\":32},\"asset_class\":{\"description\":\"Narrow the response to one underlying category. The funding book is not crypto-only. Tokenized equity, commodity, index and FX perps trade on the same venues, so this is unfiltered by default. Applies to type=current and type=accumulated; ignored for type=history. An unrecognized value returns 400.\",\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"margin\":{\"description\":\"Narrow the response to one collateral convention: `linear` for quote-margined contracts, `inverse` for coin-margined ones. Unfiltered by default. Applies to type=current and type=accumulated; ignored for type=history. An unrecognized value returns 400.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},\"limit\":{\"description\":\"Maximum number of records to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":5000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"},\"sort\":{\"description\":\"type=current only: order the rows by `open_interest`, ascending, or descending with the leading `-`. Rows with unknown open interest come last either way. Applied before `limit`/`cursor`. Default: the book's order (base_coin, exchange, symbol).\",\"type\":\"string\",\"enum\":[\"open_interest\",\"-open_interest\"]},\"extremes\":{\"description\":\"type=current only: answer with the N highest and N lowest rows by `rate_8h` (`extremes.highest`, `extremes.lowest`) among fresh rows with a usable interval, and how many rows each check left out (`extremes.omitted`). The other filters narrow the rows first. Returns an object instead of rows; cannot be combined with `limit`, `cursor` or `sort`.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":100},\"min_oi_usd\":{\"description\":\"type=current, with `extremes` only: leave out rows whose open interest in USD is below this floor. A row with unknown open interest fails a floor above 0.\",\"type\":\"number\",\"minimum\":0},\"stats\":{\"description\":\"type=current only: `1` answers with the whole book's funding (`market`: mean and open-interest-weighted APR, and the count of positive and negative rates). Returns an object instead of rows; cannot be combined with `coin`, `exchange`, `margin`, `asset_class`, `limit`, `cursor` or `sort`.\",\"type\":\"string\",\"enum\":[\"1\"]},\"summary\":{\"description\":\"type=current, with `coin` only: `1` answers with the coin's funding across venues (`summary`: average and median 8-hour rate, how they were reduced, and the venues behind them). Returns an object instead of rows; cannot be combined with `limit`, `cursor` or `sort`.\",\"type\":\"string\",\"enum\":[\"1\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/FundingCurrentRow\"},{\"$ref\":\"#/definitions/FundingAccumulatedRow\"},{\"$ref\":\"#/definitions/FundingHistoryRow\"}]}},{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/FundingCurrentRow\"},{\"$ref\":\"#/definitions/FundingAccumulatedRow\"},{\"$ref\":\"#/definitions/FundingHistoryRow\"}]}},{\"$ref\":\"#/definitions/FundingCurrentAggregates\"}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FundingCurrentRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\",\"description\":\"Funding rate as a decimal fraction per interval.\"},\"predicted_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},{\"type\":\"null\"}]},\"interval_hours\":{\"type\":\"number\"},\"next_funding_time\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"margin_type\":{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"],\"description\":\"Collateral convention for the contract: `linear` (quote-margined) or `inverse` (coin-margined).\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"],\"description\":\"Underlying category: `crypto`, `equity`, `commodity`, `fx` or `index`. Tokenized-equity perps such as Bybit `TSLL` are `equity`, not `crypto`.\"},\"mark_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Binance's mark price for the base coin (from its premiumIndex feed), attached to every venue's row for that coin as context: it is not this venue's own mark or a traded quote. A lot contract such as `1000PEPE` carries Binance's lot price as is; a bare coin that Binance lists only as a lot is priced at the lot price divided by the lot size. `null` when Binance has no contract for the coin in the same asset class.\"},\"mark_price_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"Latest one-sided USD open interest (each contract counted once) for the `(exchange, base_coin)` pair when a matching futures row exists. `null` when no open-interest row matched. That is most rows, since open-interest coverage is narrower than funding coverage. Never `0` as a stand-in for missing.\"},\"market_cap_rank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}],\"description\":\"Market-cap rank of the base coin, where `1` is the largest. `null` when the coin is unranked. Sort unranked rows last rather than treating `null` as a rank.\"},\"age_seconds\":{\"type\":[\"number\",\"null\"]},\"data_source\":{\"type\":\"string\"},\"freshness_sla_seconds\":{\"type\":\"integer\"},\"is_stale\":{\"type\":\"boolean\"},\"asset_id\":{\"description\":\"The instrument master asset of this contract: the CoinGecko id when the asset was resolved strictly (`pepe`), otherwise `<class>:<ticker>` (`equity:bb`). Every contract of one asset carries the same id, whatever its base_coin spelling. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"asset_symbol\":{\"description\":\"The asset ticker as a trader reads it: `PEPE` on the 1000PEPE and KPEPE contracts too. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"lot_multiplier\":{\"description\":\"Units of the asset per unit the contract quotes: `1000` for Binance 1000PEPEUSDT (and for Coinbase 1000PEPE-PERP, whose base_coin is PEPE), `1` for Gate.io PEPE_USDT. From the venue or a checked alias, never parsed from the symbol. `rate` is a fraction of notional and needs no scaling. `null` when unknown.\",\"type\":[\"number\",\"null\"]},\"instrument_status\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trading\",\"halted\",\"delisted\",\"settling\",\"pre_launch\"]},{\"type\":\"null\"}],\"description\":\"The venue's own status for the contract, as the instruments sync last read it. `null` when the master does not know the contract.\"},\"is_live\":{\"description\":\"`true`: trading, and the venue's contract list was read within 30 minutes. `false`: read within 30 minutes and not trading. `null`: unknown (no read in 30 minutes, a status value the sync could not interpret, or a contract the master does not know).\",\"type\":[\"boolean\",\"null\"]},\"rate_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"`rate` on the 8-hour basis: `rate × 8 / interval_hours`, so contracts on different intervals compare directly. `null` when the row has no rate or an interval Sharpe does not recognise, never computed from an assumed 8 hours.\"},\"apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"`rate` annualized over the row's own interval: `rate × 8760 / interval_hours`, a fraction (0.1 = 10%). Signed like `rate`. `null` when `rate_8h` is.\"}},\"required\":[\"exchange\",\"symbol\",\"base_coin\",\"rate\",\"interval_hours\",\"next_funding_time\",\"updated_at\",\"margin_type\",\"asset_class\",\"mark_price\",\"mark_price_updated_at\",\"open_interest\",\"market_cap_rank\",\"age_seconds\",\"data_source\",\"freshness_sla_seconds\",\"is_stale\"]},\"FundingAccumulatedRow\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"acc_1d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_90d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"settlements_1d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_7d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_30d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_90d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_1y\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"first_settled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"last_settled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"asset_class\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},{\"type\":\"null\"}],\"description\":\"Underlying category, joined in from the live contract book. `null` when no live contract matches, rather than being defaulted to `crypto`.\"},\"margin_type\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},{\"type\":\"null\"}],\"description\":\"Collateral convention, joined in from the live contract book. `null` when no live contract matches.\"},\"interval_hours\":{\"description\":\"The contract's own settlement interval, joined in from the live contract book. `null` when no live contract matches `(exchange, symbol)`. Expected settlements for a window are `ceil(window_hours / interval_hours)`. Compare `settlements_*` against that, never against a fixed 8-hour assumption.\",\"type\":[\"number\",\"null\"]},\"is_active\":{\"type\":\"boolean\",\"description\":\"`false` when the accumulated identity has no live contract behind it, meaning a delisted or renamed pair. Those rows keep their accumulated history but carry `null` metadata.\"},\"asset_id\":{\"description\":\"The instrument master asset of this contract: the CoinGecko id when the asset was resolved strictly (`pepe`), otherwise `<class>:<ticker>` (`equity:bb`). Every contract of one asset carries the same id, whatever its base_coin spelling. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"asset_symbol\":{\"description\":\"The asset ticker as a trader reads it: `PEPE` on the 1000PEPE and KPEPE contracts too. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"lot_multiplier\":{\"description\":\"Units of the asset per unit the contract quotes: `1000` for Binance 1000PEPEUSDT (and for Coinbase 1000PEPE-PERP, whose base_coin is PEPE), `1` for Gate.io PEPE_USDT. From the venue or a checked alias, never parsed from the symbol. `rate` is a fraction of notional and needs no scaling. `null` when unknown.\",\"type\":[\"number\",\"null\"]},\"instrument_status\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trading\",\"halted\",\"delisted\",\"settling\",\"pre_launch\"]},{\"type\":\"null\"}],\"description\":\"The venue's own status for the contract, as the instruments sync last read it. `null` when the master does not know the contract.\"},\"is_live\":{\"description\":\"`true`: trading, and the venue's contract list was read within 30 minutes. `false`: read within 30 minutes and not trading. `null`: unknown (no read in 30 minutes, a status value the sync could not interpret, or a contract the master does not know).\",\"type\":[\"boolean\",\"null\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"1d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"7d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"30d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"90d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"1y\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"}},\"required\":[\"1d\",\"7d\",\"30d\",\"90d\",\"1y\"],\"description\":\"How much of each window (`acc_1d` … `acc_1y`) the contract's settlements cover, judged against when it was listed and when it stopped trading.\"}},\"required\":[\"base_coin\",\"exchange\",\"symbol\",\"acc_1d\",\"acc_7d\",\"acc_30d\",\"acc_90d\",\"acc_1y\",\"settlements_1d\",\"settlements_7d\",\"settlements_30d\",\"settlements_90d\",\"settlements_1y\",\"first_settled_at\",\"last_settled_at\",\"asset_class\",\"margin_type\",\"interval_hours\",\"is_active\"]},\"FundingWindowCoverage\":{\"type\":\"object\",\"properties\":{\"coverage_ratio\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}],\"description\":\"Share of the span the contract was expected to settle in that its settlements cover: from its listing (its first settlement ever) or the window start, to its halt or now, with the last settlement credited one interval. `null` when the contract was not expected in the window at all (listed after it, or halted before it).\"},\"complete\":{\"description\":\"`coverage_ratio` is at least 0.9; `null` with the ratio. Compare `acc_*` of a complete window only with other complete windows.\",\"type\":[\"boolean\",\"null\"]},\"listed_within_window\":{\"type\":\"boolean\",\"description\":\"The contract's first settlement ever falls inside the window: a short history here is a new listing, not missing data.\"},\"halted_within_window\":{\"type\":\"boolean\",\"description\":\"The contract stopped trading inside the window: the window is measured up to that halt. The halt is when the instrument master recorded the venue's status leaving trading; when the master has no such time (it first saw the contract already halted), it is the last settlement plus one interval once the contract's current row stopped updating or left the book. `false` when no halt time is known: then the window runs to now and missing settlements read as missing.\"}},\"required\":[\"coverage_ratio\",\"complete\",\"listed_within_window\",\"halted_within_window\"]},\"FundingHistoryRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\",\"description\":\"The contract that settled. A coin can span several contracts per venue (a USDT and a USDC perp, or PEPE beside 1000PEPE lots), so read series per (exchange, symbol).\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"rate\",\"interval_hours\",\"settled_at\"]},\"FundingCurrentAggregates\":{\"type\":\"object\",\"properties\":{\"summary\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingAssetSummary\"}},\"extremes\":{\"$ref\":\"#/definitions/FundingExtremes\"},\"market\":{\"$ref\":\"#/definitions/FundingMarketStats\"}}},\"FundingAssetSummary\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\",\"description\":\"The group's base ticker. Groups follow the funding grid: one per base_coin spelling and asset class, so `coin=PEPE` answers a `PEPE`, a `1000PEPE` and a `KPEPE` entry, and a ticker two asset classes share answers one entry per class.\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"funding_avg_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Average funding across venues on the 8-hour basis, over one primary contract per venue with a fresh rate (every venue's rate when none is fresh; see `funding_all_stale`). Weighted by each contract's one-sided open interest when at least two venues, and a majority of them, carry open interest; otherwise the median (`funding_method`). `null` when no venue has a usable rate, never 0.\"},\"funding_median_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Median of the same venues' 8-hour rates: the companion one venue cannot move.\"},\"funding_method\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"oi_weighted\",\"median_fallback\"]},{\"type\":\"null\"}],\"description\":\"How `funding_avg_8h` was reduced: `oi_weighted`, or `median_fallback` when too few venues carry open interest. `null` with `funding_avg_8h`.\"},\"funding_venues_used\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Venues behind the figures, one primary contract each.\"},\"funding_venues_stale\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Venues left out because their rate was past the 10-minute freshness SLA while another venue was fresh.\"},\"funding_all_stale\":{\"type\":\"boolean\",\"description\":\"`true` when no venue was fresh: the figures are then over the stale rates, and read as such.\"}},\"required\":[\"base_coin\",\"asset_class\",\"funding_avg_8h\",\"funding_median_8h\",\"funding_method\",\"funding_venues_used\",\"funding_venues_stale\",\"funding_all_stale\"]},\"FundingExtremes\":{\"type\":\"object\",\"properties\":{\"highest\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingCurrentRow\"},\"description\":\"The N rows with the highest `rate_8h`, highest first, among fresh rows with a usable interval that clear `min_oi_usd`.\"},\"lowest\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingCurrentRow\"},\"description\":\"The N rows with the lowest `rate_8h`, lowest first, among the same rows.\"},\"omitted\":{\"type\":\"object\",\"properties\":{\"stale\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"no_interval\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"below_floor\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"stale\",\"no_interval\",\"below_floor\"],\"description\":\"Rows of the scope left out, each under the first check it failed: `stale` (past the freshness SLA), `no_interval` (no rate or no usable interval), `below_floor` (open interest below `min_oi_usd`, or unknown while the floor is above 0).\"}},\"required\":[\"highest\",\"lowest\",\"omitted\"]},\"FundingMarketStats\":{\"type\":\"object\",\"properties\":{\"funding_apr_mean\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Mean 8-hour funding over one primary contract per (venue, asset) with a fresh rate, every asset class included, annualized (× 1,095): the computation behind `avg_funding_rate` on GET /v1/market/derivatives-overview, as an APR and without a key. `null` when no contract has a usable rate.\"},\"funding_apr_oi_weighted\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"The same, weighted by each contract's one-sided open interest (venues left out of open-interest totals carry no weight). `null` when no contract carries open interest, never the mean in its place.\"},\"positive\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Primary contracts with a fresh rate above 0 (longs pay shorts).\"},\"negative\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Primary contracts with a fresh rate below 0 (shorts pay longs).\"}},\"required\":[\"funding_apr_mean\",\"funding_apr_oi_weighted\",\"positive\",\"negative\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"coin\":\"coin\",\"days\":\"days\",\"exchange\":\"exchange\",\"asset_class\":\"asset_class\",\"margin\":\"margin\",\"limit\":\"limit\",\"cursor\":\"cursor\",\"sort\":\"sort\",\"extremes\":\"extremes\",\"min_oi_usd\":\"min_oi_usd\",\"stats\":\"stats\",\"summary\":\"summary\"},\"pagination\":\"cursor\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":{\"by\":\"type\",\"map\":{\"current\":\"funding_rates_current\",\"accumulated\":\"funding_accumulated\",\"history\":\"funding_rates_history\"}},\"freshness_sla_seconds\":{\"by\":\"type\",\"map\":{\"current\":600,\"accumulated\":3600,\"history\":600}},\"behaviour\":[\"`exchange` keeps only that venue's rows.\",\"`coin` returns the contracts of that asset, whatever their base_coin spelling.\",\"`type=accumulated` returns realised sums per contract, one row per (exchange, symbol).\",\"`type=history` returns settlements oldest first.\"],\"cli\":{\"command\":\"sharpe funding\",\"options\":[\"coin\",\"type\",\"days\"]}},{\"name\":\"get_funding_settlement\",\"title\":\"Funding fee settlement\",\"description\":\"Get the dollar value of funding actually paid at each settlement -- not just the rate -- and which side, longs or shorts, paid it. Every response carries both the per-coin row breakdown and a totals block (net/long_paid/short_paid) for the requested window and class, so 'who paid funding today' is read directly from totals rather than summed from a page of rows; totals always reflects the full requested class regardless of any coin/exchange filter on the rows. window=current (the default) is the next settlement, priced live off open interest and the forward-looking rate -- always estimated, never realised. 1d/3d/7d are realised windows; one whose coverage is below 90% carries partial: true (complete: false) because its history is still accruing, not a completed total, and halted_within_window says a contract stopped settling inside the window (listed_within_window is always null: no listing time is known). Sign convention: a window's net = long_paid - short_paid; positive means longs paid more than they received (a cost to longs), negative means shorts paid more. Both long_paid and short_paid are always non-negative magnitudes. Missing is null, never 0. class splits crypto perps from RWA perps (tokenized equity, commodity, FX, index); crypto + rwa totals always equal the all totals.\",\"endpoint\":\"funding-settlement\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/funding/settlement\",\"public\":\"/api/funding/settlement\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"window\":{\"default\":\"current\",\"description\":\"Settlement window. `current` is the next (forward-looking) settlement, priced live and labelled `estimated`. `1d`/`3d`/`7d` are realised windows from the funding_fee_settlement matview.\",\"type\":\"string\",\"enum\":[\"current\",\"1d\",\"3d\",\"7d\"]},\"class\":{\"default\":\"all\",\"description\":\"Asset-class scope. `rwa` is every non-crypto `asset_class` (equity, commodity, fx, index). Not a narrower `asset_class` filter -- this plus the per-row `asset_class` field answers every question a second parameter could, and `crypto` + `rwa` always reconciles exactly to `all` in the `totals` block.\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coin\":{\"description\":\"Comma-separated base coin tickers, for example BTC,ETH. Unfiltered by default.\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to coins settling on a single venue. Accepts the slug, the display name as returned in the `venues[].exchange` field, or the ccxt id. The venue registry is not frozen, so read the `sharpe://exchanges` MCP resource or /api/funding/rates for the current list. An unrecognized value returns 400. Implies the per-venue breakdown internally; the response still omits `venues` unless `expand=venues` is also set.\",\"type\":\"string\",\"maxLength\":32},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"offset\":{\"default\":0,\"description\":\"Zero-based row offset for pagination.\",\"type\":\"integer\",\"minimum\":0},\"sort\":{\"description\":\"Sort field for the selected `window`, optionally prefixed with \\\"-\\\" for descending. Rows with no value for the sort field (an unpriced coin) always sort last, regardless of direction.\",\"type\":\"string\",\"enum\":[\"base_coin\",\"net\",\"long_paid\",\"short_paid\",\"open_interest_usd\",\"-base_coin\",\"-net\",\"-long_paid\",\"-short_paid\",\"-open_interest_usd\"]},\"expand\":{\"description\":\"Set to `venues` to include each row's per-venue breakdown. Omitted by default to keep the default payload small.\",\"type\":\"string\",\"enum\":[\"venues\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementRow\"}},\"totals\":{\"description\":\"Same net/long_paid/short_paid shape as a row, scoped to the selected `class`. crypto + rwa === all in every window, for net, long_paid and short_paid.\",\"allOf\":[{\"$ref\":\"#/definitions/SettlementWindows\"}]},\"settlementMeta\":{\"$ref\":\"#/definitions/SettlementMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"totals\",\"settlementMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementRow\"}},\"totals\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"meta\":{\"type\":\"object\",\"properties\":{\"class\":{\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coins\":{\"type\":\"integer\",\"description\":\"Coins in the selected class, matching the scope of `totals` -- independent of any coin/exchange filter or pagination on this specific request.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the settlement data was refreshed (the funding_fee_settlement matview's refresh, every 15 minutes), not the request time.\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose settlement dollars are left out of every coin row and the totals (shown only in the venues breakdown), with the reason.\"},\"total\":{\"type\":\"integer\",\"description\":\"Coins matching this request's coin/exchange filters, before pagination.\"},\"limit\":{\"type\":\"integer\"},\"offset\":{\"type\":\"integer\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"class\",\"coins\",\"updated_at\",\"total\",\"limit\",\"offset\"]}},\"required\":[\"data\",\"totals\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"SettlementRow\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Always `null`: no price source is wired into this endpoint (the settlement, funding and open-interest tables it reads carry no spot price). Use `/v1/market-cap/search` for spot price.\"},\"price_change_24h_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Always `null`, for the same reason as `price`.\"},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"windows\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementVenueRow\"},\"description\":\"Present only when expand=venues is requested.\"}},\"required\":[\"base_coin\",\"asset_class\",\"price\",\"price_change_24h_pct\",\"open_interest_usd\",\"windows\"]},\"SettlementWindows\":{\"type\":\"object\",\"properties\":{\"current\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"1d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"3d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"7d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"}},\"required\":[\"current\",\"1d\",\"3d\",\"7d\"]},\"SettlementWindowValue\":{\"type\":\"object\",\"properties\":{\"net\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"long_paid\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"short_paid\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"estimated\":{\"type\":\"boolean\",\"description\":\"True on the current window only: priced live from the in-progress rate and latest open interest, not from the matview.\"},\"rate_source\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"predicted\",\"current\"]},{\"type\":\"null\"}],\"description\":\"Where the current window's rate came from. predicted_rate is published by only 5 venues, so `current` (the in-progress rate) is the normal path, not the fallback.\"},\"coverage_ratio\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\",\"description\":\"Realised windows only: how much of the window is covered by priced history. Open interest accrues only forward, so a newly-priced venue's 7d column starts below 1.0. A coin, venue or total row is the open-interest-weighted mean of its contracts' ratios; a contract that stopped settling (halted or delisted) is expected only until its last priced settlement plus one interval.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"Realised windows only: true when coverage_ratio is below 0.9. The numbers still render -- partial means building history, not hidden.\"},\"complete\":{\"type\":\"boolean\",\"description\":\"Realised windows with a coverage_ratio only: true when coverage_ratio is at least 0.9 (the opposite of `partial`).\"},\"listed_within_window\":{\"description\":\"Realised windows with a coverage_ratio only: whether a contract behind the value was listed inside the window. Always `null` on this endpoint today: the settlement data prices seven days and carries no listing time, so a listing is unknown, never assumed.\",\"type\":[\"boolean\",\"null\"]},\"halted_within_window\":{\"type\":\"boolean\",\"description\":\"Realised windows with a coverage_ratio only: true when a contract priced in the window stopped settling inside it: its funding row left the live book or went stale, and its last priced settlement plus one interval falls in the window. Its coverage is measured only up to that point, so a halt does not read as missing history.\"}},\"required\":[\"net\",\"long_paid\",\"short_paid\"],\"description\":\"net = long_paid - short_paid. Both legs are always present alongside net -- a $0 net can conceal $50M flowing each way. Null means an unpriced/absent contract, never a zero flow.\"},\"SettlementVenueRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"windows\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"excluded_from_totals\":{\"type\":\"string\",\"description\":\"Present only on a venue whose open interest is priced per venue but left out of the coin row and the totals (MEXC today), with the reason.\"}},\"required\":[\"exchange\",\"open_interest_usd\",\"windows\"]},\"SettlementMeta\":{\"type\":\"object\",\"properties\":{\"class\":{\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coins\":{\"type\":\"integer\",\"description\":\"Coins in the selected class, matching the scope of `totals` -- independent of any coin/exchange filter or pagination on this specific request.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the settlement data was refreshed (the funding_fee_settlement matview's refresh, every 15 minutes), not the request time.\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose settlement dollars are left out of every coin row and the totals (shown only in the venues breakdown), with the reason.\"},\"total\":{\"type\":\"integer\",\"description\":\"Coins matching this request's coin/exchange filters, before pagination.\"},\"limit\":{\"type\":\"integer\"},\"offset\":{\"type\":\"integer\"}},\"required\":[\"class\",\"coins\",\"updated_at\",\"total\",\"limit\",\"offset\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{data, totals, meta}` with no pagination object (X-Total-Count header instead), where v1 answers `data: {rows, totals, settlementMeta, pagination}`: src/app/api/funding/settlement/route.ts:235-252 vs src/app/api/v1/funding/settlement/route.ts:137-148. Same rows, totals and meta fields.\",\"public_params\":null,\"python_params\":{\"window\":\"window\",\"class\":\"class\",\"coin\":\"coin\",\"exchange\":\"exchange\",\"limit\":\"limit\",\"offset\":\"offset\",\"sort\":\"sort\",\"expand\":\"expand\"},\"pagination\":\"offset\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"window\",\"map\":{\"current\":\"funding_rates_current\",\"1d\":\"funding_fee_settlement\",\"3d\":\"funding_fee_settlement\",\"7d\":\"funding_fee_settlement\"}},\"freshness_sla_seconds\":{\"by\":\"window\",\"map\":{\"current\":600,\"1d\":1800,\"3d\":1800,\"7d\":1800}},\"behaviour\":[\"`exchange` keeps only coins with a contract on that venue; each row's windows and open interest stay all-venue totals.\",\"The per-venue breakdown appears only with `expand=venues`.\",\"`totals` always carries both legs beside net for every window.\"],\"cli\":{\"command\":\"sharpe settlement\",\"options\":[\"window\",\"class\",\"coin\",\"exchange\",\"limit\"]}},{\"name\":\"get_futures_coins\",\"title\":\"Available futures coins\",\"description\":\"Get up to 1,000 coins with futures data, including funding, open-interest, liquidation, long/short, CVD, and dated-basis capability flags plus observed venue coverage and market-cap rank.\",\"endpoint\":\"futures-coins\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/futures/coins\",\"public\":\"/api/futures/coins\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCoin\"}}},\"required\":[\"coins\"]},{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"baseCoin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"hasOI\":{\"type\":\"boolean\"},\"hasFunding\":{\"type\":\"boolean\"},\"hasLiquidations\":{\"type\":\"boolean\"},\"hasLongShort\":{\"type\":\"boolean\"},\"hasCVD\":{\"type\":\"boolean\"},\"hasBasis\":{\"type\":\"boolean\"},\"venueCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"marketCapRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]},\"logoUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"baseCoin\",\"displayName\",\"hasOI\",\"hasFunding\",\"hasLiquidations\",\"hasLongShort\",\"hasCVD\",\"hasBasis\",\"venueCount\",\"venues\",\"marketCapRank\",\"logoUrl\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"coins\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesCoin\":{\"type\":\"object\",\"properties\":{\"baseCoin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"hasOI\":{\"type\":\"boolean\"},\"hasFunding\":{\"type\":\"boolean\"},\"hasLiquidations\":{\"type\":\"boolean\"},\"hasLongShort\":{\"type\":\"boolean\"},\"hasCVD\":{\"type\":\"boolean\"},\"hasBasis\":{\"type\":\"boolean\"},\"venueCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"marketCapRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]}},\"required\":[\"baseCoin\",\"displayName\",\"hasOI\",\"hasFunding\",\"hasLiquidations\",\"hasLongShort\",\"hasCVD\",\"hasBasis\",\"venueCount\",\"venues\",\"marketCapRank\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Each coin also carries `logoUrl` (src/app/api/futures/coins/route.ts:63, :83); v1 rows have no logo field.\",\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"futures_coins\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"Coins are ordered by market-cap rank, unranked last.\"],\"cli\":{\"command\":\"sharpe coins\",\"options\":[]}},{\"name\":\"get_futures_data\",\"title\":\"Futures chart data\",\"description\":\"Get futures chart data including open interest, volume, funding rate history, liquidations, long/short ratios, basis, term structure, and OHLCV. Time series are oldest-first; when one exceeds the response cap its newest rows are kept (truncated_fields marks kept: latest). Without limit, oi-snapshot returns each exchange's latest reading; pass limit/cursor to page raw rows oldest-first.\",\"endpoint\":\"futures-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/futures/data\",\"public\":\"/api/futures/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"],\"description\":\"Futures chart identifier.\"},\"coin\":{\"description\":\"Base coin ticker.\",\"type\":\"string\",\"minLength\":1,\"default\":\"BTC\"},\"timeframe\":{\"default\":\"3M\",\"description\":\"Lookback window for the data.\",\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"exchanges\":{\"description\":\"Comma-separated list of exchanges to include (e.g. Binance,Bybit).\",\"type\":\"string\"},\"limit\":{\"description\":\"Maximum number of data points per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":10000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"required\":[\"chart\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/FuturesDataPayload\"},{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"]},\"coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"data\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"$ref\":\"#/definitions/OpenInterestPoint\"},{\"$ref\":\"#/definitions/OhlcvPoint\"},{\"$ref\":\"#/definitions/FundingPoint\"},{\"$ref\":\"#/definitions/LongShortPoint\"},{\"$ref\":\"#/definitions/BasisPoint\"},{\"$ref\":\"#/definitions/LiquidationPoint\"},{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"expiry_date\":{\"type\":\"string\",\"format\":\"date-time\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"futures_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"spot_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"expiry_date\",\"days_to_expiry\",\"futures_price\",\"spot_price\",\"basis_pct\",\"annualized_basis_pct\",\"volume_24h_usd\",\"open_interest_usd\",\"snapshot_at\",\"timestamp\"]},{\"$ref\":\"#/definitions/AnnualizedBasisPoint\"},{\"$ref\":\"#/definitions/FuturesPriceOverlayPoint\"}]}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"}},\"coverage\":{\"$ref\":\"#/definitions/FreeFuturesCoverage\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-empty\",\"live\"]},\"summary\":{\"$ref\":\"#/definitions/FuturesOiSummary\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"chart\",\"coin\",\"timeframe\",\"data\",\"coverage\",\"source\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesDataPayload\":{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"]},\"coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesDataPoint\"}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Open-interest charts only (oi-stacked, oi-change, oi-daily-change, oi-snapshot): venues whose rows are shown per venue but must not be summed into a total, with the reason.\"},\"coverage\":{\"$ref\":\"#/definitions/FuturesCoverage\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"summary\":{\"$ref\":\"#/definitions/FuturesOiSummary\"}},\"required\":[\"chart\",\"coin\",\"timeframe\",\"data\",\"coverage\",\"source\"]},\"FuturesDataPoint\":{\"anyOf\":[{\"$ref\":\"#/definitions/OpenInterestPoint\"},{\"$ref\":\"#/definitions/OhlcvPoint\"},{\"$ref\":\"#/definitions/FundingPoint\"},{\"$ref\":\"#/definitions/LongShortPoint\"},{\"$ref\":\"#/definitions/BasisPoint\"},{\"$ref\":\"#/definitions/LiquidationPoint\"},{\"$ref\":\"#/definitions/TermStructurePoint\"},{\"$ref\":\"#/definitions/AnnualizedBasisPoint\"},{\"$ref\":\"#/definitions/FuturesPriceOverlayPoint\"}]},\"OpenInterestPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"open_interest_value\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"open_interest_value\",\"timestamp\"]},\"OhlcvPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\"},\"open\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"high\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"low\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"close\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume\":{\"type\":\"number\"},\"taker_buy_volume\":{\"type\":[\"number\",\"null\"]},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"timeframe\",\"open\",\"high\",\"low\",\"close\",\"volume\",\"taker_buy_volume\",\"timestamp\"]},\"FundingPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"rate\",\"interval_hours\",\"settled_at\"]},\"LongShortPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"long_ratio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"short_ratio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"long_ratio\",\"short_ratio\",\"timestamp\"]},\"BasisPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"spot_price\":{\"type\":\"number\"},\"futures_price\":{\"type\":\"number\"},\"basis_rate\":{\"type\":\"number\"},\"annualized_basis\":{\"type\":\"number\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"spot_price\",\"futures_price\",\"basis_rate\",\"annualized_basis\",\"timestamp\"]},\"LiquidationPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"side\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]},\"quantity\":{\"type\":\"number\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"side\",\"quantity\",\"price\",\"timestamp\"]},\"TermStructurePoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"expiry_date\":{\"type\":\"string\",\"format\":\"date-time\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"futures_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"spot_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"expiry_date\",\"days_to_expiry\",\"futures_price\",\"spot_price\",\"basis_pct\",\"annualized_basis_pct\",\"volume_24h_usd\",\"open_interest_usd\",\"snapshot_at\"]},\"AnnualizedBasisPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"days_to_expiry\",\"annualized_basis_pct\",\"snapshot_at\",\"timestamp\"]},\"FuturesPriceOverlayPoint\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\"},\"close\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"base_coin\",\"timeframe\",\"close\",\"timestamp\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"FuturesCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"],\"description\":\"\\\"partial\\\" when a database read failed or timed out after some rows arrived, or stopped at its row cap, so the oldest rows in the window can be missing; warnings says which. Omitted when every read completed.\"},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per gap: an incomplete database read, a read stopped at its row cap, or an open-interest history (oi-stacked, oi-change, oi-daily-change) above 30,000 rows resampled per venue to 2-, 4-, 6-, 12- or 24-hour buckets (last value per venue) to fit the response.\"}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]},\"FuturesOiSummary\":{\"type\":\"object\",\"properties\":{\"oi_total_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"The coin's one-sided open interest across venues (engine L4 `oi.asset_total_usd`): each venue's latest reading within 6 hours, summed, rounded to whole USD. Venues in `oi_excluded_venues` are left out. Null when no venue has a reading within 6 hours (`oi_null_reason`).\"},\"oi_venue_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Venues inside `oi_total_usd`.\"},\"oi_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"The oldest reading inside `oi_total_usd` (each venue's latest reading is hour-bucketed).\"},\"oi_null_reason\":{\"description\":\"Why `oi_total_usd` is null (`no_eligible_inputs`: no venue reading within 6 hours). Present only then.\",\"type\":\"string\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues that have a reading for this coin but are left out of the total, with the reason (MEXC today).\"}},\"required\":[\"oi_total_usd\",\"oi_venue_count\",\"oi_as_of\",\"oi_excluded_venues\"],\"description\":\"chart=oi-snapshot only: the coin's open interest summed across venues, computed by the server from the rows it returns.\"},\"FreeFuturesCoverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\",\"stale\",\"empty\"]},\"source\":{\"type\":\"string\"},\"requestedSince\":{\"type\":\"string\",\"format\":\"date-time\"},\"requestedUntil\":{\"type\":\"string\",\"format\":\"date-time\"},\"earliestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"latestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"distinctTimestamps\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"expectedTimestamps\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"coveragePct\":{\"description\":\"Observed share of the expected time buckets, as a fraction 0-1 despite the name.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"missingExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"exchangeCoverage\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"rowCount\":{\"type\":\"integer\"},\"distinctTimestamps\":{\"type\":\"integer\"},\"earliestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"latestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"exchange\",\"rowCount\",\"distinctTimestamps\",\"earliestDataAt\",\"latestDataAt\"]}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Same chart rows, but `coverage` is the full history-coverage report (status ok/partial/stale/empty, row and bucket counts), term-structure rows carry `timestamp`, `source` can be `supabase-empty` or `live` (nothing stored for a registered coin: fetched from the venues, on both routes since WP-S15), and there is no `pagination` (src/engine/serve/models/futures/series.ts publicSeriesBody).\",\"public_params\":null,\"python_params\":{\"chart\":\"chart\",\"coin\":\"coin\",\"timeframe\":\"timeframe\",\"exchanges\":\"exchanges\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":{\"by\":\"chart\",\"map\":{\"oi-stacked\":\"futures_open_interest\",\"oi-change\":\"futures_open_interest\",\"oi-daily-change\":\"futures_open_interest\",\"oi-snapshot\":\"futures_open_interest\",\"oi-volume\":\"futures_open_interest\",\"funding-rate\":\"funding_rates_history\",\"funding-cost\":\"funding_rates_history\",\"long-short-ratio\":\"futures_long_short_ratio\",\"top-trader-ls\":\"futures_long_short_ratio\",\"liquidations\":\"futures_liquidations\",\"term-structure\":\"futures_term_structure\",\"carry-curve\":\"futures_term_structure\",\"annualized-basis\":\"futures_term_structure\",\"perp-dislocation\":\"futures_basis\",\"perpetual-price\":\"futures_ohlcv\",\"cvd\":\"futures_ohlcv\",\"volume-snapshot\":\"futures_ohlcv\",\"volume-history\":\"futures_ohlcv\",\"returns-session\":\"futures_ohlcv\",\"returns-heatmap\":\"futures_ohlcv\",\"returns-hour\":\"futures_ohlcv\",\"returns-day\":\"futures_ohlcv\",\"crowding-risk\":\"futures_long_short_ratio\",\"flow-confirmation\":\"futures_ohlcv\"}},\"freshness_sla_seconds\":{\"by\":\"chart\",\"map\":{\"oi-stacked\":1200,\"oi-change\":1200,\"oi-daily-change\":1200,\"oi-snapshot\":1200,\"oi-volume\":1200,\"funding-rate\":600,\"funding-cost\":600,\"long-short-ratio\":1200,\"top-trader-ls\":1200,\"liquidations\":1200,\"term-structure\":7200,\"carry-curve\":7200,\"annualized-basis\":7200,\"perp-dislocation\":1200,\"perpetual-price\":7200,\"cvd\":7200,\"volume-snapshot\":7200,\"volume-history\":7200,\"returns-session\":7200,\"returns-heatmap\":7200,\"returns-hour\":7200,\"returns-day\":7200,\"crowding-risk\":1200,\"flow-confirmation\":7200}},\"behaviour\":[\"Time series are oldest first.\",\"`coin` returns only that coin's rows.\",\"Open-interest charts name the venues that must not be summed into a total.\"],\"cli\":{\"command\":\"sharpe futures\",\"options\":[\"chart\",\"coin\",\"timeframe\",\"exchanges\"]}},{\"name\":\"get_gem_finder\",\"title\":\"Gem finder\",\"description\":\"Get market-ranked token rows with market cap, volume, price and market-cap change, circulating supply, ATH and ATL history, nullable FDV/MCap, the preferred chain plus every supported chain the asset is deployed on (chainSlugs), observed exchange availability, quote freshness, and enrichment coverage. Delisted or halted markets whose upstream quote is over 24 hours old are excluded rather than reporting a weeks-old price change as current. Ambiguous same-ticker assets do not receive symbol-only exchange attribution. No wallet signal or proprietary score is returned.\",\"endpoint\":\"gem-finder-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/gem-finder/data\",\"public\":\"/api/gem-finder/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"description\":\"Maximum number of tokens to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque, snapshot-bound pagination cursor from a previous response. Cursors expire when the cache refreshes; restart without a cursor after an expiry error.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/GemFinderPayload\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}}]},{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}},\"availableExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"totalCoins\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"syncStatus\":{\"$ref\":\"#/definitions/GemFinderSyncStatus\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"coins\",\"availableExchanges\",\"totalCoins\",\"updatedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"GemFinderPayload\":{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}},\"availableExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"totalCoins\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"syncStatus\":{\"$ref\":\"#/definitions/GemFinderSyncStatus\"}},\"required\":[\"coins\",\"availableExchanges\",\"totalCoins\",\"updatedAt\"]},\"GemCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"mcapChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"24-hour market cap change percentage.\"},\"circulatingSupply\":{\"description\":\"Circulating supply in token units.\",\"type\":[\"number\",\"null\"]},\"athPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"athDate\":{\"type\":\"string\",\"description\":\"ISO 8601 time of the all-time high, as CoinGecko sends it. An empty string when CoinGecko sends none.\"},\"atlPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"All-time-low price in USD.\"},\"atlDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Percentage above the all-time low.\"},\"fdvMcapRatio\":{\"type\":[\"number\",\"null\"]},\"exchangeCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"chainSlug\":{\"description\":\"Preferred supported chain, used for the DEX link. Null when no supported chain is known.\",\"type\":[\"string\",\"null\"]},\"chainSlugs\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Every supported chain the asset is deployed on, in priority order, with chainSlug as the first entry. A multi-chain asset appears under each of these chains; an empty array means no supported chain is known.\"},\"lastUpdated\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"CoinGecko quote timestamp. Assets whose quote is older than 24 hours are excluded as no-longer-trading; a null value means the upstream omitted the field.\"}},\"required\":[\"id\",\"name\",\"symbol\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change24h\",\"change7d\",\"mcapChange24h\",\"circulatingSupply\",\"athPrice\",\"athDistance\",\"athDate\",\"atlPrice\",\"atlDistance\",\"fdvMcapRatio\",\"exchangeCount\",\"exchanges\",\"chainSlug\",\"chainSlugs\",\"lastUpdated\"]},\"GemFinderSyncStatus\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\"]},\"rawCoinCount\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"successfulPages\":{\"type\":\"array\",\"items\":{\"type\":\"integer\",\"minimum\":1}},\"failedPages\":{\"type\":\"array\",\"items\":{\"type\":\"integer\",\"minimum\":1}},\"enrichment\":{\"type\":\"object\",\"properties\":{\"platform\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\",\"unavailable\"]},\"freshCoins\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"preservedCoins\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"status\",\"freshCoins\",\"preservedCoins\"]},\"exchanges\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\",\"unavailable\"]},\"successfulSources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"failedSources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"preservedListings\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"status\",\"successfulSources\",\"failedSources\",\"preservedListings\"]}},\"required\":[\"platform\",\"exchanges\"]}},\"required\":[\"status\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Reads no query parameters (src/app/api/gem-finder/data/route.ts:46): `limit` and `cursor` are ignored and the body is always the full payload, v1's unpaginated `data`. v1 pages the same sanitized rows into a paginated envelope of GemCoin rows when `limit` is set (src/app/api/v1/gem-finder/data/route.ts:82-94).\",\"public_params\":[],\"python_params\":{\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"gem_finder\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"Returns up to 1,000 market-ranked rows, largest market cap first.\",\"Assets whose upstream quote is more than 24 hours old are excluded.\",\"chainSlugs lists every supported chain of the asset with chainSlug as its first entry.\"],\"cli\":{\"command\":\"sharpe gems\",\"options\":[\"limit\",\"cursor\"]}},{\"name\":\"get_global_overview\",\"title\":\"Global market overview\",\"description\":\"Get the whole-market derivatives board in one call: total open interest with its crypto-versus-RWA split, 24h liquidations, average Wilder RSI(14) across the top 100 crypto perps by market cap, the Altcoin Season Index (share of the top 50 by market cap beating BTC over 90 days, excluding stablecoins and wrapped/staked derivatives), open interest broken down by asset class, and a ranked per-asset row table. The tab parameter selects the universe: crypto, equity, preipo, etf, index, commodity or fx. Rows carry price, 24h price change, funding rate (interval-true, never assumed 8h), 24h volume, market cap, open interest with 1h and 24h changes, plus liquidations on crypto or a venue count on RWA tabs. Ranks are by open interest descending. Liquidations are crypto-only because no RWA venue publishes a liquidation feed. Use this for 'what is the market doing' questions; use get_funding_rates for per-venue crypto funding detail and get_rwa_perp_funding for RWA carry and cross-venue spreads.\",\"endpoint\":\"global-overview\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/global/overview\",\"public\":\"/api/global/overview\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"tab\":{\"default\":\"crypto\",\"description\":\"Universe to return rows for. The metric block is identical on every tab.\",\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"preipo\",\"etf\",\"index\",\"commodity\",\"fx\"]},\"limit\":{\"description\":\"Maximum rows per page (1-1000). Enables cursor pagination.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"tab\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"preipo\",\"etf\",\"index\",\"commodity\",\"fx\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"},\"metrics\":{\"type\":\"object\",\"properties\":{\"openInterestUsd\":{\"type\":\"number\"},\"openInterestChange24hPct\":{\"type\":[\"number\",\"null\"]},\"openInterestSparkline\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"string\",\"format\":\"date-time\"},\"v\":{\"type\":\"number\"}}}},\"cryptoOpenInterestUsd\":{\"type\":\"number\"},\"rwaOpenInterestUsd\":{\"type\":\"number\"},\"liquidations24hUsd\":{\"description\":\"Crypto only; 4-hour Velo buckets, newest still accumulating.\",\"type\":[\"number\",\"null\"]},\"liquidationsChange24hPct\":{\"type\":[\"number\",\"null\"]},\"liquidationsLongUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Long side of the 24h liquidation total, so a cascade reads as flushed longs or shorts. Crypto only.\"},\"liquidationsShortUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Short side of the 24h liquidation total. Crypto only.\"},\"liquidationsSparkline\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"string\",\"format\":\"date-time\"},\"v\":{\"type\":\"number\"}}}},\"avgRsi\":{\"description\":\"Unweighted mean Wilder RSI(14) on daily closes, top 100 crypto perps by market cap.\",\"type\":[\"number\",\"null\"]},\"avgRsiSampleSize\":{\"type\":\"integer\"},\"altcoinSeasonIndex\":{\"description\":\"Share of the top 50 by market cap beating BTC over 90 days; excludes stablecoins and wrapped/staked derivatives.\",\"type\":[\"number\",\"null\"]},\"altcoinSeasonSampleSize\":{\"type\":\"integer\"},\"classBreakdown\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"tab\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"openInterestUsd\":{\"type\":\"number\"},\"symbolCount\":{\"type\":\"integer\"}}}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose open interest every figure on the board leaves out, with the reason.\"}}},\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GlobalRow\"}}}},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GlobalRow\"}}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"GlobalRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"logoUrl\":{\"type\":[\"string\",\"null\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Funding fraction normalized to an 8h basis; never assumes the venue interval. Crypto tab: the coin's average across venues (the funding grid's Avg Rate), each venue's primary contract weighted by its one-sided open interest when at least two venues, and a majority of them, carry open interest, otherwise their median; only venues refreshed within 10 minutes; null when there is none. RWA tabs: the open-interest-weighted mean across RWA venues.\"},\"volume24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volumeChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCapUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on the preipo and index tabs, where no market cap exists.\"},\"openInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiChange1hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"oiChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidations24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Crypto tabs only; null on RWA tabs, where no venue publishes a liquidation feed.\"},\"venueCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Venues behind openInterestUsd: on the crypto tab the distinct venues holding the asset's contracts (lot and quote spellings count once per venue); on RWA tabs how many venues list the underlying.\"},\"isStale\":{\"type\":\"boolean\"}}}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"tab\":\"tab\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"tab\",\"map\":{\"crypto\":\"global_overview_snapshot\",\"equity\":\"rwa_perp_rates_current\",\"preipo\":\"rwa_perp_rates_current\",\"etf\":\"rwa_perp_rates_current\",\"index\":\"rwa_perp_rates_current\",\"commodity\":\"rwa_perp_rates_current\",\"fx\":\"rwa_perp_rates_current\"}},\"freshness_sla_seconds\":{\"by\":\"tab\",\"map\":{\"crypto\":600,\"equity\":3600,\"preipo\":3600,\"etf\":3600,\"index\":3600,\"commodity\":3600,\"fx\":3600}},\"behaviour\":[\"Rows are ranked by open interest, descending.\",\"Liquidations are crypto-only: RWA tab rows carry none.\"],\"cli\":{\"command\":\"sharpe global\",\"options\":[\"tab\"]}},{\"name\":\"get_heatmap\",\"title\":\"Market heatmap\",\"description\":\"Get market heatmap data for coins, narratives, or ecosystems. The legacy top-100 slug returns the Top 50 universe; aggregate modes expose complete or partial category coverage.\",\"endpoint\":\"heatmap-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/heatmap/data\",\"public\":\"/api/heatmap/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"mode\":{\"default\":\"coins\",\"description\":\"Heatmap grouping mode.\",\"type\":\"string\",\"enum\":[\"coins\",\"narratives\",\"ecosystems\"]},\"category\":{\"default\":\"top-100\",\"description\":\"One of 34 category slugs (e.g. top-100, defi, layer-1). The legacy top-100 slug returns the Top 50 universe.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"dots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/HeatmapDot\"}},\"updated_at\":{\"type\":\"string\",\"description\":\"ISO timestamp for the populated heatmap cache.\"},\"coverage\":{\"anyOf\":[{\"$ref\":\"#/definitions/HeatmapCoverage\"},{\"type\":\"null\"}],\"description\":\"Aggregate category coverage for narrative and ecosystem modes; null for coins mode.\"}},\"required\":[\"dots\",\"updated_at\",\"coverage\"]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"HeatmapDot\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"x\":{\"description\":\"Historical RVOL: current 24-hour volume divided by the asset's own average prior daily volume. Null when fewer than three positive historical observations are available.\",\"type\":[\"number\",\"null\"]},\"y\":{\"type\":\"object\",\"properties\":{\"24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"3y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"24h\",\"7d\",\"30d\",\"1y\",\"3y\"]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"logoUrl\":{\"type\":\"string\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"openInterest\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"openInterestChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"id\",\"name\",\"symbol\",\"x\",\"y\",\"marketCap\"]},\"HeatmapCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"availableCategories\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"totalCategories\":{\"type\":\"integer\",\"minimum\":1,\"x-unit\":\"count\"},\"ratio\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\"}},\"required\":[\"status\",\"availableCategories\",\"totalCategories\",\"ratio\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"mode\":\"mode\",\"category\":\"category\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"heatmap_cache\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"The legacy top-100 slug (the default) returns the Top 50 universe, and coins mode carries no category coverage.\",\"Aggregate modes expose complete or partial category coverage.\"],\"cli\":{\"command\":\"sharpe heatmap\",\"options\":[\"mode\",\"category\"]}},{\"name\":\"get_insider_selling\",\"title\":\"Insider selling pressure\",\"description\":\"Get insider selling pressure signals across crypto assets. Scores require cross-venue negative funding and combine OI, basis, CVD, sell-side flow, and supporting wallet/supply context; read signal_coverage_pct because partial-input scores are conservative lower bounds. coin returns one coin's row as the scorer wrote it (score null once it stopped qualifying).\",\"endpoint\":\"insider-selling-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/insider-selling/data\",\"public\":\"/api/insider-selling/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":100,\"description\":\"Maximum number of coins to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"min_score\":{\"default\":0,\"description\":\"Filter to coins scoring at or above this value.\",\"type\":\"number\",\"minimum\":0,\"maximum\":10},\"coin\":{\"description\":\"One coin by its CoinGecko id (e.g. pepe): its row exactly as the scorer wrote it, whatever its score. A coin that stopped qualifying answers `score: null` with its sub-scores and phase cleared; an id with no row answers an empty list. `limit`, `min_score` and `phase` do not apply.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":128}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/InsiderSellingRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"description\":{\"type\":\"string\"},\"signal\":{\"$ref\":\"#/definitions/ManipulationSignal\"},\"data_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600],\"description\":\"Freshness SLA in seconds (1 hour).\"}},\"required\":[\"coins\",\"count\",\"description\",\"signal\",\"data_as_of\",\"stale\",\"freshness_sla_seconds\"]},{\"type\":\"object\",\"properties\":{\"scores\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/InsiderSellingRow\"},\"description\":\"Every scored coin (score above 0 on at least two venues), highest score first, filtered by `limit` and `min_score` (and `phase` on pump-dump) as on v1.\"},\"meta\":{\"type\":\"object\",\"properties\":{\"totalScanned\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Distinct crypto assets with funding in the last three days (get_perps_monitored_count; stock, commodity, index and fx perps are not scored): the universe the score run scans, not the number of rows. Null when the count could not be read; that answer is not cached.\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"totalScanned\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present, and true, only when the newest row is older than the 1-hour freshness SLA or a failed read served the last good payload.\"}},\"required\":[\"scores\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"InsiderSellingRow\":{\"type\":\"object\",\"properties\":{\"coin_id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"avg_funding_72h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"funding_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"manipulation_phase\":{\"type\":[\"string\",\"null\"]},\"oi_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"cvd_trend_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"basis_rate_avg\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"holders_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"liquidity_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_to_liquidity_24h\":{\"type\":[\"number\",\"null\"]},\"buy_sell_imbalance_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"mintable\":{\"type\":[\"boolean\",\"null\"]},\"freezable\":{\"type\":[\"boolean\",\"null\"]},\"consecutive_negative_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"price_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"price_change_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"signal_start_date\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"holders_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct_change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidity_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"volume_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"funding_persistence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"wallet_concentration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"holder_quality_deterioration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"distribution_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"market_confirmation\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"signal_coverage_pct\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"signal_coverage_status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"limited\"]},\"incomplete_signal_groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"score_interpretation\":{\"type\":\"string\",\"enum\":[\"fully-observed\",\"lower-bound-partial-inputs\"]}},\"required\":[\"coin_id\",\"symbol\",\"name\",\"score\",\"exchange_count\",\"updated_at\",\"signal_coverage_pct\",\"signal_coverage_status\",\"incomplete_signal_groups\",\"score_interpretation\"]},\"ManipulationSignal\":{\"type\":\"object\",\"properties\":{\"methodology\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\"},\"gate\":{\"type\":[\"string\",\"null\"]},\"phase_filter\":{\"type\":[\"string\",\"null\"]},\"update_frequency\":{\"type\":\"string\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"methodology\",\"coverage\",\"update_frequency\",\"exchanges\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{scores, meta: {totalScanned}, stale?}` where v1 answers `{coins, count, description, signal, data_as_of, stale, freshness_sla_seconds}`; both filter by `limit` / `min_score` through one read model (src/engine/serve/models/signals/scores.ts).\",\"public_params\":[\"limit\",\"min_score\",\"coin\"],\"python_params\":{\"limit\":\"limit\",\"min_score\":\"min_score\",\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"insider_pressure\",\"freshness_sla_seconds\":3600,\"behaviour\":[\"Coins are ordered by score, highest first, and every listed coin scores above 0.\",\"Scores require cross-venue negative funding: every coin trades on at least two venues with a 72h average funding at or below 0 (negative before the 5-decimal rounding).\",\"Every coin carries its signal coverage; `score_interpretation` is `fully-observed` exactly when `signal_coverage_pct` is 100.\"],\"cli\":{\"command\":\"sharpe insider-selling\",\"options\":[\"limit\",\"min_score\"]}},{\"name\":\"get_listing_events\",\"title\":\"Canonical listing events\",\"description\":\"Get canonical listing lifecycle events across CEXs and Perp DEXs, including source URLs, confidence, real source-observation freshness, partial status, and per-provider coverage. Pass the opaque cursor through unchanged.\",\"endpoint\":\"listings-events\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/events\",\"public\":\"/api/listings/events\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"description\":\"Filter to a single exchange or perp DEX.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\",\"bitget\",\"kucoin\",\"bingx\",\"bitmart\",\"deepcoin\",\"coinbase\",\"kraken\",\"crypto_com\",\"upbit\",\"bithumb\",\"htx\",\"bitfinex\",\"bitstamp\",\"gemini\",\"bitmex\",\"deribit\",\"phemex\",\"lbank\",\"bitrue\",\"coinex\",\"backpack\",\"hashkey\",\"whitebit\",\"toobit\",\"hyperliquid\",\"aster\",\"dydx\",\"aevo\"]},\"venue_type\":{\"description\":\"Filter by venue type.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Filter by market type.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"description\":\"Filter by listing lifecycle event type.\",\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"description\":\"Filter by listed instrument class.\",\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"status\":{\"description\":\"Filter by event status.\",\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"narrative\":{\"description\":\"Filter by Sharpe narrative slug.\",\"type\":\"string\"},\"confidence\":{\"description\":\"Filter by source confidence.\",\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"from\":{\"description\":\"ISO date or datetime lower bound.\",\"type\":\"string\"},\"to\":{\"description\":\"ISO date or datetime upper bound.\",\"type\":\"string\"},\"days\":{\"default\":90,\"description\":\"Lookback window in days.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":365},\"limit\":{\"default\":200,\"description\":\"Max rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque two-stream cursor returned by the previous page. Pass it through unchanged.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingEventsPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingEventsPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExchangeListingEvent\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"next_cursor\":{\"type\":[\"string\",\"null\"]},\"window_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Time the API assembled this response. This is not a source freshness timestamp.\"},\"last_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"Freshest observation timestamp present in the database or official overlay rows.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"True exactly when partial_reasons is non-empty.\"},\"partial_reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per coverage gap: a provider whose request failed, a live exchange instrument feed whose newest listing is more than 60 days old, the hourly spot-listings ingest when the query covers its venues and its last completed run is more than 3 hours old, the canonical events table being unavailable (rows then come from the compatibility table), or a requested exchange, venue_type or market_type that no enabled connector covers. Empty when coverage is whole.\"},\"provider_coverage\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingEventProviderCoverage\"}},\"source\":{\"type\":\"string\",\"enum\":[\"events\",\"compatibility\"]}},\"required\":[\"rows\",\"count\",\"next_cursor\",\"window_days\",\"generated_at\",\"last_updated_at\",\"partial\",\"provider_coverage\",\"source\"]},\"ExchangeListingEvent\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"event_uid\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"exchange_name\":{\"type\":\"string\"},\"venue_type\":{\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"instrument_id\":{\"type\":\"string\"},\"base_asset\":{\"type\":\"string\"},\"quote_asset\":{\"type\":[\"string\",\"null\"]},\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_coingecko_id\":{\"type\":[\"string\",\"null\"]},\"token_contract_address\":{\"type\":[\"string\",\"null\"]},\"token_chain\":{\"type\":[\"string\",\"null\"]},\"narrative_slug\":{\"type\":[\"string\",\"null\"]},\"scheduled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"announced_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"first_trade_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"first_seen_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"effective_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"status\":{\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"source_kind\":{\"type\":\"string\",\"enum\":[\"official_api\",\"official_announcement\",\"official_status\",\"exchange_kline\",\"market_data\",\"proxy\",\"manual\"]},\"source_confidence\":{\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"source_url\":{\"type\":[\"string\",\"null\"]},\"raw_payload\":{\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"event_uid\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"asset_class\",\"instrument_id\",\"base_asset\",\"quote_asset\",\"token_symbol\",\"token_name\",\"token_coingecko_id\",\"token_contract_address\",\"token_chain\",\"narrative_slug\",\"scheduled_at\",\"announced_at\",\"first_trade_at\",\"first_seen_at\",\"effective_at\",\"status\",\"source_kind\",\"source_confidence\",\"source_url\"]},\"ListingEventProviderCoverage\":{\"type\":\"object\",\"properties\":{\"provider\":{\"type\":\"string\",\"description\":\"Stable provider or database identifier.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"database\",\"official_overlay\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"error\",\"skipped\"]},\"row_count\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"last_observed_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"provider\",\"kind\",\"status\",\"row_count\",\"last_observed_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"exchange\":\"exchange\",\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"event_type\":\"event_type\",\"asset_class\":\"asset_class\",\"status\":\"status\",\"narrative\":\"narrative\",\"confidence\":\"confidence\",\"from\":\"from\",\"to\":\"to\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"`exchange` keeps only that venue's events.\",\"Events are newest first by `effective_at`.\",\"`partial` is true exactly when `partial_reasons` is non-empty.\"],\"cli\":{\"command\":\"sharpe listings events\",\"options\":[\"narrative\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"confidence\",\"from\",\"to\",\"cursor\",\"days\",\"limit\"]}},{\"name\":\"get_listing_exchanges\",\"title\":\"New listings exchange registry\",\"description\":\"Get the typed listing connector registry, including supported exchanges, venue types, market coverage, source documentation URLs, enabled status, polling group, and parser confidence.\",\"endpoint\":\"listings-exchanges\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/exchanges\",\"public\":\"/api/listings/exchanges\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"venue_type\":{\"description\":\"Filter exchange coverage by venue type.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Filter exchange coverage by supported market type.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"enabled\":{\"description\":\"Filter to enabled or disabled connectors.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingExchangeCoveragePayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingExchangeCoveragePayload\":{\"type\":\"object\",\"properties\":{\"exchanges\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingExchangeMeta\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"enabled_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshness_sla\":{\"type\":\"string\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchanges\",\"count\",\"enabled_count\",\"freshness_sla\",\"generated_at\"]},\"ListingExchangeMeta\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"venueType\":{\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"supportedMarketTypes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"docsUrl\":{\"type\":\"string\"},\"sourceUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"format\":\"uri\"}},\"rateLimitPosture\":{\"type\":\"string\"},\"parserConfidence\":{\"type\":\"string\"},\"connectorStatus\":{\"type\":\"string\"},\"pollingGroup\":{\"type\":\"string\"},\"enabled\":{\"type\":\"boolean\"},\"notes\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"venueType\",\"supportedMarketTypes\",\"docsUrl\",\"sourceUrls\",\"rateLimitPosture\",\"parserConfidence\",\"connectorStatus\",\"pollingGroup\",\"enabled\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"enabled\":\"enabled\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":null,\"freshness_sla_seconds\":null,\"behaviour\":[\"`enabled=true` keeps only enabled connectors, so `enabled_count` equals `count`.\"],\"cli\":{\"command\":\"sharpe listings exchanges\",\"options\":[\"venue_type\",\"market_type\",\"enabled\"]}},{\"name\":\"get_market_overview\",\"title\":\"Market overview\",\"description\":\"Get BTC and ETH price/change, total crypto market cap and 24h volume, BTC dominance, market-cap change, and the Fear & Greed Index. Auxiliary source fields may be null when unavailable.\",\"endpoint\":\"tracker-market-overview\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/tracker/market-overview\",\"public\":\"/api/tracker/market-overview\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MarketOverview\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MarketOverview\":{\"type\":\"object\",\"properties\":{\"bitcoin\":{\"type\":\"object\",\"properties\":{\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"price\",\"change\"]},\"ethereum\":{\"type\":\"object\",\"properties\":{\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"price\",\"change\"]},\"fgi\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"fgi_classification\":{\"type\":\"string\"},\"total_market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"total_volume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"btc_dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"btc_dominance_pct\":{\"description\":\"Bitcoin's share of total crypto market cap, in percent (57.3 = 57.3%): `btc_dominance` with its unit in its name. Null when unknown.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"market_cap_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"bitcoin\",\"ethereum\",\"fgi\",\"fgi_classification\",\"total_market_cap\",\"total_volume\",\"btc_dominance\",\"market_cap_change_24h\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"sectors\",\"freshness_sla_seconds\":7200,\"behaviour\":[],\"cli\":{\"command\":\"sharpe market\",\"options\":[]}},{\"name\":\"get_memecoin_launches\",\"title\":\"Memecoin launches\",\"description\":\"Get recently launched tokens from recognized memecoin launchpads, screened by age, liquidity, volume, and transactions. Generic new DEX pairs are excluded; response includes complete/partial chain coverage.\",\"endpoint\":\"memecoins-launches\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/memecoins/launches\",\"public\":\"/api/memecoins/launches\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"chains\":{\"description\":\"Comma-separated chain IDs such as solana, base, bsc, ethereum.\",\"type\":\"string\"},\"days\":{\"default\":7,\"description\":\"Launch lookback window in days, from 1 to 30.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":30},\"limit\":{\"default\":80,\"description\":\"Maximum launch rows to return, from 1 to 200.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":200},\"profile\":{\"default\":\"balanced\",\"description\":\"Screening profile for liquidity, volume, and transaction thresholds.\",\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MemecoinLaunchesPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MemecoinLaunchesPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinLaunchRow\"}},\"scannedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"filters\":{\"type\":\"object\",\"properties\":{\"chains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"days\":{\"type\":\"integer\",\"x-unit\":\"days\"},\"limit\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"profile\":{\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]}},\"required\":[\"chains\",\"days\",\"limit\",\"profile\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"successfulChains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"failedChains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"classificationMethod\":{\"type\":\"string\",\"enum\":[\"recognized_meme_launchpad\"]}},\"required\":[\"status\",\"successfulChains\",\"failedChains\",\"classificationMethod\"]}},\"required\":[\"rows\",\"scannedAt\",\"filters\",\"coverage\"]},\"MemecoinLaunchRow\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"tokenAddress\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"description\":\"DexScreener pair URL; may be empty when launchpad identity is inferred from dexId.\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"txnsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"txnsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"ageHours\":{\"type\":[\"number\",\"null\"]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]},\"launchedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"launchpad\":{\"type\":[\"string\",\"null\"]},\"migrationState\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"unknown\"]},{\"type\":\"null\"}]},\"screeningStatus\":{\"type\":\"string\",\"enum\":[\"liquidity_volume_txn_screened\"]},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"securitySignalSource\":{\"type\":[\"string\",\"null\"]},\"eligibleForTrackerIngestion\":{\"type\":\"boolean\"},\"canonicalInclusionReason\":{\"type\":\"string\"},\"memeClassification\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"verified\"]},\"source\":{\"type\":\"string\",\"enum\":[\"meme_launchpad\"]},\"evidence\":{\"type\":\"string\"}},\"required\":[\"status\",\"source\",\"evidence\"]}},\"required\":[\"chainId\",\"symbol\",\"name\",\"tokenAddress\",\"pairAddress\",\"dexId\",\"pairUrl\",\"priceUsd\",\"priceChangeH1\",\"priceChangeH24\",\"volumeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"txnsH1\",\"txnsH24\",\"ageHours\",\"holdersCount\",\"holdersSource\",\"launchedAt\",\"launchpad\",\"migrationState\",\"screeningStatus\",\"riskFlags\",\"securitySignalSource\",\"eligibleForTrackerIngestion\",\"canonicalInclusionReason\",\"memeClassification\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"chains\":\"chains\",\"days\":\"days\",\"limit\":\"limit\",\"profile\":\"profile\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"token_scanner\",\"freshness_sla_seconds\":300,\"behaviour\":[\"Generic new DEX pairs are excluded: every row comes from a recognised meme launchpad.\",\"Launches are screened by age: no row is older than the `days` window, and every row is on a scanned chain.\"],\"cli\":{\"command\":\"sharpe memecoin-launches\",\"options\":[\"chains\",\"days\",\"limit\",\"profile\"]}},{\"name\":\"get_memecoins\",\"title\":\"Memecoins data\",\"description\":\"Get memecoin narrative data across grouped categories (Dog, Cat, Frog, AI, Solana, Base, Pump.fun, etc.) with market cap, market share, volume, performance, and freshness fields.\",\"endpoint\":\"memecoins-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/memecoins/data\",\"public\":\"/api/memecoins/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Memecoin narrative slug to filter by (e.g. dog-coins, cat-coins, frog-coins, ai-memes, trump-coins).\",\"type\":\"string\"},\"historical\":{\"description\":\"Include historical time-series data for the specified window.\",\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"30d\",\"1y\"]},\"coinHistory\":{\"description\":\"Include per-coin price history where retained. Enum: 24h, 7d, 1m, 1y.\",\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"1m\",\"1y\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MemecoinsDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MemecoinsDataPayload\":{\"anyOf\":[{\"$ref\":\"#/definitions/MemecoinBasePayload\"},{\"$ref\":\"#/definitions/MemecoinDetailPayload\"},{\"$ref\":\"#/definitions/MemecoinHistoricalPayload\"}]},\"MemecoinBasePayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\"]},\"MemecoinNarrative\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"emoji\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"group\":{\"type\":\"string\",\"enum\":[\"aggregate\",\"theme\",\"chain\",\"launchpad\"]},\"primaryThemeId\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketSharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/MemecoinTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"trackedCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"coverageLimit\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentumKind\":{\"type\":\"string\",\"enum\":[\"short_term_price_momentum\"]},\"calculationMethod\":{\"$ref\":\"#/definitions/MemecoinCalculationMethod\"},\"returnCoverage\":{\"$ref\":\"#/definitions/MemecoinReturnCoverage\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"}},\"required\":[\"id\",\"name\",\"emoji\",\"slug\",\"group\",\"primaryThemeId\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"marketCap\",\"volume24h\",\"marketSharePct\",\"topCoin\",\"coinCount\",\"trackedCoinCount\",\"coverageLimit\",\"dominance\",\"momentum\",\"momentumKind\",\"calculationMethod\",\"returnCoverage\",\"freshness\"]},\"MemecoinTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"MemecoinCalculationMethod\":{\"type\":\"object\",\"properties\":{\"marketCap\":{\"type\":\"string\",\"enum\":[\"coingecko_category_market_cap_ex_exclusions\"]},\"volume24h\":{\"type\":\"string\",\"enum\":[\"coingecko_category_volume_ex_exclusions\"]},\"returns\":{\"type\":\"string\",\"enum\":[\"median_constituent_price_change_min_500k_mcap\"]},\"marketShare\":{\"type\":\"string\",\"enum\":[\"category_market_cap_over_all_memes_market_cap\"]},\"momentum\":{\"type\":\"string\",\"enum\":[\"0.40_1h_0.35_24h_0.25_7d\"]}},\"required\":[\"marketCap\",\"volume24h\",\"returns\",\"marketShare\",\"momentum\"]},\"MemecoinReturnCoverage\":{\"type\":\"object\",\"properties\":{\"1h\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"24h\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"7d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"30d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"200d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"1y\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"}},\"required\":[\"1h\",\"24h\",\"7d\",\"30d\",\"200d\",\"1y\"]},\"MemecoinFreshness\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"enum\":[\"coingecko\"]},\"upstreamUpdatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"cachedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"}},\"required\":[\"source\",\"upstreamUpdatedAt\",\"cachedAt\",\"stale\"]},\"MemecoinPrimaryThemeBucket\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"sharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"color\":{\"type\":\"string\"},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"returnMethod\":{\"type\":\"string\",\"enum\":[\"market_cap_weighted_assigned_constituents\"]}},\"required\":[\"id\",\"name\",\"marketCap\",\"sharePct\",\"color\"]},\"MemecoinPrimaryThemeSnapshot\":{\"type\":\"object\",\"properties\":{\"theme_id\":{\"type\":\"string\"},\"market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"coin_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"total_meme_market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"theme_id\",\"market_cap\",\"coin_count\",\"total_meme_market_cap\",\"snapshot_at\"]},\"MemecoinHistoryMetadata\":{\"type\":\"object\",\"properties\":{\"window\":{\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"30d\",\"1y\"]},\"series\":{\"type\":\"string\",\"enum\":[\"all\",\"primary_theme\"]},\"cadence\":{\"type\":\"string\",\"enum\":[\"hourly\",\"daily\"]},\"cadenceMs\":{\"type\":\"integer\",\"minimum\":1},\"sourceRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"returnedRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"calculationMethod\":{\"type\":\"string\",\"enum\":[\"despiked_forward_filled_market_cap_snapshots\"]}},\"required\":[\"window\",\"cadence\",\"cadenceMs\",\"sourceRows\",\"returnedRows\",\"calculationMethod\"]},\"MemecoinCoinHistoryMetadata\":{\"type\":\"object\",\"properties\":{\"window\":{\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"1m\",\"1y\"]},\"cadence\":{\"type\":\"string\",\"enum\":[\"hourly\",\"daily\"]},\"cadenceMs\":{\"type\":\"integer\",\"minimum\":1},\"sourceRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"returnedRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"topCoinCount\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"calculationMethod\":{\"type\":\"string\",\"enum\":[\"forward_filled_coin_price_history\"]}},\"required\":[\"window\",\"cadence\",\"cadenceMs\",\"sourceRows\",\"returnedRows\",\"topCoinCount\",\"calculationMethod\"]},\"MemecoinDetailPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"coinPriceHistory\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPricePoint\"}}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"MemecoinCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"sparkline\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}},\"athPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"atlPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"atlPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"circSupply\":{\"type\":[\"number\",\"null\"]},\"maxSupply\":{\"type\":[\"number\",\"null\"]},\"supplyRatio\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"volMcap\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"symbol\",\"image\",\"price\",\"change1h\",\"change24h\",\"change7d\",\"marketCap\",\"fdv\",\"volume24h\",\"sparkline\",\"athPrice\",\"athPercent\",\"atlPrice\",\"atlPercent\",\"circSupply\",\"maxSupply\",\"supplyRatio\",\"volMcap\",\"change30d\",\"change200d\",\"change1y\"]},\"MemecoinPricePoint\":{\"type\":\"object\",\"properties\":{\"time\":{\"type\":\"integer\",\"format\":\"int64\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"}},\"required\":[\"time\",\"price\"]},\"MemecoinHistoricalPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinSnapshot\"}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\",\"primaryThemeSnapshots\",\"historicalMetadata\",\"snapshots\"]},\"MemecoinSnapshot\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume_24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"narrative_id\",\"market_cap\",\"volume_24h\",\"snapshot_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"narrative\",\"historical\",\"series\",\"coinHistory\"],\"python_params\":{\"narrative\":\"narrative\",\"historical\":\"historical\",\"coinHistory\":\"coin_history\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"memecoins\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`historical=7d` adds hourly market-cap snapshots covering the last 7 days, oldest first.\"],\"cli\":{\"command\":\"sharpe memecoins\",\"options\":[\"narrative\",\"historical\",\"coinHistory\"]}},{\"name\":\"get_mindshare\",\"title\":\"Mindshare data\",\"description\":\"Get narrative mindshare rankings, token-level attention rows, rolling windows, or historical mindshare snapshots.\",\"endpoint\":\"mindshare-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/mindshare/data\",\"public\":\"/api/mindshare/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"tokens\":{\"description\":\"Set to true for token rows.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"narrative\":{\"description\":\"Optional narrative slug.\",\"type\":\"string\"},\"historical\":{\"description\":\"Set to true for historical snapshots.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"timeframe\":{\"description\":\"Historical timeframe.\",\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"window\":{\"description\":\"Rolling snapshot window.\",\"type\":\"string\",\"enum\":[\"now\",\"24h\",\"7d\",\"30d\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MindshareDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MindshareDataPayload\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareToken\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"shown\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"tokens\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareSnapshot\"}},\"requestedTimeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"resolvedTimeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"timeframeClamped\":{\"type\":\"boolean\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]}},\"required\":[\"snapshots\",\"requestedTimeframe\",\"resolvedTimeframe\",\"timeframeClamped\",\"coverage\"]},{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareNarrative\"}},\"globalSocialScore\":{\"type\":\"number\"},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string when cache data is unavailable.\"},\"window\":{\"type\":\"string\",\"enum\":[\"now\",\"24h\",\"7d\",\"30d\"]},\"snapshotCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"syncCadenceHours\":{\"type\":\"integer\",\"enum\":[12]}},\"required\":[\"narratives\",\"globalSocialScore\",\"updatedAt\",\"window\",\"snapshotCount\",\"syncCadenceHours\"]}]},\"MindshareToken\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":[\"string\",\"null\"]},\"narrativeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"socialScore\":{\"type\":\"number\"},\"mindsharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"delta24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"delta7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"narrativeIds\",\"socialScore\",\"mindsharePct\",\"watchlistUsers\",\"sentimentPct\",\"delta24h\",\"delta7d\",\"marketCap\",\"price\",\"priceChange24h\"]},\"MindshareSnapshot\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"total_social_score\":{\"type\":\"number\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlist_users\":{\"type\":\"number\",\"x-unit\":\"count\"},\"token_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"total_social_score\",\"mindshare_pct\",\"watchlist_users\",\"token_count\"]},\"MindshareNarrative\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"totalSocialScore\":{\"type\":\"number\"},\"mindsharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"tokenCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"delta24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"delta7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"delta30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"slug\",\"totalSocialScore\",\"mindsharePct\",\"watchlistUsers\",\"sentimentPct\",\"tokenCount\",\"delta24h\",\"delta7d\",\"delta30d\",\"priceChange24h\",\"marketCap\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"tokens\",\"narrative\",\"historical\",\"timeframe\",\"window\"],\"python_params\":{\"tokens\":\"tokens\",\"narrative\":\"narrative\",\"historical\":\"historical\",\"timeframe\":\"timeframe\",\"window\":\"window\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"mindshare\",\"freshness_sla_seconds\":86400,\"behaviour\":[\"With `tokens=true`, `narrative` keeps only that narrative's tokens (its top 20 by social score).\"],\"cli\":{\"command\":\"sharpe mindshare\",\"options\":[\"tokens\",\"narrative\",\"historical\",\"timeframe\",\"window\"]}},{\"name\":\"get_narratives\",\"title\":\"Narratives data\",\"description\":\"Get narrative-level market data (L1, L2, DeFi, AI Agents, DePIN, RWA, Gaming, etc.) including market cap, volume, performance, and social metrics. sort orders the list by 24h change and top/bottom add the N highest and lowest narratives by 24h change (a narrative without one is never ranked).\",\"endpoint\":\"narratives-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/narratives/data\",\"public\":\"/api/narratives/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Narrative to return detail for: the config id (e.g. dex) or the URL slug (e.g. dex-tokens, layer-1, ai-agents). An unknown value returns 400 invalid_parameter listing the valid values.\",\"type\":\"string\"},\"correlation\":{\"description\":\"Set to \\\"true\\\" to include correlation data.\",\"type\":\"string\"},\"timeframe\":{\"description\":\"Timeframe for correlation data.\",\"type\":\"string\"},\"sort\":{\"description\":\"List only: order `narratives` by 24h change, highest (`-change24h`) or lowest (`change24h`) first; a narrative without a 24h change is last either way.\",\"type\":\"string\",\"enum\":[\"-change24h\",\"change24h\"]},\"top\":{\"description\":\"List only: add `top`, the N narratives with the highest 24h change.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":50},\"bottom\":{\"description\":\"List only: add `bottom`, the N narratives with the lowest 24h change.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":50}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/NarrativeOverviewPayload\"},{\"$ref\":\"#/definitions/NarrativeDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"}]},{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"top\":{\"description\":\"With `top=N`: the N narratives with the highest 24h change, highest first (a narrative without a 24h change is never ranked).\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"bottom\":{\"description\":\"With `bottom=N`: the N narratives with the lowest 24h change, lowest first.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"funding_rate\":{\"type\":[\"number\",\"null\"]},\"coin_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"narrative_id\",\"snapshot_at\"]}},\"series\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"data\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}}},\"required\":[\"narrative_id\",\"data\"]}},\"seriesMetric\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"market_cap\",\"volume_24h\",\"open_interest\",\"tvl\"]},{\"type\":\"null\"}]},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"windowSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"windowSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\",\"series\",\"seriesMetric\",\"coverage\"],\"description\":\"History mode (`historical`): a compact `[epoch ms, value]` series per narrative when `chart` names a series metric, otherwise hourly snapshot rows.\"},{\"type\":\"object\",\"properties\":{\"mindshareSnapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"mindshare_pct\"]}},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"mindshareSnapshots\",\"coverage\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"funding_rate_8hr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"funding_rate_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"snapshot_at\",\"funding_rate_8hr\",\"funding_rate_apr\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\"]},{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"snapshot_at\",\"volume_24h\",\"market_cap\",\"open_interest\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"rows\"]},{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"avg_volume_10d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"volume_24h\",\"avg_volume_10d\"]}},\"degraded\":{\"type\":\"boolean\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"tokens\"]}]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"NarrativeOverviewPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"top\":{\"description\":\"With `top=N`: the N narratives with the highest 24h change, highest first (a narrative without a 24h change is never ranked).\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"bottom\":{\"description\":\"With `bottom=N`: the N narratives with the lowest 24h change, lowest first.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\"]},\"NarrativeMarketRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest across every venue, summed over the constituents' assets (each once).\"},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"mcapFdvRatio\":{\"type\":[\"number\",\"null\"]},\"volMcapRatio\":{\"type\":[\"number\",\"null\"]},\"oiMcapRatio\":{\"type\":[\"number\",\"null\"]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/NarrativeTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Sentiment percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"mindsharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Mindshare percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"watchlistUsers\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Watchlist users merged from the mindshare sync, or null when there is no measurement (never 0 as a stand-in).\"},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"slug\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"median1h\",\"median24h\",\"median7d\",\"median30d\",\"median200d\",\"median1y\",\"marketCap\",\"volume24h\",\"openInterest\",\"fundingRate\",\"mcapFdvRatio\",\"volMcapRatio\",\"oiMcapRatio\",\"topCoin\",\"coinCount\",\"dominance\",\"momentum\",\"sentimentPct\",\"mindsharePct\",\"watchlistUsers\",\"tvl\",\"dexVolume\",\"protocolRevenue\"]},\"NarrativeTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"CategoryBasePrices\":{\"type\":\"object\",\"properties\":{\"btc\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"eth\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"sol\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]}},\"required\":[\"btc\",\"eth\",\"sol\"],\"description\":\"BTC, ETH and SOL percent price changes from CoinGecko, used to re-base category returns into BTC, ETH or SOL terms. There are no USD prices here.\"},\"CategorySyncCoverage\":{\"type\":\"object\",\"properties\":{\"expectedCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"failedIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"retainedPreviousAggregate\":{\"type\":\"boolean\"}},\"required\":[\"expectedCount\",\"freshCount\",\"failedIds\",\"retainedPreviousAggregate\"],\"description\":\"How many configured categories the last sync refreshed. When a category fetch failed and a previous aggregate existed, the previous rows are served unchanged (`retainedPreviousAggregate`).\"},\"NarrativeDetailPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"NarrativeCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The coin's funding across venues, 8-hour-equivalent (fraction per 8 hours), open-interest-weighted over each venue's primary contract; null when no venue has a fresh rate.\"},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"sparkline7d\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"ath\",\"athDistance\",\"fundingRate\",\"openInterest\",\"sparkline7d\"]},\"CategoryCorrelationPayload\":{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},\"CategoryCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"]},\"requestedSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"bucketSeconds\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}]},\"usablePairCount\":{\"type\":\"integer\"}},\"required\":[\"status\",\"requestedSince\",\"availableSince\",\"availableUntil\",\"computedAt\",\"pointCount\",\"bucketSeconds\",\"usablePairCount\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"The list, detail and correlation bodies are v1's `data`: both routes answer from one read model (src/engine/serve/models/trackers/narratives.ts), mindshare merged and the correlation matrix padded on both since engine L5 WP-S3, and both take `sort` / `top` / `bottom` on the list (WP-S12). The free body also carries the freshness envelope in `meta`. The free route also answers `historical`, `mindshare_history`, `funding_history`, `token_history` and `token_volume`, which v1 does not accept.\",\"public_params\":[\"narrative\",\"mindshare_history\",\"historical\",\"chart\",\"narrative_id\",\"correlation\",\"funding_history\",\"token_history\",\"token_volume\",\"timeframe\",\"sort\",\"top\",\"bottom\"],\"python_params\":{\"narrative\":\"narrative\",\"correlation\":\"correlation\",\"timeframe\":\"timeframe\",\"sort\":\"sort\",\"top\":\"top\",\"bottom\":\"bottom\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"narratives\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`narrative` adds that narrative's constituent `coins` and its market-cap `sparkline` beside the full list.\",\"`correlation=true` returns a square matrix padded to every configured narrative: one row and one column per label.\",\"`chart=mcap-trend` answers the history mode with one compact market-cap series per narrative, oldest point first, instead of snapshot rows.\",\"`mindshare_history` returns every narrative's mindshare series and never an ecosystem's (`eco_*`), whatever its value.\",\"`funding_history` returns that narrative's per-token funding snapshots, oldest first.\",\"`token_history` returns that narrative's per-token market snapshots, oldest first.\"],\"cli\":{\"command\":\"sharpe narratives\",\"options\":[\"narrative\"]}},{\"name\":\"get_news\",\"title\":\"News feed\",\"description\":\"Get aggregated crypto news articles from multiple sources, with optional title search and filtering by category or coin. Articles are deduplicated so only the best source per story is shown.\",\"endpoint\":\"news-feed\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/news/feed\",\"public\":\"/api/news/feed\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":200,\"description\":\"Maximum number of articles to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"offset\":{\"default\":0,\"description\":\"Number of articles to skip for pagination.\",\"type\":\"integer\",\"minimum\":0},\"category\":{\"description\":\"Filter by news category.\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"tradfi\",\"macro\",\"research\",\"ai\",\"geopolitics\"]},\"coin\":{\"description\":\"Filter by coin ticker.\",\"type\":\"string\",\"minLength\":1},\"since\":{\"description\":\"ISO 8601 timestamp. Only return articles published after this time.\",\"format\":\"date-time\",\"type\":\"string\"},\"q\":{\"description\":\"Search article titles across the stored news corpus.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":200}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/NewsFeedPayload\"},{\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NewsArticle\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"nextCursor\":{\"description\":\"Cursor of the next page (`<published ISO>|<story id>`, the key of the last story returned); pass it back as `cursor`. Null when no story remains.\",\"type\":[\"string\",\"null\"]},\"nextOffset\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}],\"description\":\"Offset of the next page (offset plus the stories returned). Null when no story remains.\"},\"truncated\":{\"type\":\"boolean\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"articles\",\"total\",\"nextCursor\",\"nextOffset\",\"truncated\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"NewsFeedPayload\":{\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NewsArticle\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"next_offset\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]},\"truncated\":{\"type\":\"boolean\"}},\"required\":[\"articles\",\"total\",\"next_offset\",\"truncated\"]},\"NewsArticle\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"source\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"link\":{\"type\":\"string\",\"format\":\"uri\"},\"summary\":{\"type\":[\"string\",\"null\"]},\"author\":{\"type\":[\"string\",\"null\"]},\"tags\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"coin_tags\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"published\":{\"type\":\"string\",\"format\":\"date-time\"},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"source_tier\":{\"type\":\"integer\"},\"category\":{\"type\":\"string\",\"enum\":[\"crypto\",\"tradfi\",\"macro\",\"research\",\"ai\",\"geopolitics\"]}},\"required\":[\"id\",\"source\",\"title\",\"link\",\"summary\",\"author\",\"tags\",\"coin_tags\",\"published\",\"fetched_at\",\"source_tier\",\"category\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"`{articles, total, nextCursor, nextOffset, truncated}` with a `cursor` param, where v1 answers `{articles, total, next_offset, truncated}` and takes no cursor: src/app/api/news/feed/route.ts:35, :167-174 vs src/app/api/v1/news/feed/route.ts:67-76, :146-152. Same articles, same deduplicated order.\",\"public_params\":[\"limit\",\"offset\",\"category\",\"coin\",\"since\",\"q\",\"cursor\"],\"python_params\":{\"limit\":\"limit\",\"offset\":\"offset\",\"category\":\"category\",\"coin\":\"coin\",\"since\":\"since\",\"q\":\"q\"},\"pagination\":\"offset\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"news\",\"freshness_sla_seconds\":21600,\"behaviour\":[\"Stories are newest first by `published`.\",\"`limit` caps the page: at most `limit` stories come back.\",\"`nextOffset` is the offset of the next page (offset plus the stories returned), and `nextCursor` continues from the last story; both are null only when no story remains.\",\"Stories are deduplicated: no two articles on a page share a title.\"],\"cli\":{\"command\":\"sharpe news\",\"options\":[\"limit\",\"coin\",\"category\",\"since\",\"q\"]}},{\"name\":\"get_price_prediction\",\"title\":\"Price prediction\",\"description\":\"Get deterministic directional scores and sub-signal breakdowns for a coin. Optional 7D/30D values are volatility-scaled heuristic scenarios, not calibrated targets or probabilities.\",\"endpoint\":\"price-prediction-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/price-prediction/data\",\"public\":\"/api/price-prediction/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Ticker, canonical coin slug, or CoinGecko ID to get predictions for (for example, `BTC` or `bitcoin`). A curated coin's ticker resolves to its slug.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/PricePredictionPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PricePredictionPayload\":{\"oneOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CoinScore\"}},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"coins\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"coin\":{\"anyOf\":[{\"$ref\":\"#/definitions/CoinScore\"},{\"type\":\"null\"}]},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"coin\",\"updatedAt\"]}]},\"CoinScore\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"consensusScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"direction\":{\"type\":\"string\",\"enum\":[\"strong_bullish\",\"bullish\",\"neutral\",\"bearish\",\"strong_bearish\",\"insufficient_data\"]},\"signals\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PredictionSignal\"}},\"signalsAvailable\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"exchangesUsed\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"spotPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"24-hour price change in percent (2.15 = +2.15%), from the CoinGecko snapshot taken when the coin was scored. Unlike priceChange7d and priceChange30d, this is not a fraction.\"},\"priceChange7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"7-day price change as a decimal fraction (0.0875 = +8.75%), from hourly closes. Not a percent: multiply by 100 before comparing with priceChange24h.\"},\"priceChange30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"30-day price change as a decimal fraction (0.0564 = +5.64%), from hourly closes. Not a percent: multiply by 100 before comparing with priceChange24h.\"},\"distanceFrom7dHigh\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Price relative to the highest hourly close of the last 7 days, as a decimal fraction (-0.0426 = 4.26% below that high). Zero or negative.\"},\"distanceFrom7dLow\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Price relative to the lowest hourly close of the last 7 days, as a decimal fraction (0.1245 = 12.45% above that low). Zero or positive.\"},\"realizedVolatility30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"modelConfidence\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"forecasts\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PriceForecast\"}},\"scoredAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"prose\":{\"type\":[\"string\",\"null\"]},\"dominance\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"share\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"}},\"required\":[\"name\",\"label\",\"share\"]},{\"type\":\"null\"}]}},\"required\":[\"coin\",\"displayName\",\"slug\",\"consensusScore\",\"direction\",\"signals\",\"signalsAvailable\",\"exchangesUsed\",\"spotPrice\",\"marketCap\",\"priceChange24h\",\"priceChange7d\",\"priceChange30d\",\"distanceFrom7dHigh\",\"distanceFrom7dLow\",\"realizedVolatility30d\",\"modelConfidence\",\"forecasts\",\"scoredAt\",\"prose\",\"dominance\"]},\"PredictionSignal\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"rawValue\":{\"type\":[\"number\",\"null\"]},\"rawDisplay\":{\"type\":\"string\"},\"subScore\":{\"type\":\"number\"},\"conviction\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"bias\":{\"type\":\"string\"},\"tooltip\":{\"type\":\"string\"}},\"required\":[\"name\",\"label\",\"rawValue\",\"rawDisplay\",\"subScore\",\"conviction\",\"bias\",\"tooltip\"]},\"PriceForecast\":{\"type\":\"object\",\"properties\":{\"days\":{\"type\":\"integer\",\"enum\":[7,30],\"x-unit\":\"days\"},\"expectedChangePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"expectedPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"lowPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"highPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"confidence\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"}},\"required\":[\"days\",\"expectedChangePct\",\"expectedPrice\",\"lowPrice\",\"highPrice\",\"confidence\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"coin\",\"coingeckoId\",\"symbol\",\"name\"],\"python_params\":{\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"price_prediction_inputs\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"`coin` returns that one coin's score.\",\"7D/30D scenarios are returned only for a coin with at least two active signals and a positive spot price.\"],\"cli\":{\"command\":\"sharpe predict\",\"options\":[\"coin\"]}},{\"name\":\"get_pump_dump\",\"title\":\"Pump and dump detection\",\"description\":\"Get pump-and-dump manipulation risk signals across crypto assets. Scores combine derivatives pressure, holder concentration, liquidity quality, DEX flow, and price behavior; read signal_coverage_pct because partial-input scores are conservative lower bounds. coin returns one coin's row as the scorer wrote it (score null once it stopped qualifying).\",\"endpoint\":\"pump-dump-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/pump-dump/data\",\"public\":\"/api/pump-dump/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":100,\"description\":\"Maximum number of coins to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"min_score\":{\"default\":0,\"description\":\"Filter to coins scoring at or above this value.\",\"type\":\"number\",\"minimum\":0,\"maximum\":10},\"phase\":{\"description\":\"Filter to one manipulation phase label.\",\"type\":\"string\",\"enum\":[\"setup\",\"markup\",\"distribution\",\"dump\",\"dumping\"]},\"coin\":{\"description\":\"One coin by its CoinGecko id (e.g. pepe): its row exactly as the scorer wrote it, whatever its score. A coin that stopped qualifying answers `score: null` with its sub-scores and phase cleared; an id with no row answers an empty list. `limit`, `min_score` and `phase` do not apply.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":128}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PumpDumpRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"description\":{\"type\":\"string\"},\"signal\":{\"$ref\":\"#/definitions/ManipulationSignal\"},\"data_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600],\"description\":\"Freshness SLA in seconds (1 hour).\"}},\"required\":[\"coins\",\"count\",\"description\",\"signal\",\"data_as_of\",\"stale\",\"freshness_sla_seconds\"]},{\"type\":\"object\",\"properties\":{\"scores\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PumpDumpRow\"},\"description\":\"Every scored coin (score above 0 on at least two venues), highest score first, filtered by `limit` and `min_score` (and `phase` on pump-dump) as on v1.\"},\"meta\":{\"type\":\"object\",\"properties\":{\"totalScanned\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Distinct crypto assets with funding in the last three days (get_perps_monitored_count; stock, commodity, index and fx perps are not scored): the universe the score run scans, not the number of rows. Null when the count could not be read; that answer is not cached.\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"totalScanned\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present, and true, only when the newest row is older than the 1-hour freshness SLA or a failed read served the last good payload.\"}},\"required\":[\"scores\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PumpDumpRow\":{\"type\":\"object\",\"properties\":{\"coin_id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"avg_funding_72h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"funding_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"manipulation_phase\":{\"type\":[\"string\",\"null\"]},\"oi_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"cvd_trend_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"basis_rate_avg\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"holders_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"liquidity_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_to_liquidity_24h\":{\"type\":[\"number\",\"null\"]},\"buy_sell_imbalance_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"mintable\":{\"type\":[\"boolean\",\"null\"]},\"freezable\":{\"type\":[\"boolean\",\"null\"]},\"consecutive_negative_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"price_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"price_change_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"signal_start_date\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"holders_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct_change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidity_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"volume_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"pump_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"divergence_persistence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"derivatives_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"holder_concentration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"liquidity_fragility\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"flow_imbalance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"market_structure_risk\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"dump_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"price_funding_divergence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"signal_coverage_pct\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"signal_coverage_status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"limited\"]},\"incomplete_signal_groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"score_interpretation\":{\"type\":\"string\",\"enum\":[\"fully-observed\",\"lower-bound-partial-inputs\"]}},\"required\":[\"coin_id\",\"symbol\",\"name\",\"score\",\"exchange_count\",\"updated_at\",\"signal_coverage_pct\",\"signal_coverage_status\",\"incomplete_signal_groups\",\"score_interpretation\"]},\"ManipulationSignal\":{\"type\":\"object\",\"properties\":{\"methodology\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\"},\"gate\":{\"type\":[\"string\",\"null\"]},\"phase_filter\":{\"type\":[\"string\",\"null\"]},\"update_frequency\":{\"type\":\"string\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"methodology\",\"coverage\",\"update_frequency\",\"exchanges\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{scores, meta: {totalScanned}, stale?}` where v1 answers `{coins, count, description, signal, data_as_of, stale, freshness_sla_seconds}`; both filter by `limit` / `min_score` / phase through one read model (src/engine/serve/models/signals/scores.ts). Rows are PumpDumpRow without the v1-only `price_funding_divergence` alias.\",\"public_params\":[\"limit\",\"min_score\",\"phase\",\"coin\"],\"python_params\":{\"limit\":\"limit\",\"min_score\":\"min_score\",\"phase\":\"phase\",\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"pump_dump\",\"freshness_sla_seconds\":3600,\"behaviour\":[\"Coins are ordered by score, highest first, and every listed coin scores above 0 on at least two venues.\",\"Every coin carries its signal coverage; `score_interpretation` is `fully-observed` exactly when `signal_coverage_pct` is 100.\"],\"cli\":{\"command\":\"sharpe pump-dump\",\"options\":[\"limit\",\"min_score\",\"phase\"]}},{\"name\":\"get_recent_listings\",\"title\":\"Recent new listings\",\"description\":\"Get a flat feed of recent token listings. Defaults remain backward-compatible with the legacy spot listing feed. Event filters add source-observation freshness, partial status, and provider coverage so agents can reject incomplete opportunity scans.\",\"endpoint\":\"listings-recent\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/recent\",\"public\":\"/api/listings/recent\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Filter to a single narrative slug.\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to a single exchange.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\",\"bitget\",\"kucoin\",\"bingx\",\"bitmart\",\"deepcoin\",\"coinbase\",\"kraken\",\"crypto_com\",\"upbit\",\"bithumb\",\"htx\",\"bitfinex\",\"bitstamp\",\"gemini\",\"bitmex\",\"deribit\",\"phemex\",\"lbank\",\"bitrue\",\"coinex\",\"backpack\",\"hashkey\",\"whitebit\",\"toobit\",\"hyperliquid\",\"aster\",\"dydx\",\"aevo\"]},\"venue_type\":{\"description\":\"Optional event-feed venue type filter.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Optional event-feed market type filter.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"description\":\"Optional event-feed lifecycle event filter.\",\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"description\":\"Optional listed instrument class filter.\",\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"status\":{\"description\":\"Optional event status filter.\",\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"confidence\":{\"description\":\"Optional source confidence filter.\",\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"from\":{\"description\":\"ISO date or datetime lower bound.\",\"type\":\"string\"},\"to\":{\"description\":\"ISO date or datetime upper bound.\",\"type\":\"string\"},\"days\":{\"default\":90,\"description\":\"How many days back to include. Default 90.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":365},\"limit\":{\"default\":200,\"description\":\"Max rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Cursor returned by previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingsRecentPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingsRecentPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingRecentCompatRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"window_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"next_cursor\":{\"type\":[\"string\",\"null\"]},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Event-feed response assembly time; present when event-specific filters are used.\"},\"last_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"Freshest source observation; present when event-specific filters are used.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"True exactly when partial_reasons is non-empty; present when event-specific filters are used.\"},\"partial_reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per coverage gap: a provider whose request failed, a live exchange instrument feed whose newest listing is more than 60 days old, the hourly spot-listings ingest when the query covers its venues and its last completed run is more than 3 hours old, the canonical events table being unavailable (rows then come from the compatibility table), or a requested exchange, venue_type or market_type that no enabled connector covers. Empty when coverage is whole. Present when event-specific filters are used.\"},\"provider_coverage\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingEventProviderCoverage\"},\"description\":\"Per-provider health; present when event-specific filters are used.\"}},\"required\":[\"rows\",\"count\",\"window_days\"]},\"ListingRecentCompatRow\":{\"type\":\"object\",\"properties\":{\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_id\":{\"type\":[\"string\",\"null\"]},\"exchange\":{\"type\":\"string\"},\"listing_date\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"narrative_slug\":{\"type\":[\"string\",\"null\"]},\"listing_date_source\":{\"type\":\"string\"},\"market_type\":{\"type\":[\"string\",\"null\"]},\"event_type\":{\"type\":[\"string\",\"null\"]},\"status\":{\"type\":[\"string\",\"null\"]},\"source_confidence\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},{\"type\":\"null\"}]}},\"required\":[\"token_symbol\",\"token_name\",\"token_id\",\"exchange\",\"listing_date\",\"narrative_slug\",\"listing_date_source\"]},\"ListingEventProviderCoverage\":{\"type\":\"object\",\"properties\":{\"provider\":{\"type\":\"string\",\"description\":\"Stable provider or database identifier.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"database\",\"official_overlay\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"error\",\"skipped\"]},\"row_count\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"last_observed_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"provider\",\"kind\",\"status\",\"row_count\",\"last_observed_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"narrative\":\"narrative\",\"exchange\":\"exchange\",\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"event_type\":\"event_type\",\"asset_class\":\"asset_class\",\"status\":\"status\",\"confidence\":\"confidence\",\"from\":\"from\",\"to\":\"to\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"Without event filters the legacy spot feed answers: rows newest listing date first over `window_days` (default 90), with no event-feed coverage fields.\"],\"cli\":{\"command\":\"sharpe listings recent\",\"options\":[\"narrative\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"confidence\",\"from\",\"to\",\"cursor\",\"days\",\"limit\"]}},{\"name\":\"get_rug_check_security\",\"title\":\"Rug Check token security\",\"description\":\"Get rug-check token contract security and liquidity risk signals, and the Rug Check score the /rug-check page shows, computed by the API: score.value (0-100, higher is safer; null only when no provider answered), score.verdict, score.data_completeness and score.engine_version, with the checks[] behind it.\",\"endpoint\":\"rug-check-security\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rug-check/security\",\"public\":\"/api/rug-check/security\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\",\"minLength\":1,\"description\":\"Token contract address.\"},\"chainId\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"EVM chain ID (1 Ethereum, 56 BNB Smart Chain, 8453 Base, 42161 Arbitrum, 137 Polygon, 10 Optimism, 43114 Avalanche, 146 Sonic, 80094 Berachain, and 29 more), or 1399811149 for Solana and 728126428 for Tron. An unsupported chain returns 400.\"}},\"required\":[\"address\",\"chainId\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/RugCheckSecurity\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RugCheckSecurity\":{\"type\":\"object\",\"properties\":{\"isHoneypot\":{\"type\":[\"boolean\",\"null\"]},\"noMint\":{\"type\":[\"boolean\",\"null\"]},\"noBlacklist\":{\"type\":[\"boolean\",\"null\"]},\"isOpenSource\":{\"type\":[\"boolean\",\"null\"]},\"isProxy\":{\"type\":[\"boolean\",\"null\"]},\"hiddenOwner\":{\"type\":[\"boolean\",\"null\"]},\"buyTax\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"sellTax\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"canTakeBackOwnership\":{\"type\":[\"boolean\",\"null\"]},\"cannotSellAll\":{\"type\":[\"boolean\",\"null\"]},\"cannotBuy\":{\"type\":[\"boolean\",\"null\"]},\"tradingCooldown\":{\"type\":[\"boolean\",\"null\"]},\"selfDestruct\":{\"type\":[\"boolean\",\"null\"]},\"transferPausable\":{\"type\":[\"boolean\",\"null\"]},\"slippageModifiable\":{\"type\":[\"boolean\",\"null\"]},\"personalSlippageModifiable\":{\"type\":[\"boolean\",\"null\"]},\"isAntiWhale\":{\"type\":[\"boolean\",\"null\"]},\"antiWhaleModifiable\":{\"type\":[\"boolean\",\"null\"]},\"externalCall\":{\"type\":[\"boolean\",\"null\"]},\"isWhitelisted\":{\"type\":[\"boolean\",\"null\"]},\"honeypotWithSameCreator\":{\"type\":[\"boolean\",\"null\"]},\"transferTax\":{\"type\":[\"number\",\"null\"]},\"isInCex\":{\"type\":[\"boolean\",\"null\"]},\"cexList\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"creatorAddress\":{\"type\":[\"string\",\"null\"]},\"creatorPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"ownerAddress\":{\"type\":[\"string\",\"null\"]},\"ownerPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"ownerChangeBalance\":{\"type\":[\"boolean\",\"null\"]},\"holderCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"totalSupply\":{\"type\":[\"string\",\"null\"]},\"lpHolderCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"lpTotalSupply\":{\"type\":[\"string\",\"null\"]},\"trustList\":{\"type\":[\"boolean\",\"null\"]},\"topHolders\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckHolder\"}},{\"type\":\"null\"}]},\"lpHolders\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckHolder\"}},{\"type\":\"null\"}],\"description\":\"LP holders of the main pool (the deepest dexInfo entry). Each holder's percent is its share of that pool's LP token supply as a 0-1 fraction (0.0002 = 0.02%) on every chain; Solana shares are recomputed from the holder balance over the pool's LP amount. Null when the list cannot be tied to a standard AMM pool.\"},\"dexInfo\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckDex\"}},{\"type\":\"null\"}],\"description\":\"DEX pools, deepest first, so entry 0 is the main pool.\"},\"source\":{\"type\":\"string\",\"enum\":[\"evm-security-scan\",\"solana-security-scan\",\"combined\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present and true only when the security provider was temporarily unavailable and this is the token's last good record (at most 7 days old). Absent on live answers.\"},\"dataAsOf\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last good record was fetched. Present only alongside `stale`.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"Present and true only when the security provider was unavailable and the token has no last good record, on Ethereum, BNB Smart Chain or Base: `isHoneypot` comes from Honeypot.is's buy/sell simulation and every other security field is null (unknown). The score then treats the contract checks as unknown, except that a detected honeypot scores 5 (Danger). Absent otherwise.\"},\"score\":{\"$ref\":\"#/definitions/RugCheckScore\"},\"checks\":{\"description\":\"The rows of the /rug-check page's Contract Security and Token Health tables for this token, contract rows first, each in the page's order. Present on every 200 answer, beside `score`.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckCheck\"}}},\"required\":[\"isHoneypot\",\"noMint\",\"noBlacklist\",\"isOpenSource\",\"isProxy\",\"hiddenOwner\",\"buyTax\",\"sellTax\",\"canTakeBackOwnership\",\"cannotSellAll\",\"cannotBuy\",\"tradingCooldown\",\"selfDestruct\",\"transferPausable\",\"slippageModifiable\",\"personalSlippageModifiable\",\"isAntiWhale\",\"antiWhaleModifiable\",\"externalCall\",\"isWhitelisted\",\"honeypotWithSameCreator\",\"transferTax\",\"isInCex\",\"cexList\",\"creatorAddress\",\"creatorPercent\",\"ownerAddress\",\"ownerPercent\",\"ownerChangeBalance\",\"holderCount\",\"totalSupply\",\"lpHolderCount\",\"lpTotalSupply\",\"trustList\",\"topHolders\",\"lpHolders\",\"dexInfo\",\"source\"]},\"RugCheckHolder\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\"},\"balance\":{\"type\":\"number\"},\"percent\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"isLocked\":{\"type\":\"boolean\"},\"isContract\":{\"type\":\"boolean\"},\"tag\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"address\",\"balance\",\"percent\",\"isLocked\",\"isContract\",\"tag\"]},\"RugCheckDex\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"liquidity\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"pair\":{\"type\":\"string\"},\"burnPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Burned share of this pool's LP tokens in percent (0-100) from GoPlus, counting destroyed LP and LP held in Raydium's lock. Solana standard AMM pools only: null for concentrated-liquidity pools and on EVM chains.\"}},\"required\":[\"name\",\"liquidity\",\"pair\",\"burnPercent\"]},\"RugCheckScore\":{\"type\":\"object\",\"properties\":{\"value\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"0-100, higher is safer. Null only when no provider answered (`data_completeness` `none`), never a default 50.\"},\"verdict\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"safe\",\"caution\",\"risky\",\"danger\"]},{\"type\":\"null\"}],\"description\":\"`safe` at 80 or more, `caution` at 50, `risky` at 20, else `danger`. Null when `value` is null.\"},\"verdict_label\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"Looks Safe\",\"Use Caution\",\"Risky\",\"Danger\"]},{\"type\":\"null\"}],\"description\":\"The verdict as the page labels it. Null when `value` is null.\"},\"verdict_note\":{\"description\":\"\\\"Trusted issuer, centralised controls\\\" when GoPlus trust-lists the token and its issuer can still mint, freeze, pause or upgrade it: those controls are listed as warnings but neither scored nor capped. Otherwise null.\",\"type\":[\"string\",\"null\"]},\"data_completeness\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"none\"],\"description\":\"`full`: the contract, holder and market pillars each had data. `partial`: one or two had none (each such pillar scores a neutral 50). `none`: no provider answered, so there is no score.\"},\"engine_version\":{\"type\":\"integer\",\"description\":\"Version of the scoring rules. A declared change to a weight, cap, band or check increments it, so a stored score can be told apart from one computed under other rules.\"},\"insights\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The verdict's reasons as the page lists them, at most 6.\"}},\"required\":[\"value\",\"verdict\",\"verdict_label\",\"verdict_note\",\"data_completeness\",\"engine_version\",\"insights\"],\"description\":\"The Rug Check score the /rug-check page shows for this token, computed server-side (engine metric token_risk.rug_check) from this answer's GoPlus fields, the token's DexScreener market figures (liquidity and 24h volume summed over its pairs on this chain, age from its oldest pair) and its GeckoTerminal holder data. Weighted 0.40 contract, 0.35 holders, 0.25 market health, then capped by hard signals (a honeypot or sell block sets 5). An input a lookup could not read is unknown, never zero: it is left out of its pillar's average (its row reads `—`), a pillar with no data at all scores a neutral 50, and `data_completeness` says whether every pillar had data. On a `stale` answer the score is computed from the last good GoPlus record. Present on every 200 answer.\"},\"RugCheckCheck\":{\"type\":\"object\",\"properties\":{\"pillar\":{\"type\":\"string\",\"enum\":[\"contract\",\"health\"],\"description\":\"`contract`: the Contract Security table; `health`: the Token Health table.\"},\"label\":{\"type\":\"string\",\"description\":\"The check, e.g. `Honeypot`, `Mint`, `Liquidity`.\"},\"value\":{\"type\":\"string\",\"description\":\"The displayed result, e.g. `Disabled`, `$6.5M`, `2.8y`.\"},\"status\":{\"type\":\"string\",\"enum\":[\"safe\",\"warning\",\"danger\",\"neutral\"],\"description\":\"`neutral`: shown without a judgement (unknown, or an owner-only power of a renounced contract).\"},\"tooltip\":{\"type\":\"string\",\"description\":\"What the check means.\"}},\"required\":[\"pillar\",\"label\",\"value\",\"status\",\"tooltip\"],\"description\":\"One row of the /rug-check page's Contract Security or Token Health table.\"}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"address\":\"address\",\"chainId\":\"chain_id\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"rug_check_inputs\",\"freshness_sla_seconds\":300,\"behaviour\":[\"An EVM token answers from GoPlus's EVM scan (`source: evm-security-scan`).\",\"`dexInfo` lists pools deepest first, so entry 0 is the main pool.\",\"Holder and LP holder shares are 0-1 fractions.\",\"Every 200 answer carries `score` and `checks`, and `checks` lists the Contract Security rows before the Token Health rows.\",\"`score.verdict` is the band of `score.value` (safe at 80 or more, caution at 50, risky at 20, else danger); both are null only when `data_completeness` is `none`.\",\"A Solana token answers from GoPlus's Solana scan (`source: solana-security-scan`), with the EVM-only honeypot, tax and proxy fields null.\",\"`dexInfo` lists pools deepest first, so entry 0 is the main pool.\",\"Holder and LP holder shares are 0-1 fractions.\",\"Every 200 answer carries `score` and `checks`, and `checks` lists the Contract Security rows before the Token Health rows.\",\"`score.verdict` is the band of `score.value` (safe at 80 or more, caution at 50, risky at 20, else danger); both are null only when `data_completeness` is `none`.\"],\"cli\":{\"command\":\"sharpe rug-check security\",\"options\":[\"address\",\"chainId\"]}},{\"name\":\"get_rug_check_trending\",\"title\":\"Rug Check trending tokens\",\"description\":\"Get trending tokens suitable for rug-check review.\",\"endpoint\":\"rug-check-trending\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rug-check/trending\",\"public\":\"/api/rug-check/trending\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":50,\"description\":\"Maximum tokens to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":100}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/RugTrendingPayload\"},{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugTrendingToken\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Tokens returned (at most `limit`).\"},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Tokens in the cached trending list (at most 100).\"},\"source\":{\"type\":\"string\",\"enum\":[\"GeckoTerminal\"]},\"fetchedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the trending list was fetched from GeckoTerminal.\"},\"stale\":{\"description\":\"Present only when GeckoTerminal answered on no network and this is the last good list (kept 6 hours); `fetchedAt` is then its real age.\",\"type\":\"boolean\",\"const\":true},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"tokens\",\"count\",\"total\",\"source\",\"fetchedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RugTrendingPayload\":{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugTrendingToken\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"source\":{\"type\":\"string\",\"enum\":[\"GeckoTerminal\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"tokens\",\"count\",\"total\",\"source\",\"fetched_at\"]},\"RugTrendingToken\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"networkId\":{\"type\":\"integer\"},\"chainName\":{\"type\":\"string\"},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"string\",\"null\"]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"volume24h\":{\"type\":[\"string\",\"null\"]},\"liquidity\":{\"type\":[\"string\",\"null\"]},\"marketCap\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"address\",\"name\",\"symbol\",\"networkId\",\"chainName\",\"imageUrl\",\"price\",\"priceChange24h\",\"volume24h\",\"liquidity\",\"marketCap\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Names the fetch time `fetchedAt` where v1 renames it `fetched_at` (src/app/api/v1/rug-check/trending/route.ts:114), carries `stale: true` on a last-good list where v1 drops the flag, and defaults `limit` to 12 (src/app/api/rug-check/trending/route.ts:151). Same token rows.\",\"public_params\":[\"limit\"],\"python_params\":{\"limit\":\"limit\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"rug_check_trending\",\"freshness_sla_seconds\":1800,\"behaviour\":[\"Tokens are ordered by 24h volume across chains, highest first.\",\"Without `limit`, the free route returns at most 12 tokens; `count` is the number returned and `total` the size of the whole list.\",\"Every token's trending pool holds at least $50,000 of liquidity.\"],\"cli\":{\"command\":\"sharpe rug-check trending\",\"options\":[\"limit\"]}},{\"name\":\"get_rwa_perp_funding\",\"title\":\"RWA perp funding rates\",\"description\":\"Get funding and carry for real-world-asset perpetuals (RWA perps: stocks, pre-IPO, ETFs, indices, commodities, FX) across 19 venues: CEXs (Binance, Bybit, OKX, Bitget, Gate, Kraken xStocks, Coinbase INTX), perp DEXs (Aster, Lighter, Extended, GRVT, ApeX, Pacifica, Orderly), Hyperliquid HIP-3 builder markets, and the rollover venues Ostium and Avantis. Rates are interval-true and mechanism-true: funding_apr annualizes each venue's own settlement interval (never an assumed 8h), and a both-sides rollover is reported separately as borrow_apr_annual (a cost, never mixed into funding spreads). Marks more than 2% off the cross-venue median are flagged is_price_suspect and excluded from stats and spreads. type=history returns stored session-tagged settlements (market/after_hours/weekend/holiday) for Hyperliquid and Kraken only, since 2026-07-28; type=stats returns best carry, top cross-venue spread, weekend premium, and open interest.\",\"endpoint\":\"rwa-perps-rates\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rwa-perps/rates\",\"public\":\"/api/rwa-perps/rates\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"current\",\"description\":\"Type of rwa-perp data to retrieve.\",\"type\":\"string\",\"enum\":[\"current\",\"history\",\"stats\"]},\"symbol\":{\"description\":\"Underlying ticker (e.g. TSLA, XAU, US500), case-insensitive. Required when type=history. GOOG and GOOGL are distinct share classes.\",\"type\":\"string\"},\"venue\":{\"description\":\"Filter to a single venue, case-insensitive (e.g. Binance, Bybit, OKX, Kraken, Coinbase, Aster, Lighter, Ostium, or a Hyperliquid HIP-3 builder venue: Hyperliquid, Kinetiq, Paragon). The venue list is registry-driven and grows over time; an unknown venue is a 400 that names the valid ones.\",\"type\":\"string\",\"maxLength\":32},\"days\":{\"default\":7,\"description\":\"Days of settlement history to retrieve (type=history only).\",\"type\":\"integer\",\"minimum\":1,\"maximum\":90},\"limit\":{\"description\":\"Maximum number of records to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":5000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/RwaPerpCurrentRow\"},{\"$ref\":\"#/definitions/RwaPerpHistoryRow\"}]}},{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/RwaPerpCurrentRow\"},{\"$ref\":\"#/definitions/RwaPerpHistoryRow\"}]}},{\"$ref\":\"#/definitions/RwaPerpStats\"}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RwaPerpCurrentRow\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"market\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"asset_class\":{\"type\":[\"string\",\"null\"]},\"mechanism\":{\"type\":\"string\"},\"price_deviation_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"is_price_suspect\":{\"type\":[\"boolean\",\"null\"]},\"last_nonzero_funding_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"last_nonzero_funding_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"funding_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},{\"type\":\"null\"}]},\"interval_hours\":{\"type\":\"number\"},\"funding_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"borrow_apr_annual\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"mark_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"oracle_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"next_funding_time\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"is_stale\":{\"type\":\"boolean\"}},\"required\":[\"venue\",\"market\",\"symbol\",\"asset_class\",\"mechanism\",\"price_deviation_pct\",\"is_price_suspect\",\"last_nonzero_funding_apr\",\"last_nonzero_funding_at\",\"funding_rate\",\"interval_hours\",\"funding_apr\",\"borrow_apr_annual\",\"mark_price\",\"oracle_price\",\"open_interest_usd\",\"next_funding_time\",\"updated_at\",\"is_stale\"]},\"RwaPerpHistoryRow\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"market\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"session_phase\":{\"type\":\"string\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"venue\",\"market\",\"symbol\",\"rate\",\"interval_hours\",\"session_phase\",\"settled_at\"]},\"RwaPerpStats\":{\"type\":\"object\",\"properties\":{\"bestCarry\":{\"anyOf\":[{\"$ref\":\"#/definitions/RwaCarryMetric\"},{\"type\":\"null\"}]},\"topSpread\":{\"anyOf\":[{\"$ref\":\"#/definitions/RwaSpreadMetric\"},{\"type\":\"null\"}]},\"weekendPremiumApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"totalOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"venues\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"symbols\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"markets\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"asOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"laggingVenues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"asOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"venue\",\"asOf\"]},\"description\":\"Venue syncs behind the freshness threshold, oldest first; the rest are current. Empty when every venue is current.\"}},\"required\":[\"bestCarry\",\"topSpread\",\"weekendPremiumApr\",\"totalOpenInterestUsd\",\"venues\",\"symbols\",\"markets\",\"asOf\",\"stale\",\"laggingVenues\"]},\"RwaCarryMetric\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"venue\":{\"type\":\"string\"},\"fundingApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"mechanism\":{\"type\":\"string\"}},\"required\":[\"symbol\",\"venue\",\"fundingApr\",\"mechanism\"]},\"RwaSpreadMetric\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"spreadApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"maxApr - minApr: the widest trusted cross-venue funding spread.\"},\"maxVenue\":{\"type\":\"string\"},\"minVenue\":{\"type\":\"string\"},\"maxApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"minApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"}},\"required\":[\"symbol\",\"spreadApr\",\"maxVenue\",\"minVenue\",\"maxApr\",\"minApr\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"symbol\":\"symbol\",\"venue\":\"venue\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"type\",\"map\":{\"current\":\"rwa_perp_rates_current\",\"stats\":\"rwa_perp_rates_current\"}},\"freshness_sla_seconds\":{\"by\":\"type\",\"map\":{\"current\":3600,\"stats\":3600}},\"behaviour\":[\"Marks more than 2% off the cross-venue median are flagged is_price_suspect.\"],\"cli\":{\"command\":\"sharpe rwa-perps\",\"options\":[\"type\",\"symbol\",\"venue\",\"days\"]}},{\"name\":\"get_stablecoins\",\"title\":\"Stablecoins data\",\"description\":\"Get stablecoin overview, detail, or yield data including nominal supply at peg, marked value, nullable peg metrics, mechanism mix, chain supply, velocity coverage, freshness, and APY risk flags. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"stablecoins-data\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/stablecoins/data\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"overview\",\"description\":\"Payload type.\",\"type\":\"string\",\"enum\":[\"overview\",\"detail\",\"yields\"]},\"slug\":{\"description\":\"Stablecoin slug. Required when type=detail.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/StablecoinsDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"StablecoinsDataPayload\":{\"oneOf\":[{\"$ref\":\"#/definitions/StablecoinOverviewPayload\"},{\"$ref\":\"#/definitions/StablecoinDetailPayload\"},{\"$ref\":\"#/definitions/StablecoinYieldsPayload\"}]},\"StablecoinOverviewPayload\":{\"type\":\"object\",\"properties\":{\"aggregate\":{\"$ref\":\"#/definitions/StablecoinsAggregate\"},\"universeItems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinItem\"}},\"items\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinItem\"}},\"history90d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"history365d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"fxFallbackCoins\":{\"type\":\"integer\"},\"chains\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainRow\"}},\"degradedComponents\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"componentUpdatedAt\":{\"type\":\"object\",\"properties\":{\"overview\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"history\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"chains\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"details\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"history\",\"chains\",\"details\"]},\"componentSources\":{\"type\":\"object\",\"properties\":{\"overview\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"history\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"chains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"details\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"overview\",\"history\",\"chains\",\"details\"]},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Oldest contributing component timestamp; retained components prevent partial refreshes from advancing it.\"},\"partial\":{\"type\":\"boolean\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Oldest contributing component timestamp for the served snapshot.\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"aggregate\",\"items\",\"history90d\",\"history365d\",\"chains\",\"updatedAt\",\"partial\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinsAggregate\":{\"type\":\"object\",\"properties\":{\"totalMarketCap\":{\"type\":\"number\"},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"mechanismSplit\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"mechanism\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"mechanism\",\"share\",\"mcap\"]}},\"assetConcentration\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"mcap\"]}},\"issuerSplit\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"mcap\"]}},\"count\":{\"type\":\"integer\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"totalMarketCap\",\"change24h\",\"change7d\",\"change30d\",\"mechanismSplit\",\"assetConcentration\",\"issuerSplit\",\"count\",\"updatedAt\"]},\"StablecoinItem\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"detailId\":{\"type\":[\"string\",\"null\"]},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"peg\":{\"type\":\"string\",\"enum\":[\"USD\",\"XAU\",\"EUR\",\"GBP\",\"JPY\",\"CNY\",\"CHF\",\"CAD\",\"AUD\",\"MXN\",\"SGD\",\"TRY\",\"BRL\",\"OTHER\"]},\"mechanism\":{\"type\":\"string\",\"enum\":[\"fiat-backed\",\"crypto-backed\",\"algorithmic\",\"yield-bearing\",\"rwa-backed\",\"other\"]},\"priceModel\":{\"type\":\"string\",\"enum\":[\"fixed-peg\",\"nav-accrual\",\"unknown\"]},\"yieldBearing\":{\"type\":\"boolean\"},\"image\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"number\",\"null\"]},\"pegDeviationPct\":{\"type\":[\"number\",\"null\"]},\"pegQuality\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"measured\",\"indicative\"]},{\"type\":\"null\"}],\"description\":\"`measured` when 24h volume is at least $10K and the price at most 6 h old; otherwise `indicative` (an illiquid or stale print, shown and ranked after the measured deviations). Null when there is no deviation.\"},\"volume24hUsd\":{\"description\":\"Trailing 24h trading volume in USD over the venues CoinGecko tracks; null when CoinGecko does not list the coin.\",\"x-unit\":\"usd\",\"type\":[\"number\",\"null\"]},\"priceUpdatedAt\":{\"description\":\"Newest time the price can be vouched for (ISO 8601); null when neither CoinGecko's quote time nor the DeFi Llama snapshot stamp is known.\",\"format\":\"date-time\",\"type\":[\"string\",\"null\"]},\"nominalSupplyValue\":{\"type\":\"number\"},\"markedMarketValue\":{\"type\":[\"number\",\"null\"]},\"marketCap\":{\"type\":\"number\",\"description\":\"Use nominalSupplyValue.\",\"deprecated\":true},\"circulating\":{\"type\":\"number\"},\"change24hUsd\":{\"type\":[\"number\",\"null\"]},\"change7dUsd\":{\"type\":[\"number\",\"null\"]},\"change30dUsd\":{\"type\":[\"number\",\"null\"]},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"chainCount\":{\"type\":\"integer\"},\"dominance\":{\"type\":\"number\"},\"chainSupplies\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainSupply\"}},\"topChains\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinTopChain\"}},\"velocity\":{\"type\":[\"number\",\"null\"]},\"velocityNonEvmSharePct\":{\"type\":\"number\"},\"velocityCoveragePct\":{\"type\":\"number\"},\"velocityUnavailableReason\":{\"type\":[\"string\",\"null\"]},\"pegStability30d\":{\"$ref\":\"#/definitions/StablecoinPegStability\"}},\"required\":[\"id\",\"slug\",\"name\",\"symbol\",\"peg\",\"mechanism\",\"priceModel\",\"yieldBearing\",\"image\",\"price\",\"pegDeviationPct\",\"nominalSupplyValue\",\"markedMarketValue\",\"marketCap\",\"circulating\",\"change24h\",\"change7d\",\"change30d\",\"chainCount\",\"dominance\",\"topChains\"]},\"StablecoinChainSupply\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"value\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"value\"]},\"StablecoinTopChain\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\"]},\"StablecoinPegStability\":{\"type\":\"object\",\"properties\":{\"inside_0_1\":{\"type\":\"number\"},\"inside_0_5\":{\"type\":\"number\"},\"inside_1_0\":{\"type\":\"number\"},\"sampleCount\":{\"type\":\"integer\"},\"earliestSampleAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"inside_0_1\",\"inside_0_5\",\"inside_1_0\",\"sampleCount\",\"earliestSampleAt\"]},\"StablecoinHistoryPoint\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"integer\",\"format\":\"int64\"},\"v\":{\"type\":\"number\"}},\"required\":[\"t\",\"v\"]},\"StablecoinChainRow\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"totalUSD\":{\"type\":\"number\"},\"share\":{\"type\":\"number\"}},\"required\":[\"name\",\"trackerId\",\"totalUSD\",\"share\"]},\"StablecoinDetailPayload\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"peg\":{\"type\":\"string\",\"enum\":[\"USD\",\"XAU\",\"EUR\",\"GBP\",\"JPY\",\"CNY\",\"CHF\",\"CAD\",\"AUD\",\"MXN\",\"SGD\",\"TRY\",\"BRL\",\"OTHER\"]},\"mechanism\":{\"type\":\"string\",\"enum\":[\"fiat-backed\",\"crypto-backed\",\"algorithmic\",\"yield-bearing\",\"rwa-backed\",\"other\"]},\"priceModel\":{\"type\":\"string\",\"enum\":[\"fixed-peg\",\"nav-accrual\",\"unknown\"]},\"yieldBearing\":{\"type\":\"boolean\"},\"image\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"number\",\"null\"]},\"pegDeviationPct\":{\"type\":[\"number\",\"null\"]},\"pegQuality\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"measured\",\"indicative\"]},{\"type\":\"null\"}],\"description\":\"`measured` when 24h volume is at least $10K and the price at most 6 h old; otherwise `indicative` (an illiquid or stale print, shown and ranked after the measured deviations). Null when there is no deviation.\"},\"volume24hUsd\":{\"description\":\"Trailing 24h trading volume in USD over the venues CoinGecko tracks; null when CoinGecko does not list the coin.\",\"x-unit\":\"usd\",\"type\":[\"number\",\"null\"]},\"priceUpdatedAt\":{\"description\":\"Newest time the price can be vouched for (ISO 8601); null when neither CoinGecko's quote time nor the DeFi Llama snapshot stamp is known.\",\"format\":\"date-time\",\"type\":[\"string\",\"null\"]},\"nominalSupplyValue\":{\"type\":\"number\"},\"markedMarketValue\":{\"type\":[\"number\",\"null\"]},\"marketCap\":{\"type\":\"number\",\"deprecated\":true},\"circulating\":{\"type\":\"number\"},\"change24hUsd\":{\"type\":[\"number\",\"null\"]},\"change7dUsd\":{\"type\":[\"number\",\"null\"]},\"change30dUsd\":{\"type\":[\"number\",\"null\"]},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"history\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"chainBreakdown\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainBreakdown\"}},\"chainHistory\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainHistory\"}},\"description\":{\"type\":[\"string\",\"null\"]},\"url\":{\"format\":\"uri\",\"type\":[\"string\",\"null\"]},\"twitter\":{\"type\":[\"string\",\"null\"]},\"auditLinks\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"format\":\"uri\"}},\"velocity\":{\"type\":[\"number\",\"null\"]},\"velocityNonEvmSharePct\":{\"type\":\"number\"},\"velocityCoveragePct\":{\"type\":\"number\"},\"velocityUnavailableReason\":{\"type\":[\"string\",\"null\"]},\"pegStability30d\":{\"$ref\":\"#/definitions/StablecoinPegStability\"},\"mintBurn90d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinMintBurnPoint\"}},\"bridgeFlow24h\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinBridgeFlowRow\"}},\"mintRedeemDescription\":{\"type\":[\"string\",\"null\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"id\",\"slug\",\"name\",\"symbol\",\"peg\",\"mechanism\",\"priceModel\",\"yieldBearing\",\"image\",\"price\",\"pegDeviationPct\",\"nominalSupplyValue\",\"markedMarketValue\",\"marketCap\",\"circulating\",\"change24h\",\"change7d\",\"change30d\",\"history\",\"chainBreakdown\",\"chainHistory\",\"description\",\"url\",\"twitter\",\"auditLinks\",\"updatedAt\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinChainBreakdown\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"circulating\":{\"type\":\"number\"},\"share\":{\"type\":\"number\"},\"supplyTvlRatioPct\":{\"type\":[\"number\",\"null\"]},\"tvlShare\":{\"deprecated\":true,\"type\":[\"number\",\"null\"]}},\"required\":[\"chain\",\"trackerId\",\"circulating\",\"share\"]},\"StablecoinChainHistory\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"points\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}}},\"required\":[\"chain\",\"trackerId\",\"points\"]},\"StablecoinMintBurnPoint\":{\"type\":\"object\",\"properties\":{\"bucketDate\":{\"type\":\"string\",\"format\":\"date\"},\"mintsUsd\":{\"type\":\"number\"},\"burnsUsd\":{\"type\":\"number\"},\"netUsd\":{\"type\":\"number\"}},\"required\":[\"bucketDate\",\"mintsUsd\",\"burnsUsd\",\"netUsd\"]},\"StablecoinBridgeFlowRow\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"chainDeltaUsd\":{\"type\":\"number\"},\"netBridgeFlowUsd\":{\"type\":\"number\"},\"direction\":{\"type\":\"string\",\"enum\":[\"inbound\",\"outbound\",\"flat\",\"mint-dominated\",\"burn-dominated\"]}},\"required\":[\"chain\",\"trackerId\",\"chainDeltaUsd\",\"netBridgeFlowUsd\",\"direction\"]},\"StablecoinYieldsPayload\":{\"type\":\"object\",\"properties\":{\"yields\":{\"$ref\":\"#/definitions/StablecoinYieldsCache\"},\"partial\":{\"type\":\"boolean\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"yields\",\"partial\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinYieldsCache\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinYieldRow\"}},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"degraded\":{\"type\":\"boolean\"},\"lastSuccessfulAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"lastAttemptAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"degradedReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"upstream-empty\",\"partial-result\"]},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"updatedAt\"]},\"StablecoinYieldRow\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"stablecoinId\":{\"type\":[\"string\",\"null\"]},\"detailId\":{\"type\":[\"string\",\"null\"]},\"bestApy\":{\"type\":\"number\"},\"bestApyBase\":{\"type\":[\"number\",\"null\"]},\"bestApyReward\":{\"type\":[\"number\",\"null\"]},\"bestApyPct7D\":{\"type\":[\"number\",\"null\"]},\"bestProject\":{\"type\":\"string\"},\"bestChain\":{\"type\":\"string\"},\"bestPoolMeta\":{\"type\":[\"string\",\"null\"]},\"bestTvlUsd\":{\"type\":\"number\"},\"bestRiskFlag\":{\"type\":[\"string\",\"null\"]},\"pools\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinYieldPool\"}}},\"required\":[\"symbol\",\"slug\",\"bestApy\",\"bestApyBase\",\"bestApyReward\",\"bestApyPct7D\",\"bestProject\",\"bestChain\",\"bestPoolMeta\",\"bestTvlUsd\",\"bestRiskFlag\",\"pools\"]},\"StablecoinYieldPool\":{\"type\":\"object\",\"properties\":{\"project\":{\"type\":\"string\"},\"chain\":{\"type\":\"string\"},\"poolMeta\":{\"type\":[\"string\",\"null\"]},\"apy\":{\"type\":\"number\"},\"apyBase\":{\"type\":[\"number\",\"null\"]},\"apyReward\":{\"type\":[\"number\",\"null\"]},\"apyPct7D\":{\"type\":[\"number\",\"null\"]},\"tvlUsd\":{\"type\":\"number\"}},\"required\":[\"project\",\"chain\",\"poolMeta\",\"apy\",\"apyBase\",\"apyReward\",\"apyPct7D\",\"tvlUsd\"]}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"slug\":\"slug\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"stablecoins\",\"freshness_sla_seconds\":7200,\"behaviour\":[],\"cli\":{\"command\":\"sharpe stablecoins\",\"options\":[\"type\",\"slug\"]}},{\"name\":\"get_token_scanner\",\"title\":\"Token scanner\",\"description\":\"Run read-only token scanner modes for hot tokens, new runners, alpha drops, AI tokens, and top-new pairs. Responses expose source coverage; valuation and risk fields stay null when unavailable. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"token-scanner-scan\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/token-scanner/scan\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"mode\":{\"default\":\"hot\",\"description\":\"Scanner mode.\",\"type\":\"string\",\"enum\":[\"hot\",\"new-runners\",\"alpha-drops\",\"ai-top\",\"top-new\"]},\"chains\":{\"description\":\"Comma-separated Dexscreener chain IDs for scanner modes.\",\"type\":\"string\"},\"chain\":{\"description\":\"Single chain for top-new mode.\",\"default\":\"base\",\"type\":\"string\"},\"profile\":{\"description\":\"Scanner profile.\",\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]},\"days\":{\"description\":\"Lookback window in days for supported scanner modes.\",\"type\":\"number\",\"minimum\":1},\"limit\":{\"default\":50,\"description\":\"Maximum rows to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":72},\"minLiquidityUsd\":{\"description\":\"Minimum liquidity in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeH24\":{\"description\":\"Minimum 24h volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minTxnsH1\":{\"description\":\"Minimum 1h transaction count.\",\"type\":\"number\",\"minimum\":0},\"minTxnsH24\":{\"description\":\"Minimum 24h transaction count.\",\"type\":\"number\",\"minimum\":0},\"maxAgeHours\":{\"description\":\"Maximum token-pair age in hours.\",\"type\":\"number\",\"minimum\":0},\"includeUnknownAge\":{\"description\":\"Whether pairs with unknown age may pass age filters.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"sortBy\":{\"description\":\"Scanner sort key.\",\"type\":\"string\",\"enum\":[\"score\",\"readiness\",\"rs\",\"volume\",\"momentum\"]},\"minBreakoutReadiness\":{\"description\":\"Minimum breakout-readiness score.\",\"type\":\"number\",\"minimum\":0},\"minRelativeStrength\":{\"description\":\"Minimum relative-strength score.\",\"type\":\"number\"},\"maxVolLiqRatio\":{\"description\":\"Maximum 24h volume-to-liquidity ratio.\",\"type\":\"number\",\"minimum\":0},\"minPriceChangeH1\":{\"description\":\"Minimum 1h price change percentage.\",\"type\":\"number\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/TokenScannerPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"TokenScannerPayload\":{\"oneOf\":[{\"type\":\"object\",\"properties\":{\"mode\":{\"type\":\"string\",\"enum\":[\"top-new\"]},\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/TopNewToken\"}},\"coverage\":{\"$ref\":\"#/definitions/ScannerSourceCoverage\"},\"scannedAt\":{\"type\":\"integer\",\"format\":\"int64\"},\"stale\":{\"type\":\"boolean\",\"description\":\"True when DexScreener failed and the last good scan for the same parameters (kept an hour) is served.\"},\"fromCache\":{\"description\":\"True when answered from the 10-second scan cache shared with the free scan routes, or from the last good scan.\",\"type\":\"boolean\"},\"error\":{\"description\":\"Why the fresh scan failed; only with `stale: true`.\",\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"Dexscreener\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the scan was fetched (not the response time).\"}},\"required\":[\"mode\",\"rows\",\"coverage\",\"scannedAt\",\"stale\",\"source\",\"fetched_at\"]},{\"type\":\"object\",\"properties\":{\"mode\":{\"type\":\"string\",\"enum\":[\"hot\",\"new-runners\",\"alpha-drops\",\"ai-top\"]},\"candidates\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/HotTokenCandidate\"}},\"summary\":{\"$ref\":\"#/definitions/ScanSummary\"},\"coverage\":{\"$ref\":\"#/definitions/ScannerSourceCoverage\"},\"scannedAt\":{\"type\":\"integer\",\"format\":\"int64\"},\"stale\":{\"type\":\"boolean\",\"description\":\"True when DexScreener failed and the last good scan for the same parameters (kept an hour) is served.\"},\"fromCache\":{\"description\":\"True when answered from the 10-second scan cache shared with the free scan routes, or from the last good scan.\",\"type\":\"boolean\"},\"error\":{\"description\":\"Why the fresh scan failed; only with `stale: true`.\",\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"Dexscreener\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the scan was fetched (not the response time).\"}},\"required\":[\"mode\",\"candidates\",\"summary\",\"coverage\",\"scannedAt\",\"stale\",\"source\",\"fetched_at\"]}]},\"TopNewToken\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"tokenAddress\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"description\":\"DexScreener pair URL; may be empty when the upstream pair omits a URL.\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"txnsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"txnsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"ageHours\":{\"type\":[\"number\",\"null\"]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"chainId\",\"symbol\",\"name\",\"tokenAddress\",\"pairAddress\",\"dexId\",\"pairUrl\",\"priceUsd\",\"priceChangeH1\",\"priceChangeH24\",\"volumeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"txnsH1\",\"txnsH24\",\"ageHours\",\"holdersCount\",\"holdersSource\"]},\"ScannerSourceCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"groups\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ScannerSourceCoverageGroup\"}}},\"required\":[\"status\",\"groups\"]},\"ScannerSourceCoverageGroup\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\"},\"attempted\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"succeeded\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"failed\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"source\",\"attempted\",\"succeeded\",\"failed\"]},\"HotTokenCandidate\":{\"type\":\"object\",\"properties\":{\"pair\":{\"$ref\":\"#/definitions/ScannerPair\"},\"score\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"scoreComponents\":{\"$ref\":\"#/definitions/ScannerScoreComponents\"},\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"riskScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"analytics\":{\"$ref\":\"#/definitions/ScannerCandidateAnalytics\"}},\"required\":[\"pair\",\"score\",\"scoreComponents\",\"rank\",\"riskFlags\",\"riskScore\"]},\"ScannerPair\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"baseAddress\":{\"type\":\"string\"},\"baseSymbol\":{\"type\":\"string\"},\"baseName\":{\"type\":\"string\"},\"quoteSymbol\":{\"type\":\"string\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH6\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH1\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeM5\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"buysH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sellsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"buysH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sellsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]},\"pairCreatedAtMs\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}],\"format\":\"int64\"}},\"required\":[\"chainId\",\"dexId\",\"pairAddress\",\"pairUrl\",\"baseAddress\",\"baseSymbol\",\"baseName\",\"quoteSymbol\",\"priceUsd\",\"volumeH24\",\"volumeH6\",\"volumeH1\",\"volumeM5\",\"buysH1\",\"sellsH1\",\"buysH24\",\"sellsH24\",\"priceChangeH1\",\"priceChangeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"holdersCount\",\"holdersSource\",\"pairCreatedAtMs\"]},\"ScannerScoreComponents\":{\"type\":\"object\",\"properties\":{\"volume\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"transactions\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"liquidity\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"momentum\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"flow\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"boost\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"recency\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"profile\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null when the token's DexScreener profile answer is unknown; the score then leaves the profile component out and renormalises the other weights.\"}},\"required\":[\"volume\",\"transactions\",\"liquidity\",\"momentum\",\"flow\",\"boost\",\"recency\",\"profile\"]},\"ScannerCandidateAnalytics\":{\"type\":\"object\",\"properties\":{\"breakoutReadiness\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"relativeStrength\":{\"type\":\"number\"},\"compressionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"volumeVelocity\":{\"type\":\"number\"},\"txnVelocity\":{\"type\":\"number\"},\"boostVelocity\":{\"description\":\"Unavailable until two real boost observations exist.\",\"type\":[\"number\",\"null\"]},\"riskScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null when valuation coverage is incomplete.\"},\"riskCoverage\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"riskPenalty\":{\"type\":\"number\"},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"fastDecay\":{\"description\":\"Unavailable until a real decay time series exists.\",\"type\":[\"boolean\",\"null\"]},\"scoreAdjusted\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"buyRatio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"}},\"required\":[\"breakoutReadiness\",\"relativeStrength\",\"compressionScore\",\"volumeVelocity\",\"txnVelocity\",\"boostVelocity\",\"riskScore\",\"riskCoverage\",\"riskPenalty\",\"riskFlags\",\"fastDecay\",\"scoreAdjusted\",\"buyRatio\"]},\"ScanSummary\":{\"type\":\"object\",\"properties\":{\"totalVolume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"totalLiquidity\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgH1Move\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgBuyRatio\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"imbalance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"regime\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trend-up\",\"trend-down\",\"mixed\"]},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"flags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"topMoverSymbol\":{\"description\":\"Null on an empty scan (tokenCount 0).\",\"type\":[\"string\",\"null\"]},\"topMoverH1\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"hotChain\":{\"description\":\"Null on an empty scan (tokenCount 0).\",\"type\":[\"string\",\"null\"]},\"tokenCount\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"totalVolume\",\"totalLiquidity\",\"avgH1Move\",\"avgScore\",\"avgBuyRatio\",\"imbalance\",\"regime\",\"flags\",\"topMoverSymbol\",\"topMoverH1\",\"hotChain\",\"tokenCount\"],\"description\":\"Figures over the scan's candidates. On an empty scan (tokenCount 0) every figure is null and flags is empty: nothing was measured, so no 0 stands in for a value.\"}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{\"mode\":\"mode\",\"chains\":\"chains\",\"chain\":\"chain\",\"profile\":\"profile\",\"days\":\"days\",\"limit\":\"limit\",\"minLiquidityUsd\":\"min_liquidity_usd\",\"minVolumeH24\":\"min_volume_h24\",\"minTxnsH1\":\"min_txns_h1\",\"minTxnsH24\":\"min_txns_h24\",\"maxAgeHours\":\"max_age_hours\",\"includeUnknownAge\":\"include_unknown_age\",\"sortBy\":\"sort_by\",\"minBreakoutReadiness\":\"min_breakout_readiness\",\"minRelativeStrength\":\"min_relative_strength\",\"maxVolLiqRatio\":\"max_vol_liq_ratio\",\"minPriceChangeH1\":\"min_price_change_h1\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"token_scanner\",\"freshness_sla_seconds\":300,\"behaviour\":[\"`coverage.status` is `partial` exactly when a source group failed.\",\"Boost velocity and fast-decay analytics are returned as `null`.\"],\"cli\":{\"command\":\"sharpe token-scanner\",\"options\":[\"mode\",\"limit\",\"chains\",\"chain\",\"profile\",\"days\",\"minLiquidityUsd\",\"minVolumeH24\",\"minTxnsH1\",\"minTxnsH24\",\"maxAgeHours\",\"includeUnknownAge\",\"sortBy\",\"minBreakoutReadiness\",\"minRelativeStrength\",\"maxVolLiqRatio\",\"minPriceChangeH1\"]}},{\"name\":\"get_web_traffic\",\"title\":\"Web traffic data\",\"description\":\"Get attention rankings, social snapshots, or market-level signals for coins and narratives, plus CoinGecko trust-score rankings for exchanges.\",\"endpoint\":\"web-traffic-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/web-traffic/data\",\"public\":\"/api/web-traffic/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"description\":\"Entity type.\",\"default\":\"exchange\",\"type\":\"string\",\"enum\":[\"exchange\",\"coin\",\"narrative\"]},\"mode\":{\"description\":\"Payload mode.\",\"default\":\"rankings\",\"type\":\"string\",\"enum\":[\"rankings\",\"snapshots\",\"market\"]},\"tf\":{\"default\":\"30d\",\"description\":\"Requested history lookback for snapshots. The route clamps to available history when the requested range is unavailable.\",\"type\":\"string\",\"enum\":[\"7d\",\"30d\",\"90d\",\"1y\",\"3y\",\"all\"]},\"entities\":{\"description\":\"Comma-separated entity IDs for snapshots.\",\"type\":\"string\"},\"sub\":{\"description\":\"Market dataset to return. Required when mode=market; ignored by other modes.\",\"type\":\"string\",\"enum\":[\"trending\",\"categories\",\"global\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/WebTrafficDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"WebTrafficDataPayload\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rankings\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WebTrafficRanking\"}},\"updatedAt\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"rankings\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WebTrafficSnapshot\"}},\"coverage\":{\"$ref\":\"#/definitions/WebTrafficSnapshotCoverage\"}},\"required\":[\"snapshots\"]},{\"$ref\":\"#/definitions/WebTrafficTrendingMarket\"},{\"$ref\":\"#/definitions/WebTrafficCategoriesMarket\"},{\"$ref\":\"#/definitions/WebTrafficGlobalMarket\"},{\"$ref\":\"#/definitions/WebTrafficUnavailableMarket\"},{\"$ref\":\"#/definitions/WebTrafficPartialGlobalMarket\"}]},\"WebTrafficRanking\":{\"oneOf\":[{\"$ref\":\"#/definitions/WebTrafficCoinRanking\"},{\"$ref\":\"#/definitions/WebTrafficExchangeRanking\"},{\"$ref\":\"#/definitions/WebTrafficNarrativeRanking\"}]},\"WebTrafficCoinRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"coin\"]},\"coinId\":{\"type\":\"string\"},\"sentimentUpPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"sentimentDownPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"priceChange7d\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"coinId\",\"sentimentUpPct\",\"watchlistUsers\"]},\"WebTrafficExchangeRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"exchange\"]},\"trustScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"trustScoreRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]},\"tradeVolume24hBtc\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"trustScore\",\"trustScoreRank\",\"tradeVolume24hBtc\"]},\"WebTrafficNarrativeRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"narrative\"]},\"communityScore\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"sentimentUpPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"priceChange7d\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"communityScore\",\"sentimentUpPct\",\"watchlistUsers\",\"priceChange7d\"]},\"WebTrafficSnapshot\":{\"type\":\"object\",\"properties\":{\"entity_type\":{\"type\":\"string\",\"enum\":[\"exchange\",\"coin\",\"narrative\"]},\"entity_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"community_score\":{\"type\":[\"number\",\"null\"]},\"sentiment_up_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"public_interest_score\":{\"type\":[\"number\",\"null\"]},\"attention_score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"watchlist_users\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"count\"},{\"type\":\"null\"}]}},\"required\":[\"entity_type\",\"entity_id\",\"snapshot_at\",\"community_score\",\"sentiment_up_pct\",\"public_interest_score\",\"attention_score\",\"watchlist_users\"]},\"WebTrafficSnapshotCoverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"7d\",\"30d\",\"90d\",\"1y\",\"3y\",\"all\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"WebTrafficTrendingMarket\":{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"marketCapRank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"score\":{\"type\":\"number\",\"x-unit\":\"order\"},\"priceBtc\":{\"type\":\"number\"},\"priceChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"sparkline\":{\"description\":\"URL of CoinGecko's sparkline SVG image; null when CoinGecko sends none.\",\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"name\",\"symbol\",\"marketCapRank\",\"score\",\"priceBtc\",\"priceChange24h\",\"sparkline\"]}},\"categories\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap1hChange\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"coinsCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sparkline\":{\"description\":\"URL of CoinGecko's sparkline SVG image; null when CoinGecko sends none.\",\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"name\",\"marketCap\",\"marketCap1hChange\",\"coinsCount\",\"sparkline\"]}},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"coins\",\"categories\",\"updatedAt\"]},\"WebTrafficCategoriesMarket\":{\"type\":\"object\",\"properties\":{\"categories\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCapChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"top3CoinIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"id\",\"name\",\"marketCap\",\"marketCapChange24h\",\"volume24h\",\"top3CoinIds\"]}},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"categories\",\"updatedAt\"]},\"WebTrafficGlobalMarket\":{\"type\":\"object\",\"properties\":{\"activeCryptocurrencies\":{\"type\":\"number\",\"x-unit\":\"count\"},\"totalMarketCapUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"totalVolumeUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"btcDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"ethDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"usdtDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"marketCapChangePercentage24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"activeCryptocurrencies\",\"totalMarketCapUsd\",\"totalVolumeUsd\",\"btcDominance\",\"ethDominance\",\"usdtDominance\",\"marketCapChangePercentage24h\",\"updatedAt\"],\"description\":\"Canonical fields are populated on a healthy market snapshot; an empty or partial object can be returned when both caches are unavailable.\"},\"WebTrafficUnavailableMarket\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false,\"description\":\"Empty degraded market payload returned when persistent and memory caches are both unavailable.\",\"maxProperties\":0},\"WebTrafficPartialGlobalMarket\":{\"type\":\"object\",\"properties\":{\"activeCryptocurrencies\":{\"type\":\"number\",\"x-unit\":\"count\"},\"totalMarketCapUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"totalVolumeUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"btcDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"ethDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"usdtDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"marketCapChangePercentage24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\"}},\"additionalProperties\":false,\"description\":\"Partial last-good global market cache returned when live refresh fails.\",\"minProperties\":1}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"mode\":\"mode\",\"tf\":\"tf\",\"entities\":\"entities\",\"sub\":\"sub\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"web_traffic\",\"freshness_sla_seconds\":172800,\"behaviour\":[\"`type` defaults to exchange: the default rankings are exchanges, highest attention score first.\",\"`entities` keeps only those entities' snapshots, oldest first.\"],\"cli\":{\"command\":\"sharpe web-traffic\",\"options\":[\"type\",\"mode\",\"tf\",\"entities\",\"sub\"]}},{\"name\":\"search_market_cap\",\"title\":\"Market cap search\",\"description\":\"Search crypto and supported TradFi assets by name or ticker. Returns matching assets with asset class, market cap, and nullable price, 24h change, FDV, ATH, and estimated ATH market cap fields.\",\"endpoint\":\"market-cap-search\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/market-cap/search\",\"public\":\"/api/market-cap/search\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"q\":{\"type\":\"string\",\"minLength\":2,\"maxLength\":100,\"description\":\"Search query (2-100 characters).\"}},\"required\":[\"q\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MarketCapAsset\"}}},\"required\":[\"assets\"]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MarketCapAsset\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"assetClass\":{\"type\":\"string\",\"enum\":[\"crypto\",\"stock\",\"index\",\"commodity\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"image\":{\"type\":[\"string\",\"null\"]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athMarketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"symbol\",\"assetClass\",\"price\",\"marketCap\",\"change24h\",\"image\",\"fdv\",\"ath\",\"athMarketCap\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"q\":\"q\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"market_cap_search\",\"freshness_sla_seconds\":300,\"behaviour\":[\"At most 20 assets come back, largest market cap first.\",\"Search covers supported TradFi assets as well as crypto: `gold` returns the gold commodity.\"],\"cli\":{\"command\":\"sharpe search\",\"options\":[\"q\"]}}],\"routes\":{\"analytics-query\":{\"v1\":\"/api/v1/analytics/query\",\"public\":null},\"arbitrage-cex-spot-transfer\":{\"v1\":\"/api/v1/arbitrage/cex-spot-transfer\",\"public\":\"/api/arbitrage/cex-spot-transfer\"},\"arbitrage-cross-exchange\":{\"v1\":\"/api/v1/arbitrage/cross-exchange\",\"public\":\"/api/arbitrage/cross-exchange\"},\"arbitrage-dated-futures-basis\":{\"v1\":\"/api/v1/arbitrage/dated-futures-basis\",\"public\":\"/api/arbitrage/dated-futures-basis\"},\"arbitrage-dex-scanner-preview\":{\"v1\":\"/api/v1/arbitrage/dex-scanner/preview\",\"public\":\"/api/arbitrage/dex-scanner/preview\"},\"arbitrage-futures-calendar-spread\":{\"v1\":\"/api/v1/arbitrage/futures-calendar-spread\",\"public\":\"/api/arbitrage/futures-calendar-spread\"},\"arbitrage-perp-dated-carry\":{\"v1\":\"/api/v1/arbitrage/perp-dated-carry\",\"public\":\"/api/arbitrage/perp-dated-carry\"},\"arbitrage-spot-perp\":{\"v1\":\"/api/v1/arbitrage/spot-perp\",\"public\":\"/api/arbitrage/spot-perp\"},\"briefing\":{\"v1\":\"/api/v1/briefing\",\"public\":\"/api/briefing\"},\"coin-analysis\":{\"v1\":\"/api/v1/coins/{coin}/analysis\",\"public\":\"/api/coins/{coin}/analysis\"},\"coin-compare-generate\":{\"v1\":null,\"public\":\"/api/coin-compare/generate\"},\"correlation-coins\":{\"v1\":null,\"public\":\"/api/correlation/coins\"},\"correlation-history\":{\"v1\":null,\"public\":\"/api/correlation/history\"},\"correlation-matrix\":{\"v1\":\"/api/v1/correlation/matrix\",\"public\":\"/api/correlation/matrix\"},\"correlation-on-demand\":{\"v1\":null,\"public\":\"/api/correlation/on-demand\"},\"ecosystems-data\":{\"v1\":\"/api/v1/ecosystems/data\",\"public\":\"/api/ecosystems/data\"},\"funding-coins\":{\"v1\":\"/api/v1/funding/coins\",\"public\":\"/api/funding/coins\"},\"funding-rates\":{\"v1\":\"/api/v1/funding/rates\",\"public\":\"/api/funding/rates\"},\"funding-settlement\":{\"v1\":\"/api/v1/funding/settlement\",\"public\":\"/api/funding/settlement\"},\"futures-coins\":{\"v1\":\"/api/v1/futures/coins\",\"public\":\"/api/futures/coins\"},\"futures-data\":{\"v1\":\"/api/v1/futures/data\",\"public\":\"/api/futures/data\"},\"gem-finder-data\":{\"v1\":\"/api/v1/gem-finder/data\",\"public\":\"/api/gem-finder/data\"},\"global-overview\":{\"v1\":\"/api/v1/global/overview\",\"public\":\"/api/global/overview\"},\"health\":{\"v1\":\"/api/v1/health\",\"public\":null},\"heatmap-data\":{\"v1\":\"/api/v1/heatmap/data\",\"public\":\"/api/heatmap/data\"},\"insider-selling-data\":{\"v1\":\"/api/v1/insider-selling/data\",\"public\":\"/api/insider-selling/data\"},\"listings-data\":{\"v1\":\"/api/v1/listings/data\",\"public\":\"/api/listings/data\"},\"listings-events\":{\"v1\":\"/api/v1/listings/events\",\"public\":\"/api/listings/events\"},\"listings-exchanges\":{\"v1\":\"/api/v1/listings/exchanges\",\"public\":\"/api/listings/exchanges\"},\"listings-recent\":{\"v1\":\"/api/v1/listings/recent\",\"public\":\"/api/listings/recent\"},\"market-cap-search\":{\"v1\":\"/api/v1/market-cap/search\",\"public\":\"/api/market-cap/search\"},\"market-derivatives-overview\":{\"v1\":\"/api/v1/market/derivatives-overview\",\"public\":null},\"memecoins-data\":{\"v1\":\"/api/v1/memecoins/data\",\"public\":\"/api/memecoins/data\"},\"memecoins-launches\":{\"v1\":\"/api/v1/memecoins/launches\",\"public\":\"/api/memecoins/launches\"},\"meta-coverage\":{\"v1\":\"/api/v1/meta/coverage\",\"public\":null},\"meta-datasets\":{\"v1\":\"/api/v1/meta/datasets\",\"public\":null},\"mindshare-data\":{\"v1\":\"/api/v1/mindshare/data\",\"public\":\"/api/mindshare/data\"},\"narratives-data\":{\"v1\":\"/api/v1/narratives/data\",\"public\":\"/api/narratives/data\"},\"news-feed\":{\"v1\":\"/api/v1/news/feed\",\"public\":\"/api/news/feed\"},\"opportunities\":{\"v1\":\"/api/v1/opportunities\",\"public\":\"/api/opportunities\"},\"price-prediction-data\":{\"v1\":\"/api/v1/price-prediction/data\",\"public\":\"/api/price-prediction/data\"},\"price-prediction-search\":{\"v1\":null,\"public\":\"/api/price-prediction/search\"},\"pump-dump-data\":{\"v1\":\"/api/v1/pump-dump/data\",\"public\":\"/api/pump-dump/data\"},\"rug-check-holders\":{\"v1\":null,\"public\":\"/api/rug-check/holders\"},\"rug-check-resolve\":{\"v1\":null,\"public\":\"/api/rug-check/resolve\"},\"rug-check-security\":{\"v1\":\"/api/v1/rug-check/security\",\"public\":\"/api/rug-check/security\"},\"rug-check-trending\":{\"v1\":\"/api/v1/rug-check/trending\",\"public\":\"/api/rug-check/trending\"},\"rwa-perps-rates\":{\"v1\":\"/api/v1/rwa-perps/rates\",\"public\":\"/api/rwa-perps/rates\"},\"stablecoins-data\":{\"v1\":\"/api/v1/stablecoins/data\",\"public\":null},\"token-data\":{\"v1\":null,\"public\":\"/api/token-data\"},\"token-scanner-inspect\":{\"v1\":null,\"public\":\"/api/token-scanner/inspect/{address}\"},\"token-scanner-rate-stats\":{\"v1\":null,\"public\":\"/api/token-scanner/rate-stats\"},\"token-scanner-scan\":{\"v1\":\"/api/v1/token-scanner/scan\",\"public\":null},\"token-scanner-scan-ai-top\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/ai-top\"},\"token-scanner-scan-alpha-drops\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/alpha-drops\"},\"token-scanner-scan-hot\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/hot\"},\"token-scanner-scan-new-runners\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/new-runners\"},\"token-scanner-scan-top-new\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/top-new\"},\"token-scanner-search\":{\"v1\":null,\"public\":\"/api/token-scanner/search\"},\"tracker-coins\":{\"v1\":null,\"public\":\"/api/tracker/coins/{categoryId}\"},\"tracker-market-overview\":{\"v1\":\"/api/v1/tracker/market-overview\",\"public\":\"/api/tracker/market-overview\"},\"usage\":{\"v1\":\"/api/v1/usage\",\"public\":null},\"web-traffic-data\":{\"v1\":\"/api/v1/web-traffic/data\",\"public\":\"/api/web-traffic/data\"}}}");
|
|
8
|
+
export const MANIFEST = JSON.parse("{\"version\":2,\"source\":\"src/contracts (generated by scripts/contracts/agent-manifest.ts)\",\"publish_output_schemas\":false,\"tools\":[{\"name\":\"get_api_coverage\",\"title\":\"API data coverage\",\"description\":\"Get public metadata about what data is available across all Sharpe Terminal products, including supported exchanges, coins, timeframes, and chart types. This coverage endpoint does not require an API key.\",\"endpoint\":\"meta-coverage\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/meta/coverage\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/CoveragePayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CoveragePayload\":{\"type\":\"object\",\"properties\":{\"product_count\":{\"type\":\"integer\"},\"status_counts\":{\"type\":\"object\",\"properties\":{\"production\":{\"type\":\"integer\"},\"shared\":{\"type\":\"integer\"},\"planned\":{\"type\":\"integer\"}},\"required\":[\"production\",\"shared\",\"planned\"]},\"products\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"$ref\":\"#/definitions/ProductCoverage\"}}},\"required\":[\"product_count\",\"status_counts\",\"products\"]},\"ProductCoverage\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"production\",\"shared\",\"planned\"]},\"ui_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"public_api_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"v1_api_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"docs_routes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"openapi_paths\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"mcp_tools\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"cli_commands\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"data_sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"tests\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"freshness_sla\":{\"type\":\"string\"},\"datasets\":{\"description\":\"The datasets behind the product with their writer cadence and freshness SLA: the numbers `freshness_sla` states in words.\",\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"]},\"cadence_seconds\":{\"type\":\"integer\",\"minimum\":0,\"description\":\"Seconds between two runs of the dataset's writer; 0 when it is fetched per request.\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"Seconds after its as_of past which the dataset's answers say `freshness_status: \\\"stale\\\"` (the writer's cadence plus one skipped run).\"}},\"required\":[\"id\",\"cadence_seconds\",\"freshness_sla_seconds\"]}},\"notes\":{\"type\":\"string\"}},\"required\":[\"name\",\"status\",\"ui_routes\",\"public_api_routes\",\"v1_api_routes\",\"docs_routes\",\"openapi_paths\",\"mcp_tools\",\"cli_commands\",\"data_sources\",\"tests\",\"freshness_sla\"]}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":null,\"freshness_sla_seconds\":null,\"behaviour\":[],\"cli\":{\"command\":\"sharpe coverage\",\"options\":[]}},{\"name\":\"get_arbitrage_borrow_rates\",\"title\":\"Margin borrow rates\",\"description\":\"Get spot-margin borrow rates per coin across Binance, OKX, Bybit and Gate.io (the venues that publish them without an account), for pricing a short spot leg (reverse cash-and-carry: sell spot, long perp) or a leveraged long. Each row is one coin with every venue's quote cheapest first: hourlyRate (fraction per hour) and annualRate (hourlyRate × 8,760, simple, fraction per year: 0.05 = 5%), the source endpoint and its time, plus lowest/highest venue. A venue that does not price a coin is absent, never 0; Gate.io covers its 100 most-traded loan currencies. `venues` says which venues answered (ok / stale / failed / unsupported). KuCoin, Bitget, MEXC, BingX, HTX and CoinEx publish no keyless rate. Filter with coin and exchanges.\",\"endpoint\":\"arbitrage-borrow-rates\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/borrow-rates\",\"public\":\"/api/arbitrage/borrow-rates\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Borrowed asset, case-insensitive (BTC, USDT, PEPE).\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated venues, case-insensitive: Binance, OKX, Bybit, Gate.io (KuCoin, Bitget, MEXC, BingX, HTX and CoinEx are accepted and reported unsupported). Default: all.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/BorrowRatesData\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"BorrowRatesData\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/BorrowRateRow\"}},\"venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/BorrowRateVenue\"}}},\"required\":[\"rows\",\"venues\"]},\"BorrowRateRow\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\",\"description\":\"Borrowed asset, upper case.\"},\"rates\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/BorrowRateQuote\"},\"description\":\"One quote per venue that prices the coin, cheapest first. A venue that does not price the coin is absent, never 0.\"},\"venueCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"lowestAnnualRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"lowestVenue\":{\"type\":\"string\"},\"highestAnnualRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"highestVenue\":{\"type\":\"string\"}},\"required\":[\"coin\",\"rates\",\"venueCount\",\"lowestAnnualRate\",\"lowestVenue\",\"highestAnnualRate\",\"highestVenue\"]},\"BorrowRateQuote\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\",\"description\":\"Venue display name.\"},\"hourlyRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_hour\",\"description\":\"Interest per hour on the borrowed amount, a fraction (0.0000049 = 0.00049% an hour). A venue that publishes a daily rate is divided by 24.\"},\"annualRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"hourlyRate × 8,760, simple (not compounded), a fraction (0.043 = 4.3% a year).\"},\"source\":{\"type\":\"string\",\"description\":\"The L0 endpoint contract the rate came from (bybit.spot-margin-data, okx.interest-rate-loan-quota, binance.margin-vip-spec, gate.unified-history-loan-rate).\"},\"asOf\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the venue stamped the rate (Bybit's server time, Gate's rate hour), else when Sharpe fetched it (OKX, Binance).\"}},\"required\":[\"venue\",\"hourlyRate\",\"annualRate\",\"source\",\"asOf\"]},\"BorrowRateVenue\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"stale\",\"failed\",\"unsupported\"],\"description\":\"ok: fresh (≤ 5 minutes). stale: the last refresh failed and the last good answer (≤ 15 minutes old) is served. failed: nothing usable, the venue's coins are absent. unsupported: the venue publishes no keyless borrow rate.\"},\"coins\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"fetchedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"reason\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"venue\",\"status\",\"coins\",\"fetchedAt\",\"reason\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"margin_borrow_rates\",\"freshness_sla_seconds\":600,\"behaviour\":[\"Every quote's annualRate is its hourlyRate × 8,760, every rate is positive, and quotes run cheapest first.\"],\"cli\":{\"command\":\"sharpe arb borrow\",\"options\":[\"coin\",\"exchanges\"]}},{\"name\":\"get_arbitrage_cex_spot_transfer\",\"title\":\"CEX spot-transfer arbitrage scanner\",\"description\":\"Get live CEX spot-transfer arbitrage routes (buy on one exchange, withdraw, deposit and sell on another) after exact network matching (ambiguous network names refused), token-contract matching, withdrawal/deposit status and minimums, withdrawal fees, per-venue taker fees (buyTakerFeePct, sellTakerFeePct), depth and slippage. Routes netting above zero come first (executionStatus executable); up to 50 near-miss routes follow as indicative with indicativeReason below_fees (or stale_quote / stale_network). Books are judged on 60 s, networks on 10 minutes. transferConfirmations is the sell venue's deposit confirmation count (transferEta is its deprecated label); meta.transferScan counts coins scanned, venues answering, routes evaluated and profitable, and the best net.\",\"endpoint\":\"arbitrage-cex-spot-transfer\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/cex-spot-transfer\",\"public\":\"/api/arbitrage/cex-spot-transfer\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum of the board's ranking figure, in percentage points: `netAprPct` on the dated basis board, `netRollApyPct` on the calendar board, `netCarryAprPct` (the fee-adjusted annualized net carry, not the edge to expiry) on the perp-dated carry board, `netProfitPct` (per trip, not annualized) on the CEX transfer board.\",\"type\":\"number\"},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its book depth (level 1 on the stored snapshot; on a live read a top-20 walk where level 1 is thin, the side then priced at that walk's VWAP), any reported open interest and its 24h volume are at least this notional (and its quotes are at most 10 minutes old). The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CexSpotTransferRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CexSpotTransferRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CexSpotTransferRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"buyExchange\":{\"type\":\"string\"},\"sellExchange\":{\"type\":\"string\"},\"buyAsk\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"sellBid\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"grossSpreadPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"network\":{\"type\":\"string\"},\"contractAddress\":{\"type\":[\"string\",\"null\"]},\"withdrawFee\":{\"type\":\"number\"},\"depositStatus\":{\"type\":\"string\",\"enum\":[\"Open\",\"Closed\"]},\"withdrawStatus\":{\"type\":\"string\",\"enum\":[\"Open\",\"Closed\"]},\"transferEta\":{\"type\":\"string\",\"description\":\"Deprecated: `transferConfirmations` as a label (\\\"15 confs\\\"), not a time.\"},\"transferConfirmations\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Deposit confirmations the sell venue waits for on the route's network; null when it does not report them.\"},\"depthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"slippagePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"netProfitPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"[VWAP_sell(q - withdrawFee) x (1 - sellTakerFee) - N x (1 + buyTakerFee)] / N, percent of the notional N. At or below zero on near-miss rows (`indicativeReason: below_fees`).\"},\"buyTakerFeePct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"Spot taker fee charged on the buy fill: the venue catalog's own when it reports one, else the shared venue fee table.\"},\"sellTakerFeePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"spreadLifetimeSeconds\":{\"description\":\"How long this server instance has seen the route continuously; resets on a cold start or another instance.\",\"type\":[\"number\",\"null\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"The older of the two order books (quote time).\"},\"networkUpdatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"The older of the two venues' transfer-network reads.\"},\"isStale\":{\"type\":\"boolean\",\"description\":\"An order book older than the 60 s quote SLA, or a transfer-network read older than 10 minutes.\"},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Executable: fresh books and networks, both books fill the notional, net profit above zero.\"},\"indicativeReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"below_fees\",\"stale_quote\",\"stale_network\"]},{\"type\":\"null\"}]}},\"required\":[\"rank\",\"coin\",\"buyExchange\",\"sellExchange\",\"buyAsk\",\"sellBid\",\"grossSpreadPct\",\"network\",\"contractAddress\",\"withdrawFee\",\"depositStatus\",\"withdrawStatus\",\"transferEta\",\"transferConfirmations\",\"depthUsd\",\"slippagePct\",\"netProfitPct\",\"buyTakerFeePct\",\"sellTakerFeePct\",\"spreadLifetimeSeconds\",\"updatedAt\",\"networkUpdatedAt\",\"isStale\",\"executionStatus\",\"indicativeReason\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"CexTransferScan\":{\"type\":\"object\",\"properties\":{\"coinsScanned\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"scannedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"venuesAnswering\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Selected venues that returned at least one order book and one transfer network.\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"not_live\",\"no_books\",\"no_networks\",\"failed\"],\"description\":\"not_live: the venue's public spot ticker shows no live book (left out of coverage); failed/no_books/no_networks make the answer degraded.\"}},\"required\":[\"exchange\",\"status\"]}},\"routesEvaluated\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Directed (coin, buy venue, sell venue) routes with a computed net: both books fill the notional on one common open network.\"},\"routesProfitable\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Evaluated routes netting above zero after fees.\"},\"bestNetPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Best net profit over evaluated routes, percent of the notional; null when none was evaluated.\"}},\"required\":[\"coinsScanned\",\"scannedCoins\",\"venuesAnswering\",\"venues\",\"routesEvaluated\",\"routesProfitable\",\"bestNetPct\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minDepthUsd\":\"min_depth_usd\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"arbitrage_tickers\",\"freshness_sla_seconds\":60,\"behaviour\":[\"Every route has the buy venue's withdrawal and the sell venue's deposit open; a route netting at or below zero is indicative `below_fees` (or stale), never executable.\",\"Executable routes (`executionStatus`) rank first, then the indicative rest; each group by `netProfitPct`, highest first; `rank` numbers that order from 1.\",\"Transfer routes run between KuCoin, Bitget, HTX and CoinEx only.\",\"`coin` keeps only that coin's routes.\"],\"cli\":{\"command\":\"sharpe arb spot-transfer\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minDepthUsd\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_cross_exchange\",\"title\":\"Cross-exchange arbitrage\",\"description\":\"Get cross-exchange funding arbitrage across every funding venue and asset class (crypto plus RWA perps: equity, commodity, FX, index — pairs never cross classes; lot spellings such as 1000PEPE and kPEPE pair as one asset), one row per coin (its best executable pair, else its largest gross differential), ranked with executable rows first by netApr, then indicative rows by netApr or gross apr. Executable = book-priced spread, legs within 5%, reported top-of-book depth ≥ $10,000, fresh quotes; otherwise indicativeReason says why (reference_only, price_gap, thin_book, stale_quote, unpriced). netApr nets both venues' taker fees and the adverse entry spread (a favourable spread is never credited) and is present only on book-priced rows; unknown spread/OI/volume are null, never zero. Rows carry pairStatus, breakEvenDays, roundTripFeeRate, the legs' contract symbols, fundingAsOf and per-leg price times; limit / cursor page the board.\",\"endpoint\":\"arbitrage-cross-exchange\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/cross-exchange\",\"public\":\"/api/arbitrage/cross-exchange\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchanges\":{\"description\":\"Comma-separated list of venues to compare. Omit for every funding venue in the funding tracker's registry that the instrument master does not mark not live (`X-Data-Venues` lists them).\",\"type\":\"string\"},\"assetClass\":{\"default\":\"all\",\"description\":\"Underlying filter: \\\"all\\\" (default), \\\"crypto\\\", or \\\"rwa\\\" (equity, commodity, FX and index perps).\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"minOiUsd\":{\"default\":0,\"description\":\"Minimum open interest in USD on the smaller leg. Default 0 (no floor). Legs with unknown OI fail a positive floor.\",\"type\":\"number\",\"minimum\":0},\"minVolUsd\":{\"default\":0,\"description\":\"Minimum 24h perp volume in USD on the smaller leg. Default 0 (no floor). Legs with unknown volume fail a positive floor.\",\"type\":\"number\",\"minimum\":0},\"sector\":{\"description\":\"Narrative filter: only crypto coins in that narrative's CoinGecko category (the constituents /api/narratives/data lists). Omit or \\\"all\\\" for every coin. A coin the category does not list, and every RWA perp, is left out when a sector is set.\",\"type\":\"string\",\"enum\":[\"all\",\"memes\",\"ai-agents\",\"layer-1\",\"defi\"]},\"limit\":{\"description\":\"Return at most this many rows, the first in board order (executable rows first by netApr, then the rest by netApr or apr). Default: every row. On v1 a limited answer carries `pagination`.\",\"type\":\"integer\",\"minimum\":1},\"cursor\":{\"description\":\"Opaque cursor from the previous page's `pagination.cursor` (100 rows a page when `limit` is omitted).\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CrossExchangeOpportunity\"}},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CrossExchangeOpportunity\"}}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CrossExchangeOpportunity\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"assetClass\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"],\"description\":\"Underlying category from the funding book: `crypto`, `equity`, `commodity`, `fx` or `index`. A pair's two legs always share it.\"},\"longExchange\":{\"type\":\"string\"},\"shortExchange\":{\"type\":\"string\"},\"longRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"shortRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"netFundingRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"apr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"grossApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"netApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"`apr` − (2 perpetual taker fills on each venue at its standard fee + the adverse entry spread) × 365 / 30, a decimal fraction per year. A favourable (negative) spread is never credited. Only on a book-priced spread whose legs are within 20% of each other; else `null`.\"},\"spreadRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"spreadSource\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"book\",\"reference\"]},{\"type\":\"null\"}],\"description\":\"Where `spreadRate` comes from: `book` (both legs' order books), `reference` (last or mark prices), or `null` when either leg has no price.\"},\"longAsk\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Best ask on the long venue, per asset unit (the contract's price ÷ its lot multiplier: a 1000PEPE contract's ask ÷ 1000).\"},\"shortBid\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Best bid on the short venue, per asset unit.\"},\"executableDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Top-of-book depth in USD the entry can fill: the smallest of the long venue's ask size and the short venue's bid size among the legs that report one (one leg's figure when only one venue reports depth). Below $10,000 the row is `indicative` (`thin_book`); `null` only when neither venue reports depth.\"},\"holdingDays\":{\"type\":\"number\",\"x-unit\":\"days\"},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded on the figures shown. \\\"executable\\\" needs a book-priced spread (spreadSource \\\"book\\\"), leg prices within 5% of each other, top-of-book depth of at least $10,000 where both venues report it, and both quotes within the board's 10-minute SLA at the time of the request. Anything else is \\\"indicative\\\" with `indicativeReason`; past a 20% gap the legs read as two instruments and `netApr` is null. Indicative rows keep every figure and sort below executable ones.\"},\"oiLong\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiShort\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"volumeLong24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"24h perp turnover in USD on the long venue; `null` when the venue does not report it.\"},\"volumeShort24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"24h perp turnover in USD on the short venue; `null` when the venue does not report it.\"},\"nextSettlement\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"intervalHours\":{\"type\":\"number\"},\"pairStatus\":{\"type\":\"string\",\"enum\":[\"eligible\",\"unpriced\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\"],\"description\":\"Whether the two legs are one instrument: `eligible`, `unpriced` when a leg has no price to check, else the first check that failed; `price_gap` means the legs' prices are more than 20% apart.\"},\"fundingAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the older leg's funding rate was written; `null` when either is unknown.\"},\"pricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the older of the two legs' quotes behind the spread and depth was read; `null` when neither leg has a quote.\"},\"indicativeReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"unpriced\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\",\"reference_only\",\"thin_book\",\"stale_quote\"]},{\"type\":\"null\"}],\"description\":\"Why the row is `indicative`; `null` when executable. `reference_only`: no book on a leg (spread from last or mark prices); `price_gap`: legs 5-20% apart (net APR kept) or past 20% (none); `thin_book`: reported top-of-book depth under $10,000; `stale_quote`: a quote older than the board's 10-minute SLA.\"},\"roundTripFeeRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Two perpetual taker fills on each venue at its standard (VIP 0) fee, a decimal fraction of notional.\"},\"breakEvenDays\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"days\"},{\"type\":\"null\"}],\"description\":\"Days of carry that pay back the one-time costs: (fees + adverse entry spread) ÷ (`apr` / 365). `null` without a `netApr`.\"},\"longSymbol\":{\"description\":\"The long venue's own contract symbol (e.g. `1000PEPEUSDT`, `kPEPE`): legs of one asset pair across lot sizes.\",\"type\":[\"string\",\"null\"]},\"shortSymbol\":{\"description\":\"The short venue's own contract symbol.\",\"type\":[\"string\",\"null\"]},\"longIntervalHours\":{\"description\":\"The long leg's own funding interval in hours: `longRate` is per this many hours (`intervalHours` is the faster of the two legs).\",\"type\":[\"number\",\"null\"]},\"shortIntervalHours\":{\"description\":\"The short leg's own funding interval in hours: `shortRate` is per this many hours.\",\"type\":[\"number\",\"null\"]},\"longPricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the long venue's quote was read; `null` without one.\"},\"shortPricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the short venue's quote was read; `null` without one.\"}},\"required\":[\"symbol\",\"assetClass\",\"longExchange\",\"shortExchange\",\"longRate\",\"shortRate\",\"netFundingRate\",\"apr\",\"grossApr\",\"netApr\",\"spreadRate\",\"spreadSource\",\"longAsk\",\"shortBid\",\"executableDepthUsd\",\"holdingDays\",\"executionStatus\",\"oiLong\",\"oiShort\",\"volumeLong24hUsd\",\"volumeShort24hUsd\",\"nextSettlement\",\"intervalHours\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"exchanges\":\"exchanges\",\"assetClass\":\"asset_class\",\"minOiUsd\":\"min_oi_usd\",\"minVolUsd\":\"min_vol_usd\",\"sector\":\"sector\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"arbitrage_boards\",\"freshness_sla_seconds\":600,\"behaviour\":[\"Executable rows rank first by `netApr`, then indicative rows by `netApr` where they have one, else gross annualized funding differential (`apr`).\",\"`netApr` is present only on book-priced rows (`spreadSource: book`), and every executable row has one.\",\"Pairs whose two legs' book prices differ by more than 20% are indicative.\",\"Unknown open interest is `null`, never `0`.\",\"`apr` is the gross annualized differential, |netFundingRate| × 8760 / intervalHours, and `grossApr` repeats it.\",\"`assetClass=rwa` keeps only equity, commodity, FX and index pairs.\",\"`exchanges` restricts both legs to the listed venues.\",\"`minOiUsd` keeps pairs whose smaller leg reports at least that open interest; a leg with unknown open interest fails the floor.\"],\"cli\":{\"command\":\"sharpe arb cross-exchange\",\"options\":[\"exchanges\",\"minOiUsd\",\"sector\"]}},{\"name\":\"get_arbitrage_dated_futures_basis\",\"title\":\"Dated futures basis scanner\",\"description\":\"Get cash-and-carry arbitrage rows for buying spot and selling dated futures (Binance, OKX, Bybit), ranked by net annualized basis after fees (netAprPct: basis at spot ask / futures bid less 2 spot + 2 futures taker fills, × 365 / days to expiry recomputed per request). Rows at least 3 days out rank first (nearExpiry rows last); executable rows first, then snapshot_quote rows (executable on a live read), then the rest, each with indicativeReason (stale_snapshot, no_depth, depth_below_notional, depth_beyond_top_of_book, oi_below_notional, no_volume, backwardation_needs_borrow, snapshot_quote). feesPct is the round-trip fee at each venue's standard rate.\",\"endpoint\":\"arbitrage-dated-futures-basis\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/dated-futures-basis\",\"public\":\"/api/arbitrage/dated-futures-basis\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum of the board's ranking figure, in percentage points: `netAprPct` on the dated basis board, `netRollApyPct` on the calendar board, `netCarryAprPct` (the fee-adjusted annualized net carry, not the edge to expiry) on the perp-dated carry board, `netProfitPct` (per trip, not annualized) on the CEX transfer board.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its book depth (level 1 on the stored snapshot; on a live read a top-20 walk where level 1 is thin, the side then priced at that walk's VWAP), any reported open interest and its 24h volume are at least this notional (and its quotes are at most 10 minutes old). The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"aggregate\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisAggregate\"}},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"aggregate\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesBasisAggregate\"}}},\"required\":[\"data\",\"meta\",\"pagination\",\"aggregate\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesBasisRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"spotVenue\":{\"type\":\"string\"},\"futuresVenue\":{\"type\":\"string\"},\"contract\":{\"type\":\"string\"},\"expiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"days\":{\"type\":\"number\",\"x-unit\":\"days\"},\"spotAsk\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"futureBid\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basisUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualizedBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"netAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiToVolume\":{\"type\":[\"number\",\"null\"]},\"depthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: a snapshot inside the freshness SLA; book depth behind the spot ask and futures bid of at least notional (level 1 on a stored snapshot row, `depth_beyond_top_of_book` when thinner; on a live read a side thinner at level 1 than the default notional is walked 20 levels deep and priced at that walk's VWAP); no reported open interest on the contract below notional (unknown open interest does not demote); 24h volume of at least notional; a non-negative basis; and quotes at most 10 minutes old (a live read, not the hourly snapshot). Otherwise \\\"indicative\\\" with `indicativeReason`: every figure is kept. Indicative rows sort below executable ones.\"},\"indicativeReason\":{\"description\":\"Why the row is indicative, the first failing check in this order: `stale_snapshot` (past the term-structure SLA), `no_perp_book` (carry: the perp has no bid/ask for its own contract), `no_depth`, `depth_below_notional` (the top-20 book walked is thinner than the notional), `depth_beyond_top_of_book` (the depth known is level 1 only and thinner than the notional: the rest would fill beyond the quote the row is priced at), `oi_below_notional`, `no_volume` (no 24h volume, or less than the notional), `backwardation_needs_borrow` (basis: a negative basis, and calendar: a backwardated Sell Near / Buy Far lock-in; the reverse trade needs a spot borrow the board does not price), `snapshot_quote` (every other check passes but the quotes are older than 10 minutes: executable on a live read). Null when executable. Absent on answers before 2026-09-30.\",\"anyOf\":[{\"type\":\"string\",\"enum\":[\"stale_snapshot\",\"no_perp_book\",\"no_depth\",\"depth_below_notional\",\"depth_beyond_top_of_book\",\"oi_below_notional\",\"no_volume\",\"backwardation_needs_borrow\",\"snapshot_quote\"]},{\"type\":\"null\"}]},\"nearExpiry\":{\"description\":\"Under 3 days to expiry: the round-trip fee annualized over the days left dominates the APR. Served, ranked after every row at least 3 days out. Absent on answers before 2026-09-30.\",\"type\":\"boolean\"},\"feesPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"Round-trip fees: 2 spot and 2 dated-futures taker fills at the venue's standard fee (engine/derive/venue-fees.ts), percent, not annualized.\"},\"marginType\":{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"spotVenue\",\"futuresVenue\",\"contract\",\"expiry\",\"days\",\"spotAsk\",\"futureBid\",\"basisUsd\",\"basisPct\",\"annualizedBasisPct\",\"netAprPct\",\"volume24hUsd\",\"openInterestUsd\",\"oiToVolume\",\"depthUsd\",\"executionStatus\",\"feesPct\",\"marginType\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"CexTransferScan\":{\"type\":\"object\",\"properties\":{\"coinsScanned\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"scannedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"venuesAnswering\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Selected venues that returned at least one order book and one transfer network.\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"not_live\",\"no_books\",\"no_networks\",\"failed\"],\"description\":\"not_live: the venue's public spot ticker shows no live book (left out of coverage); failed/no_books/no_networks make the answer degraded.\"}},\"required\":[\"exchange\",\"status\"]}},\"routesEvaluated\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Directed (coin, buy venue, sell venue) routes with a computed net: both books fill the notional on one common open network.\"},\"routesProfitable\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Evaluated routes netting above zero after fees.\"},\"bestNetPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Best net profit over evaluated routes, percent of the notional; null when none was evaluated.\"}},\"required\":[\"coinsScanned\",\"scannedCoins\",\"venuesAnswering\",\"venues\",\"routesEvaluated\",\"routesProfitable\",\"bestNetPct\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]},\"FuturesBasisAggregate\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\"},\"totalOpenInterestUsd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"oiWeightedAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"bestVenue\":{\"type\":\"string\"},\"bestAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"contractCount\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"coin\",\"totalOpenInterestUsd\",\"oiWeightedAprPct\",\"bestVenue\",\"bestAprPct\",\"contractCount\"],\"description\":\"Per-coin summary over the ranked contracts at least three days from expiry (one day until 2026-09-30). Contracts closer to expiry stay in rows but are left out, because a round-trip fee annualized over a few days dominates the APR; a coin with no qualifying contract has no entry.\"}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination, aggregate }` at the top level (rows, scanner meta, page, per-coin strip); v1 wraps the same four objects as `data: { rows, scannerMeta, pagination, aggregate }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":[\"arbitrage_dated_quotes\",\"futures_term_structure\"],\"freshness_sla_seconds\":600,\"behaviour\":[\"`coin` keeps only that coin's rows and aggregate entries.\",\"Rows at least 3 days from expiry rank first (`nearExpiry` rows last); within each group executable rows, then `snapshot_quote` rows, then the other indicative rows, each by fee-adjusted net APR (`netAprPct`), highest first; `rank` numbers that order from 1.\",\"An `executable` row is fresh, its `depthUsd` is known and at least `notional`, its reported open interest, if any, is at least `notional`, and it has no `indicativeReason`; an `indicative` row names its reason, and a row failing any of those depth, open-interest or freshness rules is indicative.\",\"Basis rows come from Binance, OKX and Bybit only: Deribit has no spot leg.\",\"`basisPct = (futureBid − spotAsk) / spotAsk × 100` and `netAprPct = (basisPct − feesPct) × 365 / days`.\",\"The per-coin aggregate covers only contracts at least three days from expiry, and a coin with no such contract has no entry.\"],\"cli\":{\"command\":\"sharpe arb dated-basis\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_fixed_floating_funding\",\"title\":\"Fixed vs floating funding (Pendle Boros)\",\"description\":\"Compare Pendle Boros fixed funding rates with realised floating funding. For every live Boros market (a venue's perp to a maturity: Binance, OKX, Bybit, Gate, KuCoin, Hyperliquid incl. xyz, Lighter) returns impliedApr (Boros's fixed rate), floatingApr (the venue's current funding as Boros reports it), realised7dApr and realised30dApr (Sharpe's stored funding for the same contract, annualised as acc × 365 / days), and spread7dApr / spread30dApr = implied − realised. A positive spread means locking the fixed rate (sell yield on Boros, receive fixed) beats what the floating leg has paid; negative means the fixed rate is cheap to pay. All rates are fractions per year (0.05 = 5%), gross of fees. Realised figures are null with realised7dNullReason / realised30dNullReason when the contract is not covered or its history is incomplete, never 0. Also serves bestBidApr / bestAskApr, daysToMaturity, openInterestUsd (one side) and a Boros trade link. Filter with coin and venue.\",\"endpoint\":\"arbitrage-fixed-floating-funding\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/fixed-floating-funding\",\"public\":\"/api/arbitrage/fixed-floating-funding\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Underlying asset, case-insensitive (BTC, ETH, HYPE, BRENTOIL).\",\"type\":\"string\",\"minLength\":1},\"venue\":{\"description\":\"Filter to one venue, case-insensitive: Boros's name (Binance, OKX, Hyperliquid, Gate, Kucoin, Lighter, Bybit) or our funding store's (Gate.io, KuCoin, tradeXYZ).\",\"type\":\"string\",\"minLength\":1,\"maxLength\":32}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/FixedFloatingFundingData\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FixedFloatingFundingData\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FixedFloatingFundingRow\"}},\"summary\":{\"$ref\":\"#/definitions/FixedFloatingFundingSummary\"}},\"required\":[\"rows\",\"summary\"]},\"FixedFloatingFundingRow\":{\"type\":\"object\",\"properties\":{\"marketId\":{\"type\":\"integer\",\"x-unit\":\"index\",\"description\":\"Boros market id (the key: one venue contract can list twice on different collateral).\"},\"market\":{\"type\":\"string\",\"description\":\"Boros market symbol, e.g. BINANCE-BTCUSDT-30OCT2026.\"},\"venue\":{\"type\":\"string\",\"description\":\"The venue whose perp funding the market settles against, as Boros names it (Binance, OKX, Hyperliquid, Gate, Kucoin, Lighter, Bybit).\"},\"coin\":{\"type\":\"string\"},\"fundingExchange\":{\"description\":\"Our funding store's exchange for the matched contract (Gate.io, KuCoin, tradeXYZ for Hyperliquid's xyz dex); null when not covered.\",\"type\":[\"string\",\"null\"]},\"fundingContract\":{\"description\":\"The matched perp's native symbol as /v1/funding/rates serves it (BTCUSDT, BTC-USDT-SWAP, XBTUSDTM, BTC-USD, xyz:BRENTOIL); null when not covered.\",\"type\":[\"string\",\"null\"]},\"collateral\":{\"description\":\"Boros collateral token (BTC, ETH, USDT, HYPE, BNB).\",\"type\":[\"string\",\"null\"]},\"maturity\":{\"type\":\"string\",\"format\":\"date-time\"},\"daysToMaturity\":{\"type\":\"number\",\"x-unit\":\"days\",\"description\":\"Fractional days from the answer's generation to maturity.\"},\"settlementIntervalHours\":{\"type\":\"number\",\"description\":\"The underlying perp's settlement interval, hours (Boros paymentPeriod).\"},\"settlementsToMaturity\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"nextSettlementAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"status\":{\"type\":\"string\",\"enum\":[\"trading\",\"close_only\",\"paused\"]},\"impliedApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"Boros implied (fixed) APR: the market's mark (fair-value) rate.\"},\"midApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"bestBidApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Best bid APR: the fixed rate a seller of yield (receive fixed, pay floating) gets now.\"},\"bestAskApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"floatingApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"The underlying (floating) APR as Boros reports it: the venue's current funding annualised by Boros's oracle.\"},\"realised7dApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Our realised funding for the same venue contract over the last 7 days, annualised: acc_7d × 365 / 7 (funding_accumulated).\"},\"realised7dNullReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"venue_not_covered\",\"contract_not_in_store\",\"store_unavailable\",\"accumulated_stale\",\"listed_within_window\",\"history_stale\"],\"description\":\"Why the realised figure is null (never 0): venue_not_covered (Boros quotes a venue or Hyperliquid builder dex our funding store does not track), contract_not_in_store (no accumulated funding row for the contract), store_unavailable (the funding store could not be read), accumulated_stale (the 7/30-day sums are past their freshness SLA), listed_within_window (the contract's first stored settlement is inside the window), history_stale (its last stored settlement is over a day old).\"},{\"type\":\"null\"}]},\"realised30dApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Realised funding over the last 30 days, annualised: acc_30d × 365 / 30.\"},\"realised30dNullReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"venue_not_covered\",\"contract_not_in_store\",\"store_unavailable\",\"accumulated_stale\",\"listed_within_window\",\"history_stale\"],\"description\":\"Why the realised figure is null (never 0): venue_not_covered (Boros quotes a venue or Hyperliquid builder dex our funding store does not track), contract_not_in_store (no accumulated funding row for the contract), store_unavailable (the funding store could not be read), accumulated_stale (the 7/30-day sums are past their freshness SLA), listed_within_window (the contract's first stored settlement is inside the window), history_stale (its last stored settlement is over a day old).\"},{\"type\":\"null\"}]},\"spread7dApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"impliedApr − realised7dApr. Positive: locking the fixed rate beats what the floating leg paid over 7 days. Gross: no Boros or venue fees.\"},\"spread30dApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"impliedApr − realised30dApr (the rank key). Gross: no Boros or venue fees.\"},\"openInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"Boros open interest, one side: notionalOI (yield units of the collateral token) × the collateral's USD price.\"},\"volume24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"tradeUrl\":{\"type\":\"string\",\"description\":\"The market on boros.pendle.finance.\"},\"borosAsOf\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Block time of the Boros indexer head the market was read at.\"},\"fundingAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the funding_accumulated view behind the realised figures was refreshed; null when not covered.\"}},\"required\":[\"marketId\",\"market\",\"venue\",\"coin\",\"fundingExchange\",\"fundingContract\",\"collateral\",\"maturity\",\"daysToMaturity\",\"settlementIntervalHours\",\"settlementsToMaturity\",\"nextSettlementAt\",\"status\",\"impliedApr\",\"midApr\",\"bestBidApr\",\"bestAskApr\",\"floatingApr\",\"realised7dApr\",\"realised7dNullReason\",\"realised30dApr\",\"realised30dNullReason\",\"spread7dApr\",\"spread30dApr\",\"openInterestUsd\",\"volume24hUsd\",\"tradeUrl\",\"borosAsOf\",\"fundingAsOf\"]},\"FixedFloatingFundingSummary\":{\"type\":\"object\",\"properties\":{\"markets\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"matched\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Markets with a realised 7-day figure.\"},\"unmatched\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"description\":\"Markets without a realised 7-day figure, by realised7dNullReason.\"},\"borosSyncedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"fundingAccumulatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"markets\",\"matched\",\"unmatched\",\"borosSyncedAt\",\"fundingAccumulatedAt\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"venue\":\"venue\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":[\"boros_markets\",\"funding_accumulated\"],\"freshness_sla_seconds\":300,\"behaviour\":[\"A realised figure is null exactly when its null reason is set, and every spread is implied − realised.\"],\"cli\":{\"command\":\"sharpe arb boros\",\"options\":[\"coin\",\"venue\"]}},{\"name\":\"get_arbitrage_funding_spread_history\",\"title\":\"Funding spread history and carry backtest\",\"description\":\"Get a pair's historical funding spread and carry backtest from stored settlements. mode=spot-perp takes venue (+ optional contract) and direction (short = buy spot, short perp; long = sell spot, long perp, borrow cost not included); mode=cross-exchange takes longVenue and shortVenue (+ optional longContract / shortContract). Legs are aligned by settlement time with each contract's real interval (never an assumed 8h). Returns series (spreadApr and legAprs annualized, cashflow and cumulativeCarry as fractions of one leg's notional) and backtests for 1/7/14/30/60 days and the requested days (1-90): fundingCollected, fees (each venue's entry+exit taker fees), netReturn, grossApr, netApr, negativeCarryDays, maxDrawdown, breakEvenDays, coverageRatio and complete. Fractions: multiply by 100 for percent.\",\"endpoint\":\"arbitrage-funding-spread-history\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/funding-spread-history\",\"public\":\"/api/arbitrage/funding-spread-history\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"mode\":{\"default\":\"spot-perp\",\"description\":\"`spot-perp`: one venue's spot and perp (needs `venue`). `cross-exchange`: a long perp and a short perp (needs `longVenue` and `shortVenue`).\",\"type\":\"string\",\"enum\":[\"spot-perp\",\"cross-exchange\"]},\"coin\":{\"description\":\"Base coin, for example BTC.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":32},\"venue\":{\"description\":\"Spot-perp venue: Binance, OKX, Bybit, Bitget, Gate.io, KuCoin, MEXC, BingX, HTX or CoinEx.\",\"type\":\"string\",\"maxLength\":32},\"contract\":{\"description\":\"Spot-perp: the venue's perp contract symbol, for example BTCUSDT. Optional: without it the venue's contract for the coin with the largest current open interest is used.\",\"type\":\"string\",\"maxLength\":64},\"direction\":{\"default\":\"short\",\"description\":\"Spot-perp: `short` buys spot and shorts the perp (collects positive funding); `long` sells spot and longs the perp (borrow interest not included).\",\"type\":\"string\",\"enum\":[\"short\",\"long\"]},\"longVenue\":{\"description\":\"Cross-exchange: the venue of the long perp.\",\"type\":\"string\",\"maxLength\":32},\"longContract\":{\"description\":\"Cross-exchange: the long perp's contract symbol. Optional, resolved as `contract` is.\",\"type\":\"string\",\"maxLength\":64},\"shortVenue\":{\"description\":\"Cross-exchange: the venue of the short perp.\",\"type\":\"string\",\"maxLength\":32},\"shortContract\":{\"description\":\"Cross-exchange: the short perp's contract symbol. Optional, resolved as `contract` is.\",\"type\":\"string\",\"maxLength\":64},\"days\":{\"default\":30,\"description\":\"Backtest window in days (1-90): the series covers it, and `backtests` lists it after the shorter standard windows.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":90}},\"required\":[\"coin\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/FundingSpreadHistory\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FundingSpreadHistory\":{\"type\":\"object\",\"properties\":{\"mode\":{\"type\":\"string\",\"enum\":[\"spot-perp\",\"cross-exchange\"]},\"coin\":{\"type\":\"string\"},\"direction\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"short\",\"long\"]},{\"type\":\"null\"}],\"description\":\"Spot-perp only: `short` = buy spot, short the perp (collects positive funding); `long` = sell spot, long the perp. Null on cross-exchange.\"},\"days\":{\"type\":\"integer\",\"x-unit\":\"days\"},\"legs\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingSpreadHistoryLeg\"}},\"spot\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"takerFee\":{\"type\":\"number\",\"x-unit\":\"fraction\"}},\"required\":[\"venue\",\"takerFee\"]},{\"type\":\"null\"}],\"description\":\"Spot-perp only: the spot leg (same venue; spot pays no funding) and its taker fee per fill.\"},\"roundTripFees\":{\"type\":\"number\",\"x-unit\":\"fraction\"},\"requiresBorrow\":{\"type\":\"boolean\",\"description\":\"True for a spot-perp `long` direction: the coin must be borrowed on margin to sell spot.\"},\"borrowCostIncluded\":{\"type\":\"boolean\",\"description\":\"Always false: margin borrow interest is not in the backtest.\"},\"windowEnd\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"Every backtest's `end`; null when a leg has no usable settlement.\"},\"series\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingSpreadHistoryPoint\"},\"description\":\"The spread at every settlement instant of either leg over the requested window's backtest span, ascending.\"},\"backtests\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingSpreadBacktest\"},\"description\":\"One per window: 1, 7, 14, 30 and 60 days where shorter than `days`, then `days` itself, ascending.\"}},\"required\":[\"mode\",\"coin\",\"direction\",\"days\",\"legs\",\"spot\",\"roundTripFees\",\"requiresBorrow\",\"borrowCostIncluded\",\"windowEnd\",\"series\",\"backtests\"]},\"FundingSpreadHistoryLeg\":{\"type\":\"object\",\"properties\":{\"role\":{\"type\":\"string\",\"enum\":[\"perp\",\"long\",\"short\"],\"description\":\"`perp` on a spot-perp pair (its side is `direction`); `long` and `short` on a cross-exchange pair.\"},\"venue\":{\"type\":\"string\"},\"contract\":{\"type\":\"string\",\"description\":\"The venue's native contract symbol the settlements are read for.\"},\"contractSource\":{\"type\":\"string\",\"enum\":[\"given\",\"resolved\"],\"description\":\"`given`: the query named the contract. `resolved`: the venue's contract for the coin with the largest current open interest (unknown open interest last), then the most settlements in the window, the latest settlement, the symbol.\"},\"side\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"],\"description\":\"The position on this perp: a short leg receives positive funding, a long leg pays it.\"},\"intervalHours\":{\"description\":\"The interval of the leg's latest settlement, in hours, read from the gap to the settlement before it (else the stored interval); null when none was readable. Never assumed 8.\",\"type\":[\"number\",\"null\"]},\"settlements\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Settlements read for the leg (the window plus a 2-day margin).\"},\"firstSettledAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"lastSettledAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"takerFee\":{\"type\":\"number\",\"x-unit\":\"fraction\",\"description\":\"The venue's standard perp taker fee per fill (src/engine/derive/venue-fees.ts).\"}},\"required\":[\"role\",\"venue\",\"contract\",\"contractSource\",\"side\",\"intervalHours\",\"settlements\",\"firstSettledAt\",\"lastSettledAt\",\"takerFee\"]},\"FundingSpreadHistoryPoint\":{\"type\":\"object\",\"properties\":{\"at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"A settlement instant of either leg.\"},\"spreadApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"The position's funding spread at `at`, annualized simply: Σ over the legs of ±(rate × 8,760 / interval hours), + for a short leg, − for a long leg. Each leg is read at the settlement whose interval covers `at` (legs aligned by time, never by index); null when a leg has no covering settlement (a gap, or its interval has not settled yet).\"},\"legAprs\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"description\":\"Each leg's own funding at `at`, annualized (rate × 8,760 / interval hours, the venue's sign), in `legs` order; null where the leg is uncovered.\"},\"cashflow\":{\"type\":\"number\",\"x-unit\":\"fraction\",\"description\":\"Funding the position received at `at` (fraction of one leg's notional, negative when paid): the settlements of the legs that settle at this instant.\"},\"cumulativeCarry\":{\"type\":\"number\",\"x-unit\":\"fraction\",\"description\":\"Running sum of `cashflow` from the start of the requested window's backtest; fees are not included.\"}},\"required\":[\"at\",\"spreadApr\",\"legAprs\",\"cashflow\",\"cumulativeCarry\"]},\"FundingSpreadBacktest\":{\"type\":\"object\",\"properties\":{\"days\":{\"type\":\"integer\",\"x-unit\":\"days\",\"description\":\"The window held: the last `days` days to `end`.\"},\"start\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Where the backtest starts: `end` − `days`, or later when a leg's history begins inside the window.\"},\"end\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"The latest instant every leg's funding is realised: the earliest of the legs' last settlements (`windowEnd`).\"},\"coveredDays\":{\"type\":\"number\",\"x-unit\":\"days\",\"description\":\"Days from `start` to `end`: the span the figures cover and annualize over.\"},\"complete\":{\"type\":\"boolean\",\"description\":\"Every leg has history from the window's start and its settlements price at least 90% of the covered span.\"},\"coverageRatio\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}],\"description\":\"The least-covered leg's share of the covered span its settlements price (Σ settlement interval ÷ span, at most 1). Missing settlements lower it; they are never read as zero funding.\"},\"fundingCollected\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Sum of the position's funding settlements in (start, end], fraction of one leg's notional; funding is paid at the settlement instant, so a settlement counts in full.\"},\"fees\":{\"type\":\"number\",\"x-unit\":\"fraction\",\"description\":\"Entry and exit taker fees, fraction of one leg's notional: 2 spot + 2 perp fills on the venue (spot-perp), 2 fills on each perp (cross-exchange). Same as `roundTripFees`.\"},\"netReturn\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"`fundingCollected − fees`.\"},\"grossApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"`fundingCollected × 365 / coveredDays`.\"},\"netApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"`netReturn × 365 / coveredDays`: fees are charged once, so short windows carry them heavily.\"},\"negativeCarryDays\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"24-hour periods, counted back from `end` (not UTC days), whose settlements summed below zero.\"},\"daysObserved\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Full 24-hour periods inside the covered span that held at least one settlement.\"},\"maxDrawdown\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Largest fall of cumulative funding from its running peak (starting at 0 at `start`), fraction of one leg's notional; fees excluded.\"},\"breakEvenDays\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"days\"},{\"type\":\"null\"}],\"description\":\"`fees` ÷ the realised average daily funding; null unless funding was positive.\"}},\"required\":[\"days\",\"start\",\"end\",\"coveredDays\",\"complete\",\"coverageRatio\",\"fundingCollected\",\"fees\",\"netReturn\",\"grossApr\",\"netApr\",\"negativeCarryDays\",\"daysObserved\",\"maxDrawdown\",\"breakEvenDays\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"mode\":\"mode\",\"coin\":\"coin\",\"venue\":\"venue\",\"contract\":\"contract\",\"direction\":\"direction\",\"longVenue\":\"long_venue\",\"longContract\":\"long_contract\",\"shortVenue\":\"short_venue\",\"shortContract\":\"short_contract\",\"days\":\"days\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"funding_rates_history\",\"freshness_sla_seconds\":600,\"behaviour\":[\"Every backtest nets its fees once: `netReturn = fundingCollected − fees`, `grossApr = fundingCollected × 365 / coveredDays`, `netApr = netReturn × 365 / coveredDays`, and `fees` equals `roundTripFees`.\",\"`series` is ascending inside the requested window's backtest, `cumulativeCarry` is the running sum of `cashflow`, and it ends at that backtest's `fundingCollected`.\",\"`backtests` lists the standard windows shorter than `days`, then `days`, ascending, each ending at `windowEnd`.\"],\"cli\":{\"command\":\"sharpe arb history\",\"options\":[\"mode\",\"coin\",\"venue\",\"contract\",\"direction\",\"longVenue\",\"longContract\",\"shortVenue\",\"shortContract\",\"days\"]}},{\"name\":\"get_arbitrage_futures_calendar_spread\",\"title\":\"Futures calendar spread scanner\",\"description\":\"Get near-versus-far dated futures calendar spread rows (adjacent pairs plus monthly/quarterly pairs at least 7 days apart) with executable forward yield (forwardYieldPct), the mark-or-mid reference forward yield that sets curve and direction (referenceForwardYieldPct, priceReference), and lock-in net roll APY after 4 futures + 2 spot taker fills (netRollApyPct, feesPct). Pairs with a near leg under 3 days or a gap under 7 days are belowTenorFloor and rank last; within the rest, executable pairs that clear their fees come first, then snapshot_quote pairs, then the rest. Rows carry nearDays, gapDays and indicativeReason when not executable.\",\"endpoint\":\"arbitrage-futures-calendar-spread\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/futures-calendar-spread\",\"public\":\"/api/arbitrage/futures-calendar-spread\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum of the board's ranking figure, in percentage points: `netAprPct` on the dated basis board, `netRollApyPct` on the calendar board, `netCarryAprPct` (the fee-adjusted annualized net carry, not the edge to expiry) on the perp-dated carry board, `netProfitPct` (per trip, not annualized) on the CEX transfer board.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its book depth (level 1 on the stored snapshot; on a live read a top-20 walk where level 1 is thin, the side then priced at that walk's VWAP), any reported open interest and its 24h volume are at least this notional (and its quotes are at most 10 minutes old). The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCalendarSpreadRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCalendarSpreadRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesCalendarSpreadRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"nearContract\":{\"type\":\"string\"},\"nearExpiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"farContract\":{\"type\":\"string\"},\"farExpiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"nearBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The near contract's reference price (mark, else book mid; never the last trade since 2026-09-30) against the venue's spot reference, percent.\"},\"farBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The far contract's reference price against the same spot reference, percent.\"},\"forwardYieldPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"Executable forward APR: (sell leg bid / buy leg ask − 1) × 365 / gapDays, percent, the legs chosen by `direction`.\"},\"curve\":{\"type\":\"string\",\"enum\":[\"Contango\",\"Backwardation\",\"Flat\"]},\"direction\":{\"type\":\"string\",\"enum\":[\"Buy Near / Sell Far\",\"Sell Near / Buy Far\"],\"description\":\"From the reference prices (mark, else mid): the far contract above the near one buys near and sells far.\"},\"netRollApyPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"Lock-in net APR: (executable spread − feesPct / 100) × 365 / gapDays × 100. May be negative.\"},\"minOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"minDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: both snapshots inside the freshness SLA; book depth behind both legs of at least notional (level 1 on a stored snapshot row, `depth_beyond_top_of_book` when thinner; on a live read a side thinner at level 1 than the default notional is walked 20 levels deep and priced at that walk's VWAP); a contango pair (a backwardated Sell Near / Buy Far lock-in needs a spot borrow: `backwardation_needs_borrow`); no reported open interest on the smaller leg below notional (unknown open interest does not demote); 24h volume on the thinner leg of at least notional; and quotes at most 10 minutes old (a live read). Otherwise \\\"indicative\\\" with `indicativeReason`: every figure is kept.\"},\"indicativeReason\":{\"description\":\"Why the row is indicative, the first failing check in this order: `stale_snapshot` (past the term-structure SLA), `no_perp_book` (carry: the perp has no bid/ask for its own contract), `no_depth`, `depth_below_notional` (the top-20 book walked is thinner than the notional), `depth_beyond_top_of_book` (the depth known is level 1 only and thinner than the notional: the rest would fill beyond the quote the row is priced at), `oi_below_notional`, `no_volume` (no 24h volume, or less than the notional), `backwardation_needs_borrow` (basis: a negative basis, and calendar: a backwardated Sell Near / Buy Far lock-in; the reverse trade needs a spot borrow the board does not price), `snapshot_quote` (every other check passes but the quotes are older than 10 minutes: executable on a live read). Null when executable. Absent on answers before 2026-09-30.\",\"anyOf\":[{\"type\":\"string\",\"enum\":[\"stale_snapshot\",\"no_perp_book\",\"no_depth\",\"depth_below_notional\",\"depth_beyond_top_of_book\",\"oi_below_notional\",\"no_volume\",\"backwardation_needs_borrow\",\"snapshot_quote\"]},{\"type\":\"null\"}]},\"nearDays\":{\"description\":\"Fractional days from the request to the near expiry.\",\"type\":\"number\",\"x-unit\":\"days\"},\"gapDays\":{\"description\":\"Fractional days between the two expiries: the annualization denominator.\",\"type\":\"number\",\"x-unit\":\"days\"},\"belowTenorFloor\":{\"description\":\"The near leg is under 3 days from expiry or the legs expire under 7 days apart: served, ranked after every pair meeting both floors.\",\"type\":\"boolean\"},\"referenceForwardYieldPct\":{\"description\":\"Reference forward APR, (F_far / F_near − 1) × 365 / gapDays on mark (else mid) prices, percent: it sets `curve` and `direction`.\",\"type\":\"number\",\"x-unit\":\"percent\"},\"priceReference\":{\"description\":\"What the reference prices are: `mark` when the venue reported a mark price for both legs, else `mid` (book mid on at least one leg).\",\"type\":\"string\",\"enum\":[\"mark\",\"mid\"]},\"feesPct\":{\"description\":\"Lock-in round-trip fees: 4 dated-futures and 2 spot taker fills at the venue's standard fees, percent, not annualized.\",\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"exchange\",\"nearContract\",\"nearExpiry\",\"farContract\",\"farExpiry\",\"nearBasisPct\",\"farBasisPct\",\"forwardYieldPct\",\"curve\",\"direction\",\"netRollApyPct\",\"minOpenInterestUsd\",\"minDepthUsd\",\"executionStatus\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"CexTransferScan\":{\"type\":\"object\",\"properties\":{\"coinsScanned\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"scannedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"venuesAnswering\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Selected venues that returned at least one order book and one transfer network.\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"not_live\",\"no_books\",\"no_networks\",\"failed\"],\"description\":\"not_live: the venue's public spot ticker shows no live book (left out of coverage); failed/no_books/no_networks make the answer degraded.\"}},\"required\":[\"exchange\",\"status\"]}},\"routesEvaluated\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Directed (coin, buy venue, sell venue) routes with a computed net: both books fill the notional on one common open network.\"},\"routesProfitable\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Evaluated routes netting above zero after fees.\"},\"bestNetPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Best net profit over evaluated routes, percent of the notional; null when none was evaluated.\"}},\"required\":[\"coinsScanned\",\"scannedCoins\",\"venuesAnswering\",\"venues\",\"routesEvaluated\",\"routesProfitable\",\"bestNetPct\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":[\"arbitrage_dated_quotes\",\"futures_term_structure\"],\"freshness_sla_seconds\":600,\"behaviour\":[\"Pairs meeting the tenor floors rank first (`belowTenorFloor` pairs last); within each group executable pairs with a positive `netRollApyPct`, then `snapshot_quote` pairs with a positive one, then every other pair, each by `netRollApyPct`, highest first; `rank` numbers that order from 1.\",\"An `executable` pair has both legs fresh, `minDepthUsd` known and at least `notional`, the smaller leg's reported open interest (`minOpenInterestUsd`), if any, at least `notional`, and no `indicativeReason`; an `indicative` pair names its reason, and a pair failing any of those rules is indicative.\",\"Each row pairs a nearer contract with a later-expiring one.\",\"`netRollApyPct` is `forwardYieldPct` less annualized round-trip fees, so it is never above it.\"],\"cli\":{\"command\":\"sharpe arb calendar-spread\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_perp_dated_carry\",\"title\":\"Perp versus dated futures carry scanner\",\"description\":\"Get perp funding versus dated futures carry rows: the dated contract's basis against the PERP (not spot) at the chosen trade's executable sides (datedBasisPct), against the funding the perp is expected to pay to expiry (expectedFundingToExpiryPct: the 7-day realised average over the settlements left, the current print under 3 days; fundingProjection says which), ranked by fee-adjusted annualized net carry (netCarryAprPct, which minApr filters). Rows carry direction (Long perp / Short dated or Short perp / Long dated), crossVenue (the legs are usually on two venues: separate accounts and collateral), currentFundingAprPct, funding7dAprPct, funding7dCumulativePct (funding7dStabilityPct is its deprecated alias), fundingIntervalHours, fundingSettlementsToExpiry, datedLegPrice / perpLegPrice, feesPct, nearExpiry (under 3 days: ranked last) and indicativeReason when not executable (snapshot_quote = executable only on a live read).\",\"endpoint\":\"arbitrage-perp-dated-carry\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/perp-dated-carry\",\"public\":\"/api/arbitrage/perp-dated-carry\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Optional base coin ticker, for example BTC, ETH, or SOL.\",\"type\":\"string\",\"minLength\":1},\"exchanges\":{\"description\":\"Comma-separated exchange filter, for example Binance,Bybit,OKX.\",\"type\":\"string\"},\"minApr\":{\"description\":\"Minimum of the board's ranking figure, in percentage points: `netAprPct` on the dated basis board, `netRollApyPct` on the calendar board, `netCarryAprPct` (the fee-adjusted annualized net carry, not the edge to expiry) on the perp-dated carry board, `netProfitPct` (per trip, not annualized) on the CEX transfer board.\",\"type\":\"number\"},\"minOiUsd\":{\"description\":\"Minimum open interest in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeUsd\":{\"description\":\"Minimum 24h futures or spot volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minDepthUsd\":{\"description\":\"Minimum executable depth in USD when available.\",\"type\":\"number\",\"minimum\":0},\"marginType\":{\"description\":\"Futures margin filter.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\",\"both\"]},\"notional\":{\"default\":10000,\"description\":\"Position notional in USD. On the dated-futures basis, calendar-spread and perp-dated carry scanners a row is executable only when its book depth (level 1 on the stored snapshot; on a live read a top-20 walk where level 1 is thin, the side then priced at that walk's VWAP), any reported open interest and its 24h volume are at least this notional (and its quotes are at most 10 minutes old). The CEX spot transfer scanner sizes its order-book fills with it.\",\"type\":\"number\",\"exclusiveMinimum\":0,\"maximum\":1000000000},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PerpDatedCarryRow\"}},\"scannerMeta\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"scannerMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PerpDatedCarryRow\"}},\"meta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"data\",\"meta\",\"pagination\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PerpDatedCarryRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"coin\":{\"type\":\"string\"},\"perpVenue\":{\"type\":\"string\"},\"datedVenue\":{\"type\":\"string\"},\"datedContract\":{\"type\":\"string\"},\"expiry\":{\"type\":\"string\",\"format\":\"date-time\"},\"days\":{\"type\":\"number\",\"x-unit\":\"days\"},\"perpFundingAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The perp's current funding print annualized (rate × 8,760 / interval), percent. Same number as `currentFundingAprPct`.\"},\"expectedFundingToExpiryPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"Funding the perp is expected to pay to expiry, percent: the projected rate (`fundingProjection`) per settlement × `fundingSettlementsToExpiry` (was the current print × days / 365 until 2026-09-30).\"},\"datedBasisPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The dated contract's basis against the PERP at the chosen trade's executable sides, percent: (F_bid / P_ask − 1) when shorting the dated leg, (F_ask / P_bid − 1) when buying it; on mark/last prices when the perp has no book (against spot until 2026-09-30).\"},\"carryEdgePct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"`expectedFundingToExpiryPct − datedBasisPct`, percent: positive when collecting funding on a short perp beats the basis paid on the long dated leg.\"},\"netCarryEdgePct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The chosen trade's edge to expiry less `feesPct`: `carryEdgePct − feesPct` for Perp Carry, `−carryEdgePct − feesPct` for Dated Cash-and-Carry. May be negative.\"},\"grossCarryAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\",\"description\":\"The chosen trade's edge before fees, annualized over `days`. May be negative when the book spread exceeds the edge.\"},\"netCarryAprPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"bestLeg\":{\"type\":\"string\",\"enum\":[\"Perp Carry\",\"Dated Cash-and-Carry\"],\"description\":\"The trade with the larger edge: Perp Carry = short perp / long dated (collect funding), Dated Cash-and-Carry = long perp / short dated (keep the basis).\"},\"nextFunding\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"funding7dStabilityPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Deprecated alias of `funding7dCumulativePct`: the 7-day cumulative funding, not a stability measure.\",\"deprecated\":true},\"executableDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"The smaller book depth on the two sides the trade hits: the dated contract's and the perp's own contract. Null when either is unknown (a perp with no book).\"},\"minOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiDepthUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Legacy compatibility metric. Use executableDepthUsd and minOpenInterestUsd.\",\"deprecated\":true},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"Whether the row can be traded at the requested notional on the figures shown. \\\"executable\\\" needs all of: both legs inside the freshness SLA; a book for the perp's own contract; depth on the dated side and the perp side the trade hits of at least notional (the perp's ticker level 1, and the dated side's level 1 on a stored snapshot row: `depth_beyond_top_of_book` when thinner; on a live read a thin dated side is walked 20 levels deep and priced at that walk's VWAP); no reported open interest on the smaller leg below notional (unknown open interest does not demote); the dated contract's 24h volume of at least notional; and every quote at most 10 minutes old. Otherwise \\\"indicative\\\" with `indicativeReason`: every figure is kept.\"},\"indicativeReason\":{\"description\":\"Why the row is indicative, the first failing check in this order: `stale_snapshot` (past the term-structure SLA), `no_perp_book` (carry: the perp has no bid/ask for its own contract), `no_depth`, `depth_below_notional` (the top-20 book walked is thinner than the notional), `depth_beyond_top_of_book` (the depth known is level 1 only and thinner than the notional: the rest would fill beyond the quote the row is priced at), `oi_below_notional`, `no_volume` (no 24h volume, or less than the notional), `backwardation_needs_borrow` (basis: a negative basis, and calendar: a backwardated Sell Near / Buy Far lock-in; the reverse trade needs a spot borrow the board does not price), `snapshot_quote` (every other check passes but the quotes are older than 10 minutes: executable on a live read). Null when executable. Absent on answers before 2026-09-30.\",\"anyOf\":[{\"type\":\"string\",\"enum\":[\"stale_snapshot\",\"no_perp_book\",\"no_depth\",\"depth_below_notional\",\"depth_beyond_top_of_book\",\"oi_below_notional\",\"no_volume\",\"backwardation_needs_borrow\",\"snapshot_quote\"]},{\"type\":\"null\"}]},\"direction\":{\"description\":\"The trade the row prices, the same choice as `bestLeg`: which leg is shorted.\",\"type\":\"string\",\"enum\":[\"Long perp / Short dated\",\"Short perp / Long dated\"]},\"crossVenue\":{\"description\":\"The perp and the dated contract trade on different venues: two accounts, each collateralized separately; the board does not price the transfer between them.\",\"type\":\"boolean\"},\"nearExpiry\":{\"description\":\"Under 3 days to expiry: served, ranked after every row at least 3 days out; the projection then uses the current print.\",\"type\":\"boolean\"},\"currentFundingAprPct\":{\"description\":\"The current funding print annualized (rate × 8,760 / interval), percent.\",\"type\":\"number\",\"x-unit\":\"percent\"},\"funding7dAprPct\":{\"description\":\"The 7-day realised funding annualized (acc_7d × 365 / 7), percent; null when the 7-day sum is unknown or the matview is past its freshness SLA.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"funding7dCumulativePct\":{\"description\":\"The 7-day cumulative funding (acc_7d × 100), percent.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingProjection\":{\"description\":\"The rate `expectedFundingToExpiryPct` projects: the 7-day realised average, or the current print (under 3 days to expiry, or no current 7-day sum).\",\"type\":\"string\",\"enum\":[\"7d_average\",\"current_print\"]},\"fundingIntervalHours\":{\"description\":\"The perp's settlement interval in hours (1, 2, 4, 8, …): the current print is per this many hours.\",\"type\":\"number\"},\"fundingSettlementsToExpiry\":{\"description\":\"Funding settlements between the request and expiry on the perp's own grid (a settlement at the expiry instant counts).\",\"type\":\"integer\",\"x-unit\":\"count\"},\"datedLegPrice\":{\"description\":\"The dated price the basis uses: its bid when shorting it, its ask when buying it (mark or mid without a book).\",\"type\":\"number\",\"x-unit\":\"usd\"},\"perpLegPrice\":{\"description\":\"The perp price the basis uses: its ask when buying it, its bid when shorting it; null when the perp has no book.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"feesPct\":{\"description\":\"Round-trip fees: 2 perp and 2 dated-futures taker fills at each venue's standard fee, percent, not annualized.\",\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"The oldest input the row is priced on: the dated snapshot, the funding row, the perp quote.\"},\"isStale\":{\"type\":\"boolean\"}},\"required\":[\"rank\",\"coin\",\"perpVenue\",\"datedVenue\",\"datedContract\",\"expiry\",\"days\",\"perpFundingAprPct\",\"expectedFundingToExpiryPct\",\"datedBasisPct\",\"carryEdgePct\",\"netCarryEdgePct\",\"grossCarryAprPct\",\"netCarryAprPct\",\"bestLeg\",\"nextFunding\",\"funding7dStabilityPct\",\"executableDepthUsd\",\"minOpenInterestUsd\",\"oiDepthUsd\",\"executionStatus\",\"updatedAt\",\"isStale\"]},\"ScannerMeta\":{\"type\":\"object\",\"properties\":{\"kind\":{\"type\":\"string\",\"enum\":[\"dated-futures-basis\",\"futures-calendar-spread\",\"perp-dated-carry\",\"cex-spot-transfer\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"unavailable\"]},\"generatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\",\"description\":\"True when `updatedAt` is older than `freshnessSlaSeconds`. Each row carries its own `isStale` by the same threshold.\"},\"freshnessSlaSeconds\":{\"type\":\"integer\",\"description\":\"Seconds a row's snapshot stays fresh: 7,200 on the dated basis, calendar and carry boards (the term-structure SLA; the envelope's `freshness_sla_seconds` is 7,200 when the hourly term structure answered and 600 when the 5-minute dated-quotes snapshot did, its `dataset_id` says which), 60 on the CEX transfer board (its order books, the envelope's `freshness_sla_seconds`; transfer networks are judged on 10 minutes per row).\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"],\"description\":\"Where the board's rows came from: the stored hourly term-structure snapshot, a stored snapshot past its SLA, the venues read live (on request, or by the 5-minute dated-quotes snapshot the arbitrage-boards cron writes: then the envelope's `dataset_id` is `arbitrage_dated_quotes` and `served_from` is `snapshot`; always `live` on the CEX transfer board), or nothing. The upstream source ids are in the X-Data-Source header.\"},\"notionalUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"supportedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The coins the board covers: the supported basis coins on the dated boards; the coins the scan fetched on the CEX transfer board.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"transferScan\":{\"$ref\":\"#/definitions/CexTransferScan\"}},\"required\":[\"kind\",\"status\",\"generatedAt\",\"updatedAt\",\"stale\",\"freshnessSlaSeconds\",\"source\",\"notionalUsd\",\"rowCount\",\"supportedCoins\",\"warnings\"]},\"CexTransferScan\":{\"type\":\"object\",\"properties\":{\"coinsScanned\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"scannedCoins\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"venuesAnswering\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Selected venues that returned at least one order book and one transfer network.\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"not_live\",\"no_books\",\"no_networks\",\"failed\"],\"description\":\"not_live: the venue's public spot ticker shows no live book (left out of coverage); failed/no_books/no_networks make the answer degraded.\"}},\"required\":[\"exchange\",\"status\"]}},\"routesEvaluated\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Directed (coin, buy venue, sell venue) routes with a computed net: both books fill the notional on one common open network.\"},\"routesProfitable\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Evaluated routes netting above zero after fees.\"},\"bestNetPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Best net profit over evaluated routes, percent of the notional; null when none was evaluated.\"}},\"required\":[\"coinsScanned\",\"scannedCoins\",\"venuesAnswering\",\"venues\",\"routesEvaluated\",\"routesProfitable\",\"bestNetPct\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"The free route answers `{ data, meta, pagination }` at the top level (rows, scanner meta, page); v1 wraps the same three objects as `data: { rows, scannerMeta, pagination }` in its success envelope (src/engine/serve/models/arbitrage/scanners.ts publicScannerBody vs v1ScannerData).\",\"public_params\":null,\"python_params\":{\"coin\":\"coin\",\"exchanges\":\"exchanges\",\"minApr\":\"min_apr\",\"minOiUsd\":\"min_oi_usd\",\"minVolumeUsd\":\"min_volume_usd\",\"minDepthUsd\":\"min_depth_usd\",\"marginType\":\"margin_type\",\"notional\":\"notional\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":[\"arbitrage_dated_quotes\",\"futures_term_structure\"],\"freshness_sla_seconds\":600,\"behaviour\":[\"Rows at least 3 days from expiry rank first (`nearExpiry` rows last); within each group executable rows, then `snapshot_quote` rows, then the other indicative rows, each by fee-adjusted annualized net carry (`netCarryAprPct`), highest first; `rank` numbers that order from 1.\",\"An `executable` row has both legs fresh, `executableDepthUsd` known and at least `notional`, `minOpenInterestUsd`, if reported, at least `notional`, and no `indicativeReason`; an `indicative` row names its reason, and a row failing any of those rules is indicative.\",\"`bestLeg` is the trade with the larger edge and agrees with `direction`: Perp Carry is short perp / long dated and nets `carryEdgePct − feesPct`; Dated Cash-and-Carry is long perp / short dated and nets `−carryEdgePct − feesPct` (`netCarryEdgePct`).\",\"`expectedFundingToExpiryPct` is the projected rate (`fundingProjection`: `funding7dAprPct` or `currentFundingAprPct`) over `fundingSettlementsToExpiry` settlements of `fundingIntervalHours`; `carryEdgePct = expectedFundingToExpiryPct − datedBasisPct` and `netCarryAprPct = netCarryEdgePct × 365 / days`.\",\"`meta.rowCount` is the number of rows across every page, the same figure as `pagination.total`.\"],\"cli\":{\"command\":\"sharpe arb perp-dated\",\"options\":[\"coin\",\"exchanges\",\"minApr\",\"minOiUsd\",\"minVolumeUsd\",\"minDepthUsd\",\"marginType\",\"notional\",\"limit\"]}},{\"name\":\"get_arbitrage_spot_perp\",\"title\":\"Spot-perp arbitrage\",\"description\":\"Get spot-perpetual funding-capture rows with live funding, verified spot or margin availability, diagnostic basis, gross APR, and net APR after the venue's taker fees, the adverse entry basis and a known borrow cost, in the board's order (executable rows first by net APR, then the rest by net APR or gross APR). Each row carries perpSymbol, perpOpenInterestUsd, fundingIsStale, executionStatus with indicativeReason (unpriced, price_gap, identity_mismatch, stale_quote, borrow_unpriced), pairStatus, breakEvenDays, requiresBorrow / borrowCostIncluded, apr7d / carrySignFlip7d (the 7-day carry against the current direction), fundingAsOf and per-leg price times. minOiUsd floors the perp leg's open interest (unknown fails a positive floor); limit / cursor page the board (the MCP tools ask for a 100-row page unless given either: the whole board is ~2.4 MB).\",\"endpoint\":\"arbitrage-spot-perp\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/arbitrage/spot-perp\",\"public\":\"/api/arbitrage/spot-perp\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"default\":\"all\",\"description\":\"Filter by exchange name, or \\\"all\\\" for all exchanges.\",\"type\":\"string\"},\"direction\":{\"default\":\"all\",\"description\":\"Filter by perpetual-leg direction: short for positive funding capture, long for negative funding capture.\",\"type\":\"string\",\"enum\":[\"all\",\"long\",\"short\"]},\"minOiUsd\":{\"default\":0,\"description\":\"Minimum open interest in USD on the perpetual leg (`perpOpenInterestUsd`). Default 0 (no floor). A row whose open interest is unknown fails a positive floor.\",\"type\":\"number\",\"minimum\":0},\"limit\":{\"description\":\"Rows per page (1-1000), in board order. Omitted with no `cursor`: every row. On v1 a paged answer carries `pagination`.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque cursor from the previous page's `pagination.cursor` (100 rows a page when `limit` is omitted).\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SpotPerpOpportunity\"}},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SpotPerpOpportunity\"}}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"SpotPerpOpportunity\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"fundingRate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\",\"description\":\"Funding rate as a decimal fraction per settlement interval.\"},\"cumRate7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"apr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"Annualized funding return as a decimal fraction (0.30 = 30%).\"},\"basisRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Spot/perpetual basis as a decimal fraction (0.001 = 0.1%).\"},\"netApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Annualized return after one-time costs, a decimal fraction (0.30 = 30%): `apr` − (2 spot + 2 perp taker fills at the venue's fee + the adverse entry basis at the quoted sides) × 365 / 30 − the base coin's borrow APR on a sell-spot row when it is known. A favourable entry basis is never credited. Null when a leg is unpriced (`pairStatus` `unpriced`) or the spot and perp prices are more than 20% apart (larger / smaller − 1 > 0.20: two instruments under one ticker).\"},\"intervalHours\":{\"type\":\"number\"},\"direction\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]},\"portfolio\":{\"type\":\"object\",\"properties\":{\"spotSide\":{\"type\":\"string\",\"enum\":[\"buy\",\"sell\"]},\"perpSide\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]}},\"required\":[\"spotSide\",\"perpSide\"]},\"nextFundingTime\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"perpSymbol\":{\"type\":\"string\",\"description\":\"The venue's perpetual contract the row trades (its own symbol, e.g. `1000PEPEUSDT`).\"},\"perpOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest of that perpetual in USD: the venue ticker's figure, else the latest stored open interest of the contract (at most ~10 minutes old). `null` when neither is known, never 0.\"},\"fundingIsStale\":{\"type\":\"boolean\",\"description\":\"`true` when `fundingAsOf` is older than the funding book's 10-minute freshness SLA at the time of the request.\"},\"executionStatus\":{\"type\":\"string\",\"enum\":[\"executable\",\"indicative\"],\"description\":\"`executable` when both legs are priced, they are one instrument within 5% of each other (the spot price against the perp's index, else mark, else last price, per asset unit), a sell-spot row's borrow rate is known and in `netApr`, and both quotes are within the board's 10-minute SLA at the time of the request; `indicative` otherwise, with `indicativeReason`: its figures stand, but it is not a verified trade.\"},\"pairStatus\":{\"type\":\"string\",\"enum\":[\"eligible\",\"unpriced\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\"],\"description\":\"Whether the spot and perpetual legs are one instrument: `eligible`, `unpriced` when either leg has no price to check, else the first check that failed: `identity_mismatch` (the instrument master places the legs on different assets), `price_gap` (prices more than 20% apart).\"},\"fundingAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the funding rate behind the row was written; `null` when unknown.\"},\"pricesAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the older of the spot and perpetual prices behind `basisRate` was read; `null` when the row has neither price.\"},\"indicativeReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"unpriced\",\"identity_mismatch\",\"not_live\",\"contract_type\",\"margin_type\",\"price_gap\",\"stale_quote\",\"borrow_unpriced\"]},{\"type\":\"null\"}],\"description\":\"Why the row is `indicative`; `null` when executable. `price_gap`: the legs are 5-20% apart (a net APR is still computed) or more than 20% (none); `stale_quote`: a leg's quote is older than the board's 10-minute SLA at the time of the request; `borrow_unpriced`: a sell-spot / long-perp row whose borrow rate the venue does not publish (`netApr` excludes that interest, so the row ranks after executable rows).\"},\"entryBasisRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"The entry basis at the quoted sides, positive when favourable: buy spot / short perp (perp bid − spot) / spot; sell spot / long perp (spot − perp ask) / perp ask. Spot is the venue's last trade; perp prices per asset unit. Only a negative value is charged in `netApr`.\"},\"roundTripFeeRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Two spot and two perpetual taker fills at the venue's standard (VIP 0) fee, a decimal fraction of notional.\"},\"breakEvenDays\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"days\"},{\"type\":\"null\"}],\"description\":\"Days of carry that pay back the one-time costs: (fees + adverse entry basis) ÷ ((`apr` − `borrowApr`) / 365). `null` without a `netApr`.\"},\"requiresBorrow\":{\"type\":\"boolean\",\"description\":\"`true` on a sell-spot / long-perp row: the base coin must be borrowed on margin.\"},\"borrowCostIncluded\":{\"type\":\"boolean\",\"description\":\"`true` when the borrow interest is subtracted from `netApr` (the venue publishes the rate); `false` when the row needs a borrow whose rate is unknown (`netApr` then overstates the carry by that interest, and the row is `indicative` `borrow_unpriced`), and on rows that need none.\"},\"borrowApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"The borrow interest subtracted from `netApr`, a decimal fraction per year; `null` when none is.\"},\"apr7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"What the last 7 days of settlements paid this row's direction, annualized: `cumRate7d` × 365 / 7, sign flipped for a long-perp row. Negative when the 7-day carry ran against the direction; `null` without `cumRate7d`.\"},\"carrySignFlip7d\":{\"description\":\"`true` when `apr7d` is negative: the current rate's direction lost money over the last 7 days. The board still ranks on the current rate.\",\"type\":[\"boolean\",\"null\"]},\"perpLotMultiplier\":{\"description\":\"Asset units per perpetual contract unit (1000 for `1000PEPEUSDT`, whose row `symbol` is PEPE); `null` when the instrument master does not know the contract.\",\"type\":[\"number\",\"null\"]},\"spotPriceAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the spot price was read; `null` without one.\"},\"perpPriceAsOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"When the venue's perpetual ticker was read; `null` without a perp price.\"}},\"required\":[\"symbol\",\"exchange\",\"fundingRate\",\"cumRate7d\",\"apr\",\"basisRate\",\"netApr\",\"intervalHours\",\"direction\",\"portfolio\",\"nextFundingTime\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"exchange\",\"direction\",\"minOiUsd\",\"limit\",\"cursor\",\"view\"],\"python_params\":{\"exchange\":\"exchange\",\"direction\":\"direction\",\"minOiUsd\":\"min_oi_usd\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"arbitrage_boards\",\"freshness_sla_seconds\":600,\"behaviour\":[\"`executable` rows rank first by `netApr`, highest first; `indicative` rows follow by `netApr` where they have one, else gross `apr`, highest first.\",\"`direction` is `short` (buy spot, short perp) when the funding rate is ≥ 0 and `long` (sell spot, long perp) when it is negative.\",\"`apr` annualizes the funding rate over the row's own `intervalHours` (|fundingRate| × 8760 / intervalHours), never an assumed 8 hours.\",\"A row whose spot and perp last prices are more than 20% apart (1 + `basisRate` above 1.2 or below 1 / 1.2) has `netApr: null`, and so does every `unpriced` row; every `executable` row has a `netApr`.\",\"`exchange` keeps only that venue's rows.\",\"`direction=long` keeps only negative-funding rows (sell spot, long perp).\"],\"cli\":{\"command\":\"sharpe arb spot-perp\",\"options\":[\"exchange\",\"direction\"]}},{\"name\":\"get_correlation_matrix\",\"title\":\"Correlation matrix\",\"description\":\"Get a price correlation matrix for crypto and supported TradFi assets over a specified calendar period. Useful for portfolio analysis and diversification.\",\"endpoint\":\"correlation-matrix\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/correlation/matrix\",\"public\":\"/api/correlation/matrix\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"period\":{\"default\":\"30d\",\"description\":\"Lookback period for correlation calculation.\",\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"ids\":{\"description\":\"Comma-separated asset ids: CoinGecko ids for crypto (e.g. bitcoin) and short ids for TradFi (e.g. sp500, gold). Maximum 10. If omitted, returns the default set. Ids no source recognises are listed in an optional `unresolved` array (partial success, as on the free route); a selection none of whose ids is recognised returns 404 resource_not_found naming them.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/CorrelationMatrixData\"},{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CorrelationAsset\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]}}},\"dataPoints\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":\"number\",\"x-unit\":\"count\"}}},\"period\":{\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Requested ids no source recognises (no TradFi config, coin metadata, CoinGecko row or stored returns). Present only when non-empty; each still gets a row and column, with null correlations.\"},\"_debug\":{\"type\":\"object\",\"properties\":{\"assetCounts\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"earliest\":{\"type\":\"string\"},\"latest\":{\"type\":\"string\"}},\"required\":[\"count\"]}},\"totalRows\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"cutoff\":{\"type\":\"string\",\"format\":\"date\"}},\"required\":[\"assetCounts\",\"totalRows\",\"cutoff\"],\"description\":\"Present only with `debug=1`: stored return rows per asset and the window's first date.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"assets\",\"matrix\",\"dataPoints\",\"period\",\"computedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"CorrelationMatrixData\":{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CorrelationAsset\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]}}},\"dataPoints\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":\"number\",\"x-unit\":\"count\"}}},\"period\":{\"type\":\"string\",\"enum\":[\"30d\",\"90d\",\"1y\",\"3y\"]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"unresolved\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Requested ids no source recognises (no TradFi config, coin metadata, CoinGecko row or stored returns). Present only when non-empty; each still gets a row and column, with null correlations.\"}},\"required\":[\"assets\",\"matrix\",\"dataPoints\",\"period\",\"computedAt\"]},\"CorrelationAsset\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"crypto\",\"tradfi\"]},\"logoUrl\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"symbol\",\"type\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"v1's payload plus `_debug` with `debug=1` (both read the correlation read model, src/engine/serve/models/research/correlation.ts).\",\"public_params\":[\"period\",\"ids\",\"debug\"],\"python_params\":{\"period\":\"period\",\"ids\":\"ids\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"correlation_prices\",\"freshness_sla_seconds\":172800,\"behaviour\":[\"The matrix is square over `assets` and symmetric; the diagonal is 1 for an asset with stored returns and null for one without.\",\"Without `ids`, the default set is bitcoin, ethereum, solana, sp500 and gold.\",\"`ids` returns exactly the requested assets, in the order asked.\"],\"cli\":{\"command\":\"sharpe correlation\",\"options\":[\"period\",\"ids\"]}},{\"name\":\"get_derivatives_overview\",\"title\":\"Market-wide derivatives overview\",\"description\":\"Get a derivatives market overview including aggregated open interest, 8-hour-equivalent funding rates, top coins by open interest (each top_coins_oi entry is an asset, its lot spellings included), and exchange/coin counts. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"market-derivatives-overview\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/market/derivatives-overview\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/DerivativesOverview\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"DerivativesOverview\":{\"type\":\"object\",\"properties\":{\"total_oi_usd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\",\"description\":\"The market-wide open interest GET /v1/global/overview publishes (metrics.openInterestUsd): one-sided USD over every crypto asset holding at least $100K plus the RWA perps, venues in oi_excluded_venues left out.\"},\"avg_funding_rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\",\"description\":\"Simple mean of the 8-hour-equivalent rate over each (venue, asset) primary contract with a fresh rate.\"},\"oi_weighted_funding_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The same primaries' rates, each weighted by its own contract's one-sided open interest. `null` when no primary carries open interest (nothing to weight by), never the simple mean.\"},\"top_coins_oi\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\",\"description\":\"The asset's symbol. Every contract of the asset counts once, lot spellings included (PEPE sums Binance and Bybit 1000PEPEUSDT and Hyperliquid kPEPE); two assets sharing a ticker are two entries (CAT the stock, CAT the coin). While the instrument master is unavailable, the stored base coin.\"},\"open_interest_usd\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"coin\",\"open_interest_usd\",\"exchange_count\"]}},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"coin_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues left out of total_oi_usd, top_coins_oi and the open-interest funding weights, with the reason.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"total_oi_usd\",\"avg_funding_rate\",\"oi_weighted_funding_rate\",\"top_coins_oi\",\"exchange_count\",\"coin_count\",\"oi_excluded_venues\",\"updated_at\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":[\"futures_open_interest\",\"funding_rates_current\"],\"freshness_sla_seconds\":600,\"behaviour\":[],\"cli\":{\"command\":\"sharpe derivatives\",\"options\":[]}},{\"name\":\"get_ecosystems\",\"title\":\"Ecosystems data\",\"description\":\"Get ecosystem-level market data (Ethereum, Solana, BNB, Arbitrum, Base, etc.) including market cap, volume, TVL, and performance metrics.\",\"endpoint\":\"ecosystems-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/ecosystems/data\",\"public\":\"/api/ecosystems/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"ecosystem\":{\"description\":\"Ecosystem to return detail for: the config id (e.g. bnb) or the URL slug (e.g. bnb-chain, ethereum, solana). An unknown value returns 400 invalid_parameter listing the valid values.\",\"type\":\"string\"},\"correlation\":{\"description\":\"Set to \\\"true\\\" to include correlation data.\",\"type\":\"string\"},\"timeframe\":{\"description\":\"Timeframe for correlation data.\",\"type\":\"string\"},\"excludeNative\":{\"description\":\"Set to \\\"true\\\" to exclude the native token from aggregated metrics.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/EcosystemOverviewPayload\"},{\"$ref\":\"#/definitions/EcosystemDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"}]},{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, each token counted in its home ecosystem only: the denominator of `dominance`.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"home-chain-constituents\",\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` and the rows' `marketCap` are computed. `home-chain-constituents` (since 2026-09-30): a token CoinGecko files under several ecosystems counts only in its home ecosystem (its native chain, else CoinGecko's primary asset platform). `deduplicated-fetched-coins`: the earlier method, where a multichain token counted in full in every ecosystem that listed it.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-home-chain-market-caps` after a complete sync (`share-of-overlapping-ecosystem-exposures` before 2026-09-30). A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, each token counted in its home ecosystem only: the denominator of `dominance`.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"home-chain-constituents\",\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` and the rows' `marketCap` are computed. `home-chain-constituents` (since 2026-09-30): a token CoinGecko files under several ecosystems counts only in its home ecosystem (its native chain, else CoinGecko's primary asset platform). `deduplicated-fetched-coins`: the earlier method, where a multichain token counted in full in every ecosystem that listed it.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-home-chain-market-caps` after a complete sync (`share-of-overlapping-ecosystem-exposures` before 2026-09-30). A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"ecosystem_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"funding_rate\":{\"type\":[\"number\",\"null\"]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"coin_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]}},\"required\":[\"ecosystem_id\",\"snapshot_at\",\"market_cap\",\"volume_24h\",\"open_interest\",\"funding_rate\",\"tvl\",\"coin_count\"]}},\"series\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"ecosystem_id\":{\"type\":\"string\"},\"data\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}}},\"required\":[\"ecosystem_id\",\"data\"]}},\"seriesMetric\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"market_cap\",\"volume_24h\",\"open_interest\",\"tvl\"]},{\"type\":\"null\"}]},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"windowSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"windowSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\",\"series\",\"seriesMetric\",\"coverage\"],\"description\":\"History mode (`historical` or `tvl=true`): a compact `[epoch ms, value]` series per ecosystem when `chart` names a series metric, otherwise the raw hourly snapshot rows.\"},{\"type\":\"object\",\"properties\":{\"mindshareSnapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"mindshare_pct\"]}},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"mindshareSnapshots\",\"coverage\"]}]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"EcosystemOverviewPayload\":{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, each token counted in its home ecosystem only: the denominator of `dominance`.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"home-chain-constituents\",\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` and the rows' `marketCap` are computed. `home-chain-constituents` (since 2026-09-30): a token CoinGecko files under several ecosystems counts only in its home ecosystem (its native chain, else CoinGecko's primary asset platform). `deduplicated-fetched-coins`: the earlier method, where a multichain token counted in full in every ecosystem that listed it.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-home-chain-market-caps` after a complete sync (`share-of-overlapping-ecosystem-exposures` before 2026-09-30). A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\"]},\"EcosystemMarketRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest across every venue, summed over the constituents' assets (each once).\"},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"mcapFdvRatio\":{\"type\":[\"number\",\"null\"]},\"volMcapRatio\":{\"type\":[\"number\",\"null\"]},\"oiMcapRatio\":{\"type\":[\"number\",\"null\"]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/EcosystemTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Sentiment percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"mindsharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Mindshare percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"watchlistUsers\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Watchlist users merged from the mindshare sync, or null when there is no measurement (never 0 as a stand-in).\"}},\"required\":[\"id\",\"name\",\"slug\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"median1h\",\"median24h\",\"median7d\",\"median30d\",\"median200d\",\"median1y\",\"marketCap\",\"volume24h\",\"openInterest\",\"fundingRate\",\"mcapFdvRatio\",\"volMcapRatio\",\"oiMcapRatio\",\"tvl\",\"topCoin\",\"coinCount\",\"dominance\",\"momentum\",\"sentimentPct\",\"mindsharePct\",\"watchlistUsers\"]},\"EcosystemTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"CategoryBasePrices\":{\"type\":\"object\",\"properties\":{\"btc\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"eth\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"sol\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]}},\"required\":[\"btc\",\"eth\",\"sol\"],\"description\":\"BTC, ETH and SOL percent price changes from CoinGecko, used to re-base category returns into BTC, ETH or SOL terms. There are no USD prices here.\"},\"CategorySyncCoverage\":{\"type\":\"object\",\"properties\":{\"expectedCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"failedIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"retainedPreviousAggregate\":{\"type\":\"boolean\"}},\"required\":[\"expectedCount\",\"freshCount\",\"failedIds\",\"retainedPreviousAggregate\"],\"description\":\"How many configured categories the last sync refreshed. When a category fetch failed and a previous aggregate existed, the previous rows are served unchanged (`retainedPreviousAggregate`).\"},\"EcosystemDetailPayload\":{\"type\":\"object\",\"properties\":{\"ecosystems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemMarketRow\"}},\"totalEcosystemMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/EcosystemCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"totalEcosystemExposureMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Sum of the ecosystems' market caps, each token counted in its home ecosystem only: the denominator of `dominance`.\"},\"marketCapMethod\":{\"type\":\"string\",\"enum\":[\"home-chain-constituents\",\"deduplicated-fetched-coins\"],\"description\":\"How `totalEcosystemMcap` and the rows' `marketCap` are computed. `home-chain-constituents` (since 2026-09-30): a token CoinGecko files under several ecosystems counts only in its home ecosystem (its native chain, else CoinGecko's primary asset platform). `deduplicated-fetched-coins`: the earlier method, where a multichain token counted in full in every ecosystem that listed it.\"},\"dominanceMethod\":{\"type\":\"string\",\"description\":\"`share-of-home-chain-market-caps` after a complete sync (`share-of-overlapping-ecosystem-exposures` before 2026-09-30). A sync that kept the previous rows repeats the previous method.\"},\"marketCapCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Distinct constituents counted in `totalEcosystemMcap`.\"}},\"required\":[\"ecosystems\",\"totalEcosystemMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"EcosystemCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The coin's funding across venues, 8-hour-equivalent (fraction per 8 hours), open-interest-weighted over each venue's primary contract; null when no venue has a fresh rate.\"},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"sparkline7d\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"ath\",\"athDistance\",\"fundingRate\",\"fundingApr\",\"openInterest\",\"sparkline7d\"]},\"CategoryCorrelationPayload\":{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},\"CategoryCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"]},\"requestedSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"bucketSeconds\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}]},\"usablePairCount\":{\"type\":\"integer\"}},\"required\":[\"status\",\"requestedSince\",\"availableSince\",\"availableUntil\",\"computedAt\",\"pointCount\",\"bucketSeconds\",\"usablePairCount\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"The list, detail and correlation bodies are v1's `data`: both routes answer from one read model (src/engine/serve/models/trackers/ecosystems.ts), mindshare merged and the correlation matrix padded on both since engine L5 WP-S3. The free body also carries the freshness envelope in `meta` (WP-S12). The free route also answers `historical`/`tvl` (history) and `mindshare_history`, which v1 does not accept.\",\"public_params\":[\"ecosystem\",\"excludeNative\",\"mindshare_history\",\"historical\",\"tvl\",\"chart\",\"correlation\",\"timeframe\"],\"python_params\":{\"ecosystem\":\"ecosystem\",\"correlation\":\"correlation\",\"timeframe\":\"timeframe\",\"excludeNative\":\"exclude_native\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"ecosystems\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`ecosystem` adds that ecosystem's constituent `coins` and its market-cap `sparkline` beside the full list.\",\"`excludeNative=true` serves the constituent list without the native token's ticker (SOL on Solana).\",\"`correlation=true` returns a square matrix: one row and one column per ecosystem label.\",\"`chart=mcap-trend` answers the history mode with one compact market-cap series per ecosystem, oldest point first, instead of snapshot rows.\",\"`mindshare_history` returns the ecosystem mindshare series (ids `eco_*`), whatever its value.\"],\"cli\":{\"command\":\"sharpe ecosystems\",\"options\":[\"ecosystem\",\"excludeNative\"]}},{\"name\":\"get_exchange_listings\",\"title\":\"New listings hub data\",\"description\":\"Get the New Listings hub payload: weekly + monthly aggregated counts by narrative and exchange, plus the last-90-day recent listings. Optionally filter by narrative slug or single exchange. Useful for tracking where venues are adding listing slots.\",\"endpoint\":\"listings-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/data\",\"public\":\"/api/listings/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Filter to a single narrative slug (e.g. `ai-agents`, `memes`, `layer-1`).\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to a single exchange.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingsHubPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingsHubPayload\":{\"type\":\"object\",\"properties\":{\"weekly\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingBucket\"}},\"monthly\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingBucket\"}},\"recent\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RecentListingRow\"}},\"lastListingAt\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"lastUpdatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"totals\":{\"type\":\"object\",\"properties\":{\"thisWeek\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"lastWeek\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"thisMonth\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"lastMonth\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"thisWeek\",\"lastWeek\",\"thisMonth\",\"lastMonth\"]},\"topNarrativesThisMonth\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingCount\"}},\"topExchangesThisMonth\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExchangeListingCount\"}}},\"required\":[\"weekly\",\"monthly\",\"recent\",\"lastListingAt\",\"lastUpdatedAt\",\"totals\",\"topNarrativesThisMonth\",\"topExchangesThisMonth\"]},\"ListingBucket\":{\"type\":\"object\",\"properties\":{\"bucket_date\":{\"type\":\"string\",\"format\":\"date\"},\"exchange\":{\"type\":\"string\"},\"narrative_slug\":{\"type\":\"string\"},\"listing_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"bucket_date\",\"exchange\",\"narrative_slug\",\"listing_count\"]},\"RecentListingRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_coingecko_id\":{\"type\":[\"string\",\"null\"]},\"exchange\":{\"type\":\"string\"},\"listing_date\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"listing_date_source\":{\"type\":\"string\"},\"narrative_slug\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"token_symbol\",\"token_name\",\"token_coingecko_id\",\"exchange\",\"listing_date\",\"listing_date_source\",\"narrative_slug\"]},\"ListingCount\":{\"type\":\"object\",\"properties\":{\"narrative_slug\":{\"type\":\"string\"},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"narrative_slug\",\"count\"]},\"ExchangeListingCount\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"exchange\",\"count\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"narrative\":\"narrative\",\"exchange\":\"exchange\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"`recent` holds the last 90 days of active listings, newest listing date first.\",\"`topNarrativesThisMonth` and `topExchangesThisMonth` hold at most five entries each, largest count first.\",\"`exchange` scopes every weekly and monthly bucket and every recent row to that venue.\"],\"cli\":{\"command\":\"sharpe listings\",\"options\":[\"narrative\",\"exchange\"]}},{\"name\":\"get_funding_rates\",\"title\":\"Funding rates\",\"description\":\"Get perpetual funding rates across every supported venue (see sharpe://exchanges for the current list). Returns current snapshots, accumulated rates over multiple windows, or per-coin historical rates. Units: `rate` is a decimal fraction settled over that row's own `interval_hours` (1h, 2h, 4h, 8h or 24h depending on venue and market). It is not a percent and never implicitly 8h, so compare or rank venues on the served rate_8h (rate × 8 / interval_hours) or apr (rate × 8760 / interval_hours), both null when the row has no usable interval. Accumulated rows carry realized sums (acc_1d/acc_7d/acc_30d/acc_90d/acc_1y) instead of a per-interval rate, and per window a `coverage` entry (coverage_ratio, complete, listed_within_window, halted_within_window): compare acc_* across contracts only on complete windows. Filter with coin, exchange, margin (linear/inverse) and asset_class; asset_class is unfiltered by default, so tokenized-equity, commodity, index and FX perps are included alongside crypto. `coin` names an asset: PEPE returns every PEPE contract, the 1000PEPE and KPEPE lot contracts included. Current and accumulated rows carry asset_id, asset_symbol, lot_multiplier (asset units per contract unit, e.g. 1000 on 1000PEPEUSDT), instrument_status (the venue's own status) and is_live (null = unknown). Page the full book with limit and cursor, or order it by open interest with sort. For type=current the API also answers with aggregates instead of rows: extremes (the highest and lowest markets by rate_8h above an optional min_oi_usd floor), stats (the whole book's mean and OI-weighted funding APR and the positive/negative counts) and summary (with coin: the coin's average and median funding across venues, the funding grid's Avg Rate).\",\"endpoint\":\"funding-rates\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/funding/rates\",\"public\":\"/api/funding/rates\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"current\",\"description\":\"Type of funding rate data to retrieve.\",\"type\":\"string\",\"enum\":[\"current\",\"accumulated\",\"history\"]},\"coin\":{\"description\":\"The coin to return: a ticker (e.g. BTC), a lot or venue spelling (e.g. `1000PEPE`, `kPEPE`), or the full name (e.g. `bitcoin`, resolved to BTC). Case-insensitive, one coin per request. `coin` names an asset, not a base_coin string: every contract of that asset is returned whatever its base_coin spelling, so `PEPE` also returns the 1000PEPE and KPEPE lot contracts (read `lot_multiplier`), and a ticker two assets share (BB is BounceBit and BlackBerry) returns both, narrowed by `asset_class`. Optional filter for type=current and type=accumulated; required when type=history. A value that no perpetual in the funding book has ever settled returns 400 rather than an empty result set; GET /api/funding/coins lists every ticker carried.\",\"type\":\"string\",\"maxLength\":64},\"days\":{\"default\":30,\"description\":\"Number of days of history to retrieve (type=history only).\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1095},\"exchange\":{\"description\":\"Filter to a single venue. Accepts the slug (e.g. `gate-io`), the display name as returned in the `exchange` field (e.g. `Gate.io`), or the ccxt id. The venue registry is not frozen, so read the `sharpe://exchanges` MCP resource or /api/funding/rates for the current list. An unrecognized value returns 400.\",\"type\":\"string\",\"maxLength\":32},\"asset_class\":{\"description\":\"Narrow the response to one underlying category. The funding book is not crypto-only. Tokenized equity, commodity, index and FX perps trade on the same venues, so this is unfiltered by default. Applies to type=current and type=accumulated; ignored for type=history. An unrecognized value returns 400.\",\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"margin\":{\"description\":\"Narrow the response to one collateral convention: `linear` for quote-margined contracts, `inverse` for coin-margined ones. Unfiltered by default. Applies to type=current and type=accumulated; ignored for type=history. An unrecognized value returns 400.\",\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},\"limit\":{\"description\":\"Maximum number of records to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":5000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"},\"sort\":{\"description\":\"type=current only: order the rows by `open_interest`, ascending, or descending with the leading `-`. Rows with unknown open interest come last either way. Applied before `limit`/`cursor`. Default: the book's order (base_coin, exchange, symbol).\",\"type\":\"string\",\"enum\":[\"open_interest\",\"-open_interest\"]},\"extremes\":{\"description\":\"type=current only: answer with the N highest and N lowest rows by `rate_8h` (`extremes.highest`, `extremes.lowest`) among fresh rows with a usable interval, and how many rows each check left out (`extremes.omitted`). The other filters narrow the rows first. Returns an object instead of rows; cannot be combined with `limit`, `cursor` or `sort`.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":100},\"min_oi_usd\":{\"description\":\"type=current, with `extremes` only: leave out rows whose open interest in USD is below this floor. A row with unknown open interest fails a floor above 0.\",\"type\":\"number\",\"minimum\":0},\"stats\":{\"description\":\"type=current only: `1` answers with the whole book's funding (`market`: mean and open-interest-weighted APR, and the count of positive and negative rates). Returns an object instead of rows; cannot be combined with `coin`, `exchange`, `margin`, `asset_class`, `limit`, `cursor` or `sort`.\",\"type\":\"string\",\"enum\":[\"1\"]},\"summary\":{\"description\":\"type=current, with `coin` only: `1` answers with the coin's funding across venues (`summary`: average and median 8-hour rate, how they were reduced, and the venues behind them). Returns an object instead of rows; cannot be combined with `limit`, `cursor` or `sort`.\",\"type\":\"string\",\"enum\":[\"1\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/FundingCurrentRow\"},{\"$ref\":\"#/definitions/FundingAccumulatedRow\"},{\"$ref\":\"#/definitions/FundingHistoryRow\"}]}},{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/FundingCurrentRow\"},{\"$ref\":\"#/definitions/FundingAccumulatedRow\"},{\"$ref\":\"#/definitions/FundingHistoryRow\"}]}},{\"$ref\":\"#/definitions/FundingCurrentAggregates\"}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FundingCurrentRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\",\"description\":\"Funding rate as a decimal fraction per interval.\"},\"predicted_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},{\"type\":\"null\"}]},\"interval_hours\":{\"type\":\"number\"},\"next_funding_time\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"margin_type\":{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"],\"description\":\"Collateral convention for the contract: `linear` (quote-margined) or `inverse` (coin-margined).\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"],\"description\":\"Underlying category: `crypto`, `equity`, `commodity`, `fx` or `index`. Tokenized-equity perps such as Bybit `TSLL` are `equity`, not `crypto`.\"},\"mark_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Binance's mark price for the base coin (from its premiumIndex feed), attached to every venue's row for that coin as context: it is not this venue's own mark or a traded quote. A lot contract such as `1000PEPE` carries Binance's lot price as is; a bare coin that Binance lists only as a lot is priced at the lot price divided by the lot size. `null` when Binance has no contract for the coin in the same asset class.\"},\"mark_price_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"Latest one-sided USD open interest (each contract counted once) for the `(exchange, base_coin)` pair when a matching futures row exists. `null` when no open-interest row matched. That is most rows, since open-interest coverage is narrower than funding coverage. Never `0` as a stand-in for missing.\"},\"market_cap_rank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}],\"description\":\"Market-cap rank of the base coin, where `1` is the largest. `null` when the coin is unranked. Sort unranked rows last rather than treating `null` as a rank.\"},\"age_seconds\":{\"type\":[\"number\",\"null\"]},\"data_source\":{\"type\":\"string\"},\"freshness_sla_seconds\":{\"type\":\"integer\"},\"is_stale\":{\"type\":\"boolean\"},\"asset_id\":{\"description\":\"The instrument master asset of this contract: the CoinGecko id when the asset was resolved strictly (`pepe`), otherwise `<class>:<ticker>` (`equity:bb`). Every contract of one asset carries the same id, whatever its base_coin spelling. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"asset_symbol\":{\"description\":\"The asset ticker as a trader reads it: `PEPE` on the 1000PEPE and KPEPE contracts too. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"lot_multiplier\":{\"description\":\"Units of the asset per unit the contract quotes: `1000` for Binance 1000PEPEUSDT (and for Coinbase 1000PEPE-PERP, whose base_coin is PEPE), `1` for Gate.io PEPE_USDT. From the venue or a checked alias, never parsed from the symbol. `rate` is a fraction of notional and needs no scaling. `null` when unknown.\",\"type\":[\"number\",\"null\"]},\"instrument_status\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trading\",\"halted\",\"delisted\",\"settling\",\"pre_launch\"]},{\"type\":\"null\"}],\"description\":\"The venue's own status for the contract, as the instruments sync last read it. `null` when the master does not know the contract.\"},\"is_live\":{\"description\":\"`true`: trading, and the venue's contract list was read within 30 minutes. `false`: read within 30 minutes and not trading. `null`: unknown (no read in 30 minutes, a status value the sync could not interpret, or a contract the master does not know).\",\"type\":[\"boolean\",\"null\"]},\"rate_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"`rate` on the 8-hour basis: `rate × 8 / interval_hours`, so contracts on different intervals compare directly. `null` when the row has no rate or an interval Sharpe does not recognise, never computed from an assumed 8 hours.\"},\"apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"`rate` annualized over the row's own interval: `rate × 8760 / interval_hours`, a fraction (0.1 = 10%). Signed like `rate`. `null` when `rate_8h` is.\"}},\"required\":[\"exchange\",\"symbol\",\"base_coin\",\"rate\",\"interval_hours\",\"next_funding_time\",\"updated_at\",\"margin_type\",\"asset_class\",\"mark_price\",\"mark_price_updated_at\",\"open_interest\",\"market_cap_rank\",\"age_seconds\",\"data_source\",\"freshness_sla_seconds\",\"is_stale\"]},\"FundingAccumulatedRow\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"acc_1d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_90d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"acc_1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"settlements_1d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_7d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_30d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_90d\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"settlements_1y\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"first_settled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"last_settled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"asset_class\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},{\"type\":\"null\"}],\"description\":\"Underlying category, joined in from the live contract book. `null` when no live contract matches, rather than being defaulted to `crypto`.\"},\"margin_type\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"linear\",\"inverse\"]},{\"type\":\"null\"}],\"description\":\"Collateral convention, joined in from the live contract book. `null` when no live contract matches.\"},\"interval_hours\":{\"description\":\"The contract's own settlement interval, joined in from the live contract book. `null` when no live contract matches `(exchange, symbol)`. Expected settlements for a window are `ceil(window_hours / interval_hours)`. Compare `settlements_*` against that, never against a fixed 8-hour assumption.\",\"type\":[\"number\",\"null\"]},\"is_active\":{\"type\":\"boolean\",\"description\":\"`false` when the accumulated identity has no live contract behind it, meaning a delisted or renamed pair. Those rows keep their accumulated history but carry `null` metadata.\"},\"asset_id\":{\"description\":\"The instrument master asset of this contract: the CoinGecko id when the asset was resolved strictly (`pepe`), otherwise `<class>:<ticker>` (`equity:bb`). Every contract of one asset carries the same id, whatever its base_coin spelling. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"asset_symbol\":{\"description\":\"The asset ticker as a trader reads it: `PEPE` on the 1000PEPE and KPEPE contracts too. `null` when the master does not know the contract.\",\"type\":[\"string\",\"null\"]},\"lot_multiplier\":{\"description\":\"Units of the asset per unit the contract quotes: `1000` for Binance 1000PEPEUSDT (and for Coinbase 1000PEPE-PERP, whose base_coin is PEPE), `1` for Gate.io PEPE_USDT. From the venue or a checked alias, never parsed from the symbol. `rate` is a fraction of notional and needs no scaling. `null` when unknown.\",\"type\":[\"number\",\"null\"]},\"instrument_status\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trading\",\"halted\",\"delisted\",\"settling\",\"pre_launch\"]},{\"type\":\"null\"}],\"description\":\"The venue's own status for the contract, as the instruments sync last read it. `null` when the master does not know the contract.\"},\"is_live\":{\"description\":\"`true`: trading, and the venue's contract list was read within 30 minutes. `false`: read within 30 minutes and not trading. `null`: unknown (no read in 30 minutes, a status value the sync could not interpret, or a contract the master does not know).\",\"type\":[\"boolean\",\"null\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"1d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"7d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"30d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"90d\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"},\"1y\":{\"$ref\":\"#/definitions/FundingWindowCoverage\"}},\"required\":[\"1d\",\"7d\",\"30d\",\"90d\",\"1y\"],\"description\":\"How much of each window (`acc_1d` … `acc_1y`) the contract's settlements cover, judged against when it was listed and when it stopped trading.\"}},\"required\":[\"base_coin\",\"exchange\",\"symbol\",\"acc_1d\",\"acc_7d\",\"acc_30d\",\"acc_90d\",\"acc_1y\",\"settlements_1d\",\"settlements_7d\",\"settlements_30d\",\"settlements_90d\",\"settlements_1y\",\"first_settled_at\",\"last_settled_at\",\"asset_class\",\"margin_type\",\"interval_hours\",\"is_active\"]},\"FundingWindowCoverage\":{\"type\":\"object\",\"properties\":{\"coverage_ratio\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}],\"description\":\"Share of the span the contract was expected to settle in that its settlements cover: from its listing (its first settlement ever) or the window start, to its halt or now, with the last settlement credited one interval. `null` when the contract was not expected in the window at all (listed after it, or halted before it).\"},\"complete\":{\"description\":\"`coverage_ratio` is at least 0.9; `null` with the ratio. Compare `acc_*` of a complete window only with other complete windows.\",\"type\":[\"boolean\",\"null\"]},\"listed_within_window\":{\"type\":\"boolean\",\"description\":\"The contract's first settlement ever falls inside the window: a short history here is a new listing, not missing data.\"},\"halted_within_window\":{\"type\":\"boolean\",\"description\":\"The contract stopped trading inside the window: the window is measured up to that halt. The halt is when the instrument master recorded the venue's status leaving trading; when the master has no such time (it first saw the contract already halted), it is the last settlement plus one interval once the contract's current row stopped updating or left the book. `false` when no halt time is known: then the window runs to now and missing settlements read as missing.\"}},\"required\":[\"coverage_ratio\",\"complete\",\"listed_within_window\",\"halted_within_window\"]},\"FundingHistoryRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\",\"description\":\"The contract that settled. A coin can span several contracts per venue (a USDT and a USDC perp, or PEPE beside 1000PEPE lots), so read series per (exchange, symbol).\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"rate\",\"interval_hours\",\"settled_at\"]},\"FundingCurrentAggregates\":{\"type\":\"object\",\"properties\":{\"summary\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingAssetSummary\"}},\"extremes\":{\"$ref\":\"#/definitions/FundingExtremes\"},\"market\":{\"$ref\":\"#/definitions/FundingMarketStats\"}}},\"FundingAssetSummary\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\",\"description\":\"The group's base ticker. Groups follow the funding grid: one per base_coin spelling and asset class, so `coin=PEPE` answers a `PEPE`, a `1000PEPE` and a `KPEPE` entry, and a ticker two asset classes share answers one entry per class.\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"funding_avg_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Average funding across venues on the 8-hour basis, over one primary contract per venue with a fresh rate (every venue's rate when none is fresh; see `funding_all_stale`). Weighted by each contract's one-sided open interest when at least two venues, and a majority of them, carry open interest; otherwise the median (`funding_method`). `null` when no venue has a usable rate, never 0.\"},\"funding_median_8h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Median of the same venues' 8-hour rates: the companion one venue cannot move.\"},\"funding_method\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"oi_weighted\",\"median_fallback\"]},{\"type\":\"null\"}],\"description\":\"How `funding_avg_8h` was reduced: `oi_weighted`, or `median_fallback` when too few venues carry open interest. `null` with `funding_avg_8h`.\"},\"funding_venues_used\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Venues behind the figures, one primary contract each.\"},\"funding_venues_stale\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Venues left out because their rate was past the 10-minute freshness SLA while another venue was fresh.\"},\"funding_all_stale\":{\"type\":\"boolean\",\"description\":\"`true` when no venue was fresh: the figures are then over the stale rates, and read as such.\"}},\"required\":[\"base_coin\",\"asset_class\",\"funding_avg_8h\",\"funding_median_8h\",\"funding_method\",\"funding_venues_used\",\"funding_venues_stale\",\"funding_all_stale\"]},\"FundingExtremes\":{\"type\":\"object\",\"properties\":{\"highest\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingCurrentRow\"},\"description\":\"The N rows with the highest `rate_8h`, highest first, among fresh rows with a usable interval that clear `min_oi_usd`.\"},\"lowest\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FundingCurrentRow\"},\"description\":\"The N rows with the lowest `rate_8h`, lowest first, among the same rows.\"},\"omitted\":{\"type\":\"object\",\"properties\":{\"stale\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"no_interval\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"below_floor\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"stale\",\"no_interval\",\"below_floor\"],\"description\":\"Rows of the scope left out, each under the first check it failed: `stale` (past the freshness SLA), `no_interval` (no rate or no usable interval), `below_floor` (open interest below `min_oi_usd`, or unknown while the floor is above 0).\"}},\"required\":[\"highest\",\"lowest\",\"omitted\"]},\"FundingMarketStats\":{\"type\":\"object\",\"properties\":{\"funding_apr_mean\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"Mean 8-hour funding over one primary contract per (venue, asset) with a fresh rate, every asset class included, annualized (× 1,095): the computation behind `avg_funding_rate` on GET /v1/market/derivatives-overview, as an APR and without a key. `null` when no contract has a usable rate.\"},\"funding_apr_oi_weighted\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}],\"description\":\"The same, weighted by each contract's one-sided open interest (venues left out of open-interest totals carry no weight). `null` when no contract carries open interest, never the mean in its place.\"},\"positive\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Primary contracts with a fresh rate above 0 (longs pay shorts).\"},\"negative\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Primary contracts with a fresh rate below 0 (shorts pay longs).\"}},\"required\":[\"funding_apr_mean\",\"funding_apr_oi_weighted\",\"positive\",\"negative\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"coin\":\"coin\",\"days\":\"days\",\"exchange\":\"exchange\",\"asset_class\":\"asset_class\",\"margin\":\"margin\",\"limit\":\"limit\",\"cursor\":\"cursor\",\"sort\":\"sort\",\"extremes\":\"extremes\",\"min_oi_usd\":\"min_oi_usd\",\"stats\":\"stats\",\"summary\":\"summary\"},\"pagination\":\"cursor\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":{\"by\":\"type\",\"map\":{\"current\":\"funding_rates_current\",\"accumulated\":\"funding_accumulated\",\"history\":\"funding_rates_history\"}},\"freshness_sla_seconds\":{\"by\":\"type\",\"map\":{\"current\":600,\"accumulated\":3600,\"history\":600}},\"behaviour\":[\"`exchange` keeps only that venue's rows.\",\"`coin` returns the contracts of that asset, whatever their base_coin spelling.\",\"`type=accumulated` returns realised sums per contract, one row per (exchange, symbol).\",\"`type=history` returns settlements oldest first.\"],\"cli\":{\"command\":\"sharpe funding\",\"options\":[\"coin\",\"type\",\"days\"]}},{\"name\":\"get_funding_settlement\",\"title\":\"Funding fee settlement\",\"description\":\"Get the dollar value of funding actually paid at each settlement -- not just the rate -- and which side, longs or shorts, paid it. Every response carries both the per-coin row breakdown and a totals block (net/long_paid/short_paid) for the requested window and class, so 'who paid funding today' is read directly from totals rather than summed from a page of rows; totals always reflects the full requested class regardless of any coin/exchange filter on the rows. window=current (the default) is the next settlement, priced live off open interest and the forward-looking rate -- always estimated, never realised. 1d/3d/7d are realised windows; one whose coverage is below 90% carries partial: true (complete: false) because its history is still accruing, not a completed total, and halted_within_window says a contract stopped settling inside the window (listed_within_window is always null: no listing time is known). Sign convention: a window's net = long_paid - short_paid; positive means longs paid more than they received (a cost to longs), negative means shorts paid more. Both long_paid and short_paid are always non-negative magnitudes. Missing is null, never 0. class splits crypto perps from RWA perps (tokenized equity, commodity, FX, index); crypto + rwa totals always equal the all totals.\",\"endpoint\":\"funding-settlement\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/funding/settlement\",\"public\":\"/api/funding/settlement\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"window\":{\"default\":\"current\",\"description\":\"Settlement window. `current` is the next (forward-looking) settlement, priced live and labelled `estimated`. `1d`/`3d`/`7d` are realised windows from the funding_fee_settlement matview.\",\"type\":\"string\",\"enum\":[\"current\",\"1d\",\"3d\",\"7d\"]},\"class\":{\"default\":\"all\",\"description\":\"Asset-class scope. `rwa` is every non-crypto `asset_class` (equity, commodity, fx, index). Not a narrower `asset_class` filter -- this plus the per-row `asset_class` field answers every question a second parameter could, and `crypto` + `rwa` always reconciles exactly to `all` in the `totals` block.\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coin\":{\"description\":\"Comma-separated base coin tickers, for example BTC,ETH. Unfiltered by default.\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to coins settling on a single venue. Accepts the slug, the display name as returned in the `venues[].exchange` field, or the ccxt id. The venue registry is not frozen, so read the `sharpe://exchanges` MCP resource or /api/funding/rates for the current list. An unrecognized value returns 400. Implies the per-venue breakdown internally; the response still omits `venues` unless `expand=venues` is also set.\",\"type\":\"string\",\"maxLength\":32},\"limit\":{\"default\":100,\"description\":\"Maximum number of rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"offset\":{\"default\":0,\"description\":\"Zero-based row offset for pagination.\",\"type\":\"integer\",\"minimum\":0},\"sort\":{\"description\":\"Sort field for the selected `window`, optionally prefixed with \\\"-\\\" for descending. Rows with no value for the sort field (an unpriced coin) always sort last, regardless of direction.\",\"type\":\"string\",\"enum\":[\"base_coin\",\"net\",\"long_paid\",\"short_paid\",\"open_interest_usd\",\"-base_coin\",\"-net\",\"-long_paid\",\"-short_paid\",\"-open_interest_usd\"]},\"expand\":{\"description\":\"Set to `venues` to include each row's per-venue breakdown. Omitted by default to keep the default payload small.\",\"type\":\"string\",\"enum\":[\"venues\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementRow\"}},\"totals\":{\"description\":\"Same net/long_paid/short_paid shape as a row, scoped to the selected `class`. crypto + rwa === all in every window, for net, long_paid and short_paid.\",\"allOf\":[{\"$ref\":\"#/definitions/SettlementWindows\"}]},\"settlementMeta\":{\"$ref\":\"#/definitions/SettlementMeta\"},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"totals\",\"settlementMeta\",\"pagination\"]},{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementRow\"}},\"totals\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"meta\":{\"type\":\"object\",\"properties\":{\"class\":{\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coins\":{\"type\":\"integer\",\"description\":\"Coins in the selected class, matching the scope of `totals` -- independent of any coin/exchange filter or pagination on this specific request.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the settlement data was refreshed (the funding_fee_settlement matview's refresh, every 15 minutes), not the request time.\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose settlement dollars are left out of every coin row and the totals (shown only in the venues breakdown), with the reason.\"},\"total\":{\"type\":\"integer\",\"description\":\"Coins matching this request's coin/exchange filters, before pagination.\"},\"limit\":{\"type\":\"integer\"},\"offset\":{\"type\":\"integer\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"class\",\"coins\",\"updated_at\",\"total\",\"limit\",\"offset\"]}},\"required\":[\"data\",\"totals\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"SettlementRow\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"asset_class\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"commodity\",\"fx\",\"index\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Always `null`: no price source is wired into this endpoint (the settlement, funding and open-interest tables it reads carry no spot price). Use `/v1/market-cap/search` for spot price.\"},\"price_change_24h_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Always `null`, for the same reason as `price`.\"},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"windows\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementVenueRow\"},\"description\":\"Present only when expand=venues is requested.\"}},\"required\":[\"base_coin\",\"asset_class\",\"price\",\"price_change_24h_pct\",\"open_interest_usd\",\"windows\"]},\"SettlementWindows\":{\"type\":\"object\",\"properties\":{\"current\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"1d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"3d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"},\"7d\":{\"$ref\":\"#/definitions/SettlementWindowValue\"}},\"required\":[\"current\",\"1d\",\"3d\",\"7d\"]},\"SettlementWindowValue\":{\"type\":\"object\",\"properties\":{\"net\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"long_paid\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"short_paid\":{\"anyOf\":[{\"type\":\"number\",\"minimum\":0,\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"estimated\":{\"type\":\"boolean\",\"description\":\"True on the current window only: priced live from the in-progress rate and latest open interest, not from the matview.\"},\"rate_source\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"predicted\",\"current\"]},{\"type\":\"null\"}],\"description\":\"Where the current window's rate came from. predicted_rate is published by only 5 venues, so `current` (the in-progress rate) is the normal path, not the fallback.\"},\"coverage_ratio\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\",\"description\":\"Realised windows only: how much of the window is covered by priced history. Open interest accrues only forward, so a newly-priced venue's 7d column starts below 1.0. A coin, venue or total row is the open-interest-weighted mean of its contracts' ratios; a contract that stopped settling (halted or delisted) is expected only until its last priced settlement plus one interval.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"Realised windows only: true when coverage_ratio is below 0.9. The numbers still render -- partial means building history, not hidden.\"},\"complete\":{\"type\":\"boolean\",\"description\":\"Realised windows with a coverage_ratio only: true when coverage_ratio is at least 0.9 (the opposite of `partial`).\"},\"listed_within_window\":{\"description\":\"Realised windows with a coverage_ratio only: whether a contract behind the value was listed inside the window. Always `null` on this endpoint today: the settlement data prices seven days and carries no listing time, so a listing is unknown, never assumed.\",\"type\":[\"boolean\",\"null\"]},\"halted_within_window\":{\"type\":\"boolean\",\"description\":\"Realised windows with a coverage_ratio only: true when a contract priced in the window stopped settling inside it: its funding row left the live book or went stale, and its last priced settlement plus one interval falls in the window. Its coverage is measured only up to that point, so a halt does not read as missing history.\"}},\"required\":[\"net\",\"long_paid\",\"short_paid\"],\"description\":\"net = long_paid - short_paid. Both legs are always present alongside net -- a $0 net can conceal $50M flowing each way. Null means an unpriced/absent contract, never a zero flow.\"},\"SettlementVenueRow\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"windows\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"excluded_from_totals\":{\"type\":\"string\",\"description\":\"Present only on a venue whose open interest is priced per venue but left out of the coin row and the totals (MEXC today), with the reason.\"}},\"required\":[\"exchange\",\"open_interest_usd\",\"windows\"]},\"SettlementMeta\":{\"type\":\"object\",\"properties\":{\"class\":{\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"rwa\"]},\"coins\":{\"type\":\"integer\",\"description\":\"Coins in the selected class, matching the scope of `totals` -- independent of any coin/exchange filter or pagination on this specific request.\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the settlement data was refreshed (the funding_fee_settlement matview's refresh, every 15 minutes), not the request time.\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose settlement dollars are left out of every coin row and the totals (shown only in the venues breakdown), with the reason.\"},\"total\":{\"type\":\"integer\",\"description\":\"Coins matching this request's coin/exchange filters, before pagination.\"},\"limit\":{\"type\":\"integer\"},\"offset\":{\"type\":\"integer\"}},\"required\":[\"class\",\"coins\",\"updated_at\",\"total\",\"limit\",\"offset\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{data, totals, meta}` with no pagination object (X-Total-Count header instead), where v1 answers `data: {rows, totals, settlementMeta, pagination}`: src/app/api/funding/settlement/route.ts:235-252 vs src/app/api/v1/funding/settlement/route.ts:137-148. Same rows, totals and meta fields.\",\"public_params\":null,\"python_params\":{\"window\":\"window\",\"class\":\"class\",\"coin\":\"coin\",\"exchange\":\"exchange\",\"limit\":\"limit\",\"offset\":\"offset\",\"sort\":\"sort\",\"expand\":\"expand\"},\"pagination\":\"offset\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"window\",\"map\":{\"current\":\"funding_rates_current\",\"1d\":\"funding_fee_settlement\",\"3d\":\"funding_fee_settlement\",\"7d\":\"funding_fee_settlement\"}},\"freshness_sla_seconds\":{\"by\":\"window\",\"map\":{\"current\":600,\"1d\":1800,\"3d\":1800,\"7d\":1800}},\"behaviour\":[\"`exchange` keeps only coins with a contract on that venue; each row's windows and open interest stay all-venue totals.\",\"The per-venue breakdown appears only with `expand=venues`.\",\"`totals` always carries both legs beside net for every window.\"],\"cli\":{\"command\":\"sharpe settlement\",\"options\":[\"window\",\"class\",\"coin\",\"exchange\",\"limit\"]}},{\"name\":\"get_futures_coins\",\"title\":\"Available futures coins\",\"description\":\"Get up to 1,000 coins with futures data, including funding, open-interest, liquidation, long/short, CVD, and dated-basis capability flags plus observed venue coverage and market-cap rank.\",\"endpoint\":\"futures-coins\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/futures/coins\",\"public\":\"/api/futures/coins\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesCoin\"}}},\"required\":[\"coins\"]},{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"baseCoin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"hasOI\":{\"type\":\"boolean\"},\"hasFunding\":{\"type\":\"boolean\"},\"hasLiquidations\":{\"type\":\"boolean\"},\"hasLongShort\":{\"type\":\"boolean\"},\"hasCVD\":{\"type\":\"boolean\"},\"hasBasis\":{\"type\":\"boolean\"},\"venueCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"marketCapRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]},\"logoUrl\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"baseCoin\",\"displayName\",\"hasOI\",\"hasFunding\",\"hasLiquidations\",\"hasLongShort\",\"hasCVD\",\"hasBasis\",\"venueCount\",\"venues\",\"marketCapRank\",\"logoUrl\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"coins\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesCoin\":{\"type\":\"object\",\"properties\":{\"baseCoin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"hasOI\":{\"type\":\"boolean\"},\"hasFunding\":{\"type\":\"boolean\"},\"hasLiquidations\":{\"type\":\"boolean\"},\"hasLongShort\":{\"type\":\"boolean\"},\"hasCVD\":{\"type\":\"boolean\"},\"hasBasis\":{\"type\":\"boolean\"},\"venueCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"venues\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"marketCapRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]}},\"required\":[\"baseCoin\",\"displayName\",\"hasOI\",\"hasFunding\",\"hasLiquidations\",\"hasLongShort\",\"hasCVD\",\"hasBasis\",\"venueCount\",\"venues\",\"marketCapRank\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Each coin also carries `logoUrl` (src/app/api/futures/coins/route.ts:63, :83); v1 rows have no logo field.\",\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"futures_coins\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"Coins are ordered by market-cap rank, unranked last.\"],\"cli\":{\"command\":\"sharpe coins\",\"options\":[]}},{\"name\":\"get_futures_data\",\"title\":\"Futures chart data\",\"description\":\"Get futures chart data including open interest, volume, funding rate history, liquidations, long/short ratios, basis, term structure, and OHLCV. Time series are oldest-first; when one exceeds the response cap its newest rows are kept (truncated_fields marks kept: latest). Without limit, oi-snapshot returns each exchange's latest reading; pass limit/cursor to page raw rows oldest-first.\",\"endpoint\":\"futures-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/futures/data\",\"public\":\"/api/futures/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"],\"description\":\"Futures chart identifier.\"},\"coin\":{\"description\":\"Base coin ticker.\",\"type\":\"string\",\"minLength\":1,\"default\":\"BTC\"},\"timeframe\":{\"default\":\"3M\",\"description\":\"Lookback window for the data.\",\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"exchanges\":{\"description\":\"Comma-separated list of exchanges to include (e.g. Binance,Bybit).\",\"type\":\"string\"},\"limit\":{\"description\":\"Maximum number of data points per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":10000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"required\":[\"chart\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/FuturesDataPayload\"},{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"]},\"coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"data\":{\"type\":\"array\",\"items\":{\"anyOf\":[{\"$ref\":\"#/definitions/OpenInterestPoint\"},{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\"},\"open\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"high\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"low\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"close\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume\":{\"type\":\"number\"},\"taker_buy_volume\":{\"type\":[\"number\",\"null\"]},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"},\"volume_usd\":{\"description\":\"USD volume of an aggregated candle: each source candle's volume × close, summed. Present only when a payload above 1,500 rows is aggregated into time buckets per venue (1 hour under 7 days of span, 4 hours under 30 days, else 1 day); use it instead of volume × close, which prices the whole bucket at its last close. Null when no candle in the bucket had a positive volume and close.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"exchange\",\"base_coin\",\"timeframe\",\"open\",\"high\",\"low\",\"close\",\"volume\",\"taker_buy_volume\",\"timestamp\"]},{\"$ref\":\"#/definitions/FundingPoint\"},{\"$ref\":\"#/definitions/LongShortPoint\"},{\"$ref\":\"#/definitions/BasisPoint\"},{\"$ref\":\"#/definitions/LiquidationPoint\"},{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"expiry_date\":{\"type\":\"string\",\"format\":\"date-time\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"futures_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"spot_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"expiry_date\",\"days_to_expiry\",\"futures_price\",\"spot_price\",\"basis_pct\",\"annualized_basis_pct\",\"volume_24h_usd\",\"open_interest_usd\",\"snapshot_at\",\"timestamp\"]},{\"$ref\":\"#/definitions/AnnualizedBasisPoint\"},{\"$ref\":\"#/definitions/FuturesPriceOverlayPoint\"}]}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"}},\"coverage\":{\"$ref\":\"#/definitions/FreeFuturesCoverage\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-empty\",\"live\"]},\"summary\":{\"$ref\":\"#/definitions/FuturesOiSummary\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"chart\",\"coin\",\"timeframe\",\"data\",\"coverage\",\"source\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"FuturesDataPayload\":{\"type\":\"object\",\"properties\":{\"chart\":{\"type\":\"string\",\"enum\":[\"perp-dislocation\",\"funding-cost\",\"crowding-risk\",\"flow-confirmation\",\"carry-curve\",\"perpetual-price\",\"liquidations\",\"oi-stacked\",\"oi-change\",\"oi-daily-change\",\"oi-snapshot\",\"oi-volume\",\"volume-snapshot\",\"volume-history\",\"cvd\",\"long-short-ratio\",\"funding-rate\",\"top-trader-ls\",\"returns-session\",\"returns-heatmap\",\"returns-hour\",\"returns-day\",\"annualized-basis\",\"term-structure\"]},\"coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/FuturesDataPoint\"}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Open-interest charts only (oi-stacked, oi-change, oi-daily-change, oi-snapshot): venues whose rows are shown per venue but must not be summed into a total, with the reason.\"},\"coverage\":{\"$ref\":\"#/definitions/FuturesCoverage\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\"]},\"pagination\":{\"anyOf\":[{\"$ref\":\"#/definitions/PaginationInfo\"},{\"type\":\"null\"}]},\"summary\":{\"$ref\":\"#/definitions/FuturesOiSummary\"}},\"required\":[\"chart\",\"coin\",\"timeframe\",\"data\",\"coverage\",\"source\"]},\"FuturesDataPoint\":{\"anyOf\":[{\"$ref\":\"#/definitions/OpenInterestPoint\"},{\"$ref\":\"#/definitions/OhlcvPoint\"},{\"$ref\":\"#/definitions/FundingPoint\"},{\"$ref\":\"#/definitions/LongShortPoint\"},{\"$ref\":\"#/definitions/BasisPoint\"},{\"$ref\":\"#/definitions/LiquidationPoint\"},{\"$ref\":\"#/definitions/TermStructurePoint\"},{\"$ref\":\"#/definitions/AnnualizedBasisPoint\"},{\"$ref\":\"#/definitions/FuturesPriceOverlayPoint\"}]},\"OpenInterestPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"open_interest_value\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"open_interest_value\",\"timestamp\"]},\"OhlcvPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\"},\"open\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"high\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"low\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"close\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume\":{\"type\":\"number\"},\"taker_buy_volume\":{\"type\":[\"number\",\"null\"]},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"timeframe\",\"open\",\"high\",\"low\",\"close\",\"volume\",\"taker_buy_volume\",\"timestamp\"]},\"FundingPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"rate\",\"interval_hours\",\"settled_at\"]},\"LongShortPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"long_ratio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"short_ratio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"long_ratio\",\"short_ratio\",\"timestamp\"]},\"BasisPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"spot_price\":{\"type\":\"number\"},\"futures_price\":{\"type\":\"number\"},\"basis_rate\":{\"type\":\"number\"},\"annualized_basis\":{\"type\":\"number\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"spot_price\",\"futures_price\",\"basis_rate\",\"annualized_basis\",\"timestamp\"]},\"LiquidationPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"side\":{\"type\":\"string\",\"enum\":[\"long\",\"short\"]},\"quantity\":{\"type\":\"number\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"side\",\"quantity\",\"price\",\"timestamp\"]},\"TermStructurePoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"expiry_date\":{\"type\":\"string\",\"format\":\"date-time\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"futures_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"spot_price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"expiry_date\",\"days_to_expiry\",\"futures_price\",\"spot_price\",\"basis_pct\",\"annualized_basis_pct\",\"volume_24h_usd\",\"open_interest_usd\",\"snapshot_at\"]},\"AnnualizedBasisPoint\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"base_coin\":{\"type\":\"string\"},\"contract_symbol\":{\"type\":\"string\"},\"days_to_expiry\":{\"type\":\"number\",\"x-unit\":\"days\"},\"annualized_basis_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchange\",\"base_coin\",\"contract_symbol\",\"days_to_expiry\",\"annualized_basis_pct\",\"snapshot_at\",\"timestamp\"]},\"FuturesPriceOverlayPoint\":{\"type\":\"object\",\"properties\":{\"base_coin\":{\"type\":\"string\"},\"timeframe\":{\"type\":\"string\"},\"close\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"timestamp\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"base_coin\",\"timeframe\",\"close\",\"timestamp\"]},\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"FuturesCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"],\"description\":\"\\\"partial\\\" when a database read failed or timed out after some rows arrived, or stopped at its row cap, so the oldest rows in the window can be missing; warnings says which. Omitted when every read completed.\"},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per gap: an incomplete database read, a read stopped at its row cap, or an open-interest history (oi-stacked, oi-change, oi-daily-change) above 30,000 rows resampled per venue to 2-, 4-, 6-, 12- or 24-hour buckets (last value per venue) to fit the response.\"}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"PaginationInfo\":{\"type\":\"object\",\"properties\":{\"cursor\":{\"type\":[\"string\",\"null\"]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"type\":\"integer\",\"minimum\":0}},\"required\":[\"cursor\",\"has_more\",\"total\"]},\"FuturesOiSummary\":{\"type\":\"object\",\"properties\":{\"oi_total_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"The coin's one-sided open interest across venues (engine L4 `oi.asset_total_usd`): each venue's latest reading within 6 hours, summed, rounded to whole USD. Venues in `oi_excluded_venues` are left out. Null when no venue has a reading within 6 hours (`oi_null_reason`).\"},\"oi_venue_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Venues inside `oi_total_usd`.\"},\"oi_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"The oldest reading inside `oi_total_usd` (each venue's latest reading is hour-bucketed).\"},\"oi_null_reason\":{\"description\":\"Why `oi_total_usd` is null (`no_eligible_inputs`: no venue reading within 6 hours). Present only then.\",\"type\":\"string\"},\"oi_excluded_venues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues that have a reading for this coin but are left out of the total, with the reason (MEXC today).\"}},\"required\":[\"oi_total_usd\",\"oi_venue_count\",\"oi_as_of\",\"oi_excluded_venues\"],\"description\":\"chart=oi-snapshot only: the coin's open interest summed across venues, computed by the server from the rows it returns.\"},\"FreeFuturesCoverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"2W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\",\"stale\",\"empty\"]},\"source\":{\"type\":\"string\"},\"requestedSince\":{\"type\":\"string\",\"format\":\"date-time\"},\"requestedUntil\":{\"type\":\"string\",\"format\":\"date-time\"},\"earliestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"latestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"rowCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"distinctTimestamps\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"expectedTimestamps\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"coveragePct\":{\"description\":\"Observed share of the expected time buckets, as a fraction 0-1 despite the name.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"missingExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"exchangeCoverage\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"rowCount\":{\"type\":\"integer\"},\"distinctTimestamps\":{\"type\":\"integer\"},\"earliestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"latestDataAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"exchange\",\"rowCount\",\"distinctTimestamps\",\"earliestDataAt\",\"latestDataAt\"]}},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Same chart rows, but `coverage` is the full history-coverage report (status ok/partial/stale/empty, row and bucket counts), term-structure rows carry `timestamp`, `source` can be `supabase-empty` or `live` (nothing stored for a registered coin: fetched from the venues, on both routes since WP-S15), and there is no `pagination` (src/engine/serve/models/futures/series.ts publicSeriesBody).\",\"public_params\":null,\"python_params\":{\"chart\":\"chart\",\"coin\":\"coin\",\"timeframe\":\"timeframe\",\"exchanges\":\"exchanges\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":{\"by\":\"chart\",\"map\":{\"oi-stacked\":\"futures_open_interest\",\"oi-change\":\"futures_open_interest\",\"oi-daily-change\":\"futures_open_interest\",\"oi-snapshot\":\"futures_open_interest\",\"oi-volume\":\"futures_open_interest\",\"funding-rate\":\"funding_rates_history\",\"funding-cost\":\"funding_rates_history\",\"long-short-ratio\":\"futures_long_short_ratio\",\"top-trader-ls\":\"futures_long_short_ratio\",\"liquidations\":\"futures_liquidations\",\"term-structure\":\"futures_term_structure\",\"carry-curve\":\"futures_term_structure\",\"annualized-basis\":\"futures_term_structure\",\"perp-dislocation\":\"futures_basis\",\"perpetual-price\":\"futures_ohlcv\",\"cvd\":\"futures_ohlcv\",\"volume-snapshot\":\"futures_ohlcv\",\"volume-history\":\"futures_ohlcv\",\"returns-session\":\"futures_ohlcv\",\"returns-heatmap\":\"futures_ohlcv\",\"returns-hour\":\"futures_ohlcv\",\"returns-day\":\"futures_ohlcv\",\"crowding-risk\":\"futures_long_short_ratio\",\"flow-confirmation\":\"futures_ohlcv\"}},\"freshness_sla_seconds\":{\"by\":\"chart\",\"map\":{\"oi-stacked\":1200,\"oi-change\":1200,\"oi-daily-change\":1200,\"oi-snapshot\":1200,\"oi-volume\":1200,\"funding-rate\":600,\"funding-cost\":600,\"long-short-ratio\":1200,\"top-trader-ls\":1200,\"liquidations\":1200,\"term-structure\":7200,\"carry-curve\":7200,\"annualized-basis\":7200,\"perp-dislocation\":1200,\"perpetual-price\":7200,\"cvd\":7200,\"volume-snapshot\":7200,\"volume-history\":7200,\"returns-session\":7200,\"returns-heatmap\":7200,\"returns-hour\":7200,\"returns-day\":7200,\"crowding-risk\":1200,\"flow-confirmation\":7200}},\"behaviour\":[\"Time series are oldest first.\",\"`coin` returns only that coin's rows.\",\"Open-interest charts name the venues that must not be summed into a total.\"],\"cli\":{\"command\":\"sharpe futures\",\"options\":[\"chart\",\"coin\",\"timeframe\",\"exchanges\"]}},{\"name\":\"get_gem_finder\",\"title\":\"Gem finder\",\"description\":\"Get market-ranked token rows, optionally scoped to one chain (chain=solana, base, ...), with market cap, volume, price and market-cap change, circulating supply, ATH and ATL history, nullable FDV/MCap, the preferred chain plus every supported chain the asset is deployed on (chainSlugs), observed exchange availability, quote freshness, and enrichment coverage. Delisted or halted markets whose upstream quote is over 24 hours old are excluded rather than reporting a weeks-old price change as current. Ambiguous same-ticker assets do not receive symbol-only exchange attribution. No wallet signal or proprietary score is returned.\",\"endpoint\":\"gem-finder-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/gem-finder/data\",\"public\":\"/api/gem-finder/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"chain\":{\"description\":\"Keep only assets deployed on this chain. A multi-chain asset matches every chain in its chainSlugs, not only its preferred chainSlug; a native L1 coin with no token contract on a supported chain (BTC, ETH) matches none. An unknown chain is a 400.\",\"type\":\"string\",\"enum\":[\"ethereum\",\"solana\",\"base\",\"arbitrum\",\"bsc\",\"avalanche\",\"polygon\",\"optimism\",\"fantom\",\"blast\",\"linea\",\"mantle\",\"scroll\",\"zksync\",\"tron\",\"cronos\",\"celo\",\"berachain\"]},\"limit\":{\"description\":\"Maximum number of tokens to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque, snapshot-bound pagination cursor from a previous response. Cursors expire when the cache refreshes; restart without a cursor after an expiry error.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/GemFinderPayload\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}}]},{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}},\"availableExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"totalCoins\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"syncStatus\":{\"$ref\":\"#/definitions/GemFinderSyncStatus\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"coins\",\"availableExchanges\",\"totalCoins\",\"updatedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"GemFinderPayload\":{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GemCoin\"}},\"availableExchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"totalCoins\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"syncStatus\":{\"$ref\":\"#/definitions/GemFinderSyncStatus\"}},\"required\":[\"coins\",\"availableExchanges\",\"totalCoins\",\"updatedAt\"]},\"GemCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"mcapChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"24-hour market cap change percentage.\"},\"circulatingSupply\":{\"description\":\"Circulating supply in token units.\",\"type\":[\"number\",\"null\"]},\"athPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"athDate\":{\"type\":\"string\",\"description\":\"ISO 8601 time of the all-time high, as CoinGecko sends it. An empty string when CoinGecko sends none.\"},\"atlPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"All-time-low price in USD.\"},\"atlDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Percentage above the all-time low.\"},\"fdvMcapRatio\":{\"type\":[\"number\",\"null\"]},\"exchangeCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"chainSlug\":{\"description\":\"Preferred supported chain, used for the DEX link. Null when no supported chain is known.\",\"type\":[\"string\",\"null\"]},\"chainSlugs\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"Every supported chain the asset is deployed on, in priority order, with chainSlug as the first entry. A multi-chain asset appears under each of these chains; an empty array means no supported chain is known.\"},\"lastUpdated\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"CoinGecko quote timestamp. Assets whose quote is older than 24 hours are excluded as no-longer-trading; a null value means the upstream omitted the field.\"}},\"required\":[\"id\",\"name\",\"symbol\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change24h\",\"change7d\",\"mcapChange24h\",\"circulatingSupply\",\"athPrice\",\"athDistance\",\"athDate\",\"atlPrice\",\"atlDistance\",\"fdvMcapRatio\",\"exchangeCount\",\"exchanges\",\"chainSlug\",\"chainSlugs\",\"lastUpdated\"]},\"GemFinderSyncStatus\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\"]},\"rawCoinCount\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"successfulPages\":{\"type\":\"array\",\"items\":{\"type\":\"integer\",\"minimum\":1}},\"failedPages\":{\"type\":\"array\",\"items\":{\"type\":\"integer\",\"minimum\":1}},\"enrichment\":{\"type\":\"object\",\"properties\":{\"platform\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\",\"unavailable\"]},\"freshCoins\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"preservedCoins\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"status\",\"freshCoins\",\"preservedCoins\"]},\"exchanges\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"partial\",\"unavailable\"]},\"successfulSources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"failedSources\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"preservedListings\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"status\",\"successfulSources\",\"failedSources\",\"preservedListings\"]}},\"required\":[\"platform\",\"exchanges\"]}},\"required\":[\"status\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Reads only `chain` (src/app/api/gem-finder/data/route.ts): `limit` and `cursor` are ignored and the body is always the full (chain-scoped) payload, v1's unpaginated `data`. v1 pages the same sanitized, chain-scoped rows into a paginated envelope of GemCoin rows when `limit` is set (src/app/api/v1/gem-finder/data/route.ts).\",\"public_params\":[\"chain\"],\"python_params\":{\"chain\":\"chain\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":\"gem_finder\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"Returns up to 1,000 market-ranked rows, largest market cap first.\",\"Assets whose upstream quote is more than 24 hours old are excluded.\",\"chainSlugs lists every supported chain of the asset with chainSlug as its first entry.\"],\"cli\":{\"command\":\"sharpe gems\",\"options\":[\"chain\",\"limit\",\"cursor\"]}},{\"name\":\"get_global_overview\",\"title\":\"Global market overview\",\"description\":\"Get the whole-market derivatives board in one call: total open interest with its crypto-versus-RWA split, 24h liquidations, average Wilder RSI(14) across the top 100 crypto perps by market cap, the Altcoin Season Index (share of the top 50 by market cap beating BTC over 90 days, excluding stablecoins and wrapped/staked derivatives), open interest broken down by asset class, and a ranked per-asset row table. The tab parameter selects the universe: crypto, equity, preipo, etf, index, commodity or fx. Rows carry price, 24h price change, funding rate (interval-true, never assumed 8h), 24h volume, market cap, open interest with 1h and 24h changes, plus liquidations on crypto or a venue count on RWA tabs. Ranks are by open interest descending. Liquidations are crypto-only because no RWA venue publishes a liquidation feed. Use this for 'what is the market doing' questions; use get_funding_rates for per-venue crypto funding detail and get_rwa_perp_funding for RWA carry and cross-venue spreads.\",\"endpoint\":\"global-overview\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/global/overview\",\"public\":\"/api/global/overview\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"tab\":{\"default\":\"crypto\",\"description\":\"Universe to return rows for. The metric block is identical on every tab.\",\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"preipo\",\"etf\",\"index\",\"commodity\",\"fx\"]},\"limit\":{\"description\":\"Maximum rows per page (1-1000). Enables cursor pagination.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"tab\":{\"type\":\"string\",\"enum\":[\"crypto\",\"equity\",\"preipo\",\"etf\",\"index\",\"commodity\",\"fx\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"isStale\":{\"type\":\"boolean\"},\"metrics\":{\"type\":\"object\",\"properties\":{\"openInterestUsd\":{\"type\":\"number\"},\"openInterestChange24hPct\":{\"type\":[\"number\",\"null\"]},\"openInterestSparkline\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"string\",\"format\":\"date-time\"},\"v\":{\"type\":\"number\"}}}},\"cryptoOpenInterestUsd\":{\"type\":\"number\"},\"rwaOpenInterestUsd\":{\"type\":\"number\"},\"liquidations24hUsd\":{\"description\":\"Crypto only; 4-hour Velo buckets, newest still accumulating.\",\"type\":[\"number\",\"null\"]},\"liquidationsChange24hPct\":{\"type\":[\"number\",\"null\"]},\"liquidationsLongUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Long side of the 24h liquidation total, so a cascade reads as flushed longs or shorts. Crypto only.\"},\"liquidationsShortUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Short side of the 24h liquidation total. Crypto only.\"},\"liquidationsSparkline\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"string\",\"format\":\"date-time\"},\"v\":{\"type\":\"number\"}}}},\"avgRsi\":{\"description\":\"Unweighted mean Wilder RSI(14) on daily closes, top 100 crypto perps by market cap.\",\"type\":[\"number\",\"null\"]},\"avgRsiSampleSize\":{\"type\":\"integer\"},\"altcoinSeasonIndex\":{\"description\":\"Share of the top 50 by market cap beating BTC over 90 days; excludes stablecoins and wrapped/staked derivatives.\",\"type\":[\"number\",\"null\"]},\"altcoinSeasonSampleSize\":{\"type\":\"integer\"},\"classBreakdown\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"tab\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"openInterestUsd\":{\"type\":\"number\"},\"symbolCount\":{\"type\":\"integer\"}}}},\"openInterestExcludedVenues\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/OpenInterestExclusion\"},\"description\":\"Venues whose open interest every figure on the board leaves out, with the reason.\"}}},\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GlobalRow\"}}}},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/GlobalRow\"}}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"OpenInterestExclusion\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"type\":\"string\"},\"reason\":{\"type\":\"string\"}},\"required\":[\"exchange\",\"reason\"],\"description\":\"A venue whose stored open interest is published per venue but left out of every cross-venue total, and why. MEXC today: its holdVol moves 7.00x the position change of MEXC's own deal feed, so it fits neither side count.\"},\"GlobalRow\":{\"type\":\"object\",\"properties\":{\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"logoUrl\":{\"type\":[\"string\",\"null\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"Funding fraction normalized to an 8h basis; never assumes the venue interval. Crypto tab: the coin's average across venues (the funding grid's Avg Rate), each venue's primary contract weighted by its one-sided open interest when at least two venues, and a majority of them, carry open interest, otherwise their median; only venues refreshed within 10 minutes; null when there is none. RWA tabs: the open-interest-weighted mean across RWA venues.\"},\"volume24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volumeChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCapUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on the preipo and index tabs, where no market cap exists.\"},\"openInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"oiChange1hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"oiChange24hPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidations24hUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Crypto tabs only; null on RWA tabs, where no venue publishes a liquidation feed.\"},\"venueCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Venues behind openInterestUsd: on the crypto tab the distinct venues holding the asset's contracts (lot and quote spellings count once per venue); on RWA tabs how many venues list the underlying.\"},\"isStale\":{\"type\":\"boolean\"}}}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"tab\":\"tab\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"tab\",\"map\":{\"crypto\":\"global_overview_snapshot\",\"equity\":\"rwa_perp_rates_current\",\"preipo\":\"rwa_perp_rates_current\",\"etf\":\"rwa_perp_rates_current\",\"index\":\"rwa_perp_rates_current\",\"commodity\":\"rwa_perp_rates_current\",\"fx\":\"rwa_perp_rates_current\"}},\"freshness_sla_seconds\":{\"by\":\"tab\",\"map\":{\"crypto\":600,\"equity\":3600,\"preipo\":3600,\"etf\":3600,\"index\":3600,\"commodity\":3600,\"fx\":3600}},\"behaviour\":[\"Rows are ranked by open interest, descending.\",\"Liquidations are crypto-only: RWA tab rows carry none.\"],\"cli\":{\"command\":\"sharpe global\",\"options\":[\"tab\"]}},{\"name\":\"get_heatmap\",\"title\":\"Market heatmap\",\"description\":\"Get market heatmap data for coins, narratives, or ecosystems. The legacy top-100 slug returns the Top 50 universe; aggregate modes expose complete or partial category coverage.\",\"endpoint\":\"heatmap-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/heatmap/data\",\"public\":\"/api/heatmap/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"mode\":{\"default\":\"coins\",\"description\":\"Heatmap grouping mode.\",\"type\":\"string\",\"enum\":[\"coins\",\"narratives\",\"ecosystems\"]},\"category\":{\"default\":\"top-100\",\"description\":\"One of 36 category slugs (e.g. top-100, defi, layer-1). The legacy top-100 slug returns the Top 50 universe.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"dots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/HeatmapDot\"}},\"updated_at\":{\"type\":\"string\",\"description\":\"ISO timestamp for the populated heatmap cache.\"},\"coverage\":{\"anyOf\":[{\"$ref\":\"#/definitions/HeatmapCoverage\"},{\"type\":\"null\"}],\"description\":\"Aggregate category coverage for narrative and ecosystem modes; null for coins mode.\"}},\"required\":[\"dots\",\"updated_at\",\"coverage\"]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"HeatmapDot\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"x\":{\"description\":\"Historical RVOL: current 24-hour volume divided by the asset's own average prior daily volume. Null when fewer than three positive historical observations are available.\",\"type\":[\"number\",\"null\"]},\"y\":{\"type\":\"object\",\"properties\":{\"24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"3y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"24h\",\"7d\",\"30d\",\"1y\",\"3y\"]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"logoUrl\":{\"type\":\"string\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"openInterest\":{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},\"openInterestChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"id\",\"name\",\"symbol\",\"x\",\"y\",\"marketCap\"]},\"HeatmapCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"availableCategories\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"totalCategories\":{\"type\":\"integer\",\"minimum\":1,\"x-unit\":\"count\"},\"ratio\":{\"type\":\"number\",\"minimum\":0,\"maximum\":1,\"x-unit\":\"ratio_0_1\"}},\"required\":[\"status\",\"availableCategories\",\"totalCategories\",\"ratio\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"mode\":\"mode\",\"category\":\"category\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"heatmap_cache\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"The legacy top-100 slug (the default) returns the Top 50 universe, and coins mode carries no category coverage.\",\"Aggregate modes expose complete or partial category coverage.\"],\"cli\":{\"command\":\"sharpe heatmap\",\"options\":[\"mode\",\"category\"]}},{\"name\":\"get_insider_selling\",\"title\":\"Insider selling pressure\",\"description\":\"Get insider selling pressure signals across crypto assets. Scores require cross-venue negative funding and combine OI, basis, CVD, sell-side flow, and supporting wallet/supply context; read signal_coverage_pct because partial-input scores are conservative lower bounds. coin returns one coin's row as the scorer wrote it (score null once it stopped qualifying).\",\"endpoint\":\"insider-selling-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/insider-selling/data\",\"public\":\"/api/insider-selling/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":100,\"description\":\"Maximum number of coins to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"min_score\":{\"default\":0,\"description\":\"Filter to coins scoring at or above this value.\",\"type\":\"number\",\"minimum\":0,\"maximum\":10},\"coin\":{\"description\":\"One coin by its CoinGecko id (e.g. pepe): its row exactly as the scorer wrote it, whatever its score. A coin that stopped qualifying answers `score: null` with its sub-scores and phase cleared; an id with no row answers an empty list. `limit`, `min_score` and `phase` do not apply.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":128}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/InsiderSellingRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"description\":{\"type\":\"string\"},\"signal\":{\"$ref\":\"#/definitions/ManipulationSignal\"},\"data_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600],\"description\":\"Freshness SLA in seconds (1 hour).\"}},\"required\":[\"coins\",\"count\",\"description\",\"signal\",\"data_as_of\",\"stale\",\"freshness_sla_seconds\"]},{\"type\":\"object\",\"properties\":{\"scores\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/InsiderSellingRow\"},\"description\":\"Every scored coin (score above 0 on at least two venues), highest score first, filtered by `limit` and `min_score` (and `phase` on pump-dump) as on v1.\"},\"meta\":{\"type\":\"object\",\"properties\":{\"totalScanned\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Distinct crypto assets with funding in the last three days (get_perps_monitored_count; stock, commodity, index and fx perps are not scored): the universe the score run scans, not the number of rows. Null when the count could not be read; that answer is not cached.\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"totalScanned\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present, and true, only when the newest row is older than the 1-hour freshness SLA or a failed read served the last good payload.\"}},\"required\":[\"scores\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"InsiderSellingRow\":{\"type\":\"object\",\"properties\":{\"coin_id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"avg_funding_72h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"funding_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"manipulation_phase\":{\"type\":[\"string\",\"null\"]},\"oi_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"cvd_trend_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"basis_rate_avg\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"holders_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"liquidity_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_to_liquidity_24h\":{\"type\":[\"number\",\"null\"]},\"buy_sell_imbalance_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"mintable\":{\"type\":[\"boolean\",\"null\"]},\"freezable\":{\"type\":[\"boolean\",\"null\"]},\"consecutive_negative_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"price_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"price_change_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"signal_start_date\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"holders_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct_change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidity_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"volume_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"funding_persistence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"wallet_concentration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"holder_quality_deterioration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"distribution_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"market_confirmation\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"signal_coverage_pct\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"signal_coverage_status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"limited\"]},\"incomplete_signal_groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"score_interpretation\":{\"type\":\"string\",\"enum\":[\"fully-observed\",\"lower-bound-partial-inputs\"]}},\"required\":[\"coin_id\",\"symbol\",\"name\",\"score\",\"exchange_count\",\"updated_at\",\"signal_coverage_pct\",\"signal_coverage_status\",\"incomplete_signal_groups\",\"score_interpretation\"]},\"ManipulationSignal\":{\"type\":\"object\",\"properties\":{\"methodology\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\"},\"gate\":{\"type\":[\"string\",\"null\"]},\"phase_filter\":{\"type\":[\"string\",\"null\"]},\"update_frequency\":{\"type\":\"string\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"methodology\",\"coverage\",\"update_frequency\",\"exchanges\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{scores, meta: {totalScanned}, stale?}` where v1 answers `{coins, count, description, signal, data_as_of, stale, freshness_sla_seconds}`; both filter by `limit` / `min_score` through one read model (src/engine/serve/models/signals/scores.ts).\",\"public_params\":[\"limit\",\"min_score\",\"coin\"],\"python_params\":{\"limit\":\"limit\",\"min_score\":\"min_score\",\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"insider_pressure\",\"freshness_sla_seconds\":3600,\"behaviour\":[\"Coins are ordered by score, highest first, and every listed coin scores above 0.\",\"Scores require cross-venue negative funding: every coin trades on at least two venues with a 72h average funding at or below 0 (negative before the 5-decimal rounding).\",\"Every coin carries its signal coverage; `score_interpretation` is `fully-observed` exactly when `signal_coverage_pct` is 100.\"],\"cli\":{\"command\":\"sharpe insider-selling\",\"options\":[\"limit\",\"min_score\"]}},{\"name\":\"get_listing_events\",\"title\":\"Canonical listing events\",\"description\":\"Get canonical listing lifecycle events across CEXs and Perp DEXs, including source URLs, confidence, real source-observation freshness, partial status, and per-provider coverage. Pass the opaque cursor through unchanged.\",\"endpoint\":\"listings-events\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/events\",\"public\":\"/api/listings/events\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"exchange\":{\"description\":\"Filter to a single exchange or perp DEX.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\",\"bitget\",\"kucoin\",\"bingx\",\"bitmart\",\"deepcoin\",\"coinbase\",\"kraken\",\"crypto_com\",\"upbit\",\"bithumb\",\"htx\",\"bitfinex\",\"bitstamp\",\"gemini\",\"bitmex\",\"deribit\",\"phemex\",\"lbank\",\"bitrue\",\"coinex\",\"backpack\",\"hashkey\",\"whitebit\",\"toobit\",\"hyperliquid\",\"aster\",\"dydx\",\"aevo\"]},\"venue_type\":{\"description\":\"Filter by venue type.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Filter by market type.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"description\":\"Filter by listing lifecycle event type.\",\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"description\":\"Filter by listed instrument class.\",\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"status\":{\"description\":\"Filter by event status.\",\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"narrative\":{\"description\":\"Filter by Sharpe narrative slug.\",\"type\":\"string\"},\"confidence\":{\"description\":\"Filter by source confidence.\",\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"from\":{\"description\":\"ISO date or datetime lower bound.\",\"type\":\"string\"},\"to\":{\"description\":\"ISO date or datetime upper bound.\",\"type\":\"string\"},\"days\":{\"default\":90,\"description\":\"Lookback window in days.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":365},\"limit\":{\"default\":200,\"description\":\"Max rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Opaque two-stream cursor returned by the previous page. Pass it through unchanged.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingEventsPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingEventsPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExchangeListingEvent\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"next_cursor\":{\"type\":[\"string\",\"null\"]},\"window_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Time the API assembled this response. This is not a source freshness timestamp.\"},\"last_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"Freshest observation timestamp present in the database or official overlay rows.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"True exactly when partial_reasons is non-empty.\"},\"partial_reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per coverage gap: a provider whose request failed, a live exchange instrument feed whose newest listing is more than 60 days old, the hourly spot-listings ingest when the query covers its venues and its last completed run is more than 3 hours old, the canonical events table being unavailable (rows then come from the compatibility table), or a requested exchange, venue_type or market_type that no enabled connector covers. Empty when coverage is whole.\"},\"provider_coverage\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingEventProviderCoverage\"}},\"source\":{\"type\":\"string\",\"enum\":[\"events\",\"compatibility\"]}},\"required\":[\"rows\",\"count\",\"next_cursor\",\"window_days\",\"generated_at\",\"last_updated_at\",\"partial\",\"provider_coverage\",\"source\"]},\"ExchangeListingEvent\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"event_uid\":{\"type\":\"string\"},\"exchange\":{\"type\":\"string\"},\"exchange_name\":{\"type\":\"string\"},\"venue_type\":{\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"instrument_id\":{\"type\":\"string\"},\"base_asset\":{\"type\":\"string\"},\"quote_asset\":{\"type\":[\"string\",\"null\"]},\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_coingecko_id\":{\"type\":[\"string\",\"null\"]},\"token_contract_address\":{\"type\":[\"string\",\"null\"]},\"token_chain\":{\"type\":[\"string\",\"null\"]},\"narrative_slug\":{\"type\":[\"string\",\"null\"]},\"scheduled_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"announced_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"first_trade_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"first_seen_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"effective_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"status\":{\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"source_kind\":{\"type\":\"string\",\"enum\":[\"official_api\",\"official_announcement\",\"official_status\",\"exchange_kline\",\"market_data\",\"proxy\",\"manual\"]},\"source_confidence\":{\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"source_url\":{\"type\":[\"string\",\"null\"]},\"raw_payload\":{\"anyOf\":[{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{}},{\"type\":\"null\"}]},\"created_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"event_uid\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"asset_class\",\"instrument_id\",\"base_asset\",\"quote_asset\",\"token_symbol\",\"token_name\",\"token_coingecko_id\",\"token_contract_address\",\"token_chain\",\"narrative_slug\",\"scheduled_at\",\"announced_at\",\"first_trade_at\",\"first_seen_at\",\"effective_at\",\"status\",\"source_kind\",\"source_confidence\",\"source_url\"]},\"ListingEventProviderCoverage\":{\"type\":\"object\",\"properties\":{\"provider\":{\"type\":\"string\",\"description\":\"Stable provider or database identifier.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"database\",\"official_overlay\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"error\",\"skipped\"]},\"row_count\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"last_observed_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"provider\",\"kind\",\"status\",\"row_count\",\"last_observed_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"exchange\":\"exchange\",\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"event_type\":\"event_type\",\"asset_class\":\"asset_class\",\"status\":\"status\",\"narrative\":\"narrative\",\"confidence\":\"confidence\",\"from\":\"from\",\"to\":\"to\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"`exchange` keeps only that venue's events.\",\"Events are newest first by `effective_at`.\",\"`partial` is true exactly when `partial_reasons` is non-empty.\"],\"cli\":{\"command\":\"sharpe listings events\",\"options\":[\"narrative\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"confidence\",\"from\",\"to\",\"cursor\",\"days\",\"limit\"]}},{\"name\":\"get_listing_exchanges\",\"title\":\"New listings exchange registry\",\"description\":\"Get the typed listing connector registry, including supported exchanges, venue types, market coverage, source documentation URLs, enabled status, polling group, and parser confidence.\",\"endpoint\":\"listings-exchanges\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/exchanges\",\"public\":\"/api/listings/exchanges\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"venue_type\":{\"description\":\"Filter exchange coverage by venue type.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Filter exchange coverage by supported market type.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"enabled\":{\"description\":\"Filter to enabled or disabled connectors.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingExchangeCoveragePayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingExchangeCoveragePayload\":{\"type\":\"object\",\"properties\":{\"exchanges\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingExchangeMeta\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"enabled_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshness_sla\":{\"type\":\"string\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"exchanges\",\"count\",\"enabled_count\",\"freshness_sla\",\"generated_at\"]},\"ListingExchangeMeta\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"venueType\":{\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"supportedMarketTypes\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"docsUrl\":{\"type\":\"string\"},\"sourceUrls\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"format\":\"uri\"}},\"rateLimitPosture\":{\"type\":\"string\"},\"parserConfidence\":{\"type\":\"string\"},\"connectorStatus\":{\"type\":\"string\"},\"pollingGroup\":{\"type\":\"string\"},\"enabled\":{\"type\":\"boolean\"},\"notes\":{\"type\":\"string\"}},\"required\":[\"id\",\"name\",\"venueType\",\"supportedMarketTypes\",\"docsUrl\",\"sourceUrls\",\"rateLimitPosture\",\"parserConfidence\",\"connectorStatus\",\"pollingGroup\",\"enabled\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"enabled\":\"enabled\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":null,\"freshness_sla_seconds\":null,\"behaviour\":[\"`enabled=true` keeps only enabled connectors, so `enabled_count` equals `count`.\"],\"cli\":{\"command\":\"sharpe listings exchanges\",\"options\":[\"venue_type\",\"market_type\",\"enabled\"]}},{\"name\":\"get_market_overview\",\"title\":\"Market overview\",\"description\":\"Get BTC and ETH price/change, total crypto market cap and 24h volume, BTC dominance, market-cap change, and the Fear & Greed Index. Auxiliary source fields may be null when unavailable.\",\"endpoint\":\"tracker-market-overview\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/tracker/market-overview\",\"public\":\"/api/tracker/market-overview\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MarketOverview\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MarketOverview\":{\"type\":\"object\",\"properties\":{\"bitcoin\":{\"type\":\"object\",\"properties\":{\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"price\",\"change\"]},\"ethereum\":{\"type\":\"object\",\"properties\":{\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"price\",\"change\"]},\"fgi\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"fgi_classification\":{\"type\":\"string\"},\"total_market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"total_volume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"btc_dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"btc_dominance_pct\":{\"description\":\"Bitcoin's share of total crypto market cap, in percent (57.3 = 57.3%): `btc_dominance` with its unit in its name. Null when unknown.\",\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"market_cap_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"bitcoin\",\"ethereum\",\"fgi\",\"fgi_classification\",\"total_market_cap\",\"total_volume\",\"btc_dominance\",\"market_cap_change_24h\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"sectors\",\"freshness_sla_seconds\":7200,\"behaviour\":[],\"cli\":{\"command\":\"sharpe market\",\"options\":[]}},{\"name\":\"get_memecoin_launches\",\"title\":\"Memecoin launches\",\"description\":\"Get recently launched tokens from recognized memecoin launchpads, screened by age, liquidity, volume, and transactions. Generic new DEX pairs are excluded; response includes complete/partial chain coverage.\",\"endpoint\":\"memecoins-launches\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/memecoins/launches\",\"public\":\"/api/memecoins/launches\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"chains\":{\"description\":\"Comma-separated chain IDs such as solana, base, bsc, ethereum.\",\"type\":\"string\"},\"days\":{\"default\":7,\"description\":\"Launch lookback window in days, from 1 to 30.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":30},\"limit\":{\"default\":80,\"description\":\"Maximum launch rows to return, from 1 to 200.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":200},\"profile\":{\"default\":\"balanced\",\"description\":\"Screening profile for liquidity, volume, and transaction thresholds.\",\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MemecoinLaunchesPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MemecoinLaunchesPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinLaunchRow\"}},\"scannedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"filters\":{\"type\":\"object\",\"properties\":{\"chains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"days\":{\"type\":\"integer\",\"x-unit\":\"days\"},\"limit\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"profile\":{\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]}},\"required\":[\"chains\",\"days\",\"limit\",\"profile\"]},\"coverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"successfulChains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"failedChains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"classificationMethod\":{\"type\":\"string\",\"enum\":[\"recognized_meme_launchpad\"]}},\"required\":[\"status\",\"successfulChains\",\"failedChains\",\"classificationMethod\"]}},\"required\":[\"rows\",\"scannedAt\",\"filters\",\"coverage\"]},\"MemecoinLaunchRow\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"tokenAddress\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"description\":\"DexScreener pair URL; may be empty when launchpad identity is inferred from dexId.\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"txnsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"txnsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"ageHours\":{\"type\":[\"number\",\"null\"]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]},\"launchedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"launchpad\":{\"type\":[\"string\",\"null\"]},\"migrationState\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"unknown\"]},{\"type\":\"null\"}]},\"screeningStatus\":{\"type\":\"string\",\"enum\":[\"liquidity_volume_txn_screened\"]},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"securitySignalSource\":{\"type\":[\"string\",\"null\"]},\"eligibleForTrackerIngestion\":{\"type\":\"boolean\"},\"canonicalInclusionReason\":{\"type\":\"string\"},\"memeClassification\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"verified\"]},\"source\":{\"type\":\"string\",\"enum\":[\"meme_launchpad\"]},\"evidence\":{\"type\":\"string\"}},\"required\":[\"status\",\"source\",\"evidence\"]}},\"required\":[\"chainId\",\"symbol\",\"name\",\"tokenAddress\",\"pairAddress\",\"dexId\",\"pairUrl\",\"priceUsd\",\"priceChangeH1\",\"priceChangeH24\",\"volumeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"txnsH1\",\"txnsH24\",\"ageHours\",\"holdersCount\",\"holdersSource\",\"launchedAt\",\"launchpad\",\"migrationState\",\"screeningStatus\",\"riskFlags\",\"securitySignalSource\",\"eligibleForTrackerIngestion\",\"canonicalInclusionReason\",\"memeClassification\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"chains\":\"chains\",\"days\":\"days\",\"limit\":\"limit\",\"profile\":\"profile\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"token_scanner\",\"freshness_sla_seconds\":300,\"behaviour\":[\"Generic new DEX pairs are excluded: every row comes from a recognised meme launchpad.\",\"Launches are screened by age: no row is older than the `days` window, and every row is on a scanned chain.\"],\"cli\":{\"command\":\"sharpe memecoin-launches\",\"options\":[\"chains\",\"days\",\"limit\",\"profile\"]}},{\"name\":\"get_memecoins\",\"title\":\"Memecoins data\",\"description\":\"Get memecoin narrative data across grouped categories (Dog, Cat, Frog, AI, Solana, Base, Pump.fun, etc.) with market cap, market share, volume, performance, and freshness fields.\",\"endpoint\":\"memecoins-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/memecoins/data\",\"public\":\"/api/memecoins/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Memecoin narrative slug to filter by (e.g. dog-coins, cat-coins, frog-coins, ai-memes, trump-coins).\",\"type\":\"string\"},\"historical\":{\"description\":\"Include historical time-series data for the specified window.\",\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"30d\",\"1y\"]},\"coinHistory\":{\"description\":\"Include per-coin price history where retained. Enum: 24h, 7d, 1m, 1y.\",\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"1m\",\"1y\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MemecoinsDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MemecoinsDataPayload\":{\"anyOf\":[{\"$ref\":\"#/definitions/MemecoinBasePayload\"},{\"$ref\":\"#/definitions/MemecoinDetailPayload\"},{\"$ref\":\"#/definitions/MemecoinHistoricalPayload\"}]},\"MemecoinBasePayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\"]},\"MemecoinNarrative\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"emoji\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"group\":{\"type\":\"string\",\"enum\":[\"aggregate\",\"theme\",\"chain\",\"launchpad\"]},\"primaryThemeId\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketSharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/MemecoinTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"trackedCoinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"coverageLimit\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentumKind\":{\"type\":\"string\",\"enum\":[\"short_term_price_momentum\"]},\"calculationMethod\":{\"$ref\":\"#/definitions/MemecoinCalculationMethod\"},\"returnCoverage\":{\"$ref\":\"#/definitions/MemecoinReturnCoverage\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"}},\"required\":[\"id\",\"name\",\"emoji\",\"slug\",\"group\",\"primaryThemeId\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"marketCap\",\"volume24h\",\"marketSharePct\",\"topCoin\",\"coinCount\",\"trackedCoinCount\",\"coverageLimit\",\"dominance\",\"momentum\",\"momentumKind\",\"calculationMethod\",\"returnCoverage\",\"freshness\"]},\"MemecoinTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"MemecoinCalculationMethod\":{\"type\":\"object\",\"properties\":{\"marketCap\":{\"type\":\"string\",\"enum\":[\"coingecko_category_market_cap_ex_exclusions\"]},\"volume24h\":{\"type\":\"string\",\"enum\":[\"coingecko_category_volume_ex_exclusions\"]},\"returns\":{\"type\":\"string\",\"enum\":[\"market_cap_weighted_constituent_price_change_min_500k_mcap\",\"median_constituent_price_change_min_500k_mcap\"]},\"medianReturns\":{\"type\":\"string\",\"enum\":[\"median_constituent_price_change_min_500k_mcap\"]},\"marketShare\":{\"type\":\"string\",\"enum\":[\"category_market_cap_over_all_memes_market_cap\"]},\"momentum\":{\"type\":\"string\",\"enum\":[\"0.40_1h_0.35_24h_0.25_7d\"]}},\"required\":[\"marketCap\",\"volume24h\",\"returns\",\"marketShare\",\"momentum\"]},\"MemecoinReturnCoverage\":{\"type\":\"object\",\"properties\":{\"1h\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"24h\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"7d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"30d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"200d\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"1y\":{\"type\":\"number\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"}},\"required\":[\"1h\",\"24h\",\"7d\",\"30d\",\"200d\",\"1y\"]},\"MemecoinFreshness\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\",\"enum\":[\"coingecko\"]},\"upstreamUpdatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"cachedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"}},\"required\":[\"source\",\"upstreamUpdatedAt\",\"cachedAt\",\"stale\"]},\"MemecoinPrimaryThemeBucket\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"sharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"color\":{\"type\":\"string\"},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"returnMethod\":{\"type\":\"string\",\"enum\":[\"market_cap_weighted_assigned_constituents\"]}},\"required\":[\"id\",\"name\",\"marketCap\",\"sharePct\",\"color\"]},\"MemecoinPrimaryThemeSnapshot\":{\"type\":\"object\",\"properties\":{\"theme_id\":{\"type\":\"string\"},\"market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"coin_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"total_meme_market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"theme_id\",\"market_cap\",\"coin_count\",\"total_meme_market_cap\",\"snapshot_at\"]},\"MemecoinHistoryMetadata\":{\"type\":\"object\",\"properties\":{\"window\":{\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"30d\",\"1y\"]},\"series\":{\"type\":\"string\",\"enum\":[\"all\",\"primary_theme\"]},\"cadence\":{\"type\":\"string\",\"enum\":[\"hourly\",\"daily\"]},\"cadenceMs\":{\"type\":\"integer\",\"minimum\":1},\"sourceRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"returnedRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"calculationMethod\":{\"type\":\"string\",\"enum\":[\"despiked_forward_filled_market_cap_snapshots\"]}},\"required\":[\"window\",\"cadence\",\"cadenceMs\",\"sourceRows\",\"returnedRows\",\"calculationMethod\"]},\"MemecoinCoinHistoryMetadata\":{\"type\":\"object\",\"properties\":{\"window\":{\"type\":\"string\",\"enum\":[\"24h\",\"7d\",\"1m\",\"1y\"]},\"cadence\":{\"type\":\"string\",\"enum\":[\"hourly\",\"daily\"]},\"cadenceMs\":{\"type\":\"integer\",\"minimum\":1},\"sourceRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"returnedRows\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"topCoinCount\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"calculationMethod\":{\"type\":\"string\",\"enum\":[\"forward_filled_coin_price_history\"]}},\"required\":[\"window\",\"cadence\",\"cadenceMs\",\"sourceRows\",\"returnedRows\",\"topCoinCount\",\"calculationMethod\"]},\"MemecoinDetailPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"coinPriceHistory\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\"},\"additionalProperties\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPricePoint\"}}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"MemecoinCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"sparkline\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}},\"athPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"atlPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"atlPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"circSupply\":{\"type\":[\"number\",\"null\"]},\"maxSupply\":{\"type\":[\"number\",\"null\"]},\"supplyRatio\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"volMcap\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"symbol\",\"image\",\"price\",\"change1h\",\"change24h\",\"change7d\",\"marketCap\",\"fdv\",\"volume24h\",\"sparkline\",\"athPrice\",\"athPercent\",\"atlPrice\",\"atlPercent\",\"circSupply\",\"maxSupply\",\"supplyRatio\",\"volMcap\",\"change30d\",\"change200d\",\"change1y\"]},\"MemecoinPricePoint\":{\"type\":\"object\",\"properties\":{\"time\":{\"type\":\"integer\",\"format\":\"int64\"},\"price\":{\"type\":\"number\",\"x-unit\":\"usd\"}},\"required\":[\"time\",\"price\"]},\"MemecoinHistoricalPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinNarrative\"}},\"totalMemeMcap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"updatedAt\":{\"type\":\"string\"},\"lastAttemptedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"freshness\":{\"$ref\":\"#/definitions/MemecoinFreshness\"},\"primaryThemeBuckets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeBucket\"}},\"primaryThemeSnapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinPrimaryThemeSnapshot\"}},\"historicalMetadata\":{\"$ref\":\"#/definitions/MemecoinHistoryMetadata\"},\"coinHistoryMetadata\":{\"$ref\":\"#/definitions/MemecoinCoinHistoryMetadata\"},\"degraded\":{\"type\":\"boolean\"},\"failedCategories\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MemecoinSnapshot\"}}},\"required\":[\"narratives\",\"totalMemeMcap\",\"updatedAt\",\"primaryThemeSnapshots\",\"historicalMetadata\",\"snapshots\"]},\"MemecoinSnapshot\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"market_cap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volume_24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"narrative_id\",\"market_cap\",\"volume_24h\",\"snapshot_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"narrative\",\"historical\",\"series\",\"coinHistory\"],\"python_params\":{\"narrative\":\"narrative\",\"historical\":\"historical\",\"coinHistory\":\"coin_history\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"memecoins\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`historical=7d` adds hourly market-cap snapshots covering the last 7 days, oldest first.\"],\"cli\":{\"command\":\"sharpe memecoins\",\"options\":[\"narrative\",\"historical\",\"coinHistory\"]}},{\"name\":\"get_mindshare\",\"title\":\"Mindshare data\",\"description\":\"Get narrative mindshare rankings, token-level attention rows, rolling windows, or historical mindshare snapshots.\",\"endpoint\":\"mindshare-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/mindshare/data\",\"public\":\"/api/mindshare/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"tokens\":{\"description\":\"Set to true for token rows.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"narrative\":{\"description\":\"Optional narrative slug.\",\"type\":\"string\"},\"historical\":{\"description\":\"Set to true for historical snapshots.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"timeframe\":{\"description\":\"Historical timeframe.\",\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"window\":{\"description\":\"Rolling snapshot window.\",\"type\":\"string\",\"enum\":[\"now\",\"24h\",\"7d\",\"30d\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/MindshareDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MindshareDataPayload\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareToken\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"shown\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"tokens\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareSnapshot\"}},\"requestedTimeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"resolvedTimeframe\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]},\"timeframeClamped\":{\"type\":\"boolean\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"1W\",\"1M\",\"3M\",\"6M\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]}},\"required\":[\"snapshots\",\"requestedTimeframe\",\"resolvedTimeframe\",\"timeframeClamped\",\"coverage\"]},{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MindshareNarrative\"}},\"globalSocialScore\":{\"type\":\"number\"},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string when cache data is unavailable.\"},\"window\":{\"type\":\"string\",\"enum\":[\"now\",\"24h\",\"7d\",\"30d\"]},\"snapshotCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"syncCadenceHours\":{\"type\":\"integer\",\"enum\":[12]}},\"required\":[\"narratives\",\"globalSocialScore\",\"updatedAt\",\"window\",\"snapshotCount\",\"syncCadenceHours\"]}]},\"MindshareToken\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":[\"string\",\"null\"]},\"narrativeIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"socialScore\":{\"type\":\"number\"},\"mindsharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"delta24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Change in mindsharePct over 24 hours, in percentage points of share (35.66 to 35.57 is -0.09), not a percent change; null when no snapshot that old exists.\"},\"delta7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Always null: token-level 7-day history is not retained.\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"narrativeIds\",\"socialScore\",\"mindsharePct\",\"watchlistUsers\",\"sentimentPct\",\"delta24h\",\"delta7d\",\"marketCap\",\"price\",\"priceChange24h\"]},\"MindshareSnapshot\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"total_social_score\":{\"type\":\"number\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlist_users\":{\"type\":\"number\",\"x-unit\":\"count\"},\"token_count\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"total_social_score\",\"mindshare_pct\",\"watchlist_users\",\"token_count\"]},\"MindshareNarrative\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"totalSocialScore\":{\"type\":\"number\"},\"mindsharePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"tokenCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"delta24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Change in mindsharePct over 24 hours, in percentage points of share (35.66 to 35.57 is -0.09), not a percent change; null when no snapshot that old exists.\"},\"delta7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Change in mindsharePct over 7 days, in percentage points of share (35.66 to 35.57 is -0.09), not a percent change; null when no snapshot that old exists.\"},\"delta30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Change in mindsharePct over 30 days, in percentage points of share (35.66 to 35.57 is -0.09), not a percent change; null when no snapshot that old exists.\"},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"slug\",\"totalSocialScore\",\"mindsharePct\",\"watchlistUsers\",\"sentimentPct\",\"tokenCount\",\"delta24h\",\"delta7d\",\"delta30d\",\"priceChange24h\",\"marketCap\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"tokens\",\"narrative\",\"historical\",\"timeframe\",\"window\"],\"python_params\":{\"tokens\":\"tokens\",\"narrative\":\"narrative\",\"historical\":\"historical\",\"timeframe\":\"timeframe\",\"window\":\"window\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"mindshare\",\"freshness_sla_seconds\":86400,\"behaviour\":[\"With `tokens=true`, `narrative` keeps only that narrative's tokens (its top 20 by social score).\"],\"cli\":{\"command\":\"sharpe mindshare\",\"options\":[\"tokens\",\"narrative\",\"historical\",\"timeframe\",\"window\"]}},{\"name\":\"get_narratives\",\"title\":\"Narratives data\",\"description\":\"Get narrative-level market data (L1, L2, DeFi, AI Agents, DePIN, RWA, Gaming, etc.) including market cap, volume, performance, and social metrics. sort orders the list by 24h change and top/bottom add the N highest and lowest narratives by 24h change (a narrative without one is never ranked).\",\"endpoint\":\"narratives-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/narratives/data\",\"public\":\"/api/narratives/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Narrative to return detail for: the config id (e.g. dex) or the URL slug (e.g. dex-tokens, layer-1, ai-agents). An unknown value returns 400 invalid_parameter listing the valid values.\",\"type\":\"string\"},\"correlation\":{\"description\":\"Set to \\\"true\\\" to include correlation data.\",\"type\":\"string\"},\"timeframe\":{\"description\":\"Timeframe for correlation data.\",\"type\":\"string\"},\"sort\":{\"description\":\"List only: order `narratives` by 24h change, highest (`-change24h`) or lowest (`change24h`) first; a narrative without a 24h change is last either way.\",\"type\":\"string\",\"enum\":[\"-change24h\",\"change24h\"]},\"top\":{\"description\":\"List only: add `top`, the N narratives with the highest 24h change.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":50},\"bottom\":{\"description\":\"List only: add `bottom`, the N narratives with the lowest 24h change.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":50}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"anyOf\":[{\"$ref\":\"#/definitions/NarrativeOverviewPayload\"},{\"$ref\":\"#/definitions/NarrativeDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"}]},{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"top\":{\"description\":\"With `top=N`: the N narratives with the highest 24h change, highest first (a narrative without a 24h change is never ranked).\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"bottom\":{\"description\":\"With `bottom=N`: the N narratives with the lowest 24h change, lowest first.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"funding_rate\":{\"type\":[\"number\",\"null\"]},\"coin_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"narrative_id\",\"snapshot_at\"]}},\"series\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"data\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}}},\"required\":[\"narrative_id\",\"data\"]}},\"seriesMetric\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"market_cap\",\"volume_24h\",\"open_interest\",\"tvl\"]},{\"type\":\"null\"}]},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"windowSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"windowSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\",\"series\",\"seriesMetric\",\"coverage\"],\"description\":\"History mode (`historical`): a compact `[epoch ms, value]` series per narrative when `chart` names a series metric, otherwise hourly snapshot rows.\"},{\"type\":\"object\",\"properties\":{\"mindshareSnapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"narrative_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"mindshare_pct\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"narrative_id\",\"snapshot_at\",\"mindshare_pct\"]}},\"coverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\",\"3Y\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"mindshareSnapshots\",\"coverage\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"funding_rate_8hr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"funding_rate_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"snapshot_at\",\"funding_rate_8hr\",\"funding_rate_apr\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"snapshots\"]},{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"market_cap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"snapshot_at\",\"volume_24h\",\"market_cap\",\"open_interest\"]}},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"rows\"]},{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"volume_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"avg_volume_10d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"volume_24h\",\"avg_volume_10d\"]}},\"degraded\":{\"type\":\"boolean\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"tokens\"]}]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"NarrativeOverviewPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"top\":{\"description\":\"With `top=N`: the N narratives with the highest 24h change, highest first (a narrative without a 24h change is never ranked).\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"bottom\":{\"description\":\"With `bottom=N`: the N narratives with the lowest 24h change, lowest first.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\",\"description\":\"ISO timestamp for populated cache data; an empty string for an empty cache response.\"},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\"]},\"NarrativeMarketRow\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"median1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}],\"description\":\"One-sided open interest across every venue, summed over the constituents' assets (each once).\"},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"mcapFdvRatio\":{\"type\":[\"number\",\"null\"]},\"volMcapRatio\":{\"type\":[\"number\",\"null\"]},\"oiMcapRatio\":{\"type\":[\"number\",\"null\"]},\"topCoin\":{\"anyOf\":[{\"$ref\":\"#/definitions/NarrativeTopCoin\"},{\"type\":\"null\"}]},\"coinCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"dominance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"momentum\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"sentimentPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Sentiment percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"mindsharePct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Mindshare percentage merged from the mindshare sync, or null when there is no measurement (unmeasured is not 0%).\"},\"watchlistUsers\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Watchlist users merged from the mindshare sync, or null when there is no measurement (never 0 as a stand-in).\"},\"tvl\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"dexVolume30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"protocolRevenue30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"slug\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"median1h\",\"median24h\",\"median7d\",\"median30d\",\"median200d\",\"median1y\",\"marketCap\",\"volume24h\",\"openInterest\",\"fundingRate\",\"mcapFdvRatio\",\"volMcapRatio\",\"oiMcapRatio\",\"topCoin\",\"coinCount\",\"dominance\",\"momentum\",\"sentimentPct\",\"mindsharePct\",\"watchlistUsers\",\"tvl\",\"dexVolume\",\"protocolRevenue\"]},\"NarrativeTopCoin\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]}},\"required\":[\"symbol\",\"image\",\"price\",\"change24h\"]},\"CategoryBasePrices\":{\"type\":\"object\",\"properties\":{\"btc\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"eth\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]},\"sol\":{\"type\":\"object\",\"properties\":{\"change1h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change7d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change30d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change200d\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"change1y\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\"]}},\"required\":[\"btc\",\"eth\",\"sol\"],\"description\":\"BTC, ETH and SOL percent price changes from CoinGecko, used to re-base category returns into BTC, ETH or SOL terms. There are no USD prices here.\"},\"CategorySyncCoverage\":{\"type\":\"object\",\"properties\":{\"expectedCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"freshCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"failedIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"retainedPreviousAggregate\":{\"type\":\"boolean\"}},\"required\":[\"expectedCount\",\"freshCount\",\"failedIds\",\"retainedPreviousAggregate\"],\"description\":\"How many configured categories the last sync refreshed. When a category fetch failed and a previous aggregate existed, the previous rows are served unchanged (`retainedPreviousAggregate`).\"},\"NarrativeDetailPayload\":{\"type\":\"object\",\"properties\":{\"narratives\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeMarketRow\"}},\"totalNarrativeMcap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"updatedAt\":{\"type\":\"string\"},\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NarrativeCoin\"}},\"sparkline\":{\"type\":\"array\",\"items\":{\"minItems\":2,\"maxItems\":2,\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"basePrices\":{\"anyOf\":[{\"$ref\":\"#/definitions/CategoryBasePrices\"},{\"type\":\"null\"}],\"description\":\"`null` when CoinGecko did not return every window for BTC, ETH and SOL; no window reads a fabricated 0.\"},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last sync ran. `updatedAt` stays at the last complete refresh when that run kept the previous rows.\"},\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\"],\"description\":\"`partial` when at least one category fetch failed in the last sync.\"},\"coverage\":{\"$ref\":\"#/definitions/CategorySyncCoverage\"}},\"required\":[\"narratives\",\"totalNarrativeMcap\",\"updatedAt\",\"coins\",\"sparkline\"]},\"NarrativeCoin\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"change1h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change200d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"change1y\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athDistance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"fundingRate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}],\"description\":\"The coin's funding across venues, 8-hour-equivalent (fraction per 8 hours), open-interest-weighted over each venue's primary contract; null when no venue has a fresh rate.\"},\"fundingApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"openInterest\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd_oi_one_sided\"},{\"type\":\"null\"}]},\"sparkline7d\":{\"type\":\"array\",\"items\":{\"type\":\"number\"}}},\"required\":[\"id\",\"symbol\",\"name\",\"image\",\"price\",\"marketCap\",\"fdv\",\"volume24h\",\"change1h\",\"change24h\",\"change7d\",\"change30d\",\"change200d\",\"change1y\",\"ath\",\"athDistance\",\"fundingRate\",\"openInterest\",\"sparkline7d\"]},\"CategoryCorrelationPayload\":{\"type\":\"object\",\"properties\":{\"timeframe\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]},\"labels\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"matrix\":{\"type\":\"array\",\"items\":{\"type\":\"array\",\"items\":{\"type\":[\"number\",\"null\"]}}},\"coverage\":{\"$ref\":\"#/definitions/CategoryCoverage\"},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"24H\",\"1W\",\"1M\",\"3M\",\"6M\",\"MTD\",\"YTD\",\"1Y\"]}}},\"required\":[\"timeframe\",\"labels\",\"matrix\"]},\"CategoryCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"insufficient\",\"unknown\"]},\"requestedSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableUntil\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"computedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"pointCount\":{\"type\":\"integer\"},\"bucketSeconds\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}]},\"usablePairCount\":{\"type\":\"integer\"}},\"required\":[\"status\",\"requestedSince\",\"availableSince\",\"availableUntil\",\"computedAt\",\"pointCount\",\"bucketSeconds\",\"usablePairCount\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"The list, detail and correlation bodies are v1's `data`: both routes answer from one read model (src/engine/serve/models/trackers/narratives.ts), mindshare merged and the correlation matrix padded on both since engine L5 WP-S3, and both take `sort` / `top` / `bottom` on the list (WP-S12). The free body also carries the freshness envelope in `meta`. The free route also answers `historical`, `mindshare_history`, `funding_history`, `token_history` and `token_volume`, which v1 does not accept.\",\"public_params\":[\"narrative\",\"mindshare_history\",\"historical\",\"chart\",\"narrative_id\",\"correlation\",\"funding_history\",\"token_history\",\"token_volume\",\"timeframe\",\"sort\",\"top\",\"bottom\"],\"python_params\":{\"narrative\":\"narrative\",\"correlation\":\"correlation\",\"timeframe\":\"timeframe\",\"sort\":\"sort\",\"top\":\"top\",\"bottom\":\"bottom\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"narratives\",\"freshness_sla_seconds\":14400,\"behaviour\":[\"`narrative` adds that narrative's constituent `coins` and its market-cap `sparkline` beside the full list.\",\"`correlation=true` returns a square matrix padded to every configured narrative: one row and one column per label.\",\"`chart=mcap-trend` answers the history mode with one compact market-cap series per narrative, oldest point first, instead of snapshot rows.\",\"`mindshare_history` returns every narrative's mindshare series and never an ecosystem's (`eco_*`), whatever its value.\",\"`funding_history` returns that narrative's per-token funding snapshots, oldest first.\",\"`token_history` returns that narrative's per-token market snapshots, oldest first.\"],\"cli\":{\"command\":\"sharpe narratives\",\"options\":[\"narrative\"]}},{\"name\":\"get_news\",\"title\":\"News feed\",\"description\":\"Get aggregated crypto news articles from multiple sources, with optional title search and filtering by category or coin. Articles are deduplicated so only the best source per story is shown.\",\"endpoint\":\"news-feed\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/news/feed\",\"public\":\"/api/news/feed\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":200,\"description\":\"Maximum number of articles to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"offset\":{\"default\":0,\"description\":\"Number of articles to skip for pagination.\",\"type\":\"integer\",\"minimum\":0},\"category\":{\"description\":\"Filter by news category.\",\"type\":\"string\",\"enum\":[\"all\",\"crypto\",\"tradfi\",\"macro\",\"research\",\"ai\",\"geopolitics\"]},\"coin\":{\"description\":\"Filter by coin ticker.\",\"type\":\"string\",\"minLength\":1},\"since\":{\"description\":\"ISO 8601 timestamp. Only return articles published after this time.\",\"format\":\"date-time\",\"type\":\"string\"},\"q\":{\"description\":\"Search article titles across the stored news corpus.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":200}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/NewsFeedPayload\"},{\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NewsArticle\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"nextCursor\":{\"description\":\"Cursor of the next page (`<published ISO>|<story id>`, the key of the last story returned); pass it back as `cursor`. Null when no story remains.\",\"type\":[\"string\",\"null\"]},\"nextOffset\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}],\"description\":\"Offset of the next page (offset plus the stories returned). Null when no story remains.\"},\"truncated\":{\"type\":\"boolean\"},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"articles\",\"total\",\"nextCursor\",\"nextOffset\",\"truncated\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"NewsFeedPayload\":{\"type\":\"object\",\"properties\":{\"articles\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/NewsArticle\"}},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"next_offset\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]},\"truncated\":{\"type\":\"boolean\"}},\"required\":[\"articles\",\"total\",\"next_offset\",\"truncated\"]},\"NewsArticle\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\",\"format\":\"int64\"},\"source\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"link\":{\"type\":\"string\",\"format\":\"uri\"},\"summary\":{\"type\":[\"string\",\"null\"]},\"author\":{\"type\":[\"string\",\"null\"]},\"tags\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"coin_tags\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"published\":{\"type\":\"string\",\"format\":\"date-time\"},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"source_tier\":{\"type\":\"integer\"},\"category\":{\"type\":\"string\",\"enum\":[\"crypto\",\"tradfi\",\"macro\",\"research\",\"ai\",\"geopolitics\"]}},\"required\":[\"id\",\"source\",\"title\",\"link\",\"summary\",\"author\",\"tags\",\"coin_tags\",\"published\",\"fetched_at\",\"source_tier\",\"category\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"`{articles, total, nextCursor, nextOffset, truncated}` with a `cursor` param, where v1 answers `{articles, total, next_offset, truncated}` and takes no cursor: src/app/api/news/feed/route.ts:35, :167-174 vs src/app/api/v1/news/feed/route.ts:67-76, :146-152. Same articles, same deduplicated order.\",\"public_params\":[\"limit\",\"offset\",\"category\",\"coin\",\"since\",\"q\",\"cursor\"],\"python_params\":{\"limit\":\"limit\",\"offset\":\"offset\",\"category\":\"category\",\"coin\":\"coin\",\"since\":\"since\",\"q\":\"q\"},\"pagination\":\"offset\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"news\",\"freshness_sla_seconds\":21600,\"behaviour\":[\"Stories are newest first by `published`.\",\"`limit` caps the page: at most `limit` stories come back.\",\"`nextOffset` is the offset of the next page (offset plus the stories returned), and `nextCursor` continues from the last story; both are null only when no story remains.\",\"Stories are deduplicated: no two articles on a page share a title.\"],\"cli\":{\"command\":\"sharpe news\",\"options\":[\"limit\",\"coin\",\"category\",\"since\",\"q\"]}},{\"name\":\"get_price_prediction\",\"title\":\"Price prediction\",\"description\":\"Get deterministic directional scores and sub-signal breakdowns for a coin. Optional 7D/30D values are volatility-scaled heuristic scenarios, not calibrated targets or probabilities.\",\"endpoint\":\"price-prediction-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/price-prediction/data\",\"public\":\"/api/price-prediction/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"coin\":{\"description\":\"Ticker, canonical coin slug, or CoinGecko ID to get predictions for (for example, `BTC` or `bitcoin`). A curated coin's ticker resolves to its slug.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/PricePredictionPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PricePredictionPayload\":{\"oneOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/CoinScore\"}},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"coins\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"coin\":{\"anyOf\":[{\"$ref\":\"#/definitions/CoinScore\"},{\"type\":\"null\"}]},\"updatedAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"coin\",\"updatedAt\"]}]},\"CoinScore\":{\"type\":\"object\",\"properties\":{\"coin\":{\"type\":\"string\"},\"displayName\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"consensusScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"direction\":{\"type\":\"string\",\"enum\":[\"strong_bullish\",\"bullish\",\"neutral\",\"bearish\",\"strong_bearish\",\"insufficient_data\"]},\"signals\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PredictionSignal\"}},\"signalsAvailable\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"exchangesUsed\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"spotPrice\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"24-hour price change in percent (2.15 = +2.15%), from the CoinGecko snapshot taken when the coin was scored. Unlike priceChange7d and priceChange30d, this is not a fraction.\"},\"priceChange7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"7-day price change as a decimal fraction (0.0875 = +8.75%), from hourly closes. Not a percent: multiply by 100 before comparing with priceChange24h.\"},\"priceChange30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"30-day price change as a decimal fraction (0.0564 = +5.64%), from hourly closes. Not a percent: multiply by 100 before comparing with priceChange24h.\"},\"distanceFrom7dHigh\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Price relative to the highest hourly close of the last 7 days, as a decimal fraction (-0.0426 = 4.26% below that high). Zero or negative.\"},\"distanceFrom7dLow\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}],\"description\":\"Price relative to the lowest hourly close of the last 7 days, as a decimal fraction (0.1245 = 12.45% above that low). Zero or positive.\"},\"realizedVolatility30d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"modelConfidence\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"forecasts\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PriceForecast\"}},\"scoredAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"prose\":{\"type\":[\"string\",\"null\"]},\"dominance\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"share\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"}},\"required\":[\"name\",\"label\",\"share\"]},{\"type\":\"null\"}]}},\"required\":[\"coin\",\"displayName\",\"slug\",\"consensusScore\",\"direction\",\"signals\",\"signalsAvailable\",\"exchangesUsed\",\"spotPrice\",\"marketCap\",\"priceChange24h\",\"priceChange7d\",\"priceChange30d\",\"distanceFrom7dHigh\",\"distanceFrom7dLow\",\"realizedVolatility30d\",\"modelConfidence\",\"forecasts\",\"scoredAt\",\"prose\",\"dominance\"]},\"PredictionSignal\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"label\":{\"type\":\"string\"},\"rawValue\":{\"type\":[\"number\",\"null\"]},\"rawDisplay\":{\"type\":\"string\"},\"subScore\":{\"type\":\"number\"},\"conviction\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"bias\":{\"type\":\"string\"},\"tooltip\":{\"type\":\"string\"}},\"required\":[\"name\",\"label\",\"rawValue\",\"rawDisplay\",\"subScore\",\"conviction\",\"bias\",\"tooltip\"]},\"PriceForecast\":{\"type\":\"object\",\"properties\":{\"days\":{\"type\":\"integer\",\"enum\":[7,30],\"x-unit\":\"days\"},\"expectedChangePct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"expectedPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"lowPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"highPrice\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"confidence\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"}},\"required\":[\"days\",\"expectedChangePct\",\"expectedPrice\",\"lowPrice\",\"highPrice\",\"confidence\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":[\"coin\",\"coingeckoId\",\"symbol\",\"name\"],\"python_params\":{\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"price_prediction_inputs\",\"freshness_sla_seconds\":43200,\"behaviour\":[\"`coin` returns that one coin's score.\",\"7D/30D scenarios are returned only for a coin with at least two active signals and a positive spot price.\"],\"cli\":{\"command\":\"sharpe predict\",\"options\":[\"coin\"]}},{\"name\":\"get_pump_dump\",\"title\":\"Pump and dump detection\",\"description\":\"Get pump-and-dump manipulation risk signals across crypto assets. Scores combine derivatives pressure, holder concentration, liquidity quality, DEX flow, and price behavior; read signal_coverage_pct because partial-input scores are conservative lower bounds. coin returns one coin's row as the scorer wrote it (score null once it stopped qualifying).\",\"endpoint\":\"pump-dump-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/pump-dump/data\",\"public\":\"/api/pump-dump/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":100,\"description\":\"Maximum number of coins to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":500},\"min_score\":{\"default\":0,\"description\":\"Filter to coins scoring at or above this value.\",\"type\":\"number\",\"minimum\":0,\"maximum\":10},\"phase\":{\"description\":\"Filter to one manipulation phase label.\",\"type\":\"string\",\"enum\":[\"setup\",\"markup\",\"distribution\",\"dump\",\"dumping\"]},\"coin\":{\"description\":\"One coin by its CoinGecko id (e.g. pepe): its row exactly as the scorer wrote it, whatever its score. A coin that stopped qualifying answers `score: null` with its sub-scores and phase cleared; an id with no row answers an empty list. `limit`, `min_score` and `phase` do not apply.\",\"type\":\"string\",\"minLength\":1,\"maxLength\":128}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PumpDumpRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"description\":{\"type\":\"string\"},\"signal\":{\"$ref\":\"#/definitions/ManipulationSignal\"},\"data_as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600],\"description\":\"Freshness SLA in seconds (1 hour).\"}},\"required\":[\"coins\",\"count\",\"description\",\"signal\",\"data_as_of\",\"stale\",\"freshness_sla_seconds\"]},{\"type\":\"object\",\"properties\":{\"scores\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/PumpDumpRow\"},\"description\":\"Every scored coin (score above 0 on at least two venues), highest score first, filtered by `limit` and `min_score` (and `phase` on pump-dump) as on v1.\"},\"meta\":{\"type\":\"object\",\"properties\":{\"totalScanned\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"Distinct crypto assets with funding in the last three days (get_perps_monitored_count; stock, commodity, index and fx perps are not scored): the universe the score run scans, not the number of rows. Null when the count could not be read; that answer is not cached.\"},\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"totalScanned\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present, and true, only when the newest row is older than the 1-hour freshness SLA or a failed read served the last good payload.\"}},\"required\":[\"scores\",\"meta\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"PumpDumpRow\":{\"type\":\"object\",\"properties\":{\"coin_id\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"avg_funding_72h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_8h\"},{\"type\":\"null\"}]},\"exchange_count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"funding_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"manipulation_phase\":{\"type\":[\"string\",\"null\"]},\"oi_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"cvd_trend_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"basis_rate_avg\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"holders_count\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"liquidity_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_24h_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"volume_to_liquidity_24h\":{\"type\":[\"number\",\"null\"]},\"buy_sell_imbalance_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}]},\"mintable\":{\"type\":[\"boolean\",\"null\"]},\"freezable\":{\"type\":[\"boolean\",\"null\"]},\"consecutive_negative_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"price_change_24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"price_change_7d\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"signal_start_date\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"holders_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"top10_holders_pct_change\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"liquidity_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"volume_change_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"pump_magnitude\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"divergence_persistence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"derivatives_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"holder_concentration\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"liquidity_fragility\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"flow_imbalance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"market_structure_risk\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"dump_pressure\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"price_funding_divergence\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"signal_coverage_pct\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"percent\"},\"signal_coverage_status\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"limited\"]},\"incomplete_signal_groups\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"score_interpretation\":{\"type\":\"string\",\"enum\":[\"fully-observed\",\"lower-bound-partial-inputs\"]}},\"required\":[\"coin_id\",\"symbol\",\"name\",\"score\",\"exchange_count\",\"updated_at\",\"signal_coverage_pct\",\"signal_coverage_status\",\"incomplete_signal_groups\",\"score_interpretation\"]},\"ManipulationSignal\":{\"type\":\"object\",\"properties\":{\"methodology\":{\"type\":\"string\"},\"coverage\":{\"type\":\"string\"},\"gate\":{\"type\":[\"string\",\"null\"]},\"phase_filter\":{\"type\":[\"string\",\"null\"]},\"update_frequency\":{\"type\":\"string\"},\"exchanges\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"methodology\",\"coverage\",\"update_frequency\",\"exchanges\"]}}},\"public_body\":\"own\",\"public_differs\":\"`{scores, meta: {totalScanned}, stale?}` where v1 answers `{coins, count, description, signal, data_as_of, stale, freshness_sla_seconds}`; both filter by `limit` / `min_score` / phase through one read model (src/engine/serve/models/signals/scores.ts). Rows are PumpDumpRow without the v1-only `price_funding_divergence` alias.\",\"public_params\":[\"limit\",\"min_score\",\"phase\",\"coin\"],\"python_params\":{\"limit\":\"limit\",\"min_score\":\"min_score\",\"phase\":\"phase\",\"coin\":\"coin\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"pump_dump\",\"freshness_sla_seconds\":3600,\"behaviour\":[\"Coins are ordered by score, highest first, and every listed coin scores above 0 on at least two venues.\",\"Every coin carries its signal coverage; `score_interpretation` is `fully-observed` exactly when `signal_coverage_pct` is 100.\"],\"cli\":{\"command\":\"sharpe pump-dump\",\"options\":[\"limit\",\"min_score\",\"phase\"]}},{\"name\":\"get_recent_listings\",\"title\":\"Recent new listings\",\"description\":\"Get a flat feed of recent token listings. Defaults remain backward-compatible with the legacy spot listing feed. Event filters add source-observation freshness, partial status, and provider coverage so agents can reject incomplete opportunity scans.\",\"endpoint\":\"listings-recent\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/listings/recent\",\"public\":\"/api/listings/recent\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"narrative\":{\"description\":\"Filter to a single narrative slug.\",\"type\":\"string\"},\"exchange\":{\"description\":\"Filter to a single exchange.\",\"type\":\"string\",\"enum\":[\"binance\",\"okx\",\"bybit\",\"gateio\",\"mexc\",\"bitget\",\"kucoin\",\"bingx\",\"bitmart\",\"deepcoin\",\"coinbase\",\"kraken\",\"crypto_com\",\"upbit\",\"bithumb\",\"htx\",\"bitfinex\",\"bitstamp\",\"gemini\",\"bitmex\",\"deribit\",\"phemex\",\"lbank\",\"bitrue\",\"coinex\",\"backpack\",\"hashkey\",\"whitebit\",\"toobit\",\"hyperliquid\",\"aster\",\"dydx\",\"aevo\"]},\"venue_type\":{\"description\":\"Optional event-feed venue type filter.\",\"type\":\"string\",\"enum\":[\"cex\",\"perp_dex\",\"dex\"]},\"market_type\":{\"description\":\"Optional event-feed market type filter.\",\"type\":\"string\",\"enum\":[\"spot\",\"perp\",\"futures\",\"options\",\"margin\"]},\"event_type\":{\"description\":\"Optional event-feed lifecycle event filter.\",\"type\":\"string\",\"enum\":[\"listing\",\"delisting\",\"suspension\",\"resumption\",\"prelaunch\"]},\"asset_class\":{\"description\":\"Optional listed instrument class filter.\",\"type\":\"string\",\"enum\":[\"token\",\"spot_pair\",\"perp_contract\",\"futures_contract\",\"options_contract\"]},\"status\":{\"description\":\"Optional event status filter.\",\"type\":\"string\",\"enum\":[\"announced\",\"scheduled\",\"live\",\"completed\",\"cancelled\",\"needs_review\"]},\"confidence\":{\"description\":\"Optional source confidence filter.\",\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},\"from\":{\"description\":\"ISO date or datetime lower bound.\",\"type\":\"string\"},\"to\":{\"description\":\"ISO date or datetime upper bound.\",\"type\":\"string\"},\"days\":{\"default\":90,\"description\":\"How many days back to include. Default 90.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":365},\"limit\":{\"default\":200,\"description\":\"Max rows returned.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":1000},\"cursor\":{\"description\":\"Cursor returned by previous page.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/ListingsRecentPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"ListingsRecentPayload\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingRecentCompatRow\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"window_days\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"days\"},{\"type\":\"null\"}]},\"next_cursor\":{\"type\":[\"string\",\"null\"]},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Event-feed response assembly time; present when event-specific filters are used.\"},\"last_updated_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}],\"description\":\"Freshest source observation; present when event-specific filters are used.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"True exactly when partial_reasons is non-empty; present when event-specific filters are used.\"},\"partial_reasons\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"One sentence per coverage gap: a provider whose request failed, a live exchange instrument feed whose newest listing is more than 60 days old, the hourly spot-listings ingest when the query covers its venues and its last completed run is more than 3 hours old, the canonical events table being unavailable (rows then come from the compatibility table), or a requested exchange, venue_type or market_type that no enabled connector covers. Empty when coverage is whole. Present when event-specific filters are used.\"},\"provider_coverage\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ListingEventProviderCoverage\"},\"description\":\"Per-provider health; present when event-specific filters are used.\"}},\"required\":[\"rows\",\"count\",\"window_days\"]},\"ListingRecentCompatRow\":{\"type\":\"object\",\"properties\":{\"token_symbol\":{\"type\":\"string\"},\"token_name\":{\"type\":[\"string\",\"null\"]},\"token_id\":{\"type\":[\"string\",\"null\"]},\"exchange\":{\"type\":\"string\"},\"listing_date\":{\"format\":\"date\",\"type\":[\"string\",\"null\"]},\"narrative_slug\":{\"type\":[\"string\",\"null\"]},\"listing_date_source\":{\"type\":\"string\"},\"market_type\":{\"type\":[\"string\",\"null\"]},\"event_type\":{\"type\":[\"string\",\"null\"]},\"status\":{\"type\":[\"string\",\"null\"]},\"source_confidence\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"authoritative\",\"high\",\"medium\",\"low\",\"proxy\",\"manual\"]},{\"type\":\"null\"}]}},\"required\":[\"token_symbol\",\"token_name\",\"token_id\",\"exchange\",\"listing_date\",\"narrative_slug\",\"listing_date_source\"]},\"ListingEventProviderCoverage\":{\"type\":\"object\",\"properties\":{\"provider\":{\"type\":\"string\",\"description\":\"Stable provider or database identifier.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"database\",\"official_overlay\"]},\"status\":{\"type\":\"string\",\"enum\":[\"ok\",\"error\",\"skipped\"]},\"row_count\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"last_observed_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"provider\",\"kind\",\"status\",\"row_count\",\"last_observed_at\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"narrative\":\"narrative\",\"exchange\":\"exchange\",\"venue_type\":\"venue_type\",\"market_type\":\"market_type\",\"event_type\":\"event_type\",\"asset_class\":\"asset_class\",\"status\":\"status\",\"confidence\":\"confidence\",\"from\":\"from\",\"to\":\"to\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":\"desc\",\"keep\":\"latest\",\"dataset\":\"listings\",\"freshness_sla_seconds\":7200,\"behaviour\":[\"Without event filters the legacy spot feed answers: rows newest listing date first over `window_days` (default 90), with no event-feed coverage fields.\"],\"cli\":{\"command\":\"sharpe listings recent\",\"options\":[\"narrative\",\"exchange\",\"venue_type\",\"market_type\",\"event_type\",\"confidence\",\"from\",\"to\",\"cursor\",\"days\",\"limit\"]}},{\"name\":\"get_rug_check_security\",\"title\":\"Rug Check token security\",\"description\":\"Get rug-check token contract security and liquidity risk signals, and the Rug Check score the /rug-check page shows, computed by the API: score.value (0-100, higher is safer; null only when no provider answered), score.verdict, score.data_completeness and score.engine_version, with the checks[] behind it.\",\"endpoint\":\"rug-check-security\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rug-check/security\",\"public\":\"/api/rug-check/security\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\",\"minLength\":1,\"description\":\"Token contract address.\"},\"chainId\":{\"type\":\"integer\",\"minimum\":1,\"description\":\"EVM chain ID (1 Ethereum, 56 BNB Smart Chain, 8453 Base, 42161 Arbitrum, 137 Polygon, 10 Optimism, 43114 Avalanche, 146 Sonic, 80094 Berachain, and 29 more), or 1399811149 for Solana and 728126428 for Tron. An unsupported chain returns 400.\"}},\"required\":[\"address\",\"chainId\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/RugCheckSecurity\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RugCheckSecurity\":{\"type\":\"object\",\"properties\":{\"isHoneypot\":{\"type\":[\"boolean\",\"null\"]},\"noMint\":{\"type\":[\"boolean\",\"null\"]},\"noBlacklist\":{\"type\":[\"boolean\",\"null\"]},\"isOpenSource\":{\"type\":[\"boolean\",\"null\"]},\"isProxy\":{\"type\":[\"boolean\",\"null\"]},\"hiddenOwner\":{\"type\":[\"boolean\",\"null\"]},\"buyTax\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"sellTax\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction\"},{\"type\":\"null\"}]},\"canTakeBackOwnership\":{\"type\":[\"boolean\",\"null\"]},\"cannotSellAll\":{\"type\":[\"boolean\",\"null\"]},\"cannotBuy\":{\"type\":[\"boolean\",\"null\"]},\"tradingCooldown\":{\"type\":[\"boolean\",\"null\"]},\"selfDestruct\":{\"type\":[\"boolean\",\"null\"]},\"transferPausable\":{\"type\":[\"boolean\",\"null\"]},\"slippageModifiable\":{\"type\":[\"boolean\",\"null\"]},\"personalSlippageModifiable\":{\"type\":[\"boolean\",\"null\"]},\"isAntiWhale\":{\"type\":[\"boolean\",\"null\"]},\"antiWhaleModifiable\":{\"type\":[\"boolean\",\"null\"]},\"externalCall\":{\"type\":[\"boolean\",\"null\"]},\"isWhitelisted\":{\"type\":[\"boolean\",\"null\"]},\"honeypotWithSameCreator\":{\"type\":[\"boolean\",\"null\"]},\"transferTax\":{\"type\":[\"number\",\"null\"]},\"isInCex\":{\"type\":[\"boolean\",\"null\"]},\"cexList\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"type\":\"string\"}},{\"type\":\"null\"}]},\"creatorAddress\":{\"type\":[\"string\",\"null\"]},\"creatorPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"ownerAddress\":{\"type\":[\"string\",\"null\"]},\"ownerPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}]},\"ownerChangeBalance\":{\"type\":[\"boolean\",\"null\"]},\"holderCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"totalSupply\":{\"type\":[\"string\",\"null\"]},\"lpHolderCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"lpTotalSupply\":{\"type\":[\"string\",\"null\"]},\"trustList\":{\"type\":[\"boolean\",\"null\"]},\"topHolders\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckHolder\"}},{\"type\":\"null\"}]},\"lpHolders\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckHolder\"}},{\"type\":\"null\"}],\"description\":\"LP holders of the main pool (the deepest dexInfo entry). Each holder's percent is its share of that pool's LP token supply as a 0-1 fraction (0.0002 = 0.02%) on every chain; Solana shares are recomputed from the holder balance over the pool's LP amount. Null when the list cannot be tied to a standard AMM pool.\"},\"dexInfo\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckDex\"}},{\"type\":\"null\"}],\"description\":\"DEX pools, deepest first, so entry 0 is the main pool.\"},\"source\":{\"type\":\"string\",\"enum\":[\"evm-security-scan\",\"solana-security-scan\",\"combined\"]},\"stale\":{\"type\":\"boolean\",\"description\":\"Present and true only when the security provider was temporarily unavailable and this is the token's last good record (at most 7 days old). Absent on live answers.\"},\"dataAsOf\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the last good record was fetched. Present only alongside `stale`.\"},\"partial\":{\"type\":\"boolean\",\"description\":\"Present and true only when the security provider was unavailable and the token has no last good record, on Ethereum, BNB Smart Chain or Base: `isHoneypot` comes from Honeypot.is's buy/sell simulation and every other security field is null (unknown). The score then treats the contract checks as unknown, except that a detected honeypot scores 5 (Danger). Absent otherwise.\"},\"score\":{\"$ref\":\"#/definitions/RugCheckScore\"},\"checks\":{\"description\":\"The rows of the /rug-check page's Contract Security and Token Health tables for this token, contract rows first, each in the page's order. Present on every 200 answer, beside `score`.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugCheckCheck\"}}},\"required\":[\"isHoneypot\",\"noMint\",\"noBlacklist\",\"isOpenSource\",\"isProxy\",\"hiddenOwner\",\"buyTax\",\"sellTax\",\"canTakeBackOwnership\",\"cannotSellAll\",\"cannotBuy\",\"tradingCooldown\",\"selfDestruct\",\"transferPausable\",\"slippageModifiable\",\"personalSlippageModifiable\",\"isAntiWhale\",\"antiWhaleModifiable\",\"externalCall\",\"isWhitelisted\",\"honeypotWithSameCreator\",\"transferTax\",\"isInCex\",\"cexList\",\"creatorAddress\",\"creatorPercent\",\"ownerAddress\",\"ownerPercent\",\"ownerChangeBalance\",\"holderCount\",\"totalSupply\",\"lpHolderCount\",\"lpTotalSupply\",\"trustList\",\"topHolders\",\"lpHolders\",\"dexInfo\",\"source\"]},\"RugCheckHolder\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\"},\"balance\":{\"type\":\"number\"},\"percent\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},\"isLocked\":{\"type\":\"boolean\"},\"isContract\":{\"type\":\"boolean\"},\"tag\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"address\",\"balance\",\"percent\",\"isLocked\",\"isContract\",\"tag\"]},\"RugCheckDex\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"liquidity\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"pair\":{\"type\":\"string\"},\"burnPercent\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Burned share of this pool's LP tokens in percent (0-100) from GoPlus, counting destroyed LP and LP held in Raydium's lock. Solana standard AMM pools only: null for concentrated-liquidity pools and on EVM chains.\"}},\"required\":[\"name\",\"liquidity\",\"pair\",\"burnPercent\"]},\"RugCheckScore\":{\"type\":\"object\",\"properties\":{\"value\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0,\"maximum\":100,\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"0-100, higher is safer. Null only when no provider answered (`data_completeness` `none`), never a default 50.\"},\"verdict\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"safe\",\"caution\",\"risky\",\"danger\"]},{\"type\":\"null\"}],\"description\":\"`safe` at 80 or more, `caution` at 50, `risky` at 20, else `danger`. Null when `value` is null.\"},\"verdict_label\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"Looks Safe\",\"Use Caution\",\"Risky\",\"Danger\"]},{\"type\":\"null\"}],\"description\":\"The verdict as the page labels it. Null when `value` is null.\"},\"verdict_note\":{\"description\":\"\\\"Trusted issuer, centralised controls\\\" when GoPlus trust-lists the token and its issuer can still mint, freeze, pause or upgrade it: those controls are listed as warnings but neither scored nor capped. Otherwise null.\",\"type\":[\"string\",\"null\"]},\"data_completeness\":{\"type\":\"string\",\"enum\":[\"full\",\"partial\",\"none\"],\"description\":\"`full`: the contract, holder and market pillars each had data. `partial`: one or two had none (each such pillar scores a neutral 50). `none`: no provider answered, so there is no score.\"},\"engine_version\":{\"type\":\"integer\",\"description\":\"Version of the scoring rules. A declared change to a weight, cap, band or check increments it, so a stored score can be told apart from one computed under other rules.\"},\"insights\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The verdict's reasons as the page lists them, at most 6.\"}},\"required\":[\"value\",\"verdict\",\"verdict_label\",\"verdict_note\",\"data_completeness\",\"engine_version\",\"insights\"],\"description\":\"The Rug Check score the /rug-check page shows for this token, computed server-side (engine metric token_risk.rug_check) from this answer's GoPlus fields, the token's DexScreener market figures (liquidity and 24h volume summed over its pairs on this chain, age from its oldest pair) and its GeckoTerminal holder data. Weighted 0.40 contract, 0.35 holders, 0.25 market health, then capped by hard signals (a honeypot or sell block sets 5). An input a lookup could not read is unknown, never zero: it is left out of its pillar's average (its row reads `—`), a pillar with no data at all scores a neutral 50, and `data_completeness` says whether every pillar had data. On a `stale` answer the score is computed from the last good GoPlus record. Present on every 200 answer.\"},\"RugCheckCheck\":{\"type\":\"object\",\"properties\":{\"pillar\":{\"type\":\"string\",\"enum\":[\"contract\",\"health\"],\"description\":\"`contract`: the Contract Security table; `health`: the Token Health table.\"},\"label\":{\"type\":\"string\",\"description\":\"The check, e.g. `Honeypot`, `Mint`, `Liquidity`.\"},\"value\":{\"type\":\"string\",\"description\":\"The displayed result, e.g. `Disabled`, `$6.5M`, `2.8y`.\"},\"status\":{\"type\":\"string\",\"enum\":[\"safe\",\"warning\",\"danger\",\"neutral\"],\"description\":\"`neutral`: shown without a judgement (unknown, or an owner-only power of a renounced contract).\"},\"tooltip\":{\"type\":\"string\",\"description\":\"What the check means.\"}},\"required\":[\"pillar\",\"label\",\"value\",\"status\",\"tooltip\"],\"description\":\"One row of the /rug-check page's Contract Security or Token Health table.\"}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"address\":\"address\",\"chainId\":\"chain_id\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"rug_check_inputs\",\"freshness_sla_seconds\":300,\"behaviour\":[\"An EVM token answers from GoPlus's EVM scan (`source: evm-security-scan`).\",\"`dexInfo` lists pools deepest first, so entry 0 is the main pool.\",\"Holder and LP holder shares are 0-1 fractions.\",\"Every 200 answer carries `score` and `checks`, and `checks` lists the Contract Security rows before the Token Health rows.\",\"`score.verdict` is the band of `score.value` (safe at 80 or more, caution at 50, risky at 20, else danger); both are null only when `data_completeness` is `none`.\",\"A Solana token answers from GoPlus's Solana scan (`source: solana-security-scan`), with the EVM-only honeypot, tax and proxy fields null.\",\"`dexInfo` lists pools deepest first, so entry 0 is the main pool.\",\"Holder and LP holder shares are 0-1 fractions.\",\"Every 200 answer carries `score` and `checks`, and `checks` lists the Contract Security rows before the Token Health rows.\",\"`score.verdict` is the band of `score.value` (safe at 80 or more, caution at 50, risky at 20, else danger); both are null only when `data_completeness` is `none`.\"],\"cli\":{\"command\":\"sharpe rug-check security\",\"options\":[\"address\",\"chainId\"]}},{\"name\":\"get_rug_check_trending\",\"title\":\"Rug Check trending tokens\",\"description\":\"Get trending tokens suitable for rug-check review.\",\"endpoint\":\"rug-check-trending\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rug-check/trending\",\"public\":\"/api/rug-check/trending\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"limit\":{\"default\":50,\"description\":\"Maximum tokens to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":100}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"$ref\":\"#/definitions/RugTrendingPayload\"},{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugTrendingToken\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Tokens returned (at most `limit`).\"},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\",\"description\":\"Tokens in the cached trending list (at most 100).\"},\"source\":{\"type\":\"string\",\"enum\":[\"GeckoTerminal\"]},\"fetchedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the trending list was fetched from GeckoTerminal.\"},\"stale\":{\"description\":\"Present only when GeckoTerminal answered on no network and this is the last good list (kept 6 hours); `fetchedAt` is then its real age.\",\"type\":\"boolean\",\"const\":true},\"meta\":{\"$ref\":\"#/definitions/ServeMeta\"}},\"required\":[\"tokens\",\"count\",\"total\",\"source\",\"fetchedAt\"]}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RugTrendingPayload\":{\"type\":\"object\",\"properties\":{\"tokens\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/RugTrendingToken\"}},\"count\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"total\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"source\":{\"type\":\"string\",\"enum\":[\"GeckoTerminal\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"tokens\",\"count\",\"total\",\"source\",\"fetched_at\"]},\"RugTrendingToken\":{\"type\":\"object\",\"properties\":{\"address\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"networkId\":{\"type\":\"integer\"},\"chainName\":{\"type\":\"string\"},\"imageUrl\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"string\",\"null\"]},\"priceChange24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"volume24h\":{\"type\":[\"string\",\"null\"]},\"liquidity\":{\"type\":[\"string\",\"null\"]},\"marketCap\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"address\",\"name\",\"symbol\",\"networkId\",\"chainName\",\"imageUrl\",\"price\",\"priceChange24h\",\"volume24h\",\"liquidity\",\"marketCap\"]},\"ServeMeta\":{\"type\":\"object\",\"properties\":{\"dataset_id\":{\"type\":\"string\",\"enum\":[\"funding_rates_current\",\"funding_rates_history\",\"funding_accumulated\",\"funding_fee_settlement\",\"global_overview_snapshot\",\"futures_open_interest\",\"futures_basis\",\"futures_term_structure\",\"futures_liquidations\",\"futures_long_short_ratio\",\"futures_ohlcv\",\"futures_coins\",\"rwa_perp_rates_current\",\"arbitrage_tickers\",\"arbitrage_boards\",\"arbitrage_dated_quotes\",\"dex_pools\",\"narratives\",\"ecosystems\",\"memecoins\",\"mindshare\",\"sectors\",\"chains\",\"sector_coins\",\"chain_coins\",\"gem_finder\",\"web_traffic\",\"heatmap_cache\",\"stablecoins\",\"news\",\"listings\",\"token_scanner\",\"rug_check_inputs\",\"rug_check_trending\",\"pump_dump\",\"insider_pressure\",\"price_prediction_inputs\",\"correlation_prices\",\"market_cap_search\",\"coingecko_coin_list\",\"boros_markets\",\"margin_borrow_rates\"],\"description\":\"The dataset the answer is read from; /v1/meta/coverage lists each product's datasets with their cadence and SLA.\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the data was current: the dataset's own time (the newest live row, the snapshot or refresh time, the fetch time), not the response time. Null when unknown.\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"`as_of` plus the freshness SLA: after this instant the data is stale, whenever the body is read (a cached copy can be re-judged against it).\"},{\"type\":\"null\"}]},\"freshness_sla_seconds\":{\"type\":\"number\",\"description\":\"Seconds after `as_of` the data stays fresh: the writer's cadence plus one skipped run.\"},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"],\"description\":\"`fresh` within the SLA at `generated_at`, `stale` past it, `unknown` when `as_of` is null.\"},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"],\"description\":\"`degraded` when this read was incomplete: a leg timed out or failed, a row budget was hit, or a fallback answered. Degraded answers are never cached.\"},\"served_from\":{\"type\":\"string\",\"enum\":[\"snapshot\",\"table\",\"matview\",\"live\",\"last-good\"],\"description\":\"Where the rows came from: a precomputed snapshot, a table or materialized view, the upstream on request, or the server's last good answer.\"},\"generated_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When this answer was built (the instant `freshness_status` is judged at).\"},\"source\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"The upstream sources behind the rows (source ids such as `binance`, `coingecko`).\"},\"coverage\":{\"type\":\"object\",\"properties\":{\"expected\":{\"type\":\"number\"},\"used\":{\"type\":\"number\"},\"dropped\":{\"type\":\"object\",\"propertyNames\":{\"type\":\"string\",\"enum\":[\"not_live\",\"stale\",\"missing_value\",\"bad_interval\",\"asset_class\",\"token_class\",\"contract_type\",\"margin_type\",\"below_floor\",\"unknown_liquidity\",\"tenor_floor\",\"identity_mismatch\",\"price_gap\",\"divergent_upstream\"]},\"additionalProperties\":{\"type\":\"number\"}},\"missing\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"expected\",\"used\",\"dropped\"],\"description\":\"How complete the stored data is (never whether it is cached): `used` of `expected` inputs counted; `dropped` counts the rest by reason (a halted market is `not_live`, outside `expected`); `missing` names the late ones when known.\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the read could not do, in words (an unreadable table, a late writer).\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when a row budget cut the answer short.\"}},\"required\":[\"dataset_id\",\"as_of\",\"stale_after\",\"freshness_sla_seconds\",\"freshness_status\",\"runtime_status\",\"served_from\",\"generated_at\",\"source\",\"warnings\",\"truncated\"],\"description\":\"The freshness envelope of the answer (engine L5 ServeMeta): which dataset it was read from, when that data was current and until when it counts as fresh, whether the read was complete, and where the rows came from.\"}}},\"public_body\":\"own\",\"public_differs\":\"Names the fetch time `fetchedAt` where v1 renames it `fetched_at` (src/app/api/v1/rug-check/trending/route.ts:114), carries `stale: true` on a last-good list where v1 drops the flag, and defaults `limit` to 12 (src/app/api/rug-check/trending/route.ts:151). Same token rows.\",\"public_params\":[\"limit\"],\"python_params\":{\"limit\":\"limit\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"rug_check_trending\",\"freshness_sla_seconds\":1800,\"behaviour\":[\"Tokens are ordered by 24h volume across chains, highest first.\",\"Without `limit`, the free route returns at most 12 tokens; `count` is the number returned and `total` the size of the whole list.\",\"Every token's trending pool holds at least $50,000 of liquidity.\"],\"cli\":{\"command\":\"sharpe rug-check trending\",\"options\":[\"limit\"]}},{\"name\":\"get_rwa_perp_funding\",\"title\":\"RWA perp funding rates\",\"description\":\"Get funding and carry for real-world-asset perpetuals (RWA perps: stocks, pre-IPO, ETFs, indices, commodities, FX) across 19 venues: CEXs (Binance, Bybit, OKX, Bitget, Gate, Kraken xStocks, Coinbase INTX), perp DEXs (Aster, Lighter, Extended, GRVT, ApeX, Pacifica, Orderly), Hyperliquid HIP-3 builder markets, and the rollover venues Ostium and Avantis. Rates are interval-true and mechanism-true: funding_apr annualizes each venue's own settlement interval (never an assumed 8h), and a both-sides rollover is reported separately as borrow_apr_annual (a cost, never mixed into funding spreads). Marks more than 2% off the cross-venue median are flagged is_price_suspect and excluded from stats and spreads. type=history returns stored session-tagged settlements (market/after_hours/weekend/holiday) for Hyperliquid and Kraken only, since 2026-07-28; type=stats returns best carry, top cross-venue spread, weekend premium, and open interest.\",\"endpoint\":\"rwa-perps-rates\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/rwa-perps/rates\",\"public\":\"/api/rwa-perps/rates\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"current\",\"description\":\"Type of rwa-perp data to retrieve.\",\"type\":\"string\",\"enum\":[\"current\",\"history\",\"stats\"]},\"symbol\":{\"description\":\"Underlying ticker (e.g. TSLA, XAU, US500), case-insensitive. Required when type=history. GOOG and GOOGL are distinct share classes.\",\"type\":\"string\"},\"venue\":{\"description\":\"Filter to a single venue, case-insensitive (e.g. Binance, Bybit, OKX, Kraken, Coinbase, Aster, Lighter, Ostium, or a Hyperliquid HIP-3 builder venue: Hyperliquid, Kinetiq, Paragon). The venue list is registry-driven and grows over time; an unknown venue is a 400 that names the valid ones.\",\"type\":\"string\",\"maxLength\":32},\"days\":{\"default\":7,\"description\":\"Days of settlement history to retrieve (type=history only).\",\"type\":\"integer\",\"minimum\":1,\"maximum\":90},\"limit\":{\"description\":\"Maximum number of records to return per page.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":5000},\"cursor\":{\"description\":\"Opaque pagination cursor from a previous response.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"anyOf\":[{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/RwaPerpCurrentRow\"},{\"$ref\":\"#/definitions/RwaPerpHistoryRow\"}]}},{\"type\":\"array\",\"items\":{\"oneOf\":[{\"$ref\":\"#/definitions/RwaPerpCurrentRow\"},{\"$ref\":\"#/definitions/RwaPerpHistoryRow\"}]}},{\"$ref\":\"#/definitions/RwaPerpStats\"}]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"RwaPerpCurrentRow\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"market\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"asset_class\":{\"type\":[\"string\",\"null\"]},\"mechanism\":{\"type\":\"string\"},\"price_deviation_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"is_price_suspect\":{\"type\":[\"boolean\",\"null\"]},\"last_nonzero_funding_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"last_nonzero_funding_at\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"funding_rate\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},{\"type\":\"null\"}]},\"interval_hours\":{\"type\":\"number\"},\"funding_apr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"borrow_apr_annual\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"mark_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"oracle_price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"open_interest_usd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"next_funding_time\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"updated_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"is_stale\":{\"type\":\"boolean\"}},\"required\":[\"venue\",\"market\",\"symbol\",\"asset_class\",\"mechanism\",\"price_deviation_pct\",\"is_price_suspect\",\"last_nonzero_funding_apr\",\"last_nonzero_funding_at\",\"funding_rate\",\"interval_hours\",\"funding_apr\",\"borrow_apr_annual\",\"mark_price\",\"oracle_price\",\"open_interest_usd\",\"next_funding_time\",\"updated_at\",\"is_stale\"]},\"RwaPerpHistoryRow\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"market\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"rate\":{\"type\":\"number\",\"x-unit\":\"fraction_per_interval\"},\"interval_hours\":{\"type\":\"number\"},\"session_phase\":{\"type\":\"string\"},\"settled_at\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"venue\",\"market\",\"symbol\",\"rate\",\"interval_hours\",\"session_phase\",\"settled_at\"]},\"RwaPerpStats\":{\"type\":\"object\",\"properties\":{\"bestCarry\":{\"anyOf\":[{\"$ref\":\"#/definitions/RwaCarryMetric\"},{\"type\":\"null\"}]},\"topSpread\":{\"anyOf\":[{\"$ref\":\"#/definitions/RwaSpreadMetric\"},{\"type\":\"null\"}]},\"weekendPremiumApr\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},{\"type\":\"null\"}]},\"totalOpenInterestUsd\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"venues\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"symbols\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"markets\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"asOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale\":{\"type\":\"boolean\"},\"laggingVenues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"venue\":{\"type\":\"string\"},\"asOf\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"venue\",\"asOf\"]},\"description\":\"Venue syncs behind the freshness threshold, oldest first; the rest are current. Empty when every venue is current.\"}},\"required\":[\"bestCarry\",\"topSpread\",\"weekendPremiumApr\",\"totalOpenInterestUsd\",\"venues\",\"symbols\",\"markets\",\"asOf\",\"stale\",\"laggingVenues\"]},\"RwaCarryMetric\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"venue\":{\"type\":\"string\"},\"fundingApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"mechanism\":{\"type\":\"string\"}},\"required\":[\"symbol\",\"venue\",\"fundingApr\",\"mechanism\"]},\"RwaSpreadMetric\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"spreadApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\",\"description\":\"maxApr - minApr: the widest trusted cross-venue funding spread.\"},\"maxVenue\":{\"type\":\"string\"},\"minVenue\":{\"type\":\"string\"},\"maxApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"},\"minApr\":{\"type\":\"number\",\"x-unit\":\"fraction_per_year\"}},\"required\":[\"symbol\",\"spreadApr\",\"maxVenue\",\"minVenue\",\"maxApr\",\"minApr\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"symbol\":\"symbol\",\"venue\":\"venue\",\"days\":\"days\",\"limit\":\"limit\",\"cursor\":\"cursor\"},\"pagination\":\"cursor\",\"order\":null,\"keep\":null,\"dataset\":{\"by\":\"type\",\"map\":{\"current\":\"rwa_perp_rates_current\",\"stats\":\"rwa_perp_rates_current\"}},\"freshness_sla_seconds\":{\"by\":\"type\",\"map\":{\"current\":3600,\"stats\":3600}},\"behaviour\":[\"Marks more than 2% off the cross-venue median are flagged is_price_suspect.\"],\"cli\":{\"command\":\"sharpe rwa-perps\",\"options\":[\"type\",\"symbol\",\"venue\",\"days\"]}},{\"name\":\"get_stablecoins\",\"title\":\"Stablecoins data\",\"description\":\"Get stablecoin overview, detail, or yield data including nominal supply at peg, marked value, nullable peg metrics, mechanism mix, chain supply, velocity coverage, freshness, and APY risk flags. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"stablecoins-data\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/stablecoins/data\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"default\":\"overview\",\"description\":\"Payload type.\",\"type\":\"string\",\"enum\":[\"overview\",\"detail\",\"yields\"]},\"slug\":{\"description\":\"Stablecoin slug. Required when type=detail.\",\"type\":\"string\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/StablecoinsDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"StablecoinsDataPayload\":{\"oneOf\":[{\"$ref\":\"#/definitions/StablecoinOverviewPayload\"},{\"$ref\":\"#/definitions/StablecoinDetailPayload\"},{\"$ref\":\"#/definitions/StablecoinYieldsPayload\"}]},\"StablecoinOverviewPayload\":{\"type\":\"object\",\"properties\":{\"aggregate\":{\"$ref\":\"#/definitions/StablecoinsAggregate\"},\"universeItems\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinItem\"}},\"items\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinItem\"}},\"history90d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"history365d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"fxFallbackCoins\":{\"type\":\"integer\"},\"chains\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainRow\"}},\"degradedComponents\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"componentUpdatedAt\":{\"type\":\"object\",\"properties\":{\"overview\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"history\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"chains\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"details\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"history\",\"chains\",\"details\"]},\"componentSources\":{\"type\":\"object\",\"properties\":{\"overview\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"history\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"chains\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"details\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"overview\",\"history\",\"chains\",\"details\"]},\"lastAttemptAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Oldest contributing component timestamp; retained components prevent partial refreshes from advancing it.\"},\"partial\":{\"type\":\"boolean\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"Oldest contributing component timestamp for the served snapshot.\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"aggregate\",\"items\",\"history90d\",\"history365d\",\"chains\",\"updatedAt\",\"partial\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinsAggregate\":{\"type\":\"object\",\"properties\":{\"totalMarketCap\":{\"type\":\"number\"},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"mechanismSplit\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"mechanism\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"mechanism\",\"share\",\"mcap\"]}},\"assetConcentration\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"mcap\"]}},\"issuerSplit\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"mcap\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"mcap\"]}},\"count\":{\"type\":\"integer\"},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"}},\"required\":[\"totalMarketCap\",\"change24h\",\"change7d\",\"change30d\",\"mechanismSplit\",\"assetConcentration\",\"issuerSplit\",\"count\",\"updatedAt\"]},\"StablecoinItem\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"detailId\":{\"type\":[\"string\",\"null\"]},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"peg\":{\"type\":\"string\",\"enum\":[\"USD\",\"XAU\",\"EUR\",\"GBP\",\"JPY\",\"CNY\",\"CHF\",\"CAD\",\"AUD\",\"MXN\",\"SGD\",\"TRY\",\"BRL\",\"OTHER\"]},\"mechanism\":{\"type\":\"string\",\"enum\":[\"fiat-backed\",\"crypto-backed\",\"algorithmic\",\"yield-bearing\",\"rwa-backed\",\"other\"]},\"priceModel\":{\"type\":\"string\",\"enum\":[\"fixed-peg\",\"nav-accrual\",\"unknown\"]},\"yieldBearing\":{\"type\":\"boolean\"},\"image\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"number\",\"null\"]},\"pegDeviationPct\":{\"type\":[\"number\",\"null\"]},\"pegQuality\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"measured\",\"indicative\"]},{\"type\":\"null\"}],\"description\":\"`measured` when 24h volume is at least $10K and the price at most 6 h old; otherwise `indicative` (an illiquid or stale print, shown and ranked after the measured deviations). Null when there is no deviation.\"},\"volume24hUsd\":{\"description\":\"Trailing 24h trading volume in USD over the venues CoinGecko tracks; null when CoinGecko does not list the coin.\",\"x-unit\":\"usd\",\"type\":[\"number\",\"null\"]},\"priceUpdatedAt\":{\"description\":\"Newest time the price can be vouched for (ISO 8601); null when neither CoinGecko's quote time nor the DeFi Llama snapshot stamp is known.\",\"format\":\"date-time\",\"type\":[\"string\",\"null\"]},\"nominalSupplyValue\":{\"type\":\"number\"},\"markedMarketValue\":{\"type\":[\"number\",\"null\"]},\"marketCap\":{\"type\":\"number\",\"description\":\"Use nominalSupplyValue.\",\"deprecated\":true},\"circulating\":{\"type\":\"number\"},\"change24hUsd\":{\"type\":[\"number\",\"null\"]},\"change7dUsd\":{\"type\":[\"number\",\"null\"]},\"change30dUsd\":{\"type\":[\"number\",\"null\"]},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"chainCount\":{\"type\":\"integer\"},\"dominance\":{\"type\":\"number\"},\"chainSupplies\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainSupply\"}},\"topChains\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinTopChain\"}},\"velocity\":{\"type\":[\"number\",\"null\"]},\"velocityNonEvmSharePct\":{\"type\":\"number\"},\"velocityCoveragePct\":{\"type\":\"number\"},\"velocityUnavailableReason\":{\"type\":[\"string\",\"null\"]},\"pegStability30d\":{\"$ref\":\"#/definitions/StablecoinPegStability\"}},\"required\":[\"id\",\"slug\",\"name\",\"symbol\",\"peg\",\"mechanism\",\"priceModel\",\"yieldBearing\",\"image\",\"price\",\"pegDeviationPct\",\"nominalSupplyValue\",\"markedMarketValue\",\"marketCap\",\"circulating\",\"change24h\",\"change7d\",\"change30d\",\"chainCount\",\"dominance\",\"topChains\"]},\"StablecoinChainSupply\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"},\"value\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\",\"value\"]},\"StablecoinTopChain\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"share\":{\"type\":\"number\"}},\"required\":[\"name\",\"share\"]},\"StablecoinPegStability\":{\"type\":\"object\",\"properties\":{\"inside_0_1\":{\"type\":\"number\"},\"inside_0_5\":{\"type\":\"number\"},\"inside_1_0\":{\"type\":\"number\"},\"sampleCount\":{\"type\":\"integer\"},\"earliestSampleAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]}},\"required\":[\"inside_0_1\",\"inside_0_5\",\"inside_1_0\",\"sampleCount\",\"earliestSampleAt\"]},\"StablecoinHistoryPoint\":{\"type\":\"object\",\"properties\":{\"t\":{\"type\":\"integer\",\"format\":\"int64\"},\"v\":{\"type\":\"number\"}},\"required\":[\"t\",\"v\"]},\"StablecoinChainRow\":{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"totalUSD\":{\"type\":\"number\"},\"share\":{\"type\":\"number\"}},\"required\":[\"name\",\"trackerId\",\"totalUSD\",\"share\"]},\"StablecoinDetailPayload\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"peg\":{\"type\":\"string\",\"enum\":[\"USD\",\"XAU\",\"EUR\",\"GBP\",\"JPY\",\"CNY\",\"CHF\",\"CAD\",\"AUD\",\"MXN\",\"SGD\",\"TRY\",\"BRL\",\"OTHER\"]},\"mechanism\":{\"type\":\"string\",\"enum\":[\"fiat-backed\",\"crypto-backed\",\"algorithmic\",\"yield-bearing\",\"rwa-backed\",\"other\"]},\"priceModel\":{\"type\":\"string\",\"enum\":[\"fixed-peg\",\"nav-accrual\",\"unknown\"]},\"yieldBearing\":{\"type\":\"boolean\"},\"image\":{\"type\":[\"string\",\"null\"]},\"price\":{\"type\":[\"number\",\"null\"]},\"pegDeviationPct\":{\"type\":[\"number\",\"null\"]},\"pegQuality\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"measured\",\"indicative\"]},{\"type\":\"null\"}],\"description\":\"`measured` when 24h volume is at least $10K and the price at most 6 h old; otherwise `indicative` (an illiquid or stale print, shown and ranked after the measured deviations). Null when there is no deviation.\"},\"volume24hUsd\":{\"description\":\"Trailing 24h trading volume in USD over the venues CoinGecko tracks; null when CoinGecko does not list the coin.\",\"x-unit\":\"usd\",\"type\":[\"number\",\"null\"]},\"priceUpdatedAt\":{\"description\":\"Newest time the price can be vouched for (ISO 8601); null when neither CoinGecko's quote time nor the DeFi Llama snapshot stamp is known.\",\"format\":\"date-time\",\"type\":[\"string\",\"null\"]},\"nominalSupplyValue\":{\"type\":\"number\"},\"markedMarketValue\":{\"type\":[\"number\",\"null\"]},\"marketCap\":{\"type\":\"number\",\"deprecated\":true},\"circulating\":{\"type\":\"number\"},\"change24hUsd\":{\"type\":[\"number\",\"null\"]},\"change7dUsd\":{\"type\":[\"number\",\"null\"]},\"change30dUsd\":{\"type\":[\"number\",\"null\"]},\"change24h\":{\"type\":[\"number\",\"null\"]},\"change7d\":{\"type\":[\"number\",\"null\"]},\"change30d\":{\"type\":[\"number\",\"null\"]},\"history\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}},\"chainBreakdown\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainBreakdown\"}},\"chainHistory\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinChainHistory\"}},\"description\":{\"type\":[\"string\",\"null\"]},\"url\":{\"format\":\"uri\",\"type\":[\"string\",\"null\"]},\"twitter\":{\"type\":[\"string\",\"null\"]},\"auditLinks\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"format\":\"uri\"}},\"velocity\":{\"type\":[\"number\",\"null\"]},\"velocityNonEvmSharePct\":{\"type\":\"number\"},\"velocityCoveragePct\":{\"type\":\"number\"},\"velocityUnavailableReason\":{\"type\":[\"string\",\"null\"]},\"pegStability30d\":{\"$ref\":\"#/definitions/StablecoinPegStability\"},\"mintBurn90d\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinMintBurnPoint\"}},\"bridgeFlow24h\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinBridgeFlowRow\"}},\"mintRedeemDescription\":{\"type\":[\"string\",\"null\"]},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"id\",\"slug\",\"name\",\"symbol\",\"peg\",\"mechanism\",\"priceModel\",\"yieldBearing\",\"image\",\"price\",\"pegDeviationPct\",\"nominalSupplyValue\",\"markedMarketValue\",\"marketCap\",\"circulating\",\"change24h\",\"change7d\",\"change30d\",\"history\",\"chainBreakdown\",\"chainHistory\",\"description\",\"url\",\"twitter\",\"auditLinks\",\"updatedAt\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinChainBreakdown\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"circulating\":{\"type\":\"number\"},\"share\":{\"type\":\"number\"},\"supplyTvlRatioPct\":{\"type\":[\"number\",\"null\"]},\"tvlShare\":{\"deprecated\":true,\"type\":[\"number\",\"null\"]}},\"required\":[\"chain\",\"trackerId\",\"circulating\",\"share\"]},\"StablecoinChainHistory\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"points\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinHistoryPoint\"}}},\"required\":[\"chain\",\"trackerId\",\"points\"]},\"StablecoinMintBurnPoint\":{\"type\":\"object\",\"properties\":{\"bucketDate\":{\"type\":\"string\",\"format\":\"date\"},\"mintsUsd\":{\"type\":\"number\"},\"burnsUsd\":{\"type\":\"number\"},\"netUsd\":{\"type\":\"number\"}},\"required\":[\"bucketDate\",\"mintsUsd\",\"burnsUsd\",\"netUsd\"]},\"StablecoinBridgeFlowRow\":{\"type\":\"object\",\"properties\":{\"chain\":{\"type\":\"string\"},\"trackerId\":{\"type\":[\"string\",\"null\"]},\"chainDeltaUsd\":{\"type\":\"number\"},\"netBridgeFlowUsd\":{\"type\":\"number\"},\"direction\":{\"type\":\"string\",\"enum\":[\"inbound\",\"outbound\",\"flat\",\"mint-dominated\",\"burn-dominated\"]}},\"required\":[\"chain\",\"trackerId\",\"chainDeltaUsd\",\"netBridgeFlowUsd\",\"direction\"]},\"StablecoinYieldsPayload\":{\"type\":\"object\",\"properties\":{\"yields\":{\"$ref\":\"#/definitions/StablecoinYieldsCache\"},\"partial\":{\"type\":\"boolean\"},\"source\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\"]},\"sources\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"DeFiLlama\",\"CoinGecko\",\"Supabase\"]}},\"as_of\":{\"type\":\"string\",\"format\":\"date-time\"},\"stale\":{\"type\":\"boolean\"},\"cache_age_seconds\":{\"type\":\"integer\",\"minimum\":0},\"freshness_sla_seconds\":{\"type\":\"integer\",\"enum\":[3600]}},\"required\":[\"yields\",\"partial\",\"source\",\"sources\",\"as_of\",\"stale\",\"cache_age_seconds\",\"freshness_sla_seconds\"]},\"StablecoinYieldsCache\":{\"type\":\"object\",\"properties\":{\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinYieldRow\"}},\"updatedAt\":{\"type\":\"string\",\"format\":\"date-time\"},\"degraded\":{\"type\":\"boolean\"},\"lastSuccessfulAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"lastAttemptAt\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"degradedReason\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"upstream-empty\",\"partial-result\"]},{\"type\":\"null\"}]}},\"required\":[\"rows\",\"updatedAt\"]},\"StablecoinYieldRow\":{\"type\":\"object\",\"properties\":{\"symbol\":{\"type\":\"string\"},\"slug\":{\"type\":\"string\"},\"stablecoinId\":{\"type\":[\"string\",\"null\"]},\"detailId\":{\"type\":[\"string\",\"null\"]},\"bestApy\":{\"type\":\"number\"},\"bestApyBase\":{\"type\":[\"number\",\"null\"]},\"bestApyReward\":{\"type\":[\"number\",\"null\"]},\"bestApyPct7D\":{\"type\":[\"number\",\"null\"]},\"bestProject\":{\"type\":\"string\"},\"bestChain\":{\"type\":\"string\"},\"bestPoolMeta\":{\"type\":[\"string\",\"null\"]},\"bestTvlUsd\":{\"type\":\"number\"},\"bestRiskFlag\":{\"type\":[\"string\",\"null\"]},\"pools\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/StablecoinYieldPool\"}}},\"required\":[\"symbol\",\"slug\",\"bestApy\",\"bestApyBase\",\"bestApyReward\",\"bestApyPct7D\",\"bestProject\",\"bestChain\",\"bestPoolMeta\",\"bestTvlUsd\",\"bestRiskFlag\",\"pools\"]},\"StablecoinYieldPool\":{\"type\":\"object\",\"properties\":{\"project\":{\"type\":\"string\"},\"chain\":{\"type\":\"string\"},\"poolMeta\":{\"type\":[\"string\",\"null\"]},\"apy\":{\"type\":\"number\"},\"apyBase\":{\"type\":[\"number\",\"null\"]},\"apyReward\":{\"type\":[\"number\",\"null\"]},\"apyPct7D\":{\"type\":[\"number\",\"null\"]},\"tvlUsd\":{\"type\":\"number\"}},\"required\":[\"project\",\"chain\",\"poolMeta\",\"apy\",\"apyBase\",\"apyReward\",\"apyPct7D\",\"tvlUsd\"]}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"slug\":\"slug\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"stablecoins\",\"freshness_sla_seconds\":7200,\"behaviour\":[],\"cli\":{\"command\":\"sharpe stablecoins\",\"options\":[\"type\",\"slug\"]}},{\"name\":\"get_token_scanner\",\"title\":\"Token scanner\",\"description\":\"Run read-only token scanner modes for hot tokens, new runners, alpha drops, AI tokens, and top-new pairs. Responses expose source coverage; valuation and risk fields stay null when unavailable. Requires an API key (SHARPE_API_KEY; the free tier works). No keyless fallback.\",\"endpoint\":\"token-scanner-scan\",\"auth\":\"required\",\"routes\":{\"v1\":\"/api/v1/token-scanner/scan\",\"public\":null},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"mode\":{\"default\":\"hot\",\"description\":\"Scanner mode.\",\"type\":\"string\",\"enum\":[\"hot\",\"new-runners\",\"alpha-drops\",\"ai-top\",\"top-new\"]},\"chains\":{\"description\":\"Comma-separated Dexscreener chain IDs for scanner modes.\",\"type\":\"string\"},\"chain\":{\"description\":\"Single chain for top-new mode.\",\"default\":\"base\",\"type\":\"string\"},\"profile\":{\"description\":\"Scanner profile.\",\"type\":\"string\",\"enum\":[\"discovery\",\"balanced\",\"strict\"]},\"days\":{\"description\":\"Lookback window in days for supported scanner modes.\",\"type\":\"number\",\"minimum\":1},\"limit\":{\"default\":50,\"description\":\"Maximum rows to return.\",\"type\":\"integer\",\"minimum\":1,\"maximum\":72},\"minLiquidityUsd\":{\"description\":\"Minimum liquidity in USD.\",\"type\":\"number\",\"minimum\":0},\"minVolumeH24\":{\"description\":\"Minimum 24h volume in USD.\",\"type\":\"number\",\"minimum\":0},\"minTxnsH1\":{\"description\":\"Minimum 1h transaction count.\",\"type\":\"number\",\"minimum\":0},\"minTxnsH24\":{\"description\":\"Minimum 24h transaction count.\",\"type\":\"number\",\"minimum\":0},\"maxAgeHours\":{\"description\":\"Maximum token-pair age in hours.\",\"type\":\"number\",\"minimum\":0},\"includeUnknownAge\":{\"description\":\"Whether pairs with unknown age may pass age filters.\",\"type\":\"string\",\"enum\":[\"true\",\"false\"]},\"sortBy\":{\"description\":\"Scanner sort key.\",\"type\":\"string\",\"enum\":[\"score\",\"readiness\",\"rs\",\"volume\",\"momentum\"]},\"minBreakoutReadiness\":{\"description\":\"Minimum breakout-readiness score.\",\"type\":\"number\",\"minimum\":0},\"minRelativeStrength\":{\"description\":\"Minimum relative-strength score.\",\"type\":\"number\"},\"maxVolLiqRatio\":{\"description\":\"Maximum 24h volume-to-liquidity ratio.\",\"type\":\"number\",\"minimum\":0},\"minPriceChangeH1\":{\"description\":\"Minimum 1h price change percentage.\",\"type\":\"number\"}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/TokenScannerPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"TokenScannerPayload\":{\"oneOf\":[{\"type\":\"object\",\"properties\":{\"mode\":{\"type\":\"string\",\"enum\":[\"top-new\"]},\"rows\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/TopNewToken\"}},\"coverage\":{\"$ref\":\"#/definitions/ScannerSourceCoverage\"},\"scannedAt\":{\"type\":\"integer\",\"format\":\"int64\"},\"stale\":{\"type\":\"boolean\",\"description\":\"True when DexScreener failed and the last good scan for the same parameters (kept an hour) is served.\"},\"fromCache\":{\"description\":\"True when answered from the 10-second scan cache shared with the free scan routes, or from the last good scan.\",\"type\":\"boolean\"},\"error\":{\"description\":\"Why the fresh scan failed; only with `stale: true`.\",\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"Dexscreener\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the scan was fetched (not the response time).\"}},\"required\":[\"mode\",\"rows\",\"coverage\",\"scannedAt\",\"stale\",\"source\",\"fetched_at\"]},{\"type\":\"object\",\"properties\":{\"mode\":{\"type\":\"string\",\"enum\":[\"hot\",\"new-runners\",\"alpha-drops\",\"ai-top\"]},\"candidates\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/HotTokenCandidate\"}},\"summary\":{\"$ref\":\"#/definitions/ScanSummary\"},\"coverage\":{\"$ref\":\"#/definitions/ScannerSourceCoverage\"},\"scannedAt\":{\"type\":\"integer\",\"format\":\"int64\"},\"stale\":{\"type\":\"boolean\",\"description\":\"True when DexScreener failed and the last good scan for the same parameters (kept an hour) is served.\"},\"fromCache\":{\"description\":\"True when answered from the 10-second scan cache shared with the free scan routes, or from the last good scan.\",\"type\":\"boolean\"},\"error\":{\"description\":\"Why the fresh scan failed; only with `stale: true`.\",\"type\":\"string\"},\"source\":{\"type\":\"string\",\"enum\":[\"Dexscreener\"]},\"fetched_at\":{\"type\":\"string\",\"format\":\"date-time\",\"description\":\"When the scan was fetched (not the response time).\"}},\"required\":[\"mode\",\"candidates\",\"summary\",\"coverage\",\"scannedAt\",\"stale\",\"source\",\"fetched_at\"]}]},\"TopNewToken\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"tokenAddress\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"description\":\"DexScreener pair URL; may be empty when the upstream pair omits a URL.\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"txnsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"txnsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"ageHours\":{\"type\":[\"number\",\"null\"]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"chainId\",\"symbol\",\"name\",\"tokenAddress\",\"pairAddress\",\"dexId\",\"pairUrl\",\"priceUsd\",\"priceChangeH1\",\"priceChangeH24\",\"volumeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"txnsH1\",\"txnsH24\",\"ageHours\",\"holdersCount\",\"holdersSource\"]},\"ScannerSourceCoverage\":{\"type\":\"object\",\"properties\":{\"status\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"groups\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ScannerSourceCoverageGroup\"}}},\"required\":[\"status\",\"groups\"]},\"ScannerSourceCoverageGroup\":{\"type\":\"object\",\"properties\":{\"source\":{\"type\":\"string\"},\"attempted\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"succeeded\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"},\"failed\":{\"type\":\"integer\",\"minimum\":0,\"x-unit\":\"count\"}},\"required\":[\"source\",\"attempted\",\"succeeded\",\"failed\"]},\"HotTokenCandidate\":{\"type\":\"object\",\"properties\":{\"pair\":{\"$ref\":\"#/definitions/ScannerPair\"},\"score\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"scoreComponents\":{\"$ref\":\"#/definitions/ScannerScoreComponents\"},\"rank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"riskScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"analytics\":{\"$ref\":\"#/definitions/ScannerCandidateAnalytics\"}},\"required\":[\"pair\",\"score\",\"scoreComponents\",\"rank\",\"riskFlags\",\"riskScore\"]},\"ScannerPair\":{\"type\":\"object\",\"properties\":{\"chainId\":{\"type\":\"string\"},\"dexId\":{\"type\":\"string\"},\"pairAddress\":{\"type\":\"string\"},\"pairUrl\":{\"type\":\"string\",\"format\":\"uri\"},\"baseAddress\":{\"type\":\"string\"},\"baseSymbol\":{\"type\":\"string\"},\"baseName\":{\"type\":\"string\"},\"quoteSymbol\":{\"type\":\"string\"},\"priceUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH24\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH6\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeH1\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"volumeM5\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"buysH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sellsH1\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"buysH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sellsH24\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"priceChangeH1\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"priceChangeH24\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"liquidityUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"holdersCount\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}]},\"holdersSource\":{\"type\":[\"string\",\"null\"]},\"pairCreatedAtMs\":{\"anyOf\":[{\"type\":\"integer\"},{\"type\":\"null\"}],\"format\":\"int64\"}},\"required\":[\"chainId\",\"dexId\",\"pairAddress\",\"pairUrl\",\"baseAddress\",\"baseSymbol\",\"baseName\",\"quoteSymbol\",\"priceUsd\",\"volumeH24\",\"volumeH6\",\"volumeH1\",\"volumeM5\",\"buysH1\",\"sellsH1\",\"buysH24\",\"sellsH24\",\"priceChangeH1\",\"priceChangeH24\",\"liquidityUsd\",\"marketCap\",\"fdv\",\"holdersCount\",\"holdersSource\",\"pairCreatedAtMs\"]},\"ScannerScoreComponents\":{\"type\":\"object\",\"properties\":{\"volume\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"transactions\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"liquidity\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"momentum\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"flow\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"boost\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"recency\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"profile\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null when the token's DexScreener profile answer is unknown; the score then leaves the profile component out and renormalises the other weights.\"}},\"required\":[\"volume\",\"transactions\",\"liquidity\",\"momentum\",\"flow\",\"boost\",\"recency\",\"profile\"]},\"ScannerCandidateAnalytics\":{\"type\":\"object\",\"properties\":{\"breakoutReadiness\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"relativeStrength\":{\"type\":\"number\"},\"compressionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"volumeVelocity\":{\"type\":\"number\"},\"txnVelocity\":{\"type\":\"number\"},\"boostVelocity\":{\"description\":\"Unavailable until two real boost observations exist.\",\"type\":[\"number\",\"null\"]},\"riskScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null when valuation coverage is incomplete.\"},\"riskCoverage\":{\"type\":\"string\",\"enum\":[\"complete\",\"partial\"]},\"riskPenalty\":{\"type\":\"number\"},\"riskFlags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"fastDecay\":{\"description\":\"Unavailable until a real decay time series exists.\",\"type\":[\"boolean\",\"null\"]},\"scoreAdjusted\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"buyRatio\":{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"}},\"required\":[\"breakoutReadiness\",\"relativeStrength\",\"compressionScore\",\"volumeVelocity\",\"txnVelocity\",\"boostVelocity\",\"riskScore\",\"riskCoverage\",\"riskPenalty\",\"riskFlags\",\"fastDecay\",\"scoreAdjusted\",\"buyRatio\"]},\"ScanSummary\":{\"type\":\"object\",\"properties\":{\"totalVolume\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"totalLiquidity\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgH1Move\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"avgBuyRatio\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_0_1\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"imbalance\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"ratio_neg1_1\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"regime\":{\"anyOf\":[{\"type\":\"string\",\"enum\":[\"trend-up\",\"trend-down\",\"mixed\"]},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"flags\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"topMoverSymbol\":{\"description\":\"Null on an empty scan (tokenCount 0).\",\"type\":[\"string\",\"null\"]},\"topMoverH1\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Null on an empty scan (tokenCount 0).\"},\"hotChain\":{\"description\":\"Null on an empty scan (tokenCount 0).\",\"type\":[\"string\",\"null\"]},\"tokenCount\":{\"type\":\"integer\",\"x-unit\":\"count\"}},\"required\":[\"totalVolume\",\"totalLiquidity\",\"avgH1Move\",\"avgScore\",\"avgBuyRatio\",\"imbalance\",\"regime\",\"flags\",\"topMoverSymbol\",\"topMoverH1\",\"hotChain\",\"tokenCount\"],\"description\":\"Figures over the scan's candidates. On an empty scan (tokenCount 0) every figure is null and flags is empty: nothing was measured, so no 0 stands in for a value.\"}}},\"public_body\":null,\"public_differs\":null,\"public_params\":null,\"python_params\":{\"mode\":\"mode\",\"chains\":\"chains\",\"chain\":\"chain\",\"profile\":\"profile\",\"days\":\"days\",\"limit\":\"limit\",\"minLiquidityUsd\":\"min_liquidity_usd\",\"minVolumeH24\":\"min_volume_h24\",\"minTxnsH1\":\"min_txns_h1\",\"minTxnsH24\":\"min_txns_h24\",\"maxAgeHours\":\"max_age_hours\",\"includeUnknownAge\":\"include_unknown_age\",\"sortBy\":\"sort_by\",\"minBreakoutReadiness\":\"min_breakout_readiness\",\"minRelativeStrength\":\"min_relative_strength\",\"maxVolLiqRatio\":\"max_vol_liq_ratio\",\"minPriceChangeH1\":\"min_price_change_h1\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"token_scanner\",\"freshness_sla_seconds\":300,\"behaviour\":[\"`coverage.status` is `partial` exactly when a source group failed.\",\"Boost velocity and fast-decay analytics are returned as `null`.\"],\"cli\":{\"command\":\"sharpe token-scanner\",\"options\":[\"mode\",\"limit\",\"chains\",\"chain\",\"profile\",\"days\",\"minLiquidityUsd\",\"minVolumeH24\",\"minTxnsH1\",\"minTxnsH24\",\"maxAgeHours\",\"includeUnknownAge\",\"sortBy\",\"minBreakoutReadiness\",\"minRelativeStrength\",\"maxVolLiqRatio\",\"minPriceChangeH1\"]}},{\"name\":\"get_web_traffic\",\"title\":\"Web traffic data\",\"description\":\"Get attention rankings, social snapshots, or market-level signals for coins and narratives, plus CoinGecko trust-score rankings for exchanges.\",\"endpoint\":\"web-traffic-data\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/web-traffic/data\",\"public\":\"/api/web-traffic/data\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"type\":{\"description\":\"Entity type.\",\"default\":\"exchange\",\"type\":\"string\",\"enum\":[\"exchange\",\"coin\",\"narrative\"]},\"mode\":{\"description\":\"Payload mode.\",\"default\":\"rankings\",\"type\":\"string\",\"enum\":[\"rankings\",\"snapshots\",\"market\"]},\"tf\":{\"default\":\"30d\",\"description\":\"Requested history lookback for snapshots. The route clamps to available history when the requested range is unavailable.\",\"type\":\"string\",\"enum\":[\"7d\",\"30d\",\"90d\",\"1y\",\"3y\",\"all\"]},\"entities\":{\"description\":\"Comma-separated entity IDs for snapshots.\",\"type\":\"string\"},\"sub\":{\"description\":\"Market dataset to return. Required when mode=market; ignored by other modes.\",\"type\":\"string\",\"enum\":[\"trending\",\"categories\",\"global\"]}},\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"$ref\":\"#/definitions/WebTrafficDataPayload\"},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"WebTrafficDataPayload\":{\"anyOf\":[{\"type\":\"object\",\"properties\":{\"rankings\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WebTrafficRanking\"}},\"updatedAt\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"rankings\",\"updatedAt\"]},{\"type\":\"object\",\"properties\":{\"snapshots\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WebTrafficSnapshot\"}},\"coverage\":{\"$ref\":\"#/definitions/WebTrafficSnapshotCoverage\"}},\"required\":[\"snapshots\"]},{\"$ref\":\"#/definitions/WebTrafficTrendingMarket\"},{\"$ref\":\"#/definitions/WebTrafficCategoriesMarket\"},{\"$ref\":\"#/definitions/WebTrafficGlobalMarket\"},{\"$ref\":\"#/definitions/WebTrafficUnavailableMarket\"},{\"$ref\":\"#/definitions/WebTrafficPartialGlobalMarket\"}]},\"WebTrafficRanking\":{\"oneOf\":[{\"$ref\":\"#/definitions/WebTrafficCoinRanking\"},{\"$ref\":\"#/definitions/WebTrafficExchangeRanking\"},{\"$ref\":\"#/definitions/WebTrafficNarrativeRanking\"}]},\"WebTrafficCoinRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"coin\"]},\"coinId\":{\"type\":\"string\"},\"sentimentUpPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Share of CoinGecko sentiment votes that are bullish, 0-100; null when there is no vote sample for the entity.\"},\"sentimentDownPct\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"watchlistUsers\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"count\"},{\"type\":\"null\"}],\"description\":\"CoinGecko portfolio watchlist count; null when CoinGecko sent no count for the coin (never 0).\"},\"priceChange7d\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"coinId\",\"sentimentUpPct\",\"watchlistUsers\"]},\"WebTrafficExchangeRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"exchange\"]},\"trustScore\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_10\"},{\"type\":\"null\"}]},\"trustScoreRank\":{\"anyOf\":[{\"type\":\"integer\",\"x-unit\":\"order\"},{\"type\":\"null\"}]},\"tradeVolume24hBtc\":{\"type\":[\"number\",\"null\"]}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"trustScore\",\"trustScoreRank\",\"tradeVolume24hBtc\"]},\"WebTrafficNarrativeRanking\":{\"type\":\"object\",\"properties\":{\"entityId\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"attentionScore\":{\"type\":\"number\",\"x-unit\":\"score_0_100\"},\"entityType\":{\"type\":\"string\",\"enum\":[\"narrative\"]},\"communityScore\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"sentimentUpPct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}],\"description\":\"Share of CoinGecko sentiment votes that are bullish, 0-100; null when there is no vote sample for the entity.\"},\"watchlistUsers\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"priceChange7d\":{\"type\":\"number\",\"x-unit\":\"percent\"}},\"required\":[\"entityId\",\"name\",\"attentionScore\",\"entityType\",\"communityScore\",\"sentimentUpPct\",\"watchlistUsers\",\"priceChange7d\"]},\"WebTrafficSnapshot\":{\"type\":\"object\",\"properties\":{\"entity_type\":{\"type\":\"string\",\"enum\":[\"exchange\",\"coin\",\"narrative\"]},\"entity_id\":{\"type\":\"string\"},\"snapshot_at\":{\"type\":\"string\",\"format\":\"date-time\"},\"community_score\":{\"type\":[\"number\",\"null\"]},\"sentiment_up_pct\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"public_interest_score\":{\"type\":[\"number\",\"null\"]},\"attention_score\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"score_0_100\"},{\"type\":\"null\"}]},\"watchlist_users\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"count\"},{\"type\":\"null\"}]}},\"required\":[\"entity_type\",\"entity_id\",\"snapshot_at\",\"community_score\",\"sentiment_up_pct\",\"public_interest_score\",\"attention_score\",\"watchlist_users\"]},\"WebTrafficSnapshotCoverage\":{\"type\":\"object\",\"properties\":{\"availableSince\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"availableTimeframes\":{\"type\":\"array\",\"items\":{\"type\":\"string\",\"enum\":[\"7d\",\"30d\",\"90d\",\"1y\",\"3y\",\"all\"]}}},\"required\":[\"availableSince\",\"availableTimeframes\"]},\"WebTrafficTrendingMarket\":{\"type\":\"object\",\"properties\":{\"coins\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"marketCapRank\":{\"type\":\"integer\",\"x-unit\":\"order\"},\"score\":{\"type\":\"number\",\"x-unit\":\"order\"},\"priceBtc\":{\"type\":\"number\"},\"priceChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"sparkline\":{\"description\":\"URL of CoinGecko's sparkline SVG image; null when CoinGecko sends none.\",\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"name\",\"symbol\",\"marketCapRank\",\"score\",\"priceBtc\",\"priceChange24h\",\"sparkline\"]}},\"categories\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"integer\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCap1hChange\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"coinsCount\":{\"type\":\"integer\",\"x-unit\":\"count\"},\"sparkline\":{\"description\":\"URL of CoinGecko's sparkline SVG image; null when CoinGecko sends none.\",\"type\":[\"string\",\"null\"]}},\"required\":[\"id\",\"name\",\"marketCap\",\"marketCap1hChange\",\"coinsCount\",\"sparkline\"]}},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"coins\",\"categories\",\"updatedAt\"]},\"WebTrafficCategoriesMarket\":{\"type\":\"object\",\"properties\":{\"categories\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"marketCapChange24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"volume24h\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"top3CoinIds\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}},\"required\":[\"id\",\"name\",\"marketCap\",\"marketCapChange24h\",\"volume24h\",\"top3CoinIds\"]}},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"categories\",\"updatedAt\"]},\"WebTrafficGlobalMarket\":{\"type\":\"object\",\"properties\":{\"activeCryptocurrencies\":{\"type\":\"number\",\"x-unit\":\"count\"},\"totalMarketCapUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"totalVolumeUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"btcDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"ethDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"usdtDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"marketCapChangePercentage24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\"}},\"required\":[\"activeCryptocurrencies\",\"totalMarketCapUsd\",\"totalVolumeUsd\",\"btcDominance\",\"ethDominance\",\"usdtDominance\",\"marketCapChangePercentage24h\",\"updatedAt\"],\"description\":\"Canonical fields are populated on a healthy market snapshot; an empty or partial object can be returned when both caches are unavailable.\"},\"WebTrafficUnavailableMarket\":{\"type\":\"object\",\"properties\":{},\"additionalProperties\":false,\"description\":\"Empty degraded market payload returned when persistent and memory caches are both unavailable.\",\"maxProperties\":0},\"WebTrafficPartialGlobalMarket\":{\"type\":\"object\",\"properties\":{\"activeCryptocurrencies\":{\"type\":\"number\",\"x-unit\":\"count\"},\"totalMarketCapUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"totalVolumeUsd\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"btcDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"ethDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"usdtDominance\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"marketCapChangePercentage24h\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"updatedAt\":{\"type\":\"string\"}},\"additionalProperties\":false,\"description\":\"Partial last-good global market cache returned when live refresh fails.\",\"minProperties\":1}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"type\":\"type\",\"mode\":\"mode\",\"tf\":\"tf\",\"entities\":\"entities\",\"sub\":\"sub\"},\"pagination\":\"none\",\"order\":\"asc\",\"keep\":\"latest\",\"dataset\":\"web_traffic\",\"freshness_sla_seconds\":172800,\"behaviour\":[\"`type` defaults to exchange: the default rankings are exchanges, highest attention score first.\",\"`entities` keeps only those entities' snapshots, oldest first.\"],\"cli\":{\"command\":\"sharpe web-traffic\",\"options\":[\"type\",\"mode\",\"tf\",\"entities\",\"sub\"]}},{\"name\":\"search_market_cap\",\"title\":\"Market cap search\",\"description\":\"Search crypto and supported TradFi assets by name or ticker. Returns matching assets with asset class, market cap, and nullable price, 24h change, FDV, ATH, and estimated ATH market cap fields.\",\"endpoint\":\"market-cap-search\",\"auth\":\"optional\",\"routes\":{\"v1\":\"/api/v1/market-cap/search\",\"public\":\"/api/market-cap/search\"},\"method\":\"GET\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"q\":{\"type\":\"string\",\"minLength\":2,\"maxLength\":100,\"description\":\"Search query (2-100 characters).\"}},\"required\":[\"q\"],\"additionalProperties\":false},\"output_schema\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"object\",\"properties\":{\"assets\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/MarketCapAsset\"}}},\"required\":[\"assets\"]},\"pagination\":{\"type\":\"object\",\"description\":\"Present when the answer is one page: pass `cursor` back to read the next one.\",\"properties\":{\"cursor\":{\"anyOf\":[{\"type\":\"string\"},{\"type\":\"null\"}]},\"has_more\":{\"type\":\"boolean\"},\"total\":{\"anyOf\":[{\"type\":\"integer\",\"minimum\":0},{\"type\":\"null\"}]}},\"required\":[\"cursor\",\"has_more\"]},\"meta\":{\"type\":\"object\",\"description\":\"Which route answered, what the API said about the data's freshness, and whether the client cut the answer to fit the agent's context window.\",\"properties\":{\"route\":{\"type\":\"string\",\"enum\":[\"v1\",\"public\"],\"description\":\"`v1` with an API key (and for the keyless v1 routes), `public` for the free twin a keyless call reads.\"},\"dataset_id\":{\"type\":\"string\"},\"as_of\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"stale_after\":{\"anyOf\":[{\"type\":\"string\",\"format\":\"date-time\"},{\"type\":\"null\"}]},\"freshness_status\":{\"type\":\"string\",\"enum\":[\"fresh\",\"stale\",\"unknown\"]},\"runtime_status\":{\"type\":\"string\",\"enum\":[\"ok\",\"degraded\"]},\"served_from\":{\"type\":\"string\"},\"warnings\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"description\":\"What the API or the client could not do, in words. State them with the answer.\"},\"truncated\":{\"type\":\"boolean\",\"description\":\"True when the answer is cut short: by the API's row budget, or by the client (`truncated_fields`).\"},\"truncated_fields\":{\"type\":\"object\",\"description\":\"The arrays and strings the client cut, by JSON path in `data`: `total` items received, `showing` kept, `kept: latest` when an oldest-first series kept its newest items.\",\"additionalProperties\":{\"type\":\"object\",\"properties\":{\"total\":{\"type\":\"integer\",\"minimum\":0},\"showing\":{\"type\":\"integer\",\"minimum\":0},\"kept\":{\"type\":\"string\",\"enum\":[\"latest\"]}},\"required\":[\"total\",\"showing\"]}},\"truncation_message\":{\"type\":\"string\"}},\"required\":[\"route\",\"warnings\"]}},\"required\":[\"data\",\"meta\"],\"definitions\":{\"MarketCapAsset\":{\"type\":\"object\",\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"symbol\":{\"type\":\"string\"},\"assetClass\":{\"type\":\"string\",\"enum\":[\"crypto\",\"stock\",\"index\",\"commodity\"]},\"price\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"marketCap\":{\"type\":\"number\",\"x-unit\":\"usd\"},\"change24h\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"percent\"},{\"type\":\"null\"}]},\"image\":{\"type\":[\"string\",\"null\"]},\"fdv\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"ath\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]},\"athMarketCap\":{\"anyOf\":[{\"type\":\"number\",\"x-unit\":\"usd\"},{\"type\":\"null\"}]}},\"required\":[\"id\",\"name\",\"symbol\",\"assetClass\",\"price\",\"marketCap\",\"change24h\",\"image\",\"fdv\",\"ath\",\"athMarketCap\"]}}},\"public_body\":\"same-as-v1-data\",\"public_differs\":null,\"public_params\":null,\"python_params\":{\"q\":\"q\"},\"pagination\":\"none\",\"order\":null,\"keep\":null,\"dataset\":\"market_cap_search\",\"freshness_sla_seconds\":300,\"behaviour\":[\"At most 20 assets come back, largest market cap first.\",\"Search covers supported TradFi assets as well as crypto: `gold` returns the gold commodity.\"],\"cli\":{\"command\":\"sharpe search\",\"options\":[\"q\"]}}],\"routes\":{\"analytics-query\":{\"v1\":\"/api/v1/analytics/query\",\"public\":null},\"arbitrage-borrow-rates\":{\"v1\":\"/api/v1/arbitrage/borrow-rates\",\"public\":\"/api/arbitrage/borrow-rates\"},\"arbitrage-cex-spot-transfer\":{\"v1\":\"/api/v1/arbitrage/cex-spot-transfer\",\"public\":\"/api/arbitrage/cex-spot-transfer\"},\"arbitrage-cross-exchange\":{\"v1\":\"/api/v1/arbitrage/cross-exchange\",\"public\":\"/api/arbitrage/cross-exchange\"},\"arbitrage-dated-futures-basis\":{\"v1\":\"/api/v1/arbitrage/dated-futures-basis\",\"public\":\"/api/arbitrage/dated-futures-basis\"},\"arbitrage-dex-scanner-preview\":{\"v1\":\"/api/v1/arbitrage/dex-scanner/preview\",\"public\":\"/api/arbitrage/dex-scanner/preview\"},\"arbitrage-fixed-floating-funding\":{\"v1\":\"/api/v1/arbitrage/fixed-floating-funding\",\"public\":\"/api/arbitrage/fixed-floating-funding\"},\"arbitrage-funding-spread-history\":{\"v1\":\"/api/v1/arbitrage/funding-spread-history\",\"public\":\"/api/arbitrage/funding-spread-history\"},\"arbitrage-futures-calendar-spread\":{\"v1\":\"/api/v1/arbitrage/futures-calendar-spread\",\"public\":\"/api/arbitrage/futures-calendar-spread\"},\"arbitrage-perp-dated-carry\":{\"v1\":\"/api/v1/arbitrage/perp-dated-carry\",\"public\":\"/api/arbitrage/perp-dated-carry\"},\"arbitrage-spot-perp\":{\"v1\":\"/api/v1/arbitrage/spot-perp\",\"public\":\"/api/arbitrage/spot-perp\"},\"briefing\":{\"v1\":\"/api/v1/briefing\",\"public\":\"/api/briefing\"},\"coin-analysis\":{\"v1\":\"/api/v1/coins/{coin}/analysis\",\"public\":\"/api/coins/{coin}/analysis\"},\"coin-compare-generate\":{\"v1\":null,\"public\":\"/api/coin-compare/generate\"},\"correlation-coins\":{\"v1\":null,\"public\":\"/api/correlation/coins\"},\"correlation-history\":{\"v1\":null,\"public\":\"/api/correlation/history\"},\"correlation-matrix\":{\"v1\":\"/api/v1/correlation/matrix\",\"public\":\"/api/correlation/matrix\"},\"correlation-on-demand\":{\"v1\":null,\"public\":\"/api/correlation/on-demand\"},\"ecosystems-data\":{\"v1\":\"/api/v1/ecosystems/data\",\"public\":\"/api/ecosystems/data\"},\"funding-coins\":{\"v1\":\"/api/v1/funding/coins\",\"public\":\"/api/funding/coins\"},\"funding-rates\":{\"v1\":\"/api/v1/funding/rates\",\"public\":\"/api/funding/rates\"},\"funding-settlement\":{\"v1\":\"/api/v1/funding/settlement\",\"public\":\"/api/funding/settlement\"},\"futures-coins\":{\"v1\":\"/api/v1/futures/coins\",\"public\":\"/api/futures/coins\"},\"futures-data\":{\"v1\":\"/api/v1/futures/data\",\"public\":\"/api/futures/data\"},\"gem-finder-data\":{\"v1\":\"/api/v1/gem-finder/data\",\"public\":\"/api/gem-finder/data\"},\"global-overview\":{\"v1\":\"/api/v1/global/overview\",\"public\":\"/api/global/overview\"},\"health\":{\"v1\":\"/api/v1/health\",\"public\":null},\"heatmap-data\":{\"v1\":\"/api/v1/heatmap/data\",\"public\":\"/api/heatmap/data\"},\"insider-selling-data\":{\"v1\":\"/api/v1/insider-selling/data\",\"public\":\"/api/insider-selling/data\"},\"listings-data\":{\"v1\":\"/api/v1/listings/data\",\"public\":\"/api/listings/data\"},\"listings-events\":{\"v1\":\"/api/v1/listings/events\",\"public\":\"/api/listings/events\"},\"listings-exchanges\":{\"v1\":\"/api/v1/listings/exchanges\",\"public\":\"/api/listings/exchanges\"},\"listings-recent\":{\"v1\":\"/api/v1/listings/recent\",\"public\":\"/api/listings/recent\"},\"market-cap-search\":{\"v1\":\"/api/v1/market-cap/search\",\"public\":\"/api/market-cap/search\"},\"market-derivatives-overview\":{\"v1\":\"/api/v1/market/derivatives-overview\",\"public\":null},\"memecoins-data\":{\"v1\":\"/api/v1/memecoins/data\",\"public\":\"/api/memecoins/data\"},\"memecoins-launches\":{\"v1\":\"/api/v1/memecoins/launches\",\"public\":\"/api/memecoins/launches\"},\"meta-coverage\":{\"v1\":\"/api/v1/meta/coverage\",\"public\":null},\"meta-datasets\":{\"v1\":\"/api/v1/meta/datasets\",\"public\":null},\"mindshare-data\":{\"v1\":\"/api/v1/mindshare/data\",\"public\":\"/api/mindshare/data\"},\"narratives-data\":{\"v1\":\"/api/v1/narratives/data\",\"public\":\"/api/narratives/data\"},\"news-feed\":{\"v1\":\"/api/v1/news/feed\",\"public\":\"/api/news/feed\"},\"opportunities\":{\"v1\":\"/api/v1/opportunities\",\"public\":\"/api/opportunities\"},\"price-prediction-data\":{\"v1\":\"/api/v1/price-prediction/data\",\"public\":\"/api/price-prediction/data\"},\"price-prediction-search\":{\"v1\":null,\"public\":\"/api/price-prediction/search\"},\"pump-dump-data\":{\"v1\":\"/api/v1/pump-dump/data\",\"public\":\"/api/pump-dump/data\"},\"rug-check-holders\":{\"v1\":null,\"public\":\"/api/rug-check/holders\"},\"rug-check-resolve\":{\"v1\":null,\"public\":\"/api/rug-check/resolve\"},\"rug-check-security\":{\"v1\":\"/api/v1/rug-check/security\",\"public\":\"/api/rug-check/security\"},\"rug-check-trending\":{\"v1\":\"/api/v1/rug-check/trending\",\"public\":\"/api/rug-check/trending\"},\"rwa-perps-rates\":{\"v1\":\"/api/v1/rwa-perps/rates\",\"public\":\"/api/rwa-perps/rates\"},\"stablecoins-data\":{\"v1\":\"/api/v1/stablecoins/data\",\"public\":null},\"token-data\":{\"v1\":null,\"public\":\"/api/token-data\"},\"token-scanner-inspect\":{\"v1\":null,\"public\":\"/api/token-scanner/inspect/{address}\"},\"token-scanner-rate-stats\":{\"v1\":null,\"public\":\"/api/token-scanner/rate-stats\"},\"token-scanner-scan\":{\"v1\":\"/api/v1/token-scanner/scan\",\"public\":null},\"token-scanner-scan-ai-top\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/ai-top\"},\"token-scanner-scan-alpha-drops\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/alpha-drops\"},\"token-scanner-scan-hot\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/hot\"},\"token-scanner-scan-new-runners\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/new-runners\"},\"token-scanner-scan-top-new\":{\"v1\":null,\"public\":\"/api/token-scanner/scan/top-new\"},\"token-scanner-search\":{\"v1\":null,\"public\":\"/api/token-scanner/search\"},\"tracker-coins\":{\"v1\":null,\"public\":\"/api/tracker/coins/{categoryId}\"},\"tracker-market-overview\":{\"v1\":\"/api/v1/tracker/market-overview\",\"public\":\"/api/tracker/market-overview\"},\"usage\":{\"v1\":\"/api/v1/usage\",\"public\":null},\"web-traffic-data\":{\"v1\":\"/api/v1/web-traffic/data\",\"public\":\"/api/web-traffic/data\"}}}");
|
|
9
9
|
//# sourceMappingURL=manifest.js.map
|