{"openapi":"3.1.0","info":{"title":"DYOR API","description":"Crypto token qualification — asset-class-aware scoring.","version":"0.1.0"},"paths":{"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Api Health Get"}}}}}}},"/api/analyze":{"get":{"summary":"Analyze","description":"Resolve + score one token against a peer baseline.","operationId":"analyze_api_analyze_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"token name, symbol, or contract address","title":"Q"},"description":"token name, symbol, or contract address"},{"name":"peer_mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(class|stored|sample|category)$","default":"class","title":"Peer Mode"}},{"name":"penalize_missing_core","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"floor a missing core domain (None = config default)","title":"Penalize Missing Core"},"description":"floor a missing core domain (None = config default)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Analyze Api Analyze Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/screener":{"get":{"summary":"Screener","description":"Ranked universe from the sample set or the last persisted run.","operationId":"screener_api_screener_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(sample|stored)$","default":"sample","title":"Source"}},{"name":"peer_groups","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Peer Groups"}},{"name":"penalize_missing_core","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Penalize Missing Core"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Screener Api Screener Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/screener/build":{"post":{"summary":"Screener Build","description":"Start a background universe collection (top-N by TVL → persist). Poll the\nreturned job_id; when done, re-fetch /api/screener?source=stored.","operationId":"screener_build_api_screener_build_post","parameters":[{"name":"top_n","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Top N"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Screener Build Api Screener Build Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/screener/build/{job_id}":{"get":{"summary":"Screener Build Status","operationId":"screener_build_status_api_screener_build__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Screener Build Status Api Screener Build  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/token-record":{"get":{"summary":"Token Record","description":"The full record for one token in the screener set (for drill-down).","operationId":"token_record_api_token_record_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"stored","title":"Source"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Token Record Api Token Record Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/memo":{"get":{"summary":"Memo","description":"Reasoned analyst memo for a token (markdown).","operationId":"memo_api_memo_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}},{"name":"peer_mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(class|stored|sample|category)$","default":"class","title":"Peer Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Memo Api Memo Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/screen":{"get":{"summary":"Screen Endpoint","description":"Filter the saved/sample universe by criteria.","operationId":"screen_endpoint_api_screen_get","parameters":[{"name":"source","in":"query","required":false,"schema":{"type":"string","pattern":"^(stored|sample)$","default":"stored","title":"Source"}},{"name":"asset_class","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Class"}},{"name":"min_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Tier"}},{"name":"min_score","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Score"}},{"name":"no_flags","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"No Flags"}},{"name":"min_real_yield","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Min Real Yield"}},{"name":"max_fdv_mcap","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Fdv Mcap"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Screen Endpoint Api Screen Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portfolio":{"get":{"summary":"Portfolio Endpoint","description":"Score a portfolio of holdings (comma-separated names/symbols/addresses).","operationId":"portfolio_endpoint_api_portfolio_get","parameters":[{"name":"tokens","in":"query","required":true,"schema":{"type":"string","description":"comma-separated holdings","title":"Tokens"},"description":"comma-separated holdings"},{"name":"peer_mode","in":"query","required":false,"schema":{"type":"string","default":"class","title":"Peer Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Portfolio Endpoint Api Portfolio Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/barbell":{"get":{"summary":"Barbell Endpoint","description":"BTC anchor + top-N ungated A/B satellites from the saved universe.","operationId":"barbell_endpoint_api_barbell_get","parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"N"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Barbell Endpoint Api Barbell Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/backtest":{"get":{"summary":"Backtest Endpoint","description":"Per-tier forward return from persisted runs.","operationId":"backtest_endpoint_api_backtest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Backtest Endpoint Api Backtest Get"}}}}}}},"/api/chart":{"get":{"summary":"Chart","description":"Historical price chart for a token (downsampled, with period change).","operationId":"chart_api_chart_get","parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","description":"CoinGecko coin id","title":"Id"},"description":"CoinGecko coin id"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Chart Api Chart Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/narratives":{"get":{"summary":"Narratives","description":"Narrative rotation — CoinGecko categories ranked by momentum.","operationId":"narratives_api_narratives_get","parameters":[{"name":"by","in":"query","required":false,"schema":{"type":"string","default":"market_cap_change_24h","title":"By"}},{"name":"top","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Top"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Narratives Api Narratives Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/classes":{"get":{"summary":"Classes","operationId":"classes_api_classes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Classes Api Classes Get"}}}}}}},"/api/methodology":{"get":{"summary":"Methodology","operationId":"methodology_api_methodology_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Methodology Api Methodology Get"}}}}}}},"/api/benchmark":{"get":{"summary":"Benchmark","operationId":"benchmark_api_benchmark_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Benchmark Api Benchmark Get"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}