@sharpe-terminal/mcp-server 1.4.0 → 1.6.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.
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The agent manifest: every endpoint tool's name, title, description, input and output JSON Schema, routes and CLI
3
+ * block, rendered from src/contracts (scripts/contracts/agent-manifest.ts). Generated by
4
+ * scripts/contracts/sync-packages.ts; do not edit. Change the contract, then re-run the sync. The Python package reads
5
+ * the same document (packages/mcp-server-python/sharpe_contract.json).
6
+ */
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\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"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\"},\"freshnessSlaSeconds\":{\"type\":\"integer\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"]},\"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\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"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\"},\"freshnessSlaSeconds\":{\"type\":\"integer\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"]},\"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\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"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\"},\"freshnessSlaSeconds\":{\"type\":\"integer\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"]},\"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\":{\"$ref\":\"#/definitions/ScannerMeta\"},\"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\"},\"freshnessSlaSeconds\":{\"type\":\"integer\"},\"source\":{\"type\":\"string\",\"enum\":[\"supabase\",\"supabase-stale\",\"live\",\"unavailable\"]},\"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\"},{\"$ref\":\"#/definitions/FreeCorrelationMatrixBody\"}]},\"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\"]},\"FreeCorrelationMatrixBody\":{\"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.\"}},\"required\":[\"assets\",\"matrix\",\"dataPoints\",\"period\",\"computedAt\"]}}},\"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\"}]},{\"$ref\":\"#/definitions/FreeEcosystemsBody\"}]},\"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\"]},\"FreeEcosystemsBody\":{\"anyOf\":[{\"$ref\":\"#/definitions/EcosystemOverviewPayload\"},{\"$ref\":\"#/definitions/EcosystemDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"},{\"$ref\":\"#/definitions/FreeEcosystemHistoryBody\"},{\"$ref\":\"#/definitions/FreeCategoryMindshareHistoryBody\"}]},\"FreeEcosystemHistoryBody\":{\"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\"]}},\"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.\"},\"FreeCategoryMindshareHistoryBody\":{\"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\"]}},\"required\":[\"mindshareSnapshots\",\"coverage\"]}}},\"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\"]},{\"$ref\":\"#/definitions/FreeFundingSettlementBody\"}]},\"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\"]},\"FreeFundingSettlementBody\":{\"type\":\"object\",\"properties\":{\"data\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/SettlementRow\"}},\"totals\":{\"$ref\":\"#/definitions/SettlementWindows\"},\"meta\":{\"$ref\":\"#/definitions/SettlementMeta\"}},\"required\":[\"data\",\"totals\",\"meta\"]}}},\"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\"]}}},\"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\"]}}},\"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\"},{\"$ref\":\"#/definitions/FreeFuturesDataBody\"}]},\"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.\"},\"FreeFuturesDataBody\":{\"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\"}},\"required\":[\"chart\",\"coin\",\"timeframe\",\"data\",\"coverage\",\"source\"]},\"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\"]}}},\"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\"}}]},{\"$ref\":\"#/definitions/GemFinderPayload\"}]},\"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\"]}}},\"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\"]},{\"$ref\":\"#/definitions/FreeInsiderSellingBody\"}]},\"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\"]},\"FreeInsiderSellingBody\":{\"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.\"}},\"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\"]}}},\"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\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"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\":{\"type\":\"number\",\"x-unit\":\"percent\"},\"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\"}]},{\"$ref\":\"#/definitions/FreeNarrativesBody\"}]},\"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\"]},\"FreeNarrativesBody\":{\"anyOf\":[{\"$ref\":\"#/definitions/NarrativeOverviewPayload\"},{\"$ref\":\"#/definitions/NarrativeDetailPayload\"},{\"$ref\":\"#/definitions/CategoryCorrelationPayload\"},{\"$ref\":\"#/definitions/FreeNarrativeHistoryBody\"},{\"$ref\":\"#/definitions/FreeCategoryMindshareHistoryBody\"},{\"$ref\":\"#/definitions/FreeNarrativeFundingHistoryBody\"},{\"$ref\":\"#/definitions/FreeNarrativeTokenHistoryBody\"},{\"$ref\":\"#/definitions/FreeNarrativeTokenVolumeBody\"}]},\"FreeNarrativeHistoryBody\":{\"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\"]}},\"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.\"},\"FreeCategoryMindshareHistoryBody\":{\"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\"]}},\"required\":[\"mindshareSnapshots\",\"coverage\"]},\"FreeNarrativeFundingHistoryBody\":{\"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\"]}}},\"required\":[\"snapshots\"]},\"FreeNarrativeTokenHistoryBody\":{\"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\"]}}},\"required\":[\"rows\"]},\"FreeNarrativeTokenVolumeBody\":{\"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\"}},\"required\":[\"tokens\"]}}},\"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\"},{\"$ref\":\"#/definitions/FreeNewsFeedBody\"}]},\"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\"]},\"FreeNewsFeedBody\":{\"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\"}},\"required\":[\"articles\",\"total\",\"nextCursor\",\"nextOffset\",\"truncated\"]}}},\"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\"]},{\"$ref\":\"#/definitions/FreePumpDumpBody\"}]},\"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\"]},\"FreePumpDumpBody\":{\"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.\"}},\"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\"]}}},\"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\"},{\"$ref\":\"#/definitions/FreeRugCheckTrendingBody\"}]},\"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\"]},\"FreeRugCheckTrendingBody\":{\"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}},\"required\":[\"tokens\",\"count\",\"total\",\"source\",\"fetchedAt\"]}}},\"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\"},\"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\"},\"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
+ //# sourceMappingURL=manifest.js.map