{"openapi":"3.1.0","info":{"title":"Bitpoort API","description":"Multi-chain on-chain intelligence for AI agents. REST + MCP live across Ethereum, Bitcoin, and Hyperliquid, with Polygon node coverage in progress.\n\n## Authentication\nMost endpoints require an `X-API-Key` header (alternative: `Authorization: Bearer`). Public endpoints (instant key creation, trust, health, discovery) are marked with `security: []` per-route. Get a free key in one request: `POST https://api.bitpoort.com/v1/keys` -- no signup, no email, 90-day expiry.\n\n## What's available\n- **Whale tracking** -- real-time large transfers across ETH/BTC/HL with 2.3M entity labels.\n- **Smart money** -- top wallets by trading performance, MEV leaderboard, copy-trade alerts.\n- **Market** -- exchange flows, emerging tokens, trending tokens, price candles, ML predictions.\n- **Hyperliquid perps** -- funding rates, liquidation heatmap, copy-trade alerts, top traders.\n- **Forensic / compliance** -- 1,386 OFAC/UK/IL/JP sanctions, 43 mixer contracts, signed compliance reports, HMAC-verified retroactive exposure scanner, KYA agent identity registry.\n- **RAG + chat** -- semantic search over 6.5M+ on-chain intelligence chunks; natural-language Q&A.\n\n## MCP\nStreamable-HTTP MCP server at `https://mcp.bitpoort.com/` exposes 61 tools backed by these REST endpoints. Discovery manifest: `https://bitpoort.com/.well-known/mcp.json`.\n","version":"1.0.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health","description":"Full health response consumed by the RAG3.jsx dashboard.\n\nShape::\n\n    {\n      status: \"running\"|\"paused\"|\"stopped\",\n      health_score: 0-100,\n      chains: [{chain, status, block_number, head_block, lag, rpc_health}],\n      pipeline: {stages: [{stage, status, processed, errors, queue_depth,\n                           throughput, latency_ms, backpressure, uptime}]},\n      queues: {ingest_to_normalize, ...},\n      system: {uptime_seconds, total_blocks_processed, total_chunks_indexed,\n               total_whale_txs, error_rate_1m, db_pool_size, redis_connected}\n    }","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}},"security":[]}},"/v1/health":{"get":{"tags":["health"],"summary":"Health","description":"Full health response consumed by the RAG3.jsx dashboard.\n\nShape::\n\n    {\n      status: \"running\"|\"paused\"|\"stopped\",\n      health_score: 0-100,\n      chains: [{chain, status, block_number, head_block, lag, rpc_health}],\n      pipeline: {stages: [{stage, status, processed, errors, queue_depth,\n                           throughput, latency_ms, backpressure, uptime}]},\n      queues: {ingest_to_normalize, ...},\n      system: {uptime_seconds, total_blocks_processed, total_chunks_indexed,\n               total_whale_txs, error_rate_1m, db_pool_size, redis_connected}\n    }","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health V1 Health Get"}}}}},"security":[]}},"/v1/blocks/latest":{"get":{"tags":["blocks"],"summary":"Latest Block","description":"Latest block for a chain. Convenience alias — equivalent to\n``/v1/blocks/{chain}?limit=1`` but with a flatter shape so agents can do\n``GET /v1/blocks/latest?chain=ETH`` without needing to know the path-param\nconvention. The single block is returned under the ``block`` key.","operationId":"latest_block_v1_blocks_latest_get","parameters":[{"name":"chain","in":"query","required":true,"schema":{"type":"string","description":"Chain ID (ETH, BTC, HL, POLYGON)","title":"Chain"},"description":"Chain ID (ETH, BTC, HL, POLYGON)"}],"responses":{"200":{"description":"Latest indexed block for the requested chain plus the current head block number.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Latest Block V1 Blocks Latest Get","$ref":"#/components/schemas/BlockLatestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blocks/recent":{"get":{"tags":["blocks"],"summary":"Recent Blocks","description":"Recent blocks for a chain via query string. Convenience alias for\n``/v1/blocks/{chain}?limit=N`` so agents can use the more conventional\n``GET /v1/blocks/recent?chain=ETH&limit=5`` shape. Supports optional\n``since``/``until`` ISO 8601 time-window filtering and ``cursor``\nkeyset pagination.","operationId":"recent_blocks_v1_blocks_recent_get","parameters":[{"name":"chain","in":"query","required":true,"schema":{"type":"string","description":"Chain ID (ETH, BTC, HL, POLYGON)","title":"Chain"},"description":"Chain ID (ETH, BTC, HL, POLYGON)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z","title":"Since"},"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z","title":"Until"},"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous response's next_cursor field","title":"Cursor"},"description":"Opaque cursor from a previous response's next_cursor field"}],"responses":{"200":{"description":"Recent blocks for the requested chain. Supports since/until ISO 8601 windowing and opaque cursor pagination via next_cursor / has_more.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Recent Blocks V1 Blocks Recent Get","$ref":"#/components/schemas/BlocksRecentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blocks/{chain}":{"get":{"tags":["blocks"],"summary":"List Blocks","description":"List recent blocks for a chain, shaped for the chain grid in the dashboard.","operationId":"list_blocks_v1_blocks__chain__get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z","title":"Since"},"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z","title":"Until"},"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous response's next_cursor field","title":"Cursor"},"description":"Opaque cursor from a previous response's next_cursor field"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Blocks V1 Blocks  Chain  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/blocks/{chain}/{block_number}":{"get":{"tags":["blocks"],"summary":"Get Block Detail","description":"Full block detail (lab block shape) for the block inspector.","operationId":"get_block_detail_v1_blocks__chain___block_number__get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"name":"block_number","in":"path","required":true,"schema":{"type":"integer","title":"Block Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Block Detail V1 Blocks  Chain   Block Number  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/chat":{"post":{"tags":["chat"],"summary":"Chat","description":"Chat with the blockchain RAG — ask anything about on-chain activity.\n\nAutomatically selects the best available LLM provider:\n1. Anthropic Claude with native tool calling\n2. DeepSeek V3 with RAG context injection (fallback)\n\nGrounding enforcement:\n- Report intents trigger mandatory tool calls before LLM generation\n- Evidence gate blocks responses with insufficient data\n- Numeric claim guard validates dollar amounts and percentages","operationId":"chat_v1_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/chat/stream":{"post":{"tags":["chat"],"summary":"Chat Stream","description":"Stream chat response via Server-Sent Events.\n\nEvents:\n- ``{type: \"meta\", chunks_used, rag_time_ms}`` — sent once after RAG search\n- ``{type: \"token\", text}``                    — one per LLM token\n- ``{type: \"done\", model, provider, llm_time_ms, total_time_ms}`` — final\n- ``:keepalive``                               — comment heartbeat every 15 s\n- ``[DONE]``                                   — stream terminator","operationId":"chat_stream_v1_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/recent":{"get":{"tags":["feed"],"summary":"Feed Recent","description":"Get recent blocks with pre-joined narrative events and whale counts.\n\nReturns blocks ordered by block_number DESC, each annotated with\nany event-level RAG chunks and whale transaction counts. Supports\noptional since/until ISO 8601 time-window filtering and ``cursor``\nkeyset pagination; response includes ``next_cursor`` and\n``has_more`` for the next page.","operationId":"feed_recent_v1_feed_recent_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain to get feed for","default":"ETH","title":"Chain"},"description":"Chain to get feed for"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of recent blocks","default":20,"title":"Limit"},"description":"Number of recent blocks"},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Minimum USD volume for actions","default":10000.0,"title":"Min Usd"},"description":"Minimum USD volume for actions"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z","title":"Since"},"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z","title":"Until"},"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous response's next_cursor field","title":"Cursor"},"description":"Opaque cursor from a previous response's next_cursor field"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedRecentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/block/{chain}/{block_number}":{"get":{"tags":["feed"],"summary":"Feed Block Detail","description":"Get full detail for a single block: metadata + narrative events + whale txs.","operationId":"feed_block_detail_v1_feed_block__chain___block_number__get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"name":"block_number","in":"path","required":true,"schema":{"type":"integer","title":"Block Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/action/{tx_hash}/hops":{"get":{"tags":["feed"],"summary":"Feed Swap Hops","description":"Get individual swap hops for a transaction (multi-hop drilldown).\n\nReturns canonical_swaps rows for the given tx_hash, with entity_registry\nJOINs for symbol/decimals fallback, ordered by log_index.","operationId":"feed_swap_hops_v1_feed_action__tx_hash__hops_get","parameters":[{"name":"tx_hash","in":"path","required":true,"schema":{"type":"string","title":"Tx Hash"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain to look up hops on","default":"ETH","title":"Chain"},"description":"Chain to look up hops on"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapHopsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/trending":{"get":{"tags":["feed"],"summary":"Feed Trending","description":"Get trending tokens by swap volume with trend indicators.\n\nCompares recent swap volume against the preceding period of the same\nlength to compute change percentage and trend direction.  Enriched with\nprice estimates and 24h volume sparklines for charting.","operationId":"feed_trending_v1_feed_trending_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain to get trending tokens for","default":"ETH","title":"Chain"},"description":"Chain to get trending tokens for"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Lookback period in hours","default":6,"title":"Hours"},"description":"Lookback period in hours"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of tokens to return","default":10,"title":"Limit"},"description":"Number of tokens to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/emerging-tokens":{"get":{"tags":["feed"],"summary":"Get Emerging Tokens","description":"Get top emerging tokens ranked by momentum score.\n\nAuthentication: public (no API key required). Same response shape as\n/v1/tokens/emerging and /v1/intelligence/emerging.","operationId":"get_emerging_tokens_v1_feed_emerging_tokens_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items to return (1-200, default 20).","default":20,"title":"Limit"},"description":"Max items to return (1-200, default 20)."},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05.","default":0.05,"title":"Min Score"},"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 lower bound on scored_at, e.g. 2026-05-01T00:00:00Z. Combinable with until.","title":"Since"},"description":"Optional ISO 8601 lower bound on scored_at, e.g. 2026-05-01T00:00:00Z. Combinable with until."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 upper bound on scored_at, e.g. 2026-05-02T00:00:00Z. Combinable with since.","title":"Until"},"description":"Optional ISO 8601 upper bound on scored_at, e.g. 2026-05-02T00:00:00Z. Combinable with since."}],"responses":{"200":{"description":"Public feed of emerging tokens ranked by momentum score. Each item carries swap activity, holder growth, and smart-money interest. Currently ETH-only.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmergingTokenItem"},"title":"Response 200 Get Emerging Tokens V1 Feed Emerging Tokens Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/btc/recent":{"get":{"tags":["feed","Bitcoin"],"summary":"Btc Feed Recent","description":"Recent Bitcoin whale flows, enriched with entity + intent data.\n\nReturns significant BTC movements after 1-block confirmation.\nOrdered by block_number DESC, then net_transfer_btc DESC.","operationId":"btc_feed_recent_v1_feed_btc_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"min_btc","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Minimum BTC value","default":10.0,"title":"Min Btc"},"description":"Minimum BTC value"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}},{"name":"entity_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return flows with known entities","default":false,"title":"Entity Only"},"description":"Only return flows with known entities"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BtcFeedEvent"},"title":"Response Btc Feed Recent V1 Feed Btc Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/feed/hl/recent":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Feed Recent","description":"Recent significant Hyperliquid trades.\n\nReturns whale trades and liquidations ordered by timestamp DESC.","operationId":"hl_feed_recent_v1_feed_hl_recent_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":10000,"title":"Min Usd"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/traders":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Top Traders","description":"Top Hyperliquid traders by smart money score.","operationId":"hl_top_traders_v1_feed_hl_traders_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"min_trades","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":3,"title":"Min Trades"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/traders/styled":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Traders Styled","description":"Top HL traders with style classification (SNIPER/DIRECTIONAL/STEAMROLLER/HEDGER).","operationId":"hl_traders_styled_v1_feed_hl_traders_styled_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/alerts":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Smart Alerts","description":"Action alerts: significant fills from high-score traders.","operationId":"hl_smart_alerts_v1_feed_hl_alerts_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":1,"title":"Hours"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":40,"title":"Min Score"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/trader/{address}":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Trader Profile","description":"Full profile for a single HL trader: stats + recent trades + coin breakdown.","operationId":"hl_trader_profile_v1_feed_hl_trader__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/pulse":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Pulse","description":"Smart Money Pulse — single-glance market state.","operationId":"hl_pulse_v1_feed_hl_pulse_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":1,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/depth":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Orderbook Depth","description":"Orderbook depth and imbalance for multiple coins.","operationId":"hl_orderbook_depth_v1_feed_hl_depth_get","parameters":[{"name":"coins","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated coins","default":"BTC,ETH,SOL,HYPE,DOGE,AVAX,SUI,LINK,AAVE,XRP","title":"Coins"},"description":"Comma-separated coins"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/flow-history":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Flow History","description":"Flow history in 5-min buckets for sparklines.","operationId":"hl_flow_history_v1_feed_hl_flow_history_get","parameters":[{"name":"coin","in":"query","required":true,"schema":{"type":"string","description":"Coin symbol","title":"Coin"},"description":"Coin symbol"},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":48,"minimum":1,"default":12,"title":"Buckets"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/funding":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Funding Rates","description":"Latest funding rates and open interest — live from Hyperliquid API.","operationId":"hl_funding_rates_v1_feed_hl_funding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/feed/hl/positions":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Positions Live","description":"Live open positions for top-scored wallets — fetched from Hyperliquid API.","operationId":"hl_positions_live_v1_feed_hl_positions_get","parameters":[{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Number of top wallets to fetch","default":10,"title":"Top N"},"description":"Number of top wallets to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/suspects":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Suspects","description":"Insider/manipulation detection — suspect trades, wallets, and coordination clusters.","operationId":"hl_suspects_v1_feed_hl_suspects_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":8760,"minimum":24,"default":720,"title":"Hours"}},{"name":"min_pnl","in":"query","required":false,"schema":{"type":"integer","minimum":500,"default":2000,"title":"Min Pnl"}},{"name":"min_return","in":"query","required":false,"schema":{"type":"number","minimum":1.0,"default":5.0,"title":"Min Return"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/strategies":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Strategies","description":"Strategy engine v3 — backtested against actual price returns, not PnL proxies.","operationId":"hl_strategies_v1_feed_hl_strategies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/feed/hl/alpha":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Alpha","description":"HL Alpha — 90-day multi-horizon backtested edges with Kelly sizing and equity curves.","operationId":"hl_alpha_v1_feed_hl_alpha_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/feed/hl/signal-log":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Signal Log","description":"Signal tracker — live and historical signals with PnL tracking.","operationId":"hl_signal_log_v1_feed_hl_signal_log_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|open|closed)$","default":"all","title":"Status"}},{"name":"version","in":"query","required":false,"schema":{"type":"string","pattern":"^(v3|v4|v5|v6|v7|all)$","default":"v3","title":"Version"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/copytrade/curated":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Copytrade Curated","description":"Returns the current curated top-10 DIR wallet list used by v4 copy trader.","operationId":"hl_copytrade_curated_v1_feed_hl_copytrade_curated_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/feed/hl/signals":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Cross Signals","description":"Cross-signal alerts from HL digest engine.","operationId":"hl_cross_signals_v1_feed_hl_signals_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":4,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/hl/insider-trades":{"get":{"tags":["feed","Hyperliquid"],"summary":"Hl Insider Trades","description":"Live trade feed from statistically impossible / insider wallets.","operationId":"hl_insider_trades_v1_feed_hl_insider_trades_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":72,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/feed/swaps/recent":{"get":{"tags":["feed","DEX"],"summary":"Feed Swaps Recent","description":"Recent on-chain DEX swaps (per-tx, not aggregated).\n\nReads the last N rows from `swap_routes` for the chain above\n`min_usd`, newest first. Bounded to the last hour so the query\ncan never table-scan the full multi-million-row history.\nCached in Redis for 30s — every visitor hits the same cache slot\nso a busy landing page is one DB query per 30s, not one per poll.","operationId":"feed_swaps_recent_v1_feed_swaps_recent_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain (ETH only for now)","default":"ETH","title":"Chain"},"description":"Chain (ETH only for now)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of recent swaps","default":10,"title":"Limit"},"description":"Number of recent swaps"},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Minimum USD volume per swap","default":10000.0,"title":"Min Usd"},"description":"Minimum USD volume per swap"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/rag/query":{"post":{"tags":["rag"],"summary":"Rag Query","description":"Execute a hybrid RAG search query.\n\nReturns::\n\n    {results: [...], total, query_time_ms}","operationId":"rag_query_v1_rag_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RagQueryBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rag Query V1 Rag Query Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/rag/chunks":{"get":{"tags":["rag"],"summary":"List Chunks","description":"List recent RAG chunks with pagination.\n\nEach chunk has the dashboard shape:\n    {id, chunk_id, chain, topic, block_height, embedding_dim, tokens,\n     cosine_score, provenance, indexed_at, text_preview}","operationId":"list_chunks_v1_rag_chunks_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"topic","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Chunks V1 Rag Chunks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/rag/stats":{"get":{"tags":["rag"],"summary":"Rag Stats","description":"RAG index statistics.","operationId":"rag_stats_v1_rag_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Rag Stats V1 Rag Stats Get"}}}}}}},"/v1/dashboard/overview":{"get":{"tags":["dashboard"],"summary":"Dashboard Overview","description":"Aggregate statistics for the dashboard home page.","operationId":"dashboard_overview_v1_dashboard_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dashboard Overview V1 Dashboard Overview Get"}}}}}}},"/v1/dashboard/chains":{"get":{"tags":["dashboard"],"summary":"Dashboard Chains","description":"All chain statuses with lag history, shaped for the chain grid.\n\nEach chain item matches::\n\n    {chain, number, headBlock, lag, lagHistory, hash, txCount, gasUsed,\n     gasLimit, baseFee, stage, latency, status, blockTime, lastChunkAt,\n     chunkFreshness, rpcHealth, errorRate1m, p99Latency}","operationId":"dashboard_chains_v1_dashboard_chains_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dashboard Chains V1 Dashboard Chains Get"}}}}}}},"/v1/dashboard/txs":{"get":{"tags":["dashboard"],"summary":"Dashboard Txs","description":"Return recent normalized transactions for the live feed.","operationId":"dashboard_txs_v1_dashboard_txs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Txs V1 Dashboard Txs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/whale-txs":{"get":{"tags":["dashboard"],"summary":"Dashboard Whale Txs","description":"Recent whale transactions for the live feed.\n\nEach item matches::\n\n    {id, chain, type, hash, from, fromLabel, to, toLabel, tokenAmount,\n     nativeSymbol, usdValue, gasPrice, blockNumber, status, timestamp,\n     description, riskFlag}","operationId":"dashboard_whale_txs_v1_dashboard_whale_txs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Whale Txs V1 Dashboard Whale Txs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/intents":{"get":{"tags":["dashboard"],"summary":"Dashboard Intents","description":"Recent intent detections for the intent panel.","operationId":"dashboard_intents_v1_dashboard_intents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Intents V1 Dashboard Intents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/logs":{"get":{"tags":["dashboard"],"summary":"Dashboard Logs","description":"Recent log entries.\n\nEach item matches::\n\n    {id, level, service, message, trace_id, metadata, timestamp}","operationId":"dashboard_logs_v1_dashboard_logs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Logs V1 Dashboard Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/alerts":{"get":{"tags":["dashboard"],"summary":"Dashboard Alerts","description":"Alert rules + recent alert history.","operationId":"dashboard_alerts_v1_dashboard_alerts_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Alerts V1 Dashboard Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/incidents":{"get":{"tags":["dashboard"],"summary":"Dashboard Incidents","description":"Recent incidents.","operationId":"dashboard_incidents_v1_dashboard_incidents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Incidents V1 Dashboard Incidents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/dlq":{"get":{"tags":["dashboard"],"summary":"Dashboard Dlq","description":"Dead letter queue entries.","operationId":"dashboard_dlq_v1_dashboard_dlq_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Dlq V1 Dashboard Dlq Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/queues":{"get":{"tags":["dashboard"],"summary":"Dashboard Queues","description":"Pipeline queue statuses.","operationId":"dashboard_queues_v1_dashboard_queues_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Dashboard Queues V1 Dashboard Queues Get"}}}}}}},"/v1/dashboard/exchange-flows":{"get":{"tags":["dashboard"],"summary":"Dashboard Exchange Flows","description":"Exchange inflow/outflow summary for the given time window.","operationId":"dashboard_exchange_flows_v1_dashboard_exchange_flows_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Exchange Flows V1 Dashboard Exchange Flows Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/gas":{"get":{"tags":["dashboard"],"summary":"Dashboard Gas","description":"Gas utilization and fee statistics.","operationId":"dashboard_gas_v1_dashboard_gas_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":1,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Gas V1 Dashboard Gas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/stablecoins":{"get":{"tags":["dashboard"],"summary":"Dashboard Stablecoins","description":"Stablecoin flow summary for the given time window.","operationId":"dashboard_stablecoins_v1_dashboard_stablecoins_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Stablecoins V1 Dashboard Stablecoins Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/market":{"get":{"tags":["dashboard"],"summary":"Dashboard Market","description":"Composite market intelligence endpoint.\n\nAggregates swap pairs, exchange flows, whale activity, gas stats, and\nstablecoin data into a single response.  Uses ``asyncio.gather`` for\nparallel DB queries.  Individual section failures degrade gracefully\n(the section is returned as ``null``).","operationId":"dashboard_market_v1_dashboard_market_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Market V1 Dashboard Market Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/dashboard/swap-pairs":{"get":{"tags":["dashboard"],"summary":"Dashboard Swap Pairs","description":"Top swap pairs by USD volume in the last N minutes.","operationId":"dashboard_swap_pairs_v1_dashboard_swap_pairs_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"minutes","in":"query","required":false,"schema":{"type":"integer","maximum":1440,"minimum":1,"default":60,"title":"Minutes"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","minimum":0,"default":0,"title":"Min Usd"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Dashboard Swap Pairs V1 Dashboard Swap Pairs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pipeline/status":{"get":{"tags":["pipeline"],"summary":"Pipeline Status","description":"Full pipeline status with all stage metrics.\n\nThe ``stages`` list uses the dashboard ``genPipelineMetrics`` shape.","operationId":"pipeline_status_v1_pipeline_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Pipeline Status V1 Pipeline Status Get"}}}}}}},"/v1/pipeline/start":{"post":{"tags":["pipeline"],"summary":"Pipeline Start","description":"Start the pipeline (all stages).","operationId":"pipeline_start_v1_pipeline_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Pipeline Start V1 Pipeline Start Post"}}}}}}},"/v1/pipeline/stop":{"post":{"tags":["pipeline"],"summary":"Pipeline Stop","description":"Stop the pipeline (all stages).","operationId":"pipeline_stop_v1_pipeline_stop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Pipeline Stop V1 Pipeline Stop Post"}}}}}}},"/v1/pipeline/pause":{"post":{"tags":["pipeline"],"summary":"Pipeline Pause","description":"Pause the pipeline (all stages).","operationId":"pipeline_pause_v1_pipeline_pause_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Pipeline Pause V1 Pipeline Pause Post"}}}}}}},"/v1/pipeline/resume":{"post":{"tags":["pipeline"],"summary":"Pipeline Resume","description":"Resume the pipeline (all stages).","operationId":"pipeline_resume_v1_pipeline_resume_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Pipeline Resume V1 Pipeline Resume Post"}}}}}}},"/v1/pipeline/stage/{name}/pause":{"post":{"tags":["pipeline"],"summary":"Stage Pause","description":"Pause an individual pipeline stage.","operationId":"stage_pause_v1_pipeline_stage__name__pause_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Stage Pause V1 Pipeline Stage  Name  Pause Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pipeline/stage/{name}/resume":{"post":{"tags":["pipeline"],"summary":"Stage Resume","description":"Resume an individual pipeline stage.","operationId":"stage_resume_v1_pipeline_stage__name__resume_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Stage Resume V1 Pipeline Stage  Name  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/pipeline/backfill":{"post":{"tags":["pipeline"],"summary":"Pipeline Backfill","description":"Inject specific blocks into the pipeline for backfill.\n\nRequires admin role.  Rate-limited to 1 request per 10 seconds.\nMax 5000 blocks per request.","operationId":"pipeline_backfill_v1_pipeline_backfill_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackfillRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Pipeline Backfill V1 Pipeline Backfill Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags":{"post":{"tags":["tags"],"summary":"Create Tag","description":"Create a new tag on an event.","operationId":"create_tag_v1_tags_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags/event/{event_id}":{"get":{"tags":["tags"],"summary":"Get Event Tags","description":"Get all tags for a specific event.","operationId":"get_event_tags_v1_tags_event__event_id__get","parameters":[{"name":"event_id","in":"path","required":true,"schema":{"type":"string","title":"Event Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags/{tag_id}":{"delete":{"tags":["tags"],"summary":"Delete Tag","description":"Delete a tag by ID.","operationId":"delete_tag_v1_tags__tag_id__delete","parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"integer","title":"Tag Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tags/labels":{"get":{"tags":["tags"],"summary":"Get Address Labels","description":"Get all user-defined address labels from tags.","operationId":"get_address_labels_v1_tags_labels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddressLabelsResponse"}}}}}}},"/v1/wallets/smart-money-flow":{"get":{"tags":["wallets"],"summary":"Smart Money Flow","description":"Get aggregated smart money position flow.","operationId":"smart_money_flow_v1_wallets_smart_money_flow_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"window","in":"query","required":false,"schema":{"type":"string","default":"1h","title":"Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Smart Money Flow V1 Wallets Smart Money Flow Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/flow-explorer":{"get":{"tags":["wallets"],"summary":"Flow Explorer","description":"Top money flows between wallets with classification labels.","operationId":"flow_explorer_v1_wallets_flow_explorer_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"from_class","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter source by classification","title":"From Class"},"description":"Filter source by classification"},{"name":"to_class","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter dest by classification","title":"To Class"},"description":"Filter dest by classification"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Flow Explorer V1 Wallets Flow Explorer Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets":{"get":{"tags":["wallets"],"summary":"Search Wallets","description":"Search wallet profiles with filters.","operationId":"search_wallets_v1_wallets_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by chain","title":"Chain"},"description":"Filter by chain"},{"name":"classification","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by classification","title":"Classification"},"description":"Filter by classification"},{"name":"label","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by label substring","title":"Label"},"description":"Search by label substring"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletSummaryResponse"},"title":"Response Search Wallets V1 Wallets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/top/{chain}":{"get":{"tags":["wallets"],"summary":"Get Top Wallets","description":"Get top wallets by volume on a chain.","operationId":"get_top_wallets_v1_wallets_top__chain__get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"type":"string","title":"Chain"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletSummaryResponse"},"title":"Response Get Top Wallets V1 Wallets Top  Chain  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/risky/{chain}":{"get":{"tags":["wallets"],"summary":"Get Risky Wallets","description":"Get wallets above a risk score threshold.","operationId":"get_risky_wallets_v1_wallets_risky__chain__get","parameters":[{"name":"chain","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"min_risk","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"description":"Minimum risk score","default":50,"title":"Min Risk"},"description":"Minimum risk score"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Risky Wallets V1 Wallets Risky  Chain  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/compliance/{address}":{"get":{"tags":["wallets"],"summary":"Wallet Compliance Report","description":"Generate a compliance risk report for a wallet address.\n\nReturns:\n- Risk score breakdown (sanctions, mixer, behavior, volume)\n- Sanctions list match (OFAC SDN)\n- Known entity label\n- Intent history (wash trading, accumulation, etc.)\n- Counterparty risk (interactions with sanctioned addresses)","operationId":"wallet_compliance_report_v1_wallets_compliance__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain to check","default":"ETH","title":"Chain"},"description":"Chain to check"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Wallet Compliance Report V1 Wallets Compliance  Address  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/trail/{address}":{"get":{"tags":["wallets"],"summary":"Wallet Transaction Trail","description":"Trace source-of-funds for an address up to N hops.\n\nReturns the most significant counterparties and their flow direction,\nrecursively up to `hops` levels deep.","operationId":"wallet_transaction_trail_v1_wallets_trail__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"hops","in":"query","required":false,"schema":{"type":"integer","maximum":4,"minimum":1,"default":2,"title":"Hops"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/{address}":{"get":{"tags":["wallets"],"summary":"Get Wallet Profile","description":"Get the profile for a specific wallet address.","operationId":"get_wallet_profile_v1_wallets__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by chain (e.g. 'ETH')","title":"Chain"},"description":"Filter by chain (e.g. 'ETH')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/{address}/all-chains":{"get":{"tags":["wallets"],"summary":"Get Wallet All Chains","description":"Get wallet profiles across all chains.","operationId":"get_wallet_all_chains_v1_wallets__address__all_chains_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletProfileResponse"},"title":"Response Get Wallet All Chains V1 Wallets  Address  All Chains Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/{address}/interactions":{"get":{"tags":["wallets"],"summary":"Get Wallet Interactions","description":"Get the interaction graph for a wallet.","operationId":"get_wallet_interactions_v1_wallets__address__interactions_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by chain","title":"Chain"},"description":"Filter by chain"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletInteractionResponse"},"title":"Response Get Wallet Interactions V1 Wallets  Address  Interactions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/wallets/{address}/refresh":{"get":{"tags":["wallets"],"summary":"Refresh Wallet Profile","description":"Trigger an on-demand profile refresh for a wallet.","operationId":"refresh_wallet_profile_v1_wallets__address__refresh_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain to refresh","default":"ETH","title":"Chain"},"description":"Chain to refresh"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/subgraph/{actor}":{"get":{"tags":["graph"],"summary":"Get Subgraph","description":"Get the subgraph around an actor (wallet address or node_id).","operationId":"get_subgraph_v1_graph_subgraph__actor__get","parameters":[{"name":"actor","in":"path","required":true,"schema":{"type":"string","title":"Actor"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain filter (e.g. 'ETH')","title":"Chain"},"description":"Chain filter (e.g. 'ETH')"},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","maximum":2,"minimum":1,"description":"Hop depth (1 or 2)","default":1,"title":"Depth"},"description":"Hop depth (1 or 2)"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":8760,"minimum":1,"description":"Time window in hours","default":168,"title":"Hours"},"description":"Time window in hours"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max edges","default":50,"title":"Limit"},"description":"Max edges"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubgraphResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/node/{node_id}":{"get":{"tags":["graph"],"summary":"Get Node","description":"Get a graph node by node_id.","operationId":"get_node_v1_graph_node__node_id__get","parameters":[{"name":"node_id","in":"path","required":true,"schema":{"type":"string","title":"Node Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/nodes/search":{"get":{"tags":["graph"],"summary":"Search Nodes","description":"Search graph nodes with optional filters.","operationId":"search_nodes_v1_graph_nodes_search_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","title":"Chain"}},{"name":"node_type","in":"query","required":false,"schema":{"type":"string","title":"Node Type"}},{"name":"label","in":"query","required":false,"schema":{"type":"string","title":"Label"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/nodes/by-address/{address}":{"get":{"tags":["graph"],"summary":"Get Nodes By Address","description":"Get all graph nodes for a wallet address.","operationId":"get_nodes_by_address_v1_graph_nodes_by_address__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/edges/top":{"get":{"tags":["graph"],"summary":"Top Edges","description":"Get top edges by volume.","operationId":"top_edges_v1_graph_edges_top_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","title":"Chain"}},{"name":"edge_type","in":"query","required":false,"schema":{"type":"string","title":"Edge Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/timeline/{actor}":{"get":{"tags":["graph"],"summary":"Actor Timeline","description":"Get recent edge events for an actor (timeline view).","operationId":"actor_timeline_v1_graph_timeline__actor__get","parameters":[{"name":"actor","in":"path","required":true,"schema":{"type":"string","title":"Actor"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","title":"Chain"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":8760,"minimum":1,"default":168,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/clusters":{"get":{"tags":["graph"],"summary":"List Clusters","description":"List top clusters by node count.","operationId":"list_clusters_v1_graph_clusters_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/clusters/{cluster_id}":{"get":{"tags":["graph"],"summary":"Get Cluster","description":"Get a cluster and its member nodes.","operationId":"get_cluster_v1_graph_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"integer","title":"Cluster Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/graph/stats":{"get":{"tags":["graph"],"summary":"Graph Stats","description":"Get graph statistics.","operationId":"graph_stats_v1_graph_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphStatsResponse"}}}}}}},"/v1/analyst/watchlists":{"get":{"tags":["analyst"],"summary":"List Watchlists","description":"List watchlists owned by the caller's org.","operationId":"list_watchlists_v1_analyst_watchlists_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["analyst"],"summary":"Create Watchlist","description":"Create a new watchlist for the caller's org.","operationId":"create_watchlist_v1_analyst_watchlists_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/watchlists/{watchlist_id}":{"get":{"tags":["analyst"],"summary":"Get Watchlist","description":"Get a watchlist (only if owned by the caller's org).","operationId":"get_watchlist_v1_analyst_watchlists__watchlist_id__get","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["analyst"],"summary":"Update Watchlist","description":"Update watchlist name and description (owner-scoped).","operationId":"update_watchlist_v1_analyst_watchlists__watchlist_id__put","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["analyst"],"summary":"Delete Watchlist","description":"Delete a watchlist (owner-scoped).","operationId":"delete_watchlist_v1_analyst_watchlists__watchlist_id__delete","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/watchlists/{watchlist_id}/items":{"post":{"tags":["analyst"],"summary":"Add Watchlist Item","description":"Add an item to an owned watchlist.","operationId":"add_watchlist_item_v1_analyst_watchlists__watchlist_id__items_post","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WatchlistItemAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/watchlists/{watchlist_id}/items/{item_id}":{"delete":{"tags":["analyst"],"summary":"Remove Watchlist Item","description":"Remove an item from an owned watchlist.","operationId":"remove_watchlist_item_v1_analyst_watchlists__watchlist_id__items__item_id__delete","parameters":[{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer","title":"Watchlist Id"}},{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/watchlists/check/{address}":{"get":{"tags":["analyst"],"summary":"Check Address Watchlists","description":"Check if an address is on any watchlist owned by the caller's org.","operationId":"check_address_watchlists_v1_analyst_watchlists_check__address__get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/searches":{"get":{"tags":["analyst"],"summary":"List Saved Searches","description":"List saved searches owned by the caller's org.","operationId":"list_saved_searches_v1_analyst_searches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["analyst"],"summary":"Create Saved Search","description":"Create a saved search for the caller's org.","operationId":"create_saved_search_v1_analyst_searches_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/searches/{search_id}":{"get":{"tags":["analyst"],"summary":"Get Saved Search","description":"Get a saved search (owner-scoped).","operationId":"get_saved_search_v1_analyst_searches__search_id__get","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["analyst"],"summary":"Update Saved Search","description":"Update a saved search (owner-scoped).","operationId":"update_saved_search_v1_analyst_searches__search_id__put","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedSearchUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["analyst"],"summary":"Delete Saved Search","description":"Delete a saved search (owner-scoped).","operationId":"delete_saved_search_v1_analyst_searches__search_id__delete","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/searches/{search_id}/pin":{"post":{"tags":["analyst"],"summary":"Toggle Search Pin","description":"Toggle pinned status (owner-scoped).","operationId":"toggle_search_pin_v1_analyst_searches__search_id__pin_post","parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analyst/exports":{"post":{"tags":["analyst"],"summary":"Create Export","description":"Create a CSV export (owner-scoped).\n\nSupported export types:\n  - whale_txs: Recent whale transactions\n  - intents: Recent behavioral intent detections\n  - watchlist: Addresses from a specific watchlist","operationId":"create_export_v1_analyst_exports_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["analyst"],"summary":"List Exports","description":"List recent export jobs for the caller's org.","operationId":"list_exports_v1_analyst_exports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs":{"get":{"tags":["tenants"],"summary":"List Orgs","description":"List all organizations.","operationId":"list_orgs_v1_tenants_orgs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["tenants"],"summary":"Create Org","description":"Create a new organization.","operationId":"create_org_v1_tenants_orgs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}":{"get":{"tags":["tenants"],"summary":"Get Org","description":"Get organization details with current usage.","operationId":"get_org_v1_tenants_orgs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["tenants"],"summary":"Update Org","description":"Update organization tier and name.","operationId":"update_org_v1_tenants_orgs__org_id__put","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Org","description":"Delete an organization and all associated data.","operationId":"delete_org_v1_tenants_orgs__org_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}/users":{"get":{"tags":["tenants"],"summary":"List Org Users","description":"List all users in an organization.","operationId":"list_org_users_v1_tenants_orgs__org_id__users_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tenants"],"summary":"Create User","description":"Create a new user in an organization.","operationId":"create_user_v1_tenants_orgs__org_id__users_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/users/{user_id}":{"put":{"tags":["tenants"],"summary":"Update User","description":"Update user name, role, and active status.","operationId":"update_user_v1_tenants_users__user_id__put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/chainrag__api__v1__tenants__UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete User","description":"Delete a user.","operationId":"delete_user_v1_tenants_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}/keys":{"post":{"tags":["tenants"],"summary":"Create Api Key","description":"Generate a new API key for an organization.\n\nThe raw key is returned only once — it's stored as a hash.\nRequires an admin key that belongs to the target organization.","operationId":"create_api_key_v1_tenants_orgs__org_id__keys_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["tenants"],"summary":"List Api Keys","description":"List all API keys for an organization.","operationId":"list_api_keys_v1_tenants_orgs__org_id__keys_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}/keys/{key_id}":{"delete":{"tags":["tenants"],"summary":"Delete Api Key","description":"Revoke an API key (sets status to 'revoked').","operationId":"delete_api_key_v1_tenants_orgs__org_id__keys__key_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/keys/{key_id}/rotate":{"post":{"tags":["tenants"],"summary":"Rotate Api Key","description":"Rotate an API key: expire the old one immediately and issue a new key.\n\nReturns the new raw key (shown only once). The old key becomes invalid\nimmediately via ``expires_at = NOW()``.","operationId":"rotate_api_key_v1_tenants_keys__key_id__rotate_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"ttl_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Ttl Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}/usage":{"get":{"tags":["tenants"],"summary":"Get Org Usage","description":"Get usage metrics for an organization.","operationId":"get_org_usage_v1_tenants_orgs__org_id__usage_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/orgs/{org_id}/quota-check":{"get":{"tags":["tenants"],"summary":"Check Org Quota","description":"Check if an organization is within quota for a specific meter.","operationId":"check_org_quota_v1_tenants_orgs__org_id__quota_check_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"meter","in":"query","required":true,"schema":{"type":"string","pattern":"^(chat_calls|tool_calls|exports)$","title":"Meter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/audit-log":{"get":{"tags":["tenants"],"summary":"Get Audit Log","description":"Retrieve audit log entries (admin only).\n\nReturns paginated request audit trail. Filter by org_id to scope\nto a specific organization.","operationId":"get_audit_log_v1_tenants_audit_log_get","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Filter by organization ID","title":"Org Id"},"description":"Filter by organization ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tenants/tiers":{"get":{"tags":["tenants"],"summary":"List Tiers","description":"List available subscription tiers and their limits.","operationId":"list_tiers_v1_tenants_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List Webhooks","description":"List all registered webhooks.","operationId":"list_webhooks_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Webhooks V1 Webhooks Get"}}}}}},"post":{"tags":["webhooks"],"summary":"Create Webhook","description":"Create a new webhook subscription.","operationId":"create_webhook_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Webhook V1 Webhooks Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{webhook_id}":{"delete":{"tags":["webhooks"],"summary":"Delete Webhook","description":"Delete a webhook by ID.","operationId":"delete_webhook_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Webhook V1 Webhooks  Webhook Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/{webhook_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"Webhook Deliveries","description":"Delivery history for a specific webhook.","operationId":"webhook_deliveries_v1_webhooks__webhook_id__deliveries_get","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"integer","title":"Webhook Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Webhook Deliveries V1 Webhooks  Webhook Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/register":{"post":{"tags":["registration"],"summary":"Register","description":"Step 1: Submit name + email. Sends verification email.","operationId":"register_v1_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/verify":{"get":{"tags":["registration"],"summary":"Verify Email","description":"Step 2: User clicks email link. Creates API key and redirects.","operationId":"verify_email_v1_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/recover":{"post":{"tags":["registration"],"summary":"Recover Key","description":"Request API key recovery via email. Sends a recovery link.","operationId":"recover_key_v1_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/recover/verify":{"get":{"tags":["registration"],"summary":"Verify Recovery","description":"User clicks recovery link. Generates new key, expires old one.","operationId":"verify_recovery_v1_recover_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/keys/exchange":{"post":{"tags":["registration"],"summary":"Exchange Key Code","description":"Consume a one-time code and return the freshly issued API key.\n\nThe code is single-use (GETDEL) and short-lived (60s TTL). Returns\nthe key in the response body so it never touches URL, history, logs,\nor Referer headers.","operationId":"exchange_key_code_v1_keys_exchange_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/keys":{"post":{"tags":["keys"],"summary":"Create Instant Key","description":"Create an API key instantly -- no email verification required.\n\nReturns a restricted key: 60 req/min, 10,000/day cap, read-only\ndata endpoints, no chat/LLM access, 90-day expiry.","operationId":"create_instant_key_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InstantKeyRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Fresh free-tier API key (bp_ prefix). Includes the key, tier limits, granted scopes, expiry, and copy-paste usage examples for REST + MCP.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstantKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/keys/attach":{"post":{"tags":["keys"],"summary":"Attach Key","description":"Bind a ``bp_`` key to the authenticated Clerk account.\n\nReturns ``{ok: true, account_id, key_prefix, name}`` on success.\nErrors:\n\n- 401 ``AUTH_REQUIRED`` -- no Clerk session resolvable from the\n  request (cookie, dev override header, or query param).\n- 400 ``KEY_NOT_FOUND`` -- the bp_ key isn't in our DB.\n- 409 ``KEY_ALREADY_ATTACHED`` -- the key is already bound to a\n  DIFFERENT account. Re-attaching to the same account is a noop\n  and returns 200.","operationId":"attach_key_v1_keys_attach_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/keys/mine":{"get":{"tags":["keys"],"summary":"List Mine","description":"List api_keys attached to the authenticated account.\n\nResponse shape::\n\n    {\"keys\": [{\"id\":..., \"name\":..., \"key_prefix\":...,\n               \"rate_limit\":..., \"daily_cap\":..., \"scopes\":[...],\n               \"expires_at\":..., \"created_at\":..., \"status\":...}]}\n\nNever returns the raw ``api_key`` -- only the ``key_prefix`` (first\n~10 chars). Once a key is provisioned the raw value is gone for\ngood; rotation = revoke + create-new.","operationId":"list_mine_v1_keys_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/keys/named":{"post":{"tags":["keys"],"summary":"Create Named","description":"Create + immediately attach a fresh ``bp_`` key for the\nauthenticated account. Returns the same shape as ``POST /v1/keys``\nbut with the key already bound to the user's dashboard, so the\nrevealed ``api_key`` is the only chance to capture it.\n\nNo per-IP cap on this endpoint (the user is already authenticated)\n-- the cap is meant to deter anonymous abuse of ``POST /v1/keys``,\nnot signed-in users provisioning their own keys.","operationId":"create_named_v1_keys_named_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamedKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/keys/{key_id}/revoke":{"post":{"tags":["keys"],"summary":"Revoke Mine","description":"Revoke a key the authenticated user owns. Sets ``status =\n'revoked'`` so the auth middleware rejects future requests\npresenting the key. Idempotent -- calling on an already-revoked\nkey returns 200.\n\n404 ``KEY_NOT_FOUND`` when the id doesn't exist OR exists but is\nattached to a different account (we never confirm a key id\nbelongs to someone else, to prevent enumeration).","operationId":"revoke_mine_v1_keys__key_id__revoke_post","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/landing-chat/stream":{"post":{"tags":["landing-chat"],"summary":"Landing Chat Stream","operationId":"landing_chat_stream_v1_landing_chat_stream_post","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"user","title":"Source"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandingChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/lab/terminal/stream":{"post":{"tags":["lab-terminal"],"summary":"Lab Terminal Stream","operationId":"lab_terminal_stream_v1_lab_terminal_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabTerminalRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/whales/recent":{"get":{"tags":["whales-public"],"summary":"Whales Recent","description":"Public endpoint: recent whale transactions. No auth required.\n\nSupports optional ``since``/``until`` ISO 8601 time-window filtering\nand ``cursor`` for keyset pagination. When a window or cursor is\nprovided the discovery cache is bypassed (each page is unique).\nResponse includes ``next_cursor`` for the next page (null when the\nlast page is reached) and ``has_more``.","operationId":"whales_recent_v1_whales_recent_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain: ETH, BTC, ALL","default":"ETH","title":"Chain"},"description":"Chain: ETH, BTC, ALL"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Minimum USD value","default":100000,"title":"Min Usd"},"description":"Minimum USD value"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z","title":"Since"},"description":"ISO 8601 datetime, e.g. 2026-05-01T00:00:00Z"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z","title":"Until"},"description":"ISO 8601 datetime, e.g. 2026-05-02T00:00:00Z"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor from a previous response's next_cursor field","title":"Cursor"},"description":"Opaque cursor from a previous response's next_cursor field"}],"responses":{"200":{"description":"Recent whale-tier transfers for the requested chain. Each whale carries from/to addresses + entity labels, USD value, tier, and ISO timestamp. Supports since/until and opaque cursor pagination via next_cursor / has_more.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhalesRecentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/agents/summary":{"get":{"tags":["agents-public"],"summary":"Public Agent Summary","operationId":"public_agent_summary_v1_agents_summary_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/agents/list":{"get":{"tags":["agents-public"],"summary":"Public Agent List","operationId":"public_agent_list_v1_agents_list_get","parameters":[{"name":"window_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Window Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/agent-identity/{name}":{"get":{"tags":["agent-identity-public"],"summary":"Public Get Agent Identity","description":"Confirm a name was registered as a Bitpoort agent identity.\n\nPublic, no auth. Returns the canonical attestation body plus\nsignature. Counterparties can use this to verify an agent claim\nbefore granting it permissions / signing approvals.","operationId":"public_get_agent_identity_v1_agent_identity__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"Agent name as registered via register_agent_identity.","title":"Name"},"description":"Agent name as registered via register_agent_identity."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Public Get Agent Identity V1 Agent Identity  Name  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/entity/list":{"get":{"tags":["entity-public"],"summary":"Entity List","description":"List top entities by whale transaction volume.","operationId":"entity_list_v1_entity_list_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/entity/{name}":{"get":{"tags":["entity-public"],"summary":"Entity Profile","description":"Public entity profile with on-chain activity summary.","operationId":"entity_profile_v1_entity__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","description":"Entity name (e.g. Binance, Wintermute)","title":"Name"},"description":"Entity name (e.g. Binance, Wintermute)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/trust":{"get":{"tags":["trust"],"summary":"Public Trust","description":"Bitpoort transparency layer -- public, no auth.\n\nReturns the same accuracy baseline that lands in every signed\ncompliance report's attestation block, plus the running build's\nreproducibility anchors. Compliance officers, journalists, and\ndefense counsel can independently verify what we claim without\nneeding a paid relationship.","operationId":"public_trust_v1_trust_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/openapi-summary.json":{"get":{"tags":["discovery"],"summary":"Machine-readable summary of REST + MCP surface","operationId":"openapi_summary_openapi_summary_json_get","responses":{"200":{"description":"Compact JSON with REST endpoint count, MCP tool count, chains, eval baseline, sanctions/mixer counts, and canonical URLs to every discovery surface (OpenAPI spec, ReDoc, MCP manifest, llms.txt, agents.md, trust, health, attestation page).","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/verify/{content_hash}":{"get":{"tags":["verify-public"],"summary":"Verify Compliance Report","description":"Confirm a compliance report hash was issued by Bitpoort.\n\nReturns 404 if unknown. Returns the report's public metadata\n(generated_at, address, chain, sections, api_key_prefix, signature),\nthe embedded ``data_provenance`` snapshot (Phase 15c — sanctions_count\n+ mixer_count + entity_registry_count + their last-modified\ntimestamps), the full canonical_body, and a verification_package\nblock bundling everything needed for offline re-verification.","operationId":"verify_compliance_report_v1_verify__content_hash__get","parameters":[{"name":"content_hash","in":"path","required":true,"schema":{"type":"string","description":"SHA-256 content hash from a generate_compliance_report attestation.content_hash field","title":"Content Hash"},"description":"SHA-256 content hash from a generate_compliance_report attestation.content_hash field"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Verify Compliance Report V1 Verify  Content Hash  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/waitlist":{"post":{"tags":["waitlist"],"summary":"Join Waitlist","description":"Join the early access waitlist.","operationId":"join_waitlist_v1_waitlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/waitlist/count":{"get":{"tags":["waitlist"],"summary":"Waitlist Count","description":"Public endpoint: how many people on the waitlist.","operationId":"waitlist_count_v1_waitlist_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/balance":{"get":{"tags":["balance"],"summary":"Get Balance","description":"Get current credit balance and usage summary.","operationId":"get_balance_v1_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/balance/history":{"get":{"tags":["balance"],"summary":"Get Balance History","description":"Get credit transaction history.","operationId":"get_balance_history_v1_balance_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/reports":{"get":{"tags":["reports"],"summary":"List Reports","description":"List recent intelligence reports (summary only).","operationId":"list_reports_v1_reports_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/latest":{"get":{"tags":["reports"],"summary":"Latest Report","description":"Get the most recent intelligence report.","operationId":"latest_report_v1_reports_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/reports/{report_date}":{"get":{"tags":["reports"],"summary":"Get Report","description":"Get a specific report by date (YYYY-MM-DD).","operationId":"get_report_v1_reports__report_date__get","parameters":[{"name":"report_date","in":"path","required":true,"schema":{"type":"string","format":"date","title":"Report Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/reports/generate":{"post":{"tags":["reports"],"summary":"Trigger Report Generation","description":"Manually trigger daily report generation.","operationId":"trigger_report_generation_v1_reports_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Create a Stripe Checkout session for subscription upgrade.","operationId":"create_checkout_v1_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/billing/portal":{"get":{"tags":["billing"],"summary":"Customer Portal","description":"Create a Stripe Customer Portal session for self-service billing management.","operationId":"customer_portal_v1_billing_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/billing/checkout/account":{"post":{"tags":["billing"],"summary":"Create Checkout Account","description":"Create a Stripe Checkout session for the authenticated account.\nResult URL is the standard Stripe Checkout page; success/cancel\nbounce back to the dashboard with ``?billing=success|cancelled``.","operationId":"create_checkout_account_v1_billing_checkout_account_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/billing/portal/account":{"get":{"tags":["billing"],"summary":"Customer Portal Account","description":"Stripe Customer Portal session for the authenticated account\n(cancel / pause / change plan / update payment method).","operationId":"customer_portal_account_v1_billing_portal_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/billing/status/account":{"get":{"tags":["billing"],"summary":"Billing Status Account","description":"Plan + rate-limit summary for the authenticated account.","operationId":"billing_status_account_v1_billing_status_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/billing/status":{"get":{"tags":["billing"],"summary":"Billing Status","description":"Get current subscription status for the authenticated API key.","operationId":"billing_status_v1_billing_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/google":{"get":{"tags":["auth"],"summary":"Google Login","description":"Redirect to Google OAuth consent screen.","operationId":"google_login_v1_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/auth/google/callback":{"get":{"tags":["auth"],"summary":"Google Callback","description":"Handle Google OAuth callback.","operationId":"google_callback_v1_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Current User","description":"Get current user info from API key.","operationId":"get_current_user_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/intelligence/emerging":{"get":{"tags":["intelligence"],"summary":"Emerging Tokens Alias","description":"Top emerging tokens ranked by momentum score. Alias for\n``/v1/feed/emerging-tokens`` — exists at the intuitive path that the\nMCP/REST docs advertise.","operationId":"emerging_tokens_alias_v1_intelligence_emerging_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items to return (1-200, default 20).","default":20,"title":"Limit"},"description":"Max items to return (1-200, default 20)."},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05.","default":0.05,"title":"Min Score"},"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain filter. Accepted: ETH (default; full coverage), BTC, HL, MATIC. Underlying token_discoveries data is currently ETH-only -- other values are accepted for forward-compatibility and ignored.","default":"ETH","title":"Chain"},"description":"Chain filter. Accepted: ETH (default; full coverage), BTC, HL, MATIC. Underlying token_discoveries data is currently ETH-only -- other values are accepted for forward-compatibility and ignored."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 lower bound on scored_at. Combinable with until.","title":"Since"},"description":"Optional ISO 8601 lower bound on scored_at. Combinable with until."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 upper bound on scored_at. Combinable with since.","title":"Until"},"description":"Optional ISO 8601 upper bound on scored_at. Combinable with since."}],"responses":{"200":{"description":"Alias for /v1/feed/emerging-tokens; same shape and ranking.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmergingTokenItem"},"title":"Response 200 Emerging Tokens Alias V1 Intelligence Emerging Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/clusters/suspicious":{"get":{"tags":["intelligence"],"summary":"Get Suspicious Clusters","description":"Find clusters with suspicious behavioral patterns.\n\nCross-joins entity_clusters + intent_detections + whale_txs to find\nclusters where members show accumulation/distribution/wash-trading\nintents AND have recent exchange activity.","operationId":"get_suspicious_clusters_v1_intelligence_clusters_suspicious_get","parameters":[{"name":"min_nodes","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":2,"default":3,"title":"Min Nodes"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Suspicious Clusters V1 Intelligence Clusters Suspicious Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/clusters/{cluster_id}/analysis":{"get":{"tags":["intelligence"],"summary":"Get Cluster Analysis","description":"Full behavioral analysis for one cluster.\n\nReturns member count, intent breakdown (accumulation, distribution_prep,\nwash_trading), 24h exchange activity, and risk score.","operationId":"get_cluster_analysis_v1_intelligence_clusters__cluster_id__analysis_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"integer","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cluster Analysis V1 Intelligence Clusters  Cluster Id  Analysis Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/anomalies/wallets":{"get":{"tags":["intelligence"],"summary":"Get Anomalous Wallets","description":"Get wallets ranked by anomaly/risk score.\n\nAnomaly scores are computed daily by the Isolation Forest model\nand persisted to wallet_profiles.risk_score.","operationId":"get_anomalous_wallets_v1_intelligence_anomalies_wallets_get","parameters":[{"name":"min_risk","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":0,"default":50,"title":"Min Risk"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Anomalous Wallets V1 Intelligence Anomalies Wallets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/entity-links":{"get":{"tags":["intelligence"],"summary":"Get Entity Links","description":"Get cross-chain entity links discovered by bridge flow analysis.\n\nEach link represents two addresses on different chains that are\nlikely controlled by the same entity, based on timing correlation,\namount similarity, and address matching heuristics.","operationId":"get_entity_links_v1_intelligence_entity_links_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Entity Links V1 Intelligence Entity Links Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/bridge-feed":{"get":{"tags":["intelligence"],"summary":"Get Bridge Feed","description":"Live cross-chain bridge transfers from Wormhole.","operationId":"get_bridge_feed_v1_intelligence_bridge_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"min_usd","in":"query","required":false,"schema":{"type":"number","default":0,"title":"Min Usd"}},{"name":"source_chain","in":"query","required":false,"schema":{"type":"string","default":"","title":"Source Chain"}},{"name":"target_chain","in":"query","required":false,"schema":{"type":"string","default":"","title":"Target Chain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/cross-chain-signals":{"get":{"tags":["intelligence"],"summary":"Get Cross Chain Signals","description":"Get ETH on-chain ↔ Hyperliquid cross-chain correlation signals.","operationId":"get_cross_chain_signals_v1_intelligence_cross_chain_signals_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}},{"name":"min_confidence","in":"query","required":false,"schema":{"type":"integer","default":40,"title":"Min Confidence"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/feed":{"get":{"tags":["intelligence"],"summary":"Get Intelligence Feed","description":"Unified event feed merging 6 data sources into one chronological stream.","operationId":"get_intelligence_feed_v1_intelligence_feed_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"ETH","title":"Chain"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":48,"minimum":1,"default":6,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":120,"title":"Limit"}},{"name":"event_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated filter: whale_transfer,intent_detection,liquidation_risk,profitable_trade,mev_extraction,signal","title":"Event Types"},"description":"Comma-separated filter: whale_transfer,intent_detection,liquidation_risk,profitable_trade,mev_extraction,signal"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Intelligence Feed V1 Intelligence Feed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/signals":{"get":{"tags":["intelligence"],"summary":"Get Intelligence Signals","description":"Get recent market intelligence signals.\n\nReturns actionable signals generated from on-chain data:\nsmart_money, exchange_flow, token_momentum, risk_warning.","operationId":"get_intelligence_signals_v1_intelligence_signals_get","parameters":[{"name":"chain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"}},{"name":"signal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal Type"}},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Intelligence Signals V1 Intelligence Signals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/intelligence/feedback/latest":{"get":{"tags":["intelligence"],"summary":"Get Latest Feedback Report","description":"Get the latest feedback loop analysis report.\n\nReturns detection metrics (precision, FP rate per detection type),\nthreshold recommendations, and label correction counts.\nComputed weekly by the feedback_analysis scheduler job.","operationId":"get_latest_feedback_report_v1_intelligence_feedback_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Latest Feedback Report V1 Intelligence Feedback Latest Get"}}}}}}},"/v1/tokens/emerging":{"get":{"tags":["tokens"],"summary":"Emerging Tokens","description":"Top emerging tokens ranked by momentum score (swap activity, trader\ngrowth, smart-money interest). Underlying ``token_discoveries`` data is\nETH-only today; the ``chain`` param is accepted for symmetry with the\nrest of the API and ignored otherwise.\n\nAuthentication: protected. Requires ``X-API-Key`` (or ``Authorization:\nBearer``). The aliases ``/v1/feed/emerging-tokens`` and\n``/v1/intelligence/emerging`` are public for backwards compatibility\nwith public-facing dashboards.","operationId":"emerging_tokens_v1_tokens_emerging_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items to return (1-200, default 20).","default":20,"title":"Limit"},"description":"Max items to return (1-200, default 20)."},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","minimum":0,"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05.","default":0.05,"title":"Min Score"},"description":"Drop items with momentum score below this floor (0.0-1.0). Default 0.05."},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain filter. Accepted: ETH (default; full coverage), BTC, HL, MATIC. Underlying token_discoveries data is currently ETH-only -- other values are accepted for forward-compatibility and ignored.","default":"ETH","title":"Chain"},"description":"Chain filter. Accepted: ETH (default; full coverage), BTC, HL, MATIC. Underlying token_discoveries data is currently ETH-only -- other values are accepted for forward-compatibility and ignored."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 lower bound on scored_at, e.g. 2026-05-01T00:00:00Z. Combinable with until.","title":"Since"},"description":"Optional ISO 8601 lower bound on scored_at, e.g. 2026-05-01T00:00:00Z. Combinable with until."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional ISO 8601 upper bound on scored_at, e.g. 2026-05-02T00:00:00Z. Combinable with since.","title":"Until"},"description":"Optional ISO 8601 upper bound on scored_at, e.g. 2026-05-02T00:00:00Z. Combinable with since."}],"responses":{"200":{"description":"List of emerging tokens ranked by momentum score. Each item carries swap activity, holder growth, smart-money interest, and a scored_at timestamp. Currently ETH-only; the chain param is accepted for symmetry.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmergingTokenItem"},"title":"Response 200 Emerging Tokens V1 Tokens Emerging Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tokens/{address}/risk":{"get":{"tags":["tokens"],"summary":"Token Risk","description":"Task-level forensic check for a single address (token contract or\nwallet). Combines composite risk scoring + sanctions screening into one\nresponse so an agent can ask one question and get a yes/no/maybe with\nreasoning.\n\nReturns:\n  ``risk_score`` (0-100), ``risk_band`` (LOW/MEDIUM/HIGH/CRITICAL),\n  ``recommendation`` (PROCEED/STANDARD_DUE_DILIGENCE/\n  ENHANCED_DUE_DILIGENCE/BLOCK_AND_ESCALATE), ``headline`` (1-line\n  summary), ``why_it_matters`` (per-component reasoning),\n  ``evidence`` (sanctions matches + mixer hits + counterparties),\n  ``confidence`` (assessor confidence). Lighter than\n  ``/v1/forensic/report`` -- no signing, no persistence, sub-second.","operationId":"token_risk_v1_tokens__address__risk_get","parameters":[{"name":"address","in":"path","required":true,"schema":{"type":"string","title":"Address"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","description":"Chain (ETH, BTC, TRON, SOL); default ETH","default":"ETH","title":"Chain"},"description":"Chain (ETH, BTC, TRON, SOL); default ETH"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alpha/current":{"get":{"tags":["alpha"],"summary":"Alpha Current","description":"Latest ensemble predictions per symbol (all horizons).","operationId":"alpha_current_v1_alpha_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Alpha Current V1 Alpha Current Get"}}}}}}},"/v1/alpha/scorecard":{"get":{"tags":["alpha"],"summary":"Alpha Scorecard","description":"Model performance metrics per horizon.","operationId":"alpha_scorecard_v1_alpha_scorecard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alpha Scorecard V1 Alpha Scorecard Get"}}}}}}},"/v1/alpha/features":{"get":{"tags":["alpha"],"summary":"Alpha Features","description":"Top feature importances from LightGBM model.","operationId":"alpha_features_v1_alpha_features_get","parameters":[{"name":"horizon","in":"query","required":false,"schema":{"type":"string","description":"Horizon: 5m, 10m, or 15m","default":"5m","title":"Horizon"},"description":"Horizon: 5m, 10m, or 15m"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Alpha Features V1 Alpha Features Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alpha/predictions":{"get":{"tags":["alpha"],"summary":"Alpha Predictions","description":"Recent prediction history.","operationId":"alpha_predictions_v1_alpha_predictions_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"horizon","in":"query","required":false,"schema":{"type":"string","description":"Horizon filter","default":"5m","title":"Horizon"},"description":"Horizon filter"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Alpha Predictions V1 Alpha Predictions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alpha/conviction":{"get":{"tags":["alpha"],"summary":"Alpha Conviction","description":"Cross-signal conviction scores.","operationId":"alpha_conviction_v1_alpha_conviction_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Alpha Conviction V1 Alpha Conviction Get"}}}}}}},"/v1/alpha/hitrate":{"get":{"tags":["alpha"],"summary":"Alpha Hitrate","description":"Hit rate per symbol for a given horizon + time window.","operationId":"alpha_hitrate_v1_alpha_hitrate_get","parameters":[{"name":"horizon","in":"query","required":false,"schema":{"type":"string","description":"Horizon: 5m, 10m, or 15m","default":"5m","title":"Horizon"},"description":"Horizon: 5m, 10m, or 15m"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alpha Hitrate V1 Alpha Hitrate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alpha/calibration":{"get":{"tags":["alpha"],"summary":"Alpha Calibration","description":"Calibration bins: predicted prob vs actual hit rate.","operationId":"alpha_calibration_v1_alpha_calibration_get","parameters":[{"name":"horizon","in":"query","required":false,"schema":{"type":"string","description":"Horizon: 5m, 10m, or 15m","default":"5m","title":"Horizon"},"description":"Horizon: 5m, 10m, or 15m"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alpha Calibration V1 Alpha Calibration Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/newswire/recent":{"get":{"tags":["newswire"],"summary":"Newswire Recent","description":"Get recent news items from the legacy feed database.","operationId":"newswire_recent_v1_newswire_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"source_type","in":"query","required":false,"schema":{"type":"string","description":"'news' for RSS only, 'all' for everything","default":"news","title":"Source Type"},"description":"'news' for RSS only, 'all' for everything"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Newswire Recent V1 Newswire Recent Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/newswire/sources":{"get":{"tags":["newswire"],"summary":"Newswire Sources","description":"Get article counts per source.","operationId":"newswire_sources_v1_newswire_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Newswire Sources V1 Newswire Sources Get"}}}}}}},"/v1/monitor/funding":{"get":{"tags":["monitor"],"summary":"Get Funding Data","description":"Get funding rate, open interest, long/short ratio, and recent liquidations from Binance Futures.","operationId":"get_funding_data_v1_monitor_funding_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string","description":"Base symbol","default":"BTC","title":"Symbol"},"description":"Base symbol"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Funding Data V1 Monitor Funding Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/monitor/brief":{"get":{"tags":["monitor"],"summary":"Get Market Brief","description":"Generate a concise AI market brief combining price action, sentiment, and on-chain signals.","operationId":"get_market_brief_v1_monitor_brief_get","parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string","description":"Symbol for brief","default":"BTC","title":"Symbol"},"description":"Symbol for brief"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Market Brief V1 Monitor Brief Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/explorer/query":{"post":{"tags":["explorer"],"summary":"Explorer Query","description":"Answer a natural language question about Ethereum using AI + Erigon RPC.","operationId":"explorer_query_v1_explorer_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/explorer/query/stream":{"post":{"tags":["explorer"],"summary":"Explorer Query Stream","description":"Streaming version of explorer_query — sends SSE events to avoid Cloudflare timeout.","operationId":"explorer_query_stream_v1_explorer_query_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplorerQuery"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alarm/categories":{"get":{"tags":["alarm"],"summary":"Alarm Categories","description":"List all available alarm categories with their schemas.","operationId":"alarm_categories_v1_alarm_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alarm Categories V1 Alarm Categories Get"}}}}}}},"/v1/alarm/config":{"get":{"tags":["alarm"],"summary":"Get Alarm Config","description":"Get alarm configuration for the authenticated user.","operationId":"get_alarm_config_v1_alarm_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Alarm Config V1 Alarm Config Get"}}}}}},"put":{"tags":["alarm"],"summary":"Update Alarm Config","description":"Update alarm configuration.\n\nBody: {\"config\": [{\"alarm_type\": \"whale_transfer\", \"enabled\": true, \"thresholds\": {\"min_usd\": 5000000}, ...}, ...]}","operationId":"update_alarm_config_v1_alarm_config_put","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Update Alarm Config V1 Alarm Config Put"}}}}}}},"/v1/alarm/feed":{"get":{"tags":["alarm"],"summary":"Alarm Feed","description":"Get alarm feed -- triggered events matching user config.\n\nAggregates whale_txs, intent_detections, exchange flows, HL events,\nand system alerts into a unified chronological feed.","operationId":"alarm_feed_v1_alarm_feed_get","parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"default":24,"title":"Hours"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Severity"}},{"name":"chain","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Chain"}},{"name":"alarm_type","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Alarm Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alarm Feed V1 Alarm Feed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/alarm/public":{"get":{"tags":["alarm"],"summary":"Alarm Feed Public","description":"Public alarm feed for landing page. No auth required.\nReturns curated on-chain events only -- no system/infra data.","operationId":"alarm_feed_public_v1_alarm_public_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":8,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Alarm Feed Public V1 Alarm Public Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/meta":{"get":{"tags":["meta"],"summary":"Meta Tags","operationId":"meta_tags_v1_meta_get","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","description":"Page path","default":"/","title":"Path"},"description":"Page path"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Admin Stats","description":"Aggregate dashboard statistics.","operationId":"admin_stats_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/users":{"get":{"tags":["admin"],"summary":"Admin List Users","description":"List all API keys with usage stats.","operationId":"admin_list_users_v1_admin_users_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"created_at","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","default":"desc","title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{key_id}":{"get":{"tags":["admin"],"summary":"Admin User Detail","description":"Single user detail with credit ledger and recent queries.","operationId":"admin_user_detail_v1_admin_users__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Admin Update User","description":"Update user fields. For balance changes, creates ledger entry.","operationId":"admin_update_user_v1_admin_users__key_id__patch","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/chainrag__api__v1__admin__UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Admin Revoke User","description":"Revoke an API key (soft delete — sets status to revoked).","operationId":"admin_revoke_user_v1_admin_users__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/query-log":{"get":{"tags":["admin"],"summary":"Admin Query Log","description":"Recent query log entries.","operationId":"admin_query_log_v1_admin_query_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/mcp-log":{"get":{"tags":["admin"],"summary":"Admin Mcp Log","description":"Recent MCP endpoint calls from audit_log.","operationId":"admin_mcp_log_v1_admin_mcp_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/agent-traffic":{"get":{"tags":["admin"],"summary":"Admin Agent Traffic","description":"Aggregated agent-traffic dashboard data.\n\n``since`` accepts ``24h``, ``7d``, or ``30d``. Returns top agents,\nhourly/daily time series, per-category counts, and recent events.\nSource: ``agent_traffic_events`` populated by the auth middleware\nwhen a request UA matches a known agent / bot fingerprint.","operationId":"admin_agent_traffic_v1_admin_agent_traffic_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d)$","default":"24h","title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/mcp-usage":{"get":{"tags":["admin"],"summary":"Admin Mcp Usage","description":"Aggregated MCP tool-call activity.\n\nReturns counts, top tools (with error/latency stats), top users\n(api_key + their top tools + last_seen), hourly/daily time series,\nand a recent feed. Source: ``mcp_tool_calls`` populated per\n``tools/call`` request inside the MCP dispatcher.\n\nInternal team accounts are excluded by default. Set\n``include_internal=true`` to see total volume including dogfooding.","operationId":"admin_mcp_usage_v1_admin_mcp_usage_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","pattern":"^(24h|7d|30d)$","default":"24h","title":"Since"}},{"name":"include_internal","in":"query","required":false,"schema":{"type":"boolean","description":"If true, include calls from api_keys flagged is_internal=true.","default":false,"title":"Include Internal"},"description":"If true, include calls from api_keys flagged is_internal=true."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/mcp-cohort":{"get":{"tags":["admin"],"summary":"Admin Mcp Cohort","description":"Cohort + retention math derived from mcp_usage_daily.\n\nSource is ``mcp_usage_daily`` (never pruned), so this works on\nlong horizons even after the raw call audit has rotated out.","operationId":"admin_mcp_cohort_v1_admin_mcp_cohort_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","pattern":"^(7d|30d|90d|1y)$","default":"30d","title":"Since"}},{"name":"include_internal","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Internal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/users/{key_id}/internal":{"patch":{"tags":["admin"],"summary":"Admin Set Internal Flag","description":"Toggle ``is_internal`` for an api_key. Internal keys are excluded\nfrom MCP usage / cohort dashboards by default.","operationId":"admin_set_internal_flag_v1_admin_users__key_id__internal_patch","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_InternalFlagBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/jobs":{"get":{"tags":["admin"],"summary":"Admin List Jobs","description":"List every job registered with the APScheduler instance.\n\nSurfaces ``id``, ``name``, ``trigger`` repr, and ``next_run_time`` so\nops can pick a target for POST /admin/run-job/{job_id}.","operationId":"admin_list_jobs_v1_admin_jobs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/run-job/{job_id}":{"post":{"tags":["admin"],"summary":"Admin Run Job","description":"Trigger ``job_id`` immediately.\n\n- ``wait=true`` (default): direct-await the job's underlying coroutine,\n  capture chainrag log records during the run, and return\n  ``{status, job_id, elapsed_s, log_tail}``.\n- ``wait=false``: APScheduler reschedule-to-now (queued behaviour),\n  returns ``{status: \"queued\", job_id}``.","operationId":"admin_run_job_v1_admin_run_job__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunJobBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/council/overview":{"get":{"tags":["council"],"summary":"Get Overview","description":"Top-level operator dashboard. Single round-trip for the home view.","operationId":"get_overview_v1_council_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouncilOverview"}}}}}}},"/v1/council/gate":{"get":{"tags":["council"],"summary":"Get Gate","description":"Release-gate state. Called by CI before deploy.","operationId":"get_gate_v1_council_gate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GateState"}}}}}}},"/v1/council/tools":{"get":{"tags":["council"],"summary":"Get Tools","description":"All non-retired tools with scores + steward state.","operationId":"get_tools_v1_council_tools_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ToolListItem"},"type":"array","title":"Response Get Tools V1 Council Tools Get"}}}}}}},"/v1/council/tools/{name}":{"get":{"tags":["council"],"summary":"Get Tool Detail","description":"Full detail for one tool: scores, recent runs, findings, proposals.","operationId":"get_tool_detail_v1_council_tools__name__get","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/council/agents":{"get":{"tags":["council"],"summary":"Get Agents","description":"All council agents -- stewards, captains, conductor.","operationId":"get_agents_v1_council_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AgentListItem"},"type":"array","title":"Response Get Agents V1 Council Agents Get"}}}}}}},"/v1/council/proposals":{"get":{"tags":["council"],"summary":"Get Proposals","description":"Filtered proposal queue. Phase 0: read-only -- approve/reject in Phase 2.","operationId":"get_proposals_v1_council_proposals_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProposalItem"},"title":"Response Get Proposals V1 Council Proposals Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forensic/screen":{"post":{"tags":["forensic"],"summary":"Screen","description":"OFAC sanctions screen — returns sanctions_status MATCH or CLEAR with\nprogram-level entity attribution.","operationId":"screen_v1_forensic_screen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Screen V1 Forensic Screen Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forensic/mixer":{"post":{"tags":["forensic"],"summary":"Mixer","description":"Mixer interaction detection — Tornado Cash, Railgun, etc. Last 30 days\nby default.","operationId":"mixer_v1_forensic_mixer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MixerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Mixer V1 Forensic Mixer Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/forensic/risk":{"post":{"tags":["forensic"],"summary":"Risk","description":"Composite 0-100 risk score — 6 components, hard overrides for direct\nsanctions/mixer hits, 4 risk bands.","operationId":"risk_v1_forensic_risk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Risk V1 Forensic Risk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize":{"get":{"tags":["oauth"],"summary":"Authorize Get","description":"Render the consent screen. Validates protocol parameters first;\nreturns a 4xx JSON error with a stable code if anything is wrong\n(cannot redirect back to a malformed redirect_uri -- spec\nrequirement). On valid input + signed-in user, returns the HTML\nconsent form.","operationId":"authorize_get_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","title":"Response Type"}},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","title":"Redirect Uri"}},{"name":"code_challenge","in":"query","required":true,"schema":{"type":"string","title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"type":"string","default":"S256","title":"Code Challenge Method"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"","title":"Scope"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]},"post":{"tags":["oauth"],"summary":"Authorize Post","description":"Consume the consent form. On approve, issue a one-time auth\ncode (10 min TTL) and 302 to the client's redirect_uri with\n``?code=<raw>&state=<state>``. On deny, 302 with\n``?error=access_denied&state=<state>``.","operationId":"authorize_post_oauth_authorize_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_post_oauth_authorize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/token":{"post":{"tags":["oauth"],"summary":"Token","description":"Token endpoint. Both grant types share the validate-client step\n(via Basic auth header OR client_id/client_secret form fields).\nPublic clients (PKCE-only) skip the secret check.","operationId":"token_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/revoke":{"post":{"tags":["oauth"],"summary":"Revoke","description":"RFC 7009 revoke. Always returns 200 (per RFC) even when the\ntoken isn't found, to avoid leaking validity info.","operationId":"revoke_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/oauth/userinfo":{"get":{"tags":["oauth"],"summary":"Userinfo","description":"Returns a minimal OIDC-style userinfo for the bearer-presented\naccess token. Subject is the internal accounts.id; email and\ndisplay_name are surfaced when the token has the corresponding\nscope (``email`` / ``profile:read``).","operationId":"userinfo_oauth_userinfo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/oauth/register":{"post":{"tags":["oauth"],"summary":"Register","description":"RFC 7591 Dynamic Client Registration. Returns the new client's\nmetadata + credentials. ``client_secret`` is only returned ONCE\n(stored as SHA-256 hash from there on).\n\nMinimum request body::\n\n    {\"redirect_uris\": [\"https://app.example.com/oauth/callback\"]}\n\nFull shape mirroring RFC 7591::\n\n    {\n      \"client_name\": \"Example App\",\n      \"redirect_uris\": [\"https://app.example.com/oauth/callback\"],\n      \"grant_types\": [\"authorization_code\", \"refresh_token\"],\n      \"response_types\": [\"code\"],\n      \"scope\": \"mcp:read api:read\",\n      \"token_endpoint_auth_method\": \"client_secret_basic\"\n                                      | \"client_secret_post\"\n                                      | \"none\",\n      \"client_uri\": \"https://app.example.com\",\n      \"logo_uri\":   \"https://app.example.com/logo.png\",\n      \"tos_uri\":    \"https://app.example.com/terms\",\n      \"policy_uri\": \"https://app.example.com/privacy\",\n      \"contacts\":   [\"dev@app.example.com\"]\n    }","operationId":"register_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/oauth/introspect":{"post":{"tags":["oauth"],"summary":"Introspect","description":"RFC 7662 token introspection. Always returns 200 to avoid\nleaking info about which tokens exist; a caller that's\nunauthorised gets {\"active\": false}.\n\nThe ``token_type_hint`` is advisory -- we look up access tokens\nfirst by default, refresh tokens if the access lookup misses or\nif the hint says ``refresh_token``.","operationId":"introspect_oauth_introspect_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_introspect_oauth_introspect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/oauth/grants/mine":{"get":{"tags":["oauth-grants"],"summary":"List Grants Mine","description":"Aggregate grants by client_id, joining oauth_clients for the\ndisplay name. Counts and ``last_used_at`` come from the union of\naccess + refresh tokens; ``first_authorized_at`` from the\nearliest token's ``created_at``.\n\nFilters out:\n  * tokens with ``revoked_at IS NOT NULL``\n  * access tokens past their ``expires_at`` (refresh tokens\n    with future ``expires_at`` keep the grant alive even if\n    access is stale)\n  * clients with ``revoked_at`` set on ``oauth_clients`` (the\n    whole client was disabled at the platform level)\n\nResponse shape::\n\n    {\n      \"grants\": [\n        {\n          \"client_id\": \"...\",\n          \"client_name\": \"...\",\n          \"scopes\": [\"mcp:read\", ...],\n          \"active_access_tokens\": <int>,\n          \"active_refresh_tokens\": <int>,\n          \"last_used_at\": \"<ISO|null>\",\n          \"first_authorized_at\": \"<ISO>\"\n        },\n        ...\n      ]\n    }","operationId":"list_grants_mine_v1_oauth_grants_mine_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/oauth/grants/{client_id}/revoke":{"post":{"tags":["oauth-grants"],"summary":"Revoke Grant","description":"Revoke every access + refresh token issued to ``client_id`` for\nthe authenticated account. Returns 200 with the count of tokens\nflipped (``access_revoked`` + ``refresh_revoked``).\n\n404 ``GRANT_NOT_FOUND`` when no active grant exists for that\n(account, client). Idempotent calls hit this branch -- the second\nRevoke click on a row that's already gone returns 404, which the\nUI handles by just refreshing the list.","operationId":"revoke_grant_v1_oauth_grants__client_id__revoke_post","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/audit/mine":{"get":{"tags":["audit"],"summary":"List My Audit","description":"Return the most recent audit events for the authenticated\nClerk account. Filters by ``account_id`` so cross-account leakage\nis impossible by construction.\n\n``since``: ISO-8601 datetime; rejects malformed input with 400\nINVALID_DATETIME (matches the rest of the API contract).\n\n``event_type``: prefix match against the ``event_type`` column,\nso ``event_type=oauth.`` returns every OAuth-namespaced event.","operationId":"list_my_audit_v1_audit_mine_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 timestamp -- only events at or after this time","title":"Since"},"description":"ISO 8601 timestamp -- only events at or after this time"},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Prefix filter, e.g. 'oauth.' or 'key.named.'","title":"Event Type"},"description":"Prefix filter, e.g. 'oauth.' or 'key.named.'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/.well-known/oauth-authorization-server":{"get":{"tags":["discovery"],"summary":"Oauth Authorization Server","description":"RFC 8414 OAuth 2.0 Authorization Server Metadata.","operationId":"oauth_authorization_server__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/openid-configuration":{"get":{"tags":["discovery"],"summary":"Openid Configuration","description":"Minimal OIDC discovery alias.\n\nWe don't issue ``id_token`` JWTs at MVP -- the userinfo endpoint\nis enough for the OIDC clients we currently support (Anthropic\ndirectory, Open WebUI). When/if we add JWT id_tokens, this\npayload will pick up ``id_token_signing_alg_values_supported``\nand ``jwks_uri``.","operationId":"openid_configuration__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/oauth-protected-resource":{"get":{"tags":["discovery"],"summary":"Oauth Protected Resource","description":"RFC 9728 OAuth 2.0 Protected Resource Metadata.\n\nServed on the MCP subdomain so OAuth-aware clients can discover\nthat the authorization server lives at ``api.bitpoort.com``. Free\nno-signup clients using the X-API-Key lane ignore this entirely.","operationId":"oauth_protected_resource__well_known_oauth_protected_resource_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/mcp/tools":{"post":{"tags":["mcp"],"summary":"List Tools","description":"Return the catalogue of available MCP tools with their schemas.","operationId":"list_tools_mcp_tools_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolListResponse"}}}}}}},"/mcp/call":{"post":{"tags":["mcp"],"summary":"Call Tool","description":"Invoke a tool by name and return its result.","operationId":"call_tool_mcp_call_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/sse":{"get":{"tags":["mcp-sse"],"summary":"Sse Connect","description":"SSE endpoint — establishes a persistent connection.","operationId":"sse_connect_mcp_sse_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/messages":{"post":{"tags":["mcp-sse"],"summary":"Handle Message","description":"Handle JSON-RPC messages from the MCP client.","operationId":"handle_message_mcp_messages_post","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp/":{"post":{"tags":["mcp-sse"],"summary":"Streamable Http","description":"Streamable HTTP endpoint — stateless JSON-RPC over POST.\n\nCompatible with Smithery, Claude Desktop, Cursor, and any MCP client\nthat supports the streamable-http transport.","operationId":"streamable_http_mcp__post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/mcp/fixtures.json":{"get":{"tags":["discovery"],"summary":"Known-safe identifiers for testing MCP tools end-to-end","operationId":"mcp_fixtures_json_mcp_fixtures_json_get","responses":{"200":{"description":"Same payload as /.well-known/mcp-fixtures.json on the marketing domain, served from the api domain so agents have a single authoritative URL behind the same auth surface as /mcp/tools.json. Public, no auth, 5-min cache.","content":{"application/json":{"schema":{}}}},"500":{"description":"fixtures file missing from build"}},"security":[]}},"/mcp/tools.json":{"get":{"tags":["discovery"],"summary":"Public mirror of the MCP tool registry","operationId":"mcp_tools_json_mcp_tools_json_get","responses":{"200":{"description":"Same payload an MCP client would receive from tools/list, served as plain HTTP JSON for agent indexes / onboarding wizards / curl. Includes the Phase 2A safety metadata (_meta.is_mutation, supports_dry_run, supports_sandbox, etc) and the Phase 4B per-tool examples when present.","content":{"application/json":{"schema":{}}}}},"security":[]}}},"components":{"schemas":{"AccountCheckoutRequest":{"properties":{"tier":{"type":"string","pattern":"^pro$","title":"Tier"}},"type":"object","required":["tier"],"title":"AccountCheckoutRequest"},"AddressLabelsResponse":{"properties":{"labels":{"additionalProperties":{"type":"string"},"type":"object","title":"Labels"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["labels","count"],"title":"AddressLabelsResponse"},"AgentListItem":{"properties":{"id":{"type":"integer","title":"Id"},"role":{"type":"string","title":"Role"},"display_name":{"type":"string","title":"Display Name"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"state":{"type":"string","title":"State"},"state_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Reason"},"prompt_rev":{"type":"integer","title":"Prompt Rev"},"anthropic_model":{"type":"string","title":"Anthropic Model"},"monthly_token_cap_cents":{"type":"integer","title":"Monthly Token Cap Cents"},"cost_this_month_cents":{"type":"integer","title":"Cost This Month Cents"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"next_wake_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Wake At"},"pending_enable":{"type":"boolean","title":"Pending Enable","default":false}},"type":"object","required":["id","role","display_name","state","prompt_rev","anthropic_model","monthly_token_cap_cents","cost_this_month_cents"],"title":"AgentListItem","description":"One row in ``GET /v1/council/agents``."},"ApiKeyCreate":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"},"rate_limit":{"type":"integer","maximum":100000.0,"minimum":1.0,"title":"Rate Limit","default":100},"role":{"type":"string","pattern":"^(analyst|read_only|agent|builder|pro)$","title":"Role","default":"analyst"},"ttl_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Ttl Days","description":"Key expiration in days (default 90)","default":90}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"AttachKeyRequest":{"properties":{"api_key":{"type":"string","title":"Api Key","description":"The bp_ API key to bind."},"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name","description":"Optional friendly name for the dashboard. Defaults to the existing api_keys.name."}},"type":"object","required":["api_key"],"title":"AttachKeyRequest"},"BackfillRequest":{"properties":{"chain":{"type":"string","title":"Chain","default":"ETH"},"block_numbers":{"items":{"type":"integer"},"type":"array","title":"Block Numbers"},"batch_size":{"type":"integer","title":"Batch Size","default":25},"sleep_ms":{"type":"integer","title":"Sleep Ms","default":300}},"type":"object","required":["block_numbers"],"title":"BackfillRequest"},"BlockDetailResponse":{"properties":{"chain":{"type":"string","title":"Chain"},"block_number":{"type":"integer","title":"Block Number"},"block_hash":{"type":"string","title":"Block Hash"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"tx_count":{"type":"integer","title":"Tx Count"},"gas_used":{"type":"integer","title":"Gas Used"},"gas_limit":{"type":"integer","title":"Gas Limit"},"gas_pct":{"type":"number","title":"Gas Pct"},"base_fee":{"type":"integer","title":"Base Fee"},"miner":{"type":"string","title":"Miner"},"events":{"items":{"$ref":"#/components/schemas/FeedEvent"},"type":"array","title":"Events"},"whale_txs":{"items":{"$ref":"#/components/schemas/WhaleTxDetail"},"type":"array","title":"Whale Txs"}},"type":"object","required":["chain","block_number","block_hash","timestamp","tx_count","gas_used","gas_limit","gas_pct","base_fee","miner","events","whale_txs"],"title":"BlockDetailResponse"},"BlockIntelligence":{"properties":{"total_actions":{"type":"integer","title":"Total Actions","default":0},"total_usd_volume":{"type":"number","title":"Total Usd Volume","default":0.0},"pricing_coverage_ratio":{"type":"number","title":"Pricing Coverage Ratio","default":1.0},"top_action_types":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Action Types"},"top_protocols":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Protocols"},"top_tokens":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Tokens"},"swap_token_stats":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Swap Token Stats"},"top_actors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Top Actors"},"anomaly_flags":{"additionalProperties":true,"type":"object","title":"Anomaly Flags"},"narrative":{"type":"string","title":"Narrative","default":""},"confidence":{"type":"number","title":"Confidence","default":0.5},"confidence_components":{"additionalProperties":true,"type":"object","title":"Confidence Components"},"denominators":{"additionalProperties":true,"type":"object","title":"Denominators"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"}},"type":"object","title":"BlockIntelligence","description":"Deterministic block-level analytics from BehaviorAnalyzer."},"BlockItem":{"properties":{"chain":{"type":"string","title":"Chain"},"number":{"type":"integer","title":"Number"},"hash":{"type":"string","title":"Hash"},"txCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Txcount"},"gasUsed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gasused"},"gasLimit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gaslimit"},"baseFee":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Basefee"},"headBlock":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Headblock"},"lag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag"},"blockTime":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Blocktime"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"additionalProperties":true,"type":"object","required":["chain","number","hash"],"title":"BlockItem"},"BlockLatestResponse":{"properties":{"chain":{"type":"string","title":"Chain"},"block":{"anyOf":[{"$ref":"#/components/schemas/BlockItem"},{"type":"null"}]},"head_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Block"}},"additionalProperties":true,"type":"object","required":["chain"],"title":"BlockLatestResponse"},"BlocksRecentResponse":{"properties":{"chain":{"type":"string","title":"Chain"},"blocks":{"items":{"$ref":"#/components/schemas/BlockItem"},"type":"array","title":"Blocks"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"head_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Head Block"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has More"}},"additionalProperties":true,"type":"object","required":["chain","blocks"],"title":"BlocksRecentResponse"},"Body_authorize_post_oauth_authorize_post":{"properties":{"response_type":{"type":"string","title":"Response Type"},"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method","default":"S256"},"scope":{"type":"string","title":"Scope","default":""},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["response_type","client_id","redirect_uri","code_challenge","decision"],"title":"Body_authorize_post_oauth_authorize_post"},"Body_introspect_oauth_introspect_post":{"properties":{"token":{"type":"string","title":"Token"},"token_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type Hint"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["token"],"title":"Body_introspect_oauth_introspect_post"},"Body_revoke_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"},"token_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type Hint"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["token"],"title":"Body_revoke_oauth_revoke_post"},"Body_token_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"}},"type":"object","required":["grant_type"],"title":"Body_token_oauth_token_post"},"BtcFeedEvent":{"properties":{"txid":{"type":"string","title":"Txid"},"block_number":{"type":"integer","title":"Block Number"},"block_timestamp":{"type":"string","title":"Block Timestamp"},"flow_type":{"type":"string","title":"Flow Type"},"net_btc":{"type":"number","title":"Net Btc"},"net_usd":{"type":"number","title":"Net Usd"},"from_entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Entity"},"from_entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Entity Type"},"to_entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Entity"},"to_entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Entity Type"},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent"},"market_signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Signal"},"signal_strength":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Signal Strength"},"is_coinbase":{"type":"boolean","title":"Is Coinbase","default":false},"input_count":{"type":"integer","title":"Input Count","default":0},"output_count":{"type":"integer","title":"Output Count","default":0},"from_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Address"},"to_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Address"}},"type":"object","required":["txid","block_number","block_timestamp","flow_type","net_btc","net_usd"],"title":"BtcFeedEvent","description":"A single Bitcoin on-chain event for the feed."},"ChatMessage":{"properties":{"role":{"type":"string","pattern":"^(user|assistant)$","title":"Role","description":"'user' or 'assistant'"},"content":{"type":"string","title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message","description":"The user's question"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain","description":"Filter context to a specific chain (e.g. 'ETH')"},"history":{"items":{"$ref":"#/components/schemas/ChatMessage"},"type":"array","title":"History","description":"Previous conversation turns for multi-turn context"},"max_chunks":{"type":"integer","maximum":12.0,"minimum":1.0,"title":"Max Chunks","description":"Max RAG chunks to retrieve","default":8},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"Force a provider: 'anthropic' or 'deepseek'. None = auto-detect."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Per-request model override (e.g. 'claude-sonnet-4-20250514', 'gpt-4o'). If set, takes priority over server config."},"llm_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Api Key","description":"Per-request LLM API key override — bring-your-own-key for hybrid RPC synthesis."}},"type":"object","required":["message"],"title":"ChatRequest"},"ChatResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"model":{"type":"string","title":"Model"},"provider":{"type":"string","title":"Provider"},"chunks_used":{"type":"integer","title":"Chunks Used"},"tools_used":{"items":{"type":"string"},"type":"array","title":"Tools Used"},"evidence":{"items":{"$ref":"#/components/schemas/EvidenceItem"},"type":"array","title":"Evidence"},"citations":{"additionalProperties":{"items":{"type":"integer"},"type":"array"},"type":"object","title":"Citations"},"confidence":{"type":"string","title":"Confidence","default":"medium"},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id"},"grounding":{"$ref":"#/components/schemas/GroundingMeta"},"suggestions":{"items":{"type":"string"},"type":"array","title":"Suggestions","description":"Suggested follow-up questions based on the response context"},"rag_time_ms":{"type":"number","title":"Rag Time Ms"},"llm_time_ms":{"type":"number","title":"Llm Time Ms"},"total_time_ms":{"type":"number","title":"Total Time Ms"},"credits_remaining":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Remaining"},"low_balance_warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Low Balance Warning"}},"type":"object","required":["answer","model","provider","chunks_used","rag_time_ms","llm_time_ms","total_time_ms"],"title":"ChatResponse"},"CheckoutRequest":{"properties":{"tier":{"type":"string","pattern":"^pro$","title":"Tier"}},"type":"object","required":["tier"],"title":"CheckoutRequest"},"CouncilOverview":{"properties":{"gate":{"$ref":"#/components/schemas/GateState"},"totals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Totals"},"top_findings":{"items":{"$ref":"#/components/schemas/FindingItem"},"type":"array","title":"Top Findings"},"top_proposals":{"items":{"$ref":"#/components/schemas/ProposalItem"},"type":"array","title":"Top Proposals"},"score_summary":{"additionalProperties":true,"type":"object","title":"Score Summary"}},"type":"object","required":["gate"],"title":"CouncilOverview","description":"Response of ``GET /v1/council/overview``."},"EmergingTokenItem":{"properties":{"token_address":{"type":"string","title":"Token Address"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"score":{"type":"number","title":"Score"},"swap_count":{"type":"integer","title":"Swap Count"},"unique_traders":{"type":"integer","title":"Unique Traders"},"total_volume_usd":{"type":"number","title":"Total Volume Usd"},"unique_holders":{"type":"integer","title":"Unique Holders"},"holders_per_hour":{"type":"number","title":"Holders Per Hour"},"age_hours":{"type":"number","title":"Age Hours"},"trader_diversity":{"type":"number","title":"Trader Diversity"},"smart_buyers":{"type":"integer","title":"Smart Buyers","default":0},"smart_volume_usd":{"type":"number","title":"Smart Volume Usd","default":0.0},"pair_age_hours":{"type":"number","title":"Pair Age Hours","default":9999.0},"sell_ratio":{"type":"number","title":"Sell Ratio","default":0.0},"unique_sellers":{"type":"integer","title":"Unique Sellers","default":0},"scored_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scored At"}},"additionalProperties":true,"type":"object","required":["token_address","score","swap_count","unique_traders","total_volume_usd","unique_holders","holders_per_hour","age_hours","trader_diversity"],"title":"EmergingTokenItem"},"EvidenceItem":{"properties":{"ref_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ref Id"},"type":{"type":"string","title":"Type","default":"chunk"},"source_id":{"type":"string","title":"Source Id","default":""},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"block_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Block Number"},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"summary":{"type":"string","title":"Summary","default":""},"etherscan_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etherscan Url"},"label_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label Source"},"time_window":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Window"}},"type":"object","title":"EvidenceItem","description":"A single piece of evidence supporting a chat response."},"ExplorerQuery":{"properties":{"question":{"type":"string","title":"Question","description":"Natural language question about Ethereum blockchain"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Optional previous context"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider","description":"LLM provider: anthropic or deepseek"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Model override"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"Anthropic API key override (optional)"}},"type":"object","required":["question"],"title":"ExplorerQuery"},"ExplorerResponse":{"properties":{"answer":{"type":"string","title":"Answer"},"tool_calls_made":{"type":"integer","title":"Tool Calls Made"},"execution_time_ms":{"type":"integer","title":"Execution Time Ms"},"provider":{"type":"string","title":"Provider","default":"deepseek"}},"type":"object","required":["answer","tool_calls_made","execution_time_ms"],"title":"ExplorerResponse"},"ExportRequest":{"properties":{"export_type":{"type":"string","pattern":"^(whale_txs|intents|watchlist)$","title":"Export Type"},"chain":{"type":"string","title":"Chain","default":"ETH"},"hours":{"type":"integer","maximum":720.0,"minimum":1.0,"title":"Hours","default":24},"watchlist_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Watchlist Id"}},"type":"object","required":["export_type"],"title":"ExportRequest"},"FeedAction":{"properties":{"action_id":{"type":"string","title":"Action Id"},"action_type":{"type":"string","title":"Action Type"},"tx_hash":{"type":"string","title":"Tx Hash"},"actor":{"type":"string","title":"Actor"},"counterparty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterparty"},"actor_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Label"},"actor_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Classification"},"counterparty_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterparty Label"},"counterparty_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterparty Classification"},"token_in":{"type":"string","title":"Token In","default":""},"token_in_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token In Symbol"},"token_in_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token In Amount"},"amount_in_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount In Usd"},"token_out":{"type":"string","title":"Token Out","default":""},"token_out_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Out Symbol"},"token_out_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token Out Amount"},"amount_out_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Out Usd"},"usd_volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usd Volume"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"},"data_quality":{"additionalProperties":true,"type":"object","title":"Data Quality"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["action_id","action_type","tx_hash","actor"],"title":"FeedAction","description":"Unified canonical action — replaces both FeedEvent and FeedSwapAction."},"FeedBlock":{"properties":{"chain":{"type":"string","title":"Chain"},"block_number":{"type":"integer","title":"Block Number"},"block_hash":{"type":"string","title":"Block Hash"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"tx_count":{"type":"integer","title":"Tx Count"},"gas_used":{"type":"integer","title":"Gas Used"},"gas_limit":{"type":"integer","title":"Gas Limit"},"gas_pct":{"type":"number","title":"Gas Pct","description":"Gas utilization percentage"},"base_fee":{"type":"integer","title":"Base Fee"},"events":{"items":{"$ref":"#/components/schemas/FeedEvent"},"type":"array","title":"Events","default":[]},"swap_actions":{"items":{"$ref":"#/components/schemas/FeedSwapAction"},"type":"array","title":"Swap Actions","description":"Structured swap actions from swap_routes"},"actions":{"items":{"$ref":"#/components/schemas/FeedAction"},"type":"array","title":"Actions","description":"Canonical actions (unified, structured)"},"token_transfers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Token Transfers","description":"Notable ERC-20 transfers (stablecoins $1M+, other tokens $50K+"},"intelligence":{"anyOf":[{"$ref":"#/components/schemas/BlockIntelligence"},{"type":"null"}],"description":"Block-level intelligence summary"},"whale_count":{"type":"integer","title":"Whale Count","default":0},"whale_volume":{"type":"number","title":"Whale Volume","default":0.0},"swap_count":{"type":"integer","title":"Swap Count","default":0},"swap_volume":{"type":"number","title":"Swap Volume","default":0.0},"lp_count":{"type":"integer","title":"Lp Count","default":0},"lp_volume":{"type":"number","title":"Lp Volume","default":0.0},"defi_count":{"type":"integer","title":"Defi Count","default":0}},"type":"object","required":["chain","block_number","block_hash","timestamp","tx_count","gas_used","gas_limit","gas_pct","base_fee"],"title":"FeedBlock"},"FeedEvent":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"topic":{"type":"string","title":"Topic"},"type":{"type":"string","title":"Type","description":"Derived event type: whale, intent, risk, deploy, digest, swap, liquidity"},"text":{"type":"string","title":"Text"},"tokens":{"type":"integer","title":"Tokens"},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash","description":"Full tx hash from provenance (for etherscan links)"},"entities":{"items":{"type":"string"},"type":"array","title":"Entities","description":"Named entities (e.g. Binance, Curve)"},"meta_tags":{"items":{"type":"string"},"type":"array","title":"Meta Tags","description":"Topic tags (e.g. whale, transfer)"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"Severity tier (LARGE, MID, etc.)"},"confidence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Confidence","description":"Confidence percentage (0-100)"},"value_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Usd","description":"Primary USD value extracted from text"},"tags":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tags","description":"User-applied tags"}},"type":"object","required":["chunk_id","topic","type","text","tokens"],"title":"FeedEvent"},"FeedRecentResponse":{"properties":{"blocks":{"items":{"$ref":"#/components/schemas/FeedBlock"},"type":"array","title":"Blocks"},"chain":{"type":"string","title":"Chain"},"count":{"type":"integer","title":"Count"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["blocks","chain","count"],"title":"FeedRecentResponse"},"FeedSwapAction":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"},"block_number":{"type":"integer","title":"Block Number"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"trader_address":{"type":"string","title":"Trader Address"},"hop_count":{"type":"integer","title":"Hop Count","default":1},"token_in":{"type":"string","title":"Token In","default":""},"token_in_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token In Symbol"},"token_in_decimals":{"type":"integer","title":"Token In Decimals","default":18},"token_in_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token In Amount"},"amount_in_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount In Usd"},"token_out":{"type":"string","title":"Token Out","default":""},"token_out_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Out Symbol"},"token_out_decimals":{"type":"integer","title":"Token Out Decimals","default":18},"token_out_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token Out Amount"},"amount_out_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Out Usd"},"usd_volume":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Usd Volume"},"protocol":{"type":"string","title":"Protocol","default":"unknown"},"dex_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dex Label"}},"type":"object","required":["tx_hash","block_number","timestamp","trader_address"],"title":"FeedSwapAction","description":"Structured swap action from swap_routes — replaces text narrative for swaps."},"FindingItem":{"properties":{"id":{"type":"integer","title":"Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"dimension":{"type":"string","title":"Dimension"},"severity":{"type":"string","title":"Severity"},"title":{"type":"string","title":"Title"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","dimension","severity","title","created_at"],"title":"FindingItem"},"GateState":{"properties":{"status":{"type":"string","title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"last_changed_at":{"type":"string","format":"date-time","title":"Last Changed At"},"override_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Override Until"},"override_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override By"}},"type":"object","required":["status","last_changed_at"],"title":"GateState"},"GraphStatsResponse":{"properties":{"total_nodes":{"type":"integer","title":"Total Nodes","default":0},"total_edges":{"type":"integer","title":"Total Edges","default":0},"total_clusters":{"type":"integer","title":"Total Clusters","default":0}},"type":"object","title":"GraphStatsResponse"},"GroundingMeta":{"properties":{"grounded":{"type":"boolean","title":"Grounded","default":true},"is_report_intent":{"type":"boolean","title":"Is Report Intent","default":false},"tools_called":{"items":{"type":"string"},"type":"array","title":"Tools Called"},"rag_chunks_count":{"type":"integer","title":"Rag Chunks Count","default":0},"tool_rows_returned":{"type":"integer","title":"Tool Rows Returned","default":0},"evidence_ids_used":{"items":{"type":"integer"},"type":"array","title":"Evidence Ids Used"},"ungrounded_claims":{"items":{"type":"string"},"type":"array","title":"Ungrounded Claims"},"evidence_gate_passed":{"type":"boolean","title":"Evidence Gate Passed","default":true}},"type":"object","title":"GroundingMeta","description":"Metadata about the grounding quality of this response."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InstantKeyMcp":{"properties":{"url":{"type":"string","title":"Url"},"transport":{"type":"string","title":"Transport"},"config":{"$ref":"#/components/schemas/InstantKeyMcpConfig"}},"additionalProperties":true,"type":"object","required":["url","transport","config"],"title":"InstantKeyMcp"},"InstantKeyMcpConfig":{"properties":{"type":{"type":"string","title":"Type"},"url":{"type":"string","title":"Url"},"headers":{"additionalProperties":{"type":"string"},"type":"object","title":"Headers"}},"additionalProperties":true,"type":"object","required":["type","url","headers"],"title":"InstantKeyMcpConfig"},"InstantKeyRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","default":"instant-agent"}},"type":"object","title":"InstantKeyRequest"},"InstantKeyResponse":{"properties":{"api_key":{"type":"string","title":"Api Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"tier":{"type":"string","title":"Tier"},"rate_limit":{"type":"integer","title":"Rate Limit"},"requests_per":{"type":"string","title":"Requests Per"},"daily_cap":{"type":"integer","title":"Daily Cap"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expires_at":{"type":"string","title":"Expires At"},"usage":{"$ref":"#/components/schemas/InstantKeyUsage"}},"additionalProperties":true,"type":"object","required":["api_key","key_prefix","tier","rate_limit","requests_per","daily_cap","scopes","expires_at","usage"],"title":"InstantKeyResponse"},"InstantKeyUsage":{"properties":{"header":{"type":"string","title":"Header"},"example":{"type":"string","title":"Example"},"docs":{"type":"string","title":"Docs"},"agents_landing":{"type":"string","title":"Agents Landing"},"discovery_manifest":{"type":"string","title":"Discovery Manifest"},"mcp":{"$ref":"#/components/schemas/InstantKeyMcp"},"upgrade":{"type":"string","title":"Upgrade"}},"additionalProperties":true,"type":"object","required":["header","example","docs","agents_landing","discovery_manifest","mcp","upgrade"],"title":"InstantKeyUsage"},"LabTerminalRequest":{"properties":{"message":{"type":"string","maxLength":800,"minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"LabTerminalRequest"},"LandingChatRequest":{"properties":{"message":{"type":"string","maxLength":800,"minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"LandingChatRequest"},"MixerRequest":{"properties":{"address":{"type":"string","maxLength":128,"minLength":1,"title":"Address"},"chain":{"type":"string","maxLength":16,"title":"Chain","default":"ETH"},"lookback_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Lookback Days","default":30},"limit":{"type":"integer","maximum":200.0,"minimum":1.0,"title":"Limit","default":50}},"type":"object","required":["address"],"title":"MixerRequest"},"NamedKeyRequest":{"properties":{"name":{"type":"string","maxLength":64,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"NamedKeyRequest"},"OrgCreate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-z0-9_-]+$","title":"Slug"},"tier":{"type":"string","pattern":"^(free|starter|pro|enterprise)$","title":"Tier","default":"free"}},"type":"object","required":["name","slug"],"title":"OrgCreate"},"OrgUpdate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"tier":{"type":"string","pattern":"^(free|starter|pro|enterprise)$","title":"Tier","default":"free"}},"type":"object","required":["name"],"title":"OrgUpdate"},"ProposalItem":{"properties":{"id":{"type":"integer","title":"Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"title":{"type":"string","title":"Title"},"body_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Md"},"state":{"type":"string","title":"State"},"target_dimension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Dimension"},"branch_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch Name"},"github_pr_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Pr Url"},"blocked_by_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Blocked By Id"},"verification_run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Verification Run Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"},"decided_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decided By"},"decision_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Note"}},"type":"object","required":["id","title","state","created_at"],"title":"ProposalItem"},"RagQueryBody":{"properties":{"query":{"type":"string","title":"Query"},"limit":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Limit","default":10},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"strategy":{"type":"string","title":"Strategy","default":"hybrid"},"mmr_lambda":{"type":"number","title":"Mmr Lambda","default":0.5}},"type":"object","required":["query"],"title":"RagQueryBody"},"RecoverRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"}},"type":"object","required":["email"],"title":"RecoverRequest"},"RegisterRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"}},"type":"object","required":["name","email"],"title":"RegisterRequest"},"RiskRequest":{"properties":{"address":{"type":"string","maxLength":128,"minLength":1,"title":"Address"},"chain":{"type":"string","maxLength":16,"title":"Chain","default":"ETH"}},"type":"object","required":["address"],"title":"RiskRequest"},"RunJobBody":{"properties":{"wait":{"type":"boolean","title":"Wait","default":true}},"type":"object","title":"RunJobBody"},"SavedSearchCreate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"search_type":{"type":"string","pattern":"^(rag|chat)$","title":"Search Type","default":"rag"},"query":{"type":"string","minLength":1,"title":"Query"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"}},"type":"object","required":["name","query"],"title":"SavedSearchCreate"},"SavedSearchUpdate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"query":{"type":"string","minLength":1,"title":"Query"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"}},"type":"object","required":["name","query"],"title":"SavedSearchUpdate"},"ScreenRequest":{"properties":{"address":{"type":"string","maxLength":128,"minLength":1,"title":"Address"},"chain":{"type":"string","maxLength":16,"title":"Chain","default":"ETH"}},"type":"object","required":["address"],"title":"ScreenRequest"},"SubgraphResponse":{"properties":{"actor_node":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Actor Node"},"edges":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Edges"},"nodes":{"additionalProperties":true,"type":"object","title":"Nodes"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"}},"type":"object","title":"SubgraphResponse"},"SwapHop":{"properties":{"log_index":{"type":"integer","title":"Log Index"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"pool_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pool Address"},"token_in":{"type":"string","title":"Token In","default":""},"token_in_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token In Symbol"},"token_in_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token In Amount"},"amount_in_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount In Usd"},"token_out":{"type":"string","title":"Token Out","default":""},"token_out_symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Out Symbol"},"token_out_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Token Out Amount"},"amount_out_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Out Usd"},"dex_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dex Label"}},"type":"object","required":["log_index"],"title":"SwapHop","description":"Single hop in a multi-hop swap (from canonical_swaps)."},"SwapHopsResponse":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"},"chain":{"type":"string","title":"Chain"},"hops":{"items":{"$ref":"#/components/schemas/SwapHop"},"type":"array","title":"Hops"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tx_hash","chain","hops","count"],"title":"SwapHopsResponse"},"TagCreateRequest":{"properties":{"event_id":{"type":"string","title":"Event Id","description":"chunk_id or event identifier"},"event_type":{"type":"string","title":"Event Type","description":"whale, intent, swap, risk, deploy, digest"},"tag_type":{"type":"string","title":"Tag Type","description":"confirm, false_positive, intent_override, address_label, note"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"Override intent type, label text, or note content"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address","description":"Address being labeled (for address_label)"},"chain":{"type":"string","title":"Chain","description":"Chain","default":"ETH"},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash","description":"Transaction hash"},"wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet","description":"Wallet address (for intent feedback)"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type","description":"Original intent type (for overrides)"}},"type":"object","required":["event_id","event_type","tag_type"],"title":"TagCreateRequest"},"TagListResponse":{"properties":{"tags":{"items":{"$ref":"#/components/schemas/TagResponse"},"type":"array","title":"Tags"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["tags","count"],"title":"TagListResponse"},"TagResponse":{"properties":{"id":{"type":"integer","title":"Id"},"event_id":{"type":"string","title":"Event Id"},"event_type":{"type":"string","title":"Event Type"},"tag_type":{"type":"string","title":"Tag Type"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"chain":{"type":"string","title":"Chain","default":"ETH"},"tx_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tx Hash"},"wallet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet"},"original_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Type"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","event_id","event_type","tag_type"],"title":"TagResponse"},"ToolCallRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Name of the tool to invoke"},"arguments":{"additionalProperties":true,"type":"object","title":"Arguments","description":"Tool arguments"}},"type":"object","required":["name"],"title":"ToolCallRequest"},"ToolCallResponse":{"properties":{"name":{"type":"string","title":"Name"},"result":{"title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["name","result"],"title":"ToolCallResponse"},"ToolDetail":{"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"tier":{"type":"string","title":"Tier"},"chain_coverage":{"items":{"type":"string"},"type":"array","title":"Chain Coverage"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scores":{"$ref":"#/components/schemas/ToolScores"},"agent":{"anyOf":[{"$ref":"#/components/schemas/AgentListItem"},{"type":"null"}]},"recent_runs":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recent Runs"},"recent_findings":{"items":{"$ref":"#/components/schemas/FindingItem"},"type":"array","title":"Recent Findings"},"open_proposals":{"items":{"$ref":"#/components/schemas/ProposalItem"},"type":"array","title":"Open Proposals"}},"type":"object","required":["name","category","tier","scores"],"title":"ToolDetail","description":"Response of ``GET /v1/council/tools/{name}``."},"ToolListItem":{"properties":{"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"tier":{"type":"string","title":"Tier"},"chain_coverage":{"items":{"type":"string"},"type":"array","title":"Chain Coverage"},"scores":{"$ref":"#/components/schemas/ToolScores"},"agent_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent State"},"agent_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Role"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"next_wake_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Wake At"}},"type":"object","required":["name","category","tier","scores"],"title":"ToolListItem","description":"One row in ``GET /v1/council/tools``."},"ToolListResponse":{"properties":{"tools":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tools"}},"type":"object","required":["tools"],"title":"ToolListResponse"},"ToolScores":{"properties":{"schema_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Schema Score"},"routing_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Routing Score"},"output_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Output Score"},"freshness_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Freshness Score"},"error_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Error Score"},"cost_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Score"},"composite":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Composite"},"prev_composite":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Prev Composite"},"last_updated":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Updated"}},"type":"object","title":"ToolScores"},"TrendingResponse":{"properties":{"tokens":{"items":{"$ref":"#/components/schemas/TrendingToken"},"type":"array","title":"Tokens"},"chain":{"type":"string","title":"Chain"},"period_hours":{"type":"integer","title":"Period Hours"}},"type":"object","required":["tokens","chain","period_hours"],"title":"TrendingResponse"},"TrendingToken":{"properties":{"symbol":{"type":"string","title":"Symbol"},"token_address":{"type":"string","title":"Token Address"},"swap_count":{"type":"integer","title":"Swap Count"},"volume_usd":{"type":"number","title":"Volume Usd"},"buy_volume_usd":{"type":"number","title":"Buy Volume Usd"},"sell_volume_usd":{"type":"number","title":"Sell Volume Usd"},"unique_wallets":{"type":"integer","title":"Unique Wallets"},"change_pct":{"type":"number","title":"Change Pct"},"trend":{"type":"string","title":"Trend","description":"up, down, or flat"},"buy_sell_ratio":{"type":"number","title":"Buy Sell Ratio"},"price_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Usd","description":"Current price estimate (from known tokens)"},"volume_24h_sparkline":{"items":{"type":"number"},"type":"array","title":"Volume 24H Sparkline","description":"24 hourly volume buckets (oldest→newest) for sparkline chart"}},"type":"object","required":["symbol","token_address","swap_count","volume_usd","buy_volume_usd","sell_volume_usd","unique_wallets","change_pct","trend","buy_sell_ratio"],"title":"TrendingToken"},"UserCreate":{"properties":{"email":{"type":"string","minLength":5,"title":"Email"},"name":{"type":"string","title":"Name","default":""},"role":{"type":"string","pattern":"^(admin|analyst|read_only)$","title":"Role","default":"analyst"}},"type":"object","required":["email"],"title":"UserCreate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaitlistRequest":{"properties":{"email":{"type":"string","maxLength":200,"minLength":3,"title":"Email"},"name":{"type":"string","maxLength":100,"title":"Name","default":""},"company":{"type":"string","maxLength":100,"title":"Company","default":""},"use_case":{"type":"string","maxLength":500,"title":"Use Case","default":""}},"type":"object","required":["email"],"title":"WaitlistRequest"},"WalletInteractionResponse":{"properties":{"from_address":{"type":"string","title":"From Address"},"to_address":{"type":"string","title":"To Address"},"chain":{"type":"string","title":"Chain"},"interaction_count":{"type":"integer","title":"Interaction Count","default":0},"total_value_usd":{"type":"number","title":"Total Value Usd","default":0.0},"first_interaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Interaction"},"last_interaction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Interaction"},"interaction_types":{"title":"Interaction Types"}},"type":"object","required":["from_address","to_address","chain"],"title":"WalletInteractionResponse"},"WalletProfileResponse":{"properties":{"address":{"type":"string","title":"Address"},"chain":{"type":"string","title":"Chain"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"classification":{"type":"string","title":"Classification","default":"unknown"},"confidence":{"type":"number","title":"Confidence","default":0.0},"first_seen_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First Seen Block"},"first_seen_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Seen At"},"last_activity_block":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Activity Block"},"last_activity_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Activity At"},"total_tx_count":{"type":"integer","title":"Total Tx Count","default":0},"total_sent_count":{"type":"integer","title":"Total Sent Count","default":0},"total_recv_count":{"type":"integer","title":"Total Recv Count","default":0},"total_volume_usd":{"type":"number","title":"Total Volume Usd","default":0.0},"total_sent_usd":{"type":"number","title":"Total Sent Usd","default":0.0},"total_recv_usd":{"type":"number","title":"Total Recv Usd","default":0.0},"avg_tx_value_usd":{"type":"number","title":"Avg Tx Value Usd","default":0.0},"max_tx_value_usd":{"type":"number","title":"Max Tx Value Usd","default":0.0},"risk_score":{"type":"integer","title":"Risk Score","default":0},"risk_flags":{"title":"Risk Flags"},"active_intents":{"title":"Active Intents"},"top_tokens":{"title":"Top Tokens"},"top_counterparties":{"title":"Top Counterparties"},"tx_type_breakdown":{"title":"Tx Type Breakdown"},"cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Id"}},"type":"object","required":["address","chain"],"title":"WalletProfileResponse"},"WalletSummaryResponse":{"properties":{"address":{"type":"string","title":"Address"},"chain":{"type":"string","title":"Chain"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"classification":{"type":"string","title":"Classification","default":"unknown"},"total_volume_usd":{"type":"number","title":"Total Volume Usd","default":0.0},"total_tx_count":{"type":"integer","title":"Total Tx Count","default":0},"risk_score":{"type":"integer","title":"Risk Score","default":0},"last_activity_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Activity At"}},"type":"object","required":["address","chain"],"title":"WalletSummaryResponse"},"WatchlistCreate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"item_type":{"type":"string","pattern":"^(wallet|token|protocol)$","title":"Item Type","default":"wallet"}},"type":"object","required":["name"],"title":"WatchlistCreate"},"WatchlistItemAdd":{"properties":{"address":{"type":"string","minLength":1,"title":"Address"},"chain":{"type":"string","title":"Chain","default":"ETH"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"notes":{"type":"string","title":"Notes","default":""}},"type":"object","required":["address"],"title":"WatchlistItemAdd"},"WatchlistUpdate":{"properties":{"name":{"type":"string","maxLength":128,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name"],"title":"WatchlistUpdate"},"WebhookCreateBody":{"properties":{"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"secret":{"type":"string","title":"Secret","default":""}},"type":"object","required":["url"],"title":"WebhookCreateBody"},"WhaleItem":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"},"block_number":{"type":"integer","title":"Block Number"},"chain":{"type":"string","title":"Chain"},"from_address":{"type":"string","title":"From Address"},"to_address":{"type":"string","title":"To Address"},"from_entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Entity"},"to_entity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Entity"},"value_usd":{"type":"number","title":"Value Usd"},"token_symbol":{"type":"string","title":"Token Symbol"},"tier":{"type":"string","title":"Tier"},"timestamp":{"type":"string","title":"Timestamp"}},"additionalProperties":true,"type":"object","required":["tx_hash","block_number","chain","from_address","to_address","value_usd","token_symbol","tier","timestamp"],"title":"WhaleItem"},"WhaleTxDetail":{"properties":{"tx_hash":{"type":"string","title":"Tx Hash"},"block_number":{"type":"integer","title":"Block Number","default":0},"from_address":{"type":"string","title":"From Address"},"from_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Label"},"to_address":{"type":"string","title":"To Address"},"to_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Label"},"value_usd":{"type":"number","title":"Value Usd"},"tier":{"type":"string","title":"Tier"},"tx_type":{"type":"string","title":"Tx Type"},"description":{"type":"string","title":"Description"},"risk_flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Flag"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"},"method_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method Name"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"}},"type":"object","required":["tx_hash","from_address","to_address","value_usd","tier","tx_type","description"],"title":"WhaleTxDetail"},"WhalesRecentResponse":{"properties":{"count":{"type":"integer","title":"Count"},"chain":{"type":"string","title":"Chain"},"min_usd":{"type":"number","title":"Min Usd"},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"},"until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Until"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More"},"whales":{"items":{"$ref":"#/components/schemas/WhaleItem"},"type":"array","title":"Whales"}},"additionalProperties":true,"type":"object","required":["count","chain","min_usd","has_more","whales"],"title":"WhalesRecentResponse"},"_InternalFlagBody":{"properties":{"is_internal":{"type":"boolean","title":"Is Internal"}},"type":"object","required":["is_internal"],"title":"_InternalFlagBody"},"chainrag__api__v1__admin__UserUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"rate_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rate Limit"},"balance_adjust":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Adjust"},"balance_adjust_reason":{"type":"string","title":"Balance Adjust Reason","default":"admin adjustment"}},"type":"object","title":"UserUpdate"},"chainrag__api__v1__tenants__UserUpdate":{"properties":{"name":{"type":"string","title":"Name","default":""},"role":{"type":"string","pattern":"^(admin|analyst|read_only)$","title":"Role","default":"analyst"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","title":"UserUpdate"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Get a free key in one request: POST https://api.bitpoort.com/v1/keys (no signup, 60 req/min, 10,000/day, 90-day expiry)."},"BearerAuth":{"type":"http","scheme":"bearer","description":"Same `bp_` key as ApiKeyAuth, sent as `Authorization: Bearer <key>`."}}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}]}