{"openapi":"3.1.0","info":{"title":"Fairline API","description":"MLB, NHL, EPL, and NFL projection model API","version":"0.1.0"},"paths":{"/api/health":{"get":{"tags":["health"],"summary":"Health","description":"Unauthenticated liveness probe for Railway and the uptime monitor.\n\nThe failure branch answers with a fixed string rather than the driver's\nexception text. A SQLAlchemy connection error spells out the\nprivate-network DB host, port, role, and pool sizing, and nothing\nauthenticates this route. The operator still gets the full detail, at error\nlevel in the service logs (and so in Sentry, via the logging integration).\n\nBoth branches keep answering 200. Railway's health check and the uptime\nmonitor read the status code, so a DB blip must not read as a dead\ncontainer and roll back a deploy. ``status`` is what separates them.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/pipeline/{sport}/run":{"post":{"tags":["pipeline"],"summary":"Trigger Pipeline","description":"Run full pipeline (data refresh + projections).","operationId":"trigger_pipeline_api_pipeline__sport__run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sport","in":"path","required":true,"schema":{"type":"string","title":"Sport"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"trigger","in":"query","required":false,"schema":{"type":"string","default":"manual","title":"Trigger"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/nfl/run-week":{"post":{"tags":["pipeline"],"summary":"Trigger Nfl Week","description":"Run the NFL pipeline for every date in the current week.","operationId":"trigger_nfl_week_api_pipeline_nfl_run_week_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"trigger","in":"query","required":false,"schema":{"type":"string","default":"manual","title":"Trigger"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NflWeekPipelineTriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/runs":{"get":{"tags":["pipeline"],"summary":"List Runs","operationId":"list_runs_api_pipeline_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","title":"Sport"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PipelineRunResponse"},"title":"Response List Runs Api Pipeline Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/runs/{run_id}":{"get":{"tags":["pipeline"],"summary":"Get Run","operationId":"get_run_api_pipeline_runs__run_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"integer","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pipeline/events":{"get":{"tags":["pipeline"],"summary":"Pipeline Sse","description":"Server-Sent Events stream for pipeline status updates.\n\nDeliberately public: a browser ``EventSource`` cannot send an\n``Authorization`` header. Availability is protected by the two subscriber\ncaps in ``api.events`` instead, the per-client one keyed on the caller IP so\na single source cannot consume the whole pool. That key trusts the first\n``X-Forwarded-For`` hop, which the caller can spoof (see ``client_ip_key``),\nso it raises the cost of a flood rather than making one impossible.","operationId":"pipeline_sse_api_pipeline_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mlb/games":{"get":{"tags":["mlb"],"summary":"List Games","operationId":"list_games_api_mlb_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MlbSlateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mlb/games/{game_id}":{"get":{"tags":["mlb"],"summary":"Get Game","operationId":"get_game_api_mlb_games__game_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"game_id","in":"path","required":true,"schema":{"type":"integer","title":"Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MlbGameDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nhl/games":{"get":{"tags":["nhl"],"summary":"List Games","operationId":"list_games_api_nhl_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NhlSlateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nhl/games/{game_id}":{"get":{"tags":["nhl"],"summary":"Get Game","operationId":"get_game_api_nhl_games__game_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"game_id","in":"path","required":true,"schema":{"type":"integer","title":"Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NhlGameDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nfl/games":{"get":{"tags":["nfl"],"summary":"List Games","operationId":"list_games_api_nfl_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NflSlateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nfl/games/{game_id}":{"get":{"tags":["nfl"],"summary":"Get Game","operationId":"get_game_api_nfl_games__game_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"game_id","in":"path","required":true,"schema":{"type":"integer","title":"Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NflGameDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/epl/games":{"get":{"tags":["epl"],"summary":"List Games","operationId":"list_games_api_epl_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EplSlateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/epl/games/{game_id}":{"get":{"tags":["epl"],"summary":"Get Game","operationId":"get_game_api_epl_games__game_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"game_id","in":"path","required":true,"schema":{"type":"integer","title":"Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EplGameDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/line-history/{sport}/{external_game_id}":{"get":{"tags":["line-history"],"summary":"Game Line History","operationId":"game_line_history_api_line_history__sport___external_game_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sport","in":"path","required":true,"schema":{"type":"string","title":"Sport"}},{"name":"external_game_id","in":"path","required":true,"schema":{"type":"string","title":"External Game Id"}},{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Odds vocab: ML | Totals | Spread | ...","title":"Market"},"description":"Odds vocab: ML | Totals | Spread | ..."},{"name":"side","in":"query","required":true,"schema":{"type":"string","description":"home | away | over | under","title":"Side"},"description":"home | away | over | under"},{"name":"line","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line"}},{"name":"player","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameLineHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/attribution":{"post":{"tags":["attribution"],"summary":"Create Attribution","operationId":"create_attribution_api_attribution_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributionIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/attribution/report":{"get":{"tags":["attribution"],"summary":"Get Attribution Report","operationId":"get_attribution_report_api_attribution_report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributionReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/games":{"get":{"tags":["audit"],"summary":"Get Audit Games","description":"Fetch all game projections for a date range.\n\nReturns full projection data (including JSONB blobs) for auditing model\nperformance against actual results. Use include_snapshots=true to get\nhistorical projection data from every pipeline run, not just the latest.","operationId":"get_audit_games_api_audit_games_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Start of date range (inclusive)","title":"Start Date"},"description":"Start of date range (inclusive)"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"End of date range (inclusive)","title":"End Date"},"description":"End of date range (inclusive)"},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by sport (mlb/nhl/epl/nfl)","title":"Sport"},"description":"Filter by sport (mlb/nhl/epl/nfl)"},{"name":"include_snapshots","in":"query","required":false,"schema":{"type":"boolean","description":"Include per-run projection snapshots","default":false,"title":"Include Snapshots"},"description":"Include per-run projection snapshots"},{"name":"include_finals","in":"query","required":false,"schema":{"type":"boolean","description":"Attach actual final scores (live-fetched per sport/past-date; off by default to avoid an upstream fan-out)","default":false,"title":"Include Finals"},"description":"Attach actual final scores (live-fetched per sport/past-date; off by default to avoid an upstream fan-out)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/nhl-lineups":{"get":{"tags":["audit"],"summary":"Get Nhl Lineups","description":"Return every archived lineup observation for one NHL game.","operationId":"get_nhl_lineups_api_audit_nhl_lineups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"game_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":20,"title":"Game Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NhlLineupObservationResponse"},"title":"Response Get Nhl Lineups Api Audit Nhl Lineups Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/audit/calibration":{"get":{"tags":["audit"],"summary":"Get Calibration","description":"Post-selection calibration over graded bets in a date range.\n\nBins each placed bet's stated probability against how often it won, and the\nclaimed edge against the realized edge, per market. `suggested_lambda` is the\nblend-to-market weight implied by the claimed-vs-realized gap (the Phase 4\nshrinkage input). Shares the pure aggregation with the offline report script.\n\nThe result is cached for 15 minutes under the exact (start_date, end_date,\nsport) the caller asked for, in the shared cache in `api.calibration_cache`,\nso a repeated 30-day admin refresh returns without running the query again.\nConcurrent callers that miss the same key await one shared asyncio.Task.\n\nThis route holds its own one-token AnyIO capacity limiter and the public\ntransparency route holds a separate one, so each API process runs at most two\ncalibration queries at once and an admin request never waits behind a public\nrefresh. Callers awaiting a token do not occupy the default AnyIO thread\ncapacity.","operationId":"get_calibration_api_audit_calibration_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Start of date range (inclusive)","title":"Start Date"},"description":"Start of date range (inclusive)"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"End of date range (inclusive)","title":"End Date"},"description":"End of date range (inclusive)"},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by sport (mlb/nhl/epl/nfl)","title":"Sport"},"description":"Filter by sport (mlb/nhl/epl/nfl)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalibrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/grade":{"post":{"tags":["grading"],"summary":"Grade Date","description":"Grade all ungraded logical bets for a date. Idempotent — existing bet_results rows are skipped.\n\nAlso grades AI Blackbox picks (issue #157) into blackbox_pick_results, in\nits own committed transaction so it cannot roll back the model's grading.\nThe morning cron calls this endpoint, so both run on the same daily trigger\nwith no separate cron entry.","operationId":"grade_date_api_grading_grade_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/bets":{"get":{"tags":["grading"],"summary":"Get Bets","description":"Fetch graded-or-not logical bets for a date range, one row per logical bet.","operationId":"get_bets_api_grading_bets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"End Date"}},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}},{"name":"result","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/nfl-watch":{"get":{"tags":["grading"],"summary":"Get Nfl Watch","description":"The NFL launch watch: the model against the de-vigged close, per cell.\n\nCumulative from the first NFL bet of the season through ``through``, never a\nrolling window, because a 7-day window on NFL holds one week of games and\nreads as noise. The primary number is ``brier_t``, the paired Brier of the\nmodel against the de-vigged close in standard errors, positive meaning the\nmodel scored worse. The return carries a 90% interval so the reader sees how\nlittle it can say at these sample sizes.\n\nClosing-line value is deliberately absent. It compares the price a play was\nstruck at against the closing price, so it measures price capture and says\nnothing about whether the model picks winners.\n\nWhile ``core.value_gating.NFL_VALUE_ENABLED`` is False the six game-market\ncells record no bets at all, so every ``source='captured'`` row reads n=0.\nThe plays those cells would have flagged come back as ``source='suppressed'``\nrows, scored the same way off the no-vig anchors ``suppressed_value_plays``\nhas carried since revision d3e4f5a6b7c8. The two sources never share a cell.","operationId":"get_nfl_watch_api_grading_nfl_watch_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"season","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":2020,"description":"NFL season year, e.g. 2026","title":"Season"},"description":"NFL season year, e.g. 2026"},{"name":"through","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Last game date to include. Defaults to the end of the season.","title":"Through"},"description":"Last game date to include. Defaults to the end of the season."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NflWatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/mlb-dog-edge":{"get":{"tags":["grading"],"summary":"Get Mlb Dog Edge","description":"Live tracked record for the MLB moneyline dog-edge pocket (issue #143).\n\nReads the record for MLB moneylines over the window, keeps the pocket rows,\nand rolls them up CLV-first. Volume is qualifying plays per active MLB day.\nResponses are cached in-process for _DOG_EDGE_CACHE_TTL; summary_only=true\n(the dashboard chip) returns the same cached record without the row-level\nledger.","operationId":"get_mlb_dog_edge_api_grading_mlb_dog_edge_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":365,"title":"Days"}},{"name":"summary_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Summary Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MlbDogEdgeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/mlb-dog-hypothesis":{"get":{"tags":["grading"],"summary":"Get Mlb Dog Hypothesis","description":"Frozen-entry MLB dog-hypothesis cohort record (WS2 task 2.2).\n\nReads the prospective cohort of frozen sharp_dog_entries (from\nDOG_COHORT_EPOCH), de-vigs each entry's raw pair three ways, and rolls up the\nproportional PRIMARY cohort (n, record, actual-minus-sharp) plus the Shin and\npower SENSITIVITY cohorts, executable coverage, flat 1u P&L on the executable\nsubset, and the entry-vs-close gap in its own labeled section. Empty (staging,\nno rows) returns a sane zero cohort, never a 500. Cached in-process for\n_DOG_HYP_CACHE_TTL.","operationId":"get_mlb_dog_hypothesis_api_grading_mlb_dog_hypothesis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MlbDogHypothesisResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/grading/suppressed":{"get":{"tags":["grading"],"summary":"Get Suppressed Plays","description":"List every candidate bet the value-detection layer suppressed, with\njoined actual-outcome grading and counterfactual P&L.\n\nUsed by audits/scripts/suppression_analysis.py and for Path 3 validation\n(\"would-have-been bets that would now clear the gate\").","operationId":"get_suppressed_plays_api_grading_suppressed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"End Date"}},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}},{"name":"reason","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. implausible_edge_cap, observed_bf_gate, projected_k_below_line, projected_k_above_line, edge_below_threshold","title":"Reason"},"description":"e.g. implausible_edge_cap, observed_bf_gate, projected_k_below_line, projected_k_above_line, edge_below_threshold"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/grading/observations":{"get":{"tags":["grading"],"summary":"Get Observations","description":"Raw bet_observations rows for price-path analyses (issue #99).\n\nRange caps: 3 days unfiltered, 31 days when a market or external_game_id\nfilter narrows the pull. A hard LIMIT protects the response path\nregardless; `truncated: true` signals the limit was hit, so callers\n(e.g. audits/scripts/timing_niche_weekend_daygames.py) should iterate\nper game-day rather than bulk-pull.","operationId":"get_observations_api_grading_observations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Start Date"}},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"End Date"}},{"name":"sport","in":"query","required":true,"schema":{"type":"string","title":"Sport"}},{"name":"market","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"}},{"name":"external_game_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Game Id"}},{"name":"is_main","in":"query","required":false,"schema":{"type":"string","pattern":"^(true|false|all)$","description":"'true' = main lines only (default), 'false' = alt lines only, 'all' = both","default":"true","title":"Is Main"},"description":"'true' = main lines only (default), 'false' = alt lines only, 'all' = both"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/faq/config":{"get":{"tags":["faq"],"summary":"Get Faq Config","operationId":"get_faq_config_api_faq_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Me Api Auth Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/subscriptions":{"get":{"tags":["subscriptions"],"summary":"List Subscriptions","operationId":"list_subscriptions_api_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionsListResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["subscriptions"],"summary":"Create Subscription","operationId":"create_subscription_api_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/subscriptions/{sub_id}":{"delete":{"tags":["subscriptions"],"summary":"Delete Subscription","description":"Soft-unsubscribe. Returns the updated row.","operationId":"delete_subscription_api_subscriptions__sub_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["subscriptions"],"summary":"Reactivate Subscription","description":"Flip an inactive row back to active. If an active row on the same key\nalready exists (e.g. user recreated via POST), we leave this row alone\nand return that active row instead so the client converges to one row\nper logical key.","operationId":"reactivate_subscription_api_subscriptions__sub_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"integer","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/send-starting-soon":{"post":{"tags":["notifications"],"summary":"Send Starting Soon","operationId":"send_starting_soon_api_notifications_send_starting_soon_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Send Starting Soon Api Notifications Send Starting Soon Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notifications/resend-webhook":{"post":{"tags":["notifications"],"summary":"Resend Webhook","description":"Phase 2 stub — accept, log nothing, return 204.\n\nWhen implemented, this handler will verify the Resend signature header,\nparse the event type (email.bounced, email.complained, etc.), and\nunsubscribe the recipient on hard bounce.","operationId":"resend_webhook_api_notifications_resend_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/unsubscribe":{"post":{"tags":["unsubscribe"],"summary":"Unsubscribe Post","operationId":"unsubscribe_post_api_unsubscribe_post","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","description":"Signed unsubscribe token","title":"T"},"description":"Signed unsubscribe token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnsubscribeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["unsubscribe"],"summary":"Unsubscribe Get","operationId":"unsubscribe_get_api_unsubscribe_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","description":"Signed unsubscribe token","title":"T"},"description":"Signed unsubscribe token"}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/odds/refreshes":{"get":{"tags":["odds"],"summary":"List Refreshes","description":"List recent odds-refresh runs for observability.","operationId":"list_refreshes_api_odds_refreshes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"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"}}}}}}},"/api/odds/refresh":{"post":{"tags":["odds"],"summary":"Trigger Refresh","description":"Force an on-demand odds refresh from the pipeline control panel.\n\nRe-fetches book lines and re-runs value detection for the requested sport\n(or every supported sport when `sport` is omitted) against the persisted\nprojection probs, exactly like the worker's loop but on demand and without\nwaiting for the next tick. Runs inline so the response carries each sport's\noutcome for the UI; the same `odds_refreshed` SSE event still fires, so open\nslates auto-refresh. The rate-limit cooldown is bypassed because an operator\nasked for fresh odds. The pipeline-in-flight guard still applies, and an\nempty ODDS_API_KEY removes only odds_api while other sources proceed.\n\n`refresh_sport_odds` self-serializes on the pipeline advisory lock\n`pipeline:{sport}`, shared with the full pipeline, so a manual refresh\nfired while the worker or a projection run is mid-write skips instead of\nracing. It surfaces that as status=skipped, skip_reason=skipped_overlap in\nits RefreshResult, carried straight into the response below.","operationId":"trigger_refresh_api_odds_refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}},{"name":"date","in":"query","required":false,"schema":{"type":"string","format":"date","title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/events/odds-refreshed":{"post":{"tags":["events"],"summary":"Emit Odds Refreshed","description":"Republish an odds_refreshed payload from the worker onto the SSE bus.","operationId":"emit_odds_refreshed_api_events_odds_refreshed_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Emit Odds Refreshed Api Events Odds Refreshed Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/contact":{"post":{"tags":["contact"],"summary":"Submit Contact","operationId":"submit_contact_api_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmission"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSubmissionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/clerk":{"post":{"tags":["webhooks"],"summary":"Receive Clerk Webhook","operationId":"receive_clerk_webhook_api_webhooks_clerk_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Receive Clerk Webhook Api Webhooks Clerk Post"}}}}}}},"/api/ops/daily-digest":{"post":{"tags":["ops"],"summary":"Daily Digest","operationId":"daily_digest_api_ops_daily_digest_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD game date to digest; defaults to yesterday (UTC). Cron passes the ET date it just graded.","title":"Date"},"description":"YYYY-MM-DD game date to digest; defaults to yesterday (UTC). Cron passes the ET date it just graded."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/prune":{"post":{"tags":["ops"],"summary":"Prune","operationId":"prune_api_ops_prune_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_batches","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Cap on delete batches per table, so one cron call is bounded.","default":50,"title":"Max Batches"},"description":"Cap on delete batches per table, so one cron call is bounded."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/ops/renewal-reminders":{"post":{"tags":["ops"],"summary":"Renewal Reminders","operationId":"renewal_reminders_api_ops_renewal_reminders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD to evaluate reminders against; defaults to today (UTC). Cron sends no date.","title":"Date"},"description":"YYYY-MM-DD to evaluate reminders against; defaults to today (UTC). Cron sends no date."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/picks/blackbox/snapshot":{"get":{"tags":["picks"],"summary":"Get Blackbox Snapshot","operationId":"get_blackbox_snapshot_api_picks_blackbox_snapshot_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"mlb","title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/picks/blackbox/ingest":{"post":{"tags":["picks"],"summary":"Ingest Blackbox","operationId":"ingest_blackbox_api_picks_blackbox_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/picks/blackbox/digest":{"get":{"tags":["picks"],"summary":"Get Blackbox Digest","description":"The panel's own calibration record (outcomes only, no CLV), staged next\nto the snapshot so the routine injects it into every proposer and judge\nprompt as <TRACK_RECORD>. Same gate as the snapshot endpoint: the staging\nAction's read token clears it, and cron's secret clears everything.","operationId":"get_blackbox_digest_api_picks_blackbox_digest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"mlb","title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DigestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/picks/blackbox/baseline":{"get":{"tags":["picks"],"summary":"Get Blackbox Baseline","description":"What value_detection flagged at this moment, for the slate. The staging\nAction stages it NEXT TO the snapshot (DATE.baseline.json.gz) so the 14-day\ncheckpoint can compare the panel's nominations against the deterministic\nflag set, blind: the routine never reads this file, so panel/baseline\nagreement is evidence rather than anchoring.","operationId":"get_blackbox_baseline_api_picks_blackbox_baseline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","format":"date","title":"Date"}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","default":"mlb","title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlackboxBaselineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/picks/blackbox/recheck":{"post":{"tags":["picks"],"summary":"Recheck Blackbox","description":"Void live picks whose market moved against them before first pitch.\nCron calls this every tick; it is a cheap no-op unless a pick's game starts\ninside the re-check window.","operationId":"recheck_blackbox_api_picks_blackbox_recheck_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecheckResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/picks/blackbox":{"get":{"tags":["picks"],"summary":"Get Blackbox Picks","description":"The featured slate plus the summary over the whole tracked window.\n\nThe summary spans every pick in the window by design, so this endpoint still\nderives the full ledger; it just no longer serves it. The history is paged\nseparately, and the tiles have to keep describing the whole record however deep\ninto it the reader has paged, or the headline CLV appears to move when they turn\na page.","operationId":"get_blackbox_picks_api_picks_blackbox_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":365,"title":"Days"}},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlackboxPicksResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/picks/blackbox/ledger":{"get":{"tags":["picks"],"summary":"Get Blackbox Ledger","description":"One page of the track record, `days` slate-days wide, ending strictly before\n`before`.\n\nThe caller pages by handing back `next_cursor`. The cursor is exclusive, so the\nUI's first page passes the featured date and the history starts beneath it with\nno slate shown twice.\n\n`before` defaults to tomorrow rather than today, so an ad-hoc call with no cursor\nstill includes today's slate; the UI always passes one.","operationId":"get_blackbox_ledger_api_picks_blackbox_ledger_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Before"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":60,"minimum":1,"default":14,"title":"Days"}},{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlackboxLedgerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transparency/calibration":{"get":{"tags":["transparency"],"summary":"Public Calibration","description":"Live post-selection calibration over the trailing `days`, public.\n\nBins each placed bet's stated probability against how often it won and the\nclaimed edge against the realized edge, per market, over a window ending\ntoday. A sport with fewer than 500 graded bets in the window answers with\nits graded count, `below_floor: true`, and no numbers, so no public surface\nprints a win rate or a skill score off a thin sample. The window is trailing (not caller-supplied dates) so the surface\nstays a fixed shape the frontend can render simply.\n\nAvailability: `days` clamps up to one of four buckets, so this route asks the\nshared cache in `api.calibration_cache` for at most 20 keys (five sport\nchoices x four buckets), keyed by sport and bucket rather than by date, so\nthe keys survive midnight. A result younger than 15 minutes is served as is.\nA result between 15 minutes and 24 hours old is served at once while one\nbackground refresh runs, so no caller waits on the query after the first\ncompute. Each successful public result is also saved to the\ncalibration_cache_entries table and restored at startup, and the api warms\nthe four per-sport 365-day keys in the background after it boots. Concurrent\nmisses for one key await one shared asyncio.Task. This route's SQL passes\nthrough the public one-token AnyIO capacity limiter, and\n/api/audit/calibration uses a separate one, so each API process runs at most\ntwo calibration queries at once, one public and one authenticated. Waiting\ncallers do not occupy the default AnyIO thread capacity. The `30/hour` quota\nuses a member-specific key for requests carrying the trusted MCP secret and a\nvalid on-behalf-of user, and the frontend's server-side fetch, which carries\nthe trusted X-Frontend-Secret header, gets its own key with a quota it cannot\ntrip. Other requests use the first X-Forwarded-For hop, which a caller can\nspoof, so their per-IP quota cannot bound a determined client on its own.","operationId":"public_calibration_api_transparency_calibration_get","parameters":[{"name":"sport","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by sport (mlb/nhl/epl/nfl)","title":"Sport"},"description":"Filter by sport (mlb/nhl/epl/nfl)"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Trailing window in days, ending today (max 365)","default":365,"title":"Days"},"description":"Trailing window in days, ending today (max 365)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalibrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/coverage":{"get":{"tags":["coverage"],"summary":"Get Coverage","description":"Public data-coverage report, per league, over trailing 7-day and 30-day\nwindows ending today, denominated by SCHEDULED games (never games with\nodds, which would flatter coverage). Every registry league is included.\nNo auth: this feeds the public /accuracy page. Rate-limited (see below).\n\nPer league, per window:\n\n- two-plus-books share: fraction of scheduled games where the main markets\n  (ML/Spread/Totals) drew >=2 distinct bettable bookmakers.\n- median books per market (median_books.ml / .spread / .totals): for EACH\n  main market separately, the median across the window's scheduled games\n  of the count of distinct bettable bookmakers carrying a usable two-sided\n  quote for THAT market. Each\n  market gets its own median rather than one figure unioned across ML,\n  Spread, and Totals, so a game with rich moneyline coverage can never\n  mask a bare spread or totals market the way a single combined number\n  would. A scheduled game with zero fetched rows for a market counts as 0\n  books in that market's median, not as an excluded game.\n- freshness (games_stale / stale_share): for a COMPLETED game (kickoff has\n  passed), age is measured AT KICKOFF: the last pre-kickoff quote's\n  source_fetched_at (T1.2), compared to the game's own kickoff time. This\n  is deliberate. The kickoff-freeze gate means market_lines stops being\n  touched once a game starts, so measuring a finished game's freshness\n  against query time (now) would call every finished game stale purely\n  because time has passed since kickoff. The \"last pre-kickoff quote\" is\n  itself bounded to source_fetched_at <= kickoff in the SQL, so this stays\n  correct even if the freeze gate's behavior ever changes; it can never\n  read a post-kickoff write as if it were the pre-kickoff quote. For an\n  UPCOMING game, age is query-relative: source_fetched_at compared to now.\n  A game is \"stale\" if that age exceeds 30 minutes, or if it has no\n  fetched bettable quote at all (missing data counts against coverage, it\n  is not excluded).\n- outage days: count of days in the window that had >=1 scheduled game for\n  this league but zero games with a fresh (non-stale) quote that day. This\n  intentionally reuses the same 30-minute freshness rule as games_stale,\n  which is stricter than \"the league had any fetch at all that day\": a day\n  with a fetch that was simply too old still counts as an outage day. That\n  means this figure can only ever over-report outage days relative to a\n  looser definition, never under-report one.\n\nEvery share is null, not zero, when its window has zero scheduled games\nfor that league (0/0 is undefined). Vendor last-update timestamps are not\navailable to us; see `freshness_note` on the response, which the /accuracy\npage must surface verbatim (\"as of our last fetch\", not the book's own\ntime).\n\nCached in-process for 15 minutes behind one shared key (the endpoint takes\nno parameters) with a singleflight lock, so concurrent cold requests share\none recomputation across all leagues instead of each re-running it.\nRate-limited to 30 requests/hour per IP (mirrors the public transparency\ncalibration route's posture), so even the cheap cache-hit path stays\nbounded for an anonymous caller; the singleflight lock already bounds\nconcurrent recomputation, so this is the only gap the rate limit closes.\nPass/fail thresholds for billing purposes are not computed here; they are\npreregistered separately in docs/product/product_thesis.md.","operationId":"get_coverage_api_coverage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoverageResponse"}}}}}}}},"components":{"schemas":{"AttributionIn":{"properties":{"source":{"type":"string","maxLength":120,"minLength":1,"title":"Source"},"method":{"type":"string","enum":["ref","utm","referrer"],"title":"Method"},"engine":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Engine"},"medium":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Medium"},"campaign":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Campaign"},"content":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Content"},"term":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Term"},"landing":{"type":"string","maxLength":200,"title":"Landing"},"touched_at_ms":{"type":"integer","title":"Touched At Ms"}},"type":"object","required":["source","method","landing","touched_at_ms"],"title":"AttributionIn"},"AttributionOut":{"properties":{"user_id":{"type":"string","title":"User Id"},"source":{"type":"string","title":"Source"},"method":{"type":"string","enum":["ref","utm","referrer"],"title":"Method"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"},"medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medium"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Term"},"landing":{"type":"string","title":"Landing"},"touched_at":{"type":"string","format":"date-time","title":"Touched At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","source","method","engine","medium","campaign","content","term","landing","touched_at","created_at"],"title":"AttributionOut"},"AttributionReport":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"rows":{"items":{"$ref":"#/components/schemas/AttributionReportRow"},"type":"array","title":"Rows"},"unattributed":{"$ref":"#/components/schemas/AttributionUnattributed"},"totals":{"$ref":"#/components/schemas/AttributionTotals"}},"type":"object","required":["start_date","end_date","rows","unattributed","totals"],"title":"AttributionReport"},"AttributionReportRow":{"properties":{"source":{"type":"string","title":"Source"},"method":{"type":"string","enum":["ref","utm","referrer"],"title":"Method"},"signups":{"type":"integer","title":"Signups"},"trials":{"type":"integer","title":"Trials"},"subscribed":{"type":"integer","title":"Subscribed"}},"type":"object","required":["source","method","signups","trials","subscribed"],"title":"AttributionReportRow"},"AttributionTotals":{"properties":{"signups":{"type":"integer","title":"Signups"},"trials":{"type":"integer","title":"Trials"},"subscribed":{"type":"integer","title":"Subscribed"}},"type":"object","required":["signups","trials","subscribed"],"title":"AttributionTotals"},"AttributionUnattributed":{"properties":{"trials":{"type":"integer","title":"Trials"},"subscribed":{"type":"integer","title":"Subscribed"}},"type":"object","required":["trials","subscribed"],"title":"AttributionUnattributed"},"AuditGame":{"properties":{"sport":{"type":"string","title":"Sport"},"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"home_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Runs"},"away_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Runs"},"home_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Points"},"away_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Points"},"projected_spread":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Spread"},"home_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Lambda"},"away_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Lambda"},"draw_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Pct"},"draw_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Fair Ml"},"btts_yes_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Btts Yes Pct"},"actual_home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Home Score"},"actual_away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Away Score"},"has_data":{"type":"boolean","title":"Has Data","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"preliminary_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preliminary Data"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"pipeline_run_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pipeline Run Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["sport","id","external_game_id","game_date","home_team","away_team"],"title":"AuditGame","description":"Single game with full projection data for audit."},"AuditPipelineRun":{"properties":{"id":{"type":"integer","title":"Id"},"sport":{"type":"string","title":"Sport"},"pass_type":{"type":"string","title":"Pass Type"},"game_date":{"type":"string","format":"date","title":"Game Date"},"status":{"type":"string","title":"Status"},"trigger_source":{"type":"string","title":"Trigger Source"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"games_processed":{"type":"integer","title":"Games Processed"}},"type":"object","required":["id","sport","pass_type","game_date","status","trigger_source","started_at","games_processed"],"title":"AuditPipelineRun","description":"Pipeline run summary for the audit period."},"AuditResponse":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"total_games":{"type":"integer","title":"Total Games"},"total_runs":{"type":"integer","title":"Total Runs"},"games":{"items":{"$ref":"#/components/schemas/AuditGame"},"type":"array","title":"Games"},"pipeline_runs":{"items":{"$ref":"#/components/schemas/AuditPipelineRun"},"type":"array","title":"Pipeline Runs"},"snapshots":{"anyOf":[{"items":{"$ref":"#/components/schemas/AuditSnapshot"},"type":"array"},{"type":"null"}],"title":"Snapshots"}},"type":"object","required":["start_date","end_date","total_games","total_runs","games","pipeline_runs"],"title":"AuditResponse","description":"Full audit response for a date range."},"AuditSnapshot":{"properties":{"id":{"type":"integer","title":"Id"},"sport":{"type":"string","title":"Sport"},"game_date":{"type":"string","format":"date","title":"Game Date"},"external_game_id":{"type":"string","title":"External Game Id"},"pipeline_run_id":{"type":"integer","title":"Pipeline Run Id"},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team"},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","sport","game_date","external_game_id","pipeline_run_id"],"title":"AuditSnapshot","description":"Point-in-time snapshot of a game from a specific pipeline run."},"BetResponse":{"properties":{"id":{"type":"integer","title":"Id"},"sport":{"type":"string","title":"Sport"},"game_date":{"type":"string","format":"date","title":"Game Date"},"external_game_id":{"type":"string","title":"External Game Id"},"pipeline_run_id":{"type":"integer","title":"Pipeline Run Id"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line"},"model_prob":{"type":"number","title":"Model Prob"},"book_decimal":{"type":"number","title":"Book Decimal"},"book_implied":{"type":"number","title":"Book Implied"},"edge":{"type":"number","title":"Edge"},"ev_pct":{"type":"number","title":"Ev Pct"},"fair_american":{"type":"integer","title":"Fair American"},"bookmaker":{"type":"string","title":"Bookmaker"},"units":{"type":"number","title":"Units"},"first_observed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Observed At"},"first_observed_decimal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Observed Decimal"},"first_observed_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Observed Edge"},"novig_market_prob":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Novig Market Prob"},"fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fair Edge"},"novig_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Novig Source"},"book_novig_prob":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Book Novig Prob"},"book_fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Book Fair Edge"},"book_novig_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Book Novig Source"},"sharp_novig_prob":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sharp Novig Prob"},"sharp_fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sharp Fair Edge"},"sharp_novig_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sharp Novig Source"},"lead_time_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lead Time Hours"},"lineups_confirmed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Lineups Confirmed"},"entry_fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Entry Fair Edge"},"dog_entry_decimal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dog Entry Decimal"},"dog_entry_bookmaker":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dog Entry Bookmaker"},"dog_entry_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dog Entry Edge"},"dog_entry_anchor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dog Entry Anchor"},"dog_entry_pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dog Entry Pnl"},"clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct"},"clv_prob":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Prob"},"beat_close":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close"},"clv_anchor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clv Anchor"},"clv_close_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clv Close Source"},"clv_pct_novig":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct Novig"},"beat_close_novig":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close Novig"},"clv_close_source_novig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clv Close Source Novig"},"clv_to_close":{"type":"boolean","title":"Clv To Close","default":true},"value_status":{"type":"string","title":"Value Status","default":"at_close"},"value_window_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value Window Seconds"},"result":{"type":"string","title":"Result"},"actual_home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Home Score"},"actual_away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Away Score"},"pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pnl"},"peak_pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Peak Pnl"},"graded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Graded At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","sport","game_date","external_game_id","pipeline_run_id","home_team","away_team","market","side","model_prob","book_decimal","book_implied","edge","ev_pct","fair_american","bookmaker","units","result","created_at"],"title":"BetResponse","description":"One logical bet (latest observation + earliest observation + result)."},"BetsResponse":{"properties":{"count":{"type":"integer","title":"Count"},"bets":{"items":{"$ref":"#/components/schemas/BetResponse"},"type":"array","title":"Bets"},"clv_by_market":{"items":{"$ref":"#/components/schemas/ClvMarketSummary"},"type":"array","title":"Clv By Market","default":[]},"clv_by_leadtime":{"items":{"$ref":"#/components/schemas/ClvLeadTimeSummary"},"type":"array","title":"Clv By Leadtime","default":[]}},"type":"object","required":["count","bets"],"title":"BetsResponse","description":"Response from the bets listing endpoint."},"BlackboxBaselineResponse":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sport":{"type":"string","title":"Sport"},"games":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Games"}},"type":"object","required":["date","sport","games"],"title":"BlackboxBaselineResponse","description":"The deterministic value_detection flag set at snapshot time, staged next\nto the snapshot as the checkpoint's blind baseline. Never shown to the panel."},"BlackboxLedgerResponse":{"properties":{"picks":{"items":{"$ref":"#/components/schemas/BlackboxPickOut"},"type":"array","title":"Picks"},"window_start":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Window Start"},"window_end":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Window End"},"next_cursor":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Next Cursor"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","required":["picks"],"title":"BlackboxLedgerResponse","description":"One page of the track record: the picks from N *slate* days (days that\nactually carry picks), most recent first, ending strictly before the request's\ncursor.\n\nThe window is counted in slates rather than calendar days on purpose. The panel\ncommits nothing on a slate where every candidate collides with an earlier pick,\nand MLB has real off-days, so a calendar window goes thin exactly where the\nrecord is already sparse.\n\n`next_cursor` is the oldest date on this page, and is exclusive: passing it back\nas `before` returns the page beneath this one. It is None once the record runs\nout."},"BlackboxPickOut":{"properties":{"id":{"type":"integer","title":"Id"},"sport":{"type":"string","title":"Sport"},"game_date":{"type":"string","format":"date","title":"Game Date"},"external_game_id":{"type":"string","title":"External Game Id"},"home_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team"},"away_team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team"},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line"},"bookmaker":{"type":"string","title":"Bookmaker"},"odds_taken_decimal":{"type":"number","title":"Odds Taken Decimal"},"model_probability":{"type":"number","title":"Model Probability"},"market_fair_probability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Market Fair Probability"},"edge":{"type":"number","title":"Edge"},"confidence_tier":{"type":"string","title":"Confidence Tier"},"consensus_votes":{"type":"string","title":"Consensus Votes"},"display_units":{"type":"number","title":"Display Units"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"news_sources":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"News Sources"},"model_version":{"type":"string","title":"Model Version"},"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result"},"pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pnl"},"voided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Voided At"},"void_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Void Reason"},"clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct"},"clv_status":{"type":"string","title":"Clv Status","default":"no_close_available"},"beat_close":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close"},"closing_decimal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Closing Decimal"},"clv_pct_novig":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct Novig"},"beat_close_novig":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close Novig"},"clv_close_source_novig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clv Close Source Novig"},"closing_fair_decimal_novig":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Closing Fair Decimal Novig"},"dissent_reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dissent Reasoning"}},"type":"object","required":["id","sport","game_date","external_game_id","market","side","bookmaker","odds_taken_decimal","model_probability","edge","confidence_tier","consensus_votes","display_units","model_version","generated_at"],"title":"BlackboxPickOut","description":"A committed pick with its graded outcome and derived P&L / CLV."},"BlackboxPicksResponse":{"properties":{"featured_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Featured Date"},"picks":{"items":{"$ref":"#/components/schemas/BlackboxPickOut"},"type":"array","title":"Picks"},"summary":{"$ref":"#/components/schemas/TrackRecordSummary"},"disclaimers":{"items":{"type":"string"},"type":"array","title":"Disclaimers"}},"type":"object","required":["picks","summary","disclaimers"],"title":"BlackboxPicksResponse","description":"The featured slate plus the whole-record summary. Deliberately carries NO\nledger: the history is paged by GET /api/picks/blackbox/ledger, so arriving on\nthe page no longer serialises every reasoning paragraph ever written."},"CalibrationResponse":{"properties":{"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"sport":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sport"},"below_floor":{"type":"boolean","title":"Below Floor","default":false},"value_flags_gated":{"type":"boolean","title":"Value Flags Gated","default":false},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"overall":{"$ref":"#/components/schemas/MarketCalibration"},"by_market":{"items":{"$ref":"#/components/schemas/MarketCalibration"},"type":"array","title":"By Market"}},"type":"object","required":["start_date","end_date","sport","overall","by_market"],"title":"CalibrationResponse","description":"Post-selection calibration over graded bets in a date range."},"CandidateIn":{"properties":{"line_id":{"type":"string","title":"Line Id"},"external_game_id":{"type":"string","title":"External Game Id"},"market":{"type":"string","title":"Market"},"selection":{"type":"string","title":"Selection"},"scores":{"items":{"$ref":"#/components/schemas/JudgeScore"},"type":"array","title":"Scores","default":[]},"news_sources":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"News Sources","default":[]}},"type":"object","required":["line_id","external_game_id","market","selection"],"title":"CandidateIn","description":"A pooled candidate (round 1) with the full panel's scores (round 2)."},"CloseEconomics":{"properties":{"n":{"type":"integer","title":"N"},"avg_vig_pts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Vig Pts"},"avg_move_pts":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Move Pts"},"avg_net_pts_at_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Net Pts At Close"}},"type":"object","required":["n"],"title":"CloseEconomics","description":"Where the money goes between entry and close, in probability points\n(x100), averaged over close-covered picks: vig paid at entry, line movement\ncaptured, and the net EV edge left at the close. Movement has to beat vig\nfor the record to have a chance; Design B captured +1.6 while paying +2.8."},"ClvLeadTimeSummary":{"properties":{"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"bucket":{"type":"string","title":"Bucket"},"n":{"type":"integer","title":"N"},"avg_clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Clv Pct"},"pct_beat_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Beat Close"}},"type":"object","required":["market","side","bucket","n"],"title":"ClvLeadTimeSummary","description":"Per (market, side, lead-time bucket) CLV rollup over the returned bets\n(issue #99).\n\nBuckets are CLV_LEADTIME_BUCKETS above plus CLV_LEADTIME_UNKNOWN (no\ngame_time_utc) and CLV_LEADTIME_POST_START (entry after first pitch); the\nlatter two are emitted only when nonzero, while every standard bucket is\nemitted for each (market, side) seen, n=0 included, so a thin cell is\nvisible as thin rather than missing. Split by side because one-sided bleeds\ncancel at the market level. Same trust gate as clv_by_market\n(clv_to_close only), and per market the bucket n-sums equal\nclv_by_market.n. Computed over whatever date range was queried; never\nstored."},"ClvMarketSummary":{"properties":{"market":{"type":"string","title":"Market"},"n":{"type":"integer","title":"N"},"avg_clv_pct":{"type":"number","title":"Avg Clv Pct"},"pct_beat_close":{"type":"number","title":"Pct Beat Close"},"n_lineup_anchored":{"type":"integer","title":"N Lineup Anchored"},"n_kalshi_close":{"type":"integer","title":"N Kalshi Close","default":0}},"type":"object","required":["market","n","avg_clv_pct","pct_beat_close","n_lineup_anchored"],"title":"ClvMarketSummary","description":"Per-market closing line value rollup over the returned bets."},"ClvSummary":{"properties":{"n_with_clv":{"type":"integer","title":"N With Clv"},"avg_clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Clv Pct"},"pct_beat_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Beat Close"}},"type":"object","required":["n_with_clv"],"title":"ClvSummary","description":"One anchor's CLV rollup (raw same-book OR no-vig), never blended together."},"ContactSubmission":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"format":"email","title":"Email"},"subject":{"type":"string","maxLength":200,"minLength":1,"title":"Subject"},"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message"},"turnstile_token":{"type":"string","maxLength":4096,"minLength":1,"title":"Turnstile Token"},"website":{"type":"string","maxLength":200,"title":"Website","default":""}},"type":"object","required":["name","email","subject","message","turnstile_token"],"title":"ContactSubmission"},"ContactSubmissionResponse":{"properties":{"status":{"type":"string","title":"Status"},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id"}},"type":"object","required":["status"],"title":"ContactSubmissionResponse"},"CoverageResponse":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At"},"freshness_note":{"type":"string","title":"Freshness Note"},"leagues":{"items":{"$ref":"#/components/schemas/LeagueCoverage"},"type":"array","title":"Leagues"}},"type":"object","required":["generated_at","freshness_note","leagues"],"title":"CoverageResponse"},"DigestResponse":{"properties":{"digest":{"additionalProperties":true,"type":"object","title":"Digest"}},"type":"object","required":["digest"],"title":"DigestResponse","description":"Outcome-feedback digest (v2): the panel's own calibration record, staged\nalongside the snapshot so the routine can inject it as <TRACK_RECORD>."},"DogEdgeClvSummary":{"properties":{"n_with_clv":{"type":"integer","title":"N With Clv"},"avg_clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Clv Pct"},"pct_beat_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pct Beat Close"}},"type":"object","required":["n_with_clv"],"title":"DogEdgeClvSummary","description":"One anchor's CLV rollup (soft-book OR sharp), never blended together."},"DogHypothesisCloseGap":{"properties":{"n_available":{"type":"integer","title":"N Available"},"n_missing":{"type":"integer","title":"N Missing"},"mean_entry_to_close_prob":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Entry To Close Prob"}},"type":"object","required":["n_available","n_missing"],"title":"DogHypothesisCloseGap","description":"Entry-vs-close sharp-prob gap, reported separately from the frozen record.\n\nThe close is the per-identity sharp-anchored (Pinnacle no-vig) close from the\nWS1 ``market_lines`` machinery. A missing close is counted unavailable and is\nnever backfilled from a carried observation."},"DogHypothesisDevigCohort":{"properties":{"method":{"type":"string","title":"Method"},"is_primary":{"type":"boolean","title":"Is Primary"},"n_members":{"type":"integer","title":"N Members"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"pending":{"type":"integer","title":"Pending"},"actual_minus_sharp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Minus Sharp"}},"type":"object","required":["method","is_primary","n_members","wins","losses","pending"],"title":"DogHypothesisDevigCohort","description":"One de-vig method's cohort over the SAME frozen raw pairs.\n\n``is_primary`` marks the preregistered proportional cohort; the Shin and\npower cohorts are sensitivity-only and never mixed into the primary record."},"EdgeBin":{"properties":{"lo":{"type":"number","title":"Lo"},"hi":{"type":"number","title":"Hi"},"n":{"type":"integer","title":"N"},"mean_claimed_edge":{"type":"number","title":"Mean Claimed Edge"},"realized_edge":{"type":"number","title":"Realized Edge"},"shrink_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Shrink Ratio"}},"type":"object","required":["lo","hi","n","mean_claimed_edge","realized_edge","shrink_ratio"],"title":"EdgeBin","description":"One claimed-edge bucket: claimed vs realized edge (the shrinkage curve)."},"EplGameDetail":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"matchweek":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matchweek"},"home_lineup_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Lineup Confidence"},"away_lineup_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Lineup Confidence"},"is_derby":{"type":"boolean","title":"Is Derby","default":false},"home_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Lambda"},"away_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Lambda"},"draw_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Pct"},"draw_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Fair Ml"},"btts_yes_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Btts Yes Pct"},"has_data":{"type":"boolean","title":"Has Data","default":false},"preliminary_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preliminary Data"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"EplGameDetail","description":"Full game detail including projection JSONB."},"EplGameSummary":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"matchweek":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Matchweek"},"home_lineup_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Lineup Confidence"},"away_lineup_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Lineup Confidence"},"is_derby":{"type":"boolean","title":"Is Derby","default":false},"home_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Lambda"},"away_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Lambda"},"draw_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Pct"},"draw_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Draw Fair Ml"},"btts_yes_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Btts Yes Pct"},"has_data":{"type":"boolean","title":"Has Data","default":false}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"EplGameSummary","description":"Compact game info for the slate grid."},"EplSlateResponse":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sport":{"type":"string","title":"Sport","default":"epl"},"run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Status"},"run_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run Completed At"},"games":{"items":{"$ref":"#/components/schemas/EplGameSummary"},"type":"array","title":"Games"}},"type":"object","required":["date","games"],"title":"EplSlateResponse"},"GameLineHistoryResponse":{"properties":{"sport":{"type":"string","title":"Sport"},"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"line":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Line"},"player":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player"},"books":{"items":{"type":"string"},"type":"array","title":"Books","default":[]},"points":{"items":{"$ref":"#/components/schemas/SnapshotLinePoint"},"type":"array","title":"Points","default":[]}},"type":"object","required":["sport","market","side"],"title":"GameLineHistoryResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestRequest":{"properties":{"slate_date":{"type":"string","format":"date","title":"Slate Date"},"sport":{"type":"string","title":"Sport","default":"mlb"},"snapshot_hash":{"type":"string","title":"Snapshot Hash"},"model_version":{"type":"string","title":"Model Version"},"n_judges":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"N Judges"},"candidates":{"items":{"$ref":"#/components/schemas/CandidateIn"},"type":"array","title":"Candidates"}},"type":"object","required":["slate_date","snapshot_hash","model_version","candidates"],"title":"IngestRequest"},"IngestResponse":{"properties":{"snapshot_id":{"type":"integer","title":"Snapshot Id"},"created":{"type":"integer","title":"Created"},"already_committed":{"type":"boolean","title":"Already Committed"},"picks":{"items":{"$ref":"#/components/schemas/BlackboxPickOut"},"type":"array","title":"Picks"}},"type":"object","required":["snapshot_id","created","already_committed","picks"],"title":"IngestResponse"},"JudgeScore":{"properties":{"judge_index":{"type":"integer","title":"Judge Index"},"probability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Probability"},"bet":{"type":"boolean","title":"Bet","default":false},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning"},"expected_bf":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Bf"},"k_pct_adj":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"K Pct Adj"},"expected_home_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Home Runs"},"expected_away_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Away Runs"}},"type":"object","required":["judge_index"],"title":"JudgeScore","description":"One panel judge's evaluation of one candidate (round 2)."},"LeagueCoverage":{"properties":{"league":{"type":"string","title":"League"},"label":{"type":"string","title":"Label"},"window_7d":{"$ref":"#/components/schemas/WindowCoverage"},"window_30d":{"$ref":"#/components/schemas/WindowCoverage"}},"type":"object","required":["league","label","window_7d","window_30d"],"title":"LeagueCoverage"},"MarketCalibration":{"properties":{"market":{"type":"string","title":"Market"},"n_graded":{"type":"integer","title":"N Graded"},"brier":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier"},"calibration_error":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Calibration Error"},"base_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Base Rate"},"brier_baseline":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Baseline"},"brier_skill":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Skill"},"mean_claimed_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mean Claimed Edge"},"realized_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Realized Edge"},"suggested_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Suggested Lambda"},"reliability":{"items":{"$ref":"#/components/schemas/ReliabilityBin"},"type":"array","title":"Reliability"},"edge_bins":{"items":{"$ref":"#/components/schemas/EdgeBin"},"type":"array","title":"Edge Bins"}},"type":"object","required":["market","n_graded","brier","calibration_error","mean_claimed_edge","realized_edge","suggested_lambda","reliability","edge_bins"],"title":"MarketCalibration","description":"Calibration rollup for one market (or 'overall')."},"MedianBooksByMarket":{"properties":{"ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ml"},"spread":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Spread"},"totals":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Totals"}},"type":"object","required":["ml","spread","totals"],"title":"MedianBooksByMarket","description":"Median count of distinct bettable bookmakers per game,\ncomputed separately for each main market rather than one figure unioned\nacross ML/Spread/Totals, so rich moneyline coverage can never mask a bare\nspread or totals market (see get_coverage's docstring). Each field is None,\nnot 0, only when its window has zero scheduled games (0/0 is undefined);\na scheduled game with zero fetched rows for a market still contributes 0\nto that market's median."},"MlbDogEdgeResponse":{"properties":{"window_start":{"type":"string","format":"date","title":"Window Start"},"window_end":{"type":"string","format":"date","title":"Window End"},"bets":{"items":{"$ref":"#/components/schemas/MlbDogEdgeRow"},"type":"array","title":"Bets"},"summary":{"$ref":"#/components/schemas/MlbDogEdgeSummary"},"disclaimers":{"items":{"type":"string"},"type":"array","title":"Disclaimers"}},"type":"object","required":["window_start","window_end","bets","summary","disclaimers"],"title":"MlbDogEdgeResponse"},"MlbDogEdgeRow":{"properties":{"id":{"type":"integer","title":"Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"external_game_id":{"type":"string","title":"External Game Id"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"side":{"type":"string","title":"Side"},"bookmaker":{"type":"string","title":"Bookmaker"},"book_decimal":{"type":"number","title":"Book Decimal"},"first_observed_decimal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"First Observed Decimal"},"units":{"type":"number","title":"Units"},"entry_fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Entry Fair Edge"},"fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fair Edge"},"sharp_fair_edge":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sharp Fair Edge"},"clv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct"},"beat_close":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close"},"clv_to_close":{"type":"boolean","title":"Clv To Close","default":true},"clv_pct_novig":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Clv Pct Novig"},"beat_close_novig":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beat Close Novig"},"result":{"type":"string","title":"Result"},"pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Pnl"}},"type":"object","required":["id","game_date","external_game_id","home_team","away_team","side","bookmaker","book_decimal","units","result"],"title":"MlbDogEdgeRow","description":"One qualifying dog-edge play, both de-vig anchors side by side."},"MlbDogEdgeSummary":{"properties":{"n_picks":{"type":"integer","title":"N Picks"},"n_graded":{"type":"integer","title":"N Graded"},"n_pending":{"type":"integer","title":"N Pending"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"pushes":{"type":"integer","title":"Pushes"},"voids":{"type":"integer","title":"Voids"},"units_staked":{"type":"number","title":"Units Staked"},"units_pnl":{"type":"number","title":"Units Pnl"},"roi_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Pct"},"clv_soft":{"$ref":"#/components/schemas/DogEdgeClvSummary"},"clv_sharp":{"$ref":"#/components/schemas/DogEdgeClvSummary"},"n_active_days":{"type":"integer","title":"N Active Days"},"avg_qualifying_per_day":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Qualifying Per Day"},"sample_size_label":{"type":"string","title":"Sample Size Label"}},"type":"object","required":["n_picks","n_graded","n_pending","wins","losses","pushes","voids","units_staked","units_pnl","clv_soft","clv_sharp","n_active_days","sample_size_label"],"title":"MlbDogEdgeSummary","description":"CLV-first rollup for the pocket; ROI is at the taken soft-book price."},"MlbDogHypothesisResponse":{"properties":{"cohort_epoch":{"type":"string","format":"date-time","title":"Cohort Epoch"},"gate":{"type":"string","title":"Gate"},"n_hypothesis":{"type":"integer","title":"N Hypothesis"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"pending":{"type":"integer","title":"Pending"},"actual_minus_sharp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Minus Sharp"},"devig_methods":{"items":{"$ref":"#/components/schemas/DogHypothesisDevigCohort"},"type":"array","title":"Devig Methods"},"n_executable":{"type":"integer","title":"N Executable"},"executable_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Executable Share"},"n_sharp_only":{"type":"integer","title":"N Sharp Only"},"pnl_units":{"type":"number","title":"Pnl Units"},"pnl_n":{"type":"integer","title":"Pnl N"},"close_gap":{"$ref":"#/components/schemas/DogHypothesisCloseGap"},"disclaimers":{"items":{"type":"string"},"type":"array","title":"Disclaimers","default":[]}},"type":"object","required":["cohort_epoch","gate","n_hypothesis","wins","losses","pending","devig_methods","n_executable","n_sharp_only","pnl_units","pnl_n","close_gap"],"title":"MlbDogHypothesisResponse","description":"Frozen-entry MLB dog-hypothesis cohort record (feeds the T11.4 gate).\n\nTop-level ``wins`` / ``losses`` / ``pending`` / ``actual_minus_sharp`` are the\nPRIMARY (proportional) cohort; ``devig_methods`` carries all three cohorts so\nthe sensitivity read stays inspectable but distinct. Flat 1u P&L is over the\nexecutable subset only, at each member's frozen executable decimal."},"MlbGameDetail":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"game_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Game Number"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue"},"home_pitcher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Pitcher Name"},"away_pitcher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Pitcher Name"},"hp_umpire_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hp Umpire Name"},"home_lineup_confirmed":{"type":"boolean","title":"Home Lineup Confirmed","default":false},"away_lineup_confirmed":{"type":"boolean","title":"Away Lineup Confirmed","default":false},"home_bullpen_game":{"type":"boolean","title":"Home Bullpen Game","default":false},"away_bullpen_game":{"type":"boolean","title":"Away Bullpen Game","default":false},"home_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Runs"},"away_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Runs"},"has_data":{"type":"boolean","title":"Has Data","default":false},"preliminary_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preliminary Data"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"MlbGameDetail","description":"Full game detail including projection JSONB."},"MlbGameSummary":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"game_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Game Number"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue"},"home_pitcher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Pitcher Name"},"away_pitcher_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Pitcher Name"},"hp_umpire_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hp Umpire Name"},"home_lineup_confirmed":{"type":"boolean","title":"Home Lineup Confirmed","default":false},"away_lineup_confirmed":{"type":"boolean","title":"Away Lineup Confirmed","default":false},"home_bullpen_game":{"type":"boolean","title":"Home Bullpen Game","default":false},"away_bullpen_game":{"type":"boolean","title":"Away Bullpen Game","default":false},"home_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Runs"},"away_projected_runs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Runs"},"has_data":{"type":"boolean","title":"Has Data","default":false}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"MlbGameSummary","description":"Compact game info for the slate grid."},"MlbSlateResponse":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sport":{"type":"string","title":"Sport","default":"mlb"},"run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Status"},"run_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run Completed At"},"games":{"items":{"$ref":"#/components/schemas/MlbGameSummary"},"type":"array","title":"Games"}},"type":"object","required":["date","games"],"title":"MlbSlateResponse"},"NflGameDetail":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"home_team_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team Code"},"away_team_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team Code"},"stadium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stadium"},"season":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season"},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week"},"projected_spread":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Spread"},"home_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Points"},"away_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Points"},"inactives_confirmed":{"type":"boolean","title":"Inactives Confirmed","default":false},"data_stale":{"type":"boolean","title":"Data Stale","default":false},"home_starting_qb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Starting Qb"},"away_starting_qb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Starting Qb"},"home_listed_qb_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Listed Qb Out"},"away_listed_qb_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Listed Qb Out"},"has_data":{"type":"boolean","title":"Has Data","default":false},"preliminary_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preliminary Data"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"NflGameDetail","description":"Full game detail: the projection blobs plus the market board.\n\n``odds_data`` is inherited from the summary. It comes off the same\n``nfl_games`` row as the projection, since the promotion finished on\n2026-08-26."},"NflGameSummary":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"home_team_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Team Code"},"away_team_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Team Code"},"stadium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stadium"},"season":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season"},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week"},"projected_spread":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Spread"},"home_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Projected Points"},"away_projected_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Projected Points"},"inactives_confirmed":{"type":"boolean","title":"Inactives Confirmed","default":false},"data_stale":{"type":"boolean","title":"Data Stale","default":false},"home_starting_qb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Starting Qb"},"away_starting_qb":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Starting Qb"},"home_listed_qb_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Listed Qb Out"},"away_listed_qb_out":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Listed Qb Out"},"has_data":{"type":"boolean","title":"Has Data","default":false}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"NflGameSummary","description":"Compact game info for the slate grid. Projection fields only."},"NflSlateResponse":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sport":{"type":"string","title":"Sport","default":"nfl"},"run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Status"},"run_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run Completed At"},"games":{"items":{"$ref":"#/components/schemas/NflGameSummary"},"type":"array","title":"Games"}},"type":"object","required":["date","games"],"title":"NflSlateResponse"},"NflWatchCellResponse":{"properties":{"market":{"type":"string","title":"Market"},"side":{"type":"string","title":"Side"},"source":{"type":"string","title":"Source"},"gated":{"type":"boolean","title":"Gated"},"n_recorded":{"type":"integer","title":"N Recorded"},"n_graded":{"type":"integer","title":"N Graded"},"n_wins":{"type":"integer","title":"N Wins"},"n_pushes":{"type":"integer","title":"N Pushes"},"n_scored":{"type":"integer","title":"N Scored"},"n_skipped_no_close":{"type":"integer","title":"N Skipped No Close"},"skips_by_reason":{"additionalProperties":{"type":"integer"},"type":"object","title":"Skips By Reason"},"brier_model":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Model"},"brier_close":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Close"},"brier_diff":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Diff"},"brier_diff_se":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier Diff Se"},"brier_t":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Brier T"},"roi_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Pct"},"roi_sd_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Sd Pct"},"roi_se_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Se Pct"},"roi_low_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Low Pct"},"roi_high_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi High Pct"},"verdict":{"type":"string","title":"Verdict"},"ungate_candidate":{"type":"boolean","title":"Ungate Candidate"},"regate_look":{"type":"boolean","title":"Regate Look"},"reasons":{"items":{"type":"string"},"type":"array","title":"Reasons"}},"type":"object","required":["market","side","source","gated","n_recorded","n_graded","n_wins","n_pushes","n_scored","n_skipped_no_close","skips_by_reason","brier_model","brier_close","brier_diff","brier_diff_se","brier_t","roi_pct","roi_sd_pct","roi_se_pct","roi_low_pct","roi_high_pct","verdict","ungate_candidate","regate_look","reasons"],"title":"NflWatchCellResponse","description":"One market-side cell's reading. Return figures are in percent points."},"NflWatchResponse":{"properties":{"season":{"type":"integer","title":"Season"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"type":"string","format":"date","title":"End Date"},"readable_n":{"type":"integer","title":"Readable N"},"proper_score_se_bar":{"type":"number","title":"Proper Score Se Bar"},"roi_interval_z":{"type":"number","title":"Roi Interval Z"},"n_rows":{"type":"integer","title":"N Rows"},"n_suppressed_rows":{"type":"integer","title":"N Suppressed Rows"},"cells":{"items":{"$ref":"#/components/schemas/NflWatchCellResponse"},"type":"array","title":"Cells"},"notes":{"items":{"type":"string"},"type":"array","title":"Notes"}},"type":"object","required":["season","start_date","end_date","readable_n","proper_score_se_bar","roi_interval_z","n_rows","n_suppressed_rows","cells","notes"],"title":"NflWatchResponse","description":"The whole watch for one season through one date."},"NflWeekPipelineTriggerResponse":{"properties":{"status":{"type":"string","title":"Status"},"dates":{"items":{"type":"string","format":"date"},"type":"array","title":"Dates"},"message":{"type":"string","title":"Message"}},"type":"object","required":["status","dates","message"],"title":"NflWeekPipelineTriggerResponse"},"NhlGameDetail":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"arena":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arena"},"home_goalie_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Goalie Name"},"home_goalie_sv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Goalie Sv Pct"},"home_goalie_confirmed":{"type":"boolean","title":"Home Goalie Confirmed","default":false},"away_goalie_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Goalie Name"},"away_goalie_sv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Goalie Sv Pct"},"away_goalie_confirmed":{"type":"boolean","title":"Away Goalie Confirmed","default":false},"home_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Lambda"},"away_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Lambda"},"has_data":{"type":"boolean","title":"Has Data","default":false},"preliminary_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preliminary Data"},"projection_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Projection Data"}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"NhlGameDetail","description":"Full game detail including projection JSONB."},"NhlGameSummary":{"properties":{"id":{"type":"integer","title":"Id"},"external_game_id":{"type":"string","title":"External Game Id"},"game_date":{"type":"string","format":"date","title":"Game Date"},"home_team":{"type":"string","title":"Home Team"},"away_team":{"type":"string","title":"Away Team"},"projected_total":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Projected Total"},"home_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Win Pct"},"away_win_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Win Pct"},"home_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Fair Ml"},"away_fair_ml":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Fair Ml"},"odds_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Odds Data"},"home_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Home Score"},"away_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Away Score"},"is_final":{"type":"boolean","title":"Is Final","default":false},"has_projection":{"type":"boolean","title":"Has Projection","default":false},"locked":{"type":"boolean","title":"Locked","default":false},"game_time_utc":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Game Time Utc"},"arena":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Arena"},"home_goalie_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Goalie Name"},"home_goalie_sv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Goalie Sv Pct"},"home_goalie_confirmed":{"type":"boolean","title":"Home Goalie Confirmed","default":false},"away_goalie_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Away Goalie Name"},"away_goalie_sv_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Goalie Sv Pct"},"away_goalie_confirmed":{"type":"boolean","title":"Away Goalie Confirmed","default":false},"home_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Home Lambda"},"away_lambda":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Away Lambda"},"has_data":{"type":"boolean","title":"Has Data","default":false}},"type":"object","required":["id","external_game_id","game_date","home_team","away_team"],"title":"NhlGameSummary","description":"Compact game info for the slate grid."},"NhlLineupObservationResponse":{"properties":{"external_game_id":{"type":"string","title":"External Game Id"},"team_abbrev":{"type":"string","title":"Team Abbrev"},"player_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Player Id"},"player_name":{"type":"string","title":"Player Name"},"position":{"type":"string","title":"Position"},"status":{"type":"string","title":"Status"},"source":{"type":"string","title":"Source"},"source_url":{"type":"string","title":"Source Url"},"source_published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Source Published At"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"}},"type":"object","required":["external_game_id","team_abbrev","player_id","player_name","position","status","source","source_url","source_published_at","observed_at"],"title":"NhlLineupObservationResponse","description":"One timestamped NHL lineup observation from an external source."},"NhlSlateResponse":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"sport":{"type":"string","title":"Sport","default":"nhl"},"run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Status"},"run_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run Completed At"},"games":{"items":{"$ref":"#/components/schemas/NhlGameSummary"},"type":"array","title":"Games"}},"type":"object","required":["date","games"],"title":"NhlSlateResponse"},"PipelineRunResponse":{"properties":{"id":{"type":"integer","title":"Id"},"sport":{"type":"string","title":"Sport"},"pass_type":{"type":"string","title":"Pass Type"},"game_date":{"type":"string","format":"date","title":"Game Date"},"status":{"type":"string","title":"Status"},"trigger_source":{"type":"string","title":"Trigger Source"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"games_processed":{"type":"integer","title":"Games Processed"},"games_odds_refreshed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Games Odds Refreshed"}},"type":"object","required":["id","sport","pass_type","game_date","status","trigger_source","started_at","games_processed"],"title":"PipelineRunResponse"},"PipelineTriggerResponse":{"properties":{"run_id":{"type":"integer","title":"Run Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["run_id","status","message"],"title":"PipelineTriggerResponse"},"RecheckResponse":{"properties":{"checked":{"type":"integer","title":"Checked"},"voided":{"type":"integer","title":"Voided"},"skipped_no_data":{"type":"integer","title":"Skipped No Data"}},"type":"object","required":["checked","voided","skipped_no_data"],"title":"RecheckResponse","description":"Pre-start market re-check counts for one cron tick (v2)."},"ReliabilityBin":{"properties":{"lo":{"type":"number","title":"Lo"},"hi":{"type":"number","title":"Hi"},"n":{"type":"integer","title":"N"},"mean_predicted":{"type":"number","title":"Mean Predicted"},"observed_rate":{"type":"number","title":"Observed Rate"}},"type":"object","required":["lo","hi","n","mean_predicted","observed_rate"],"title":"ReliabilityBin","description":"One probability decile: predicted vs observed for graded bets."},"SnapshotLinePoint":{"properties":{"observed_at":{"type":"string","format":"date-time","title":"Observed At"},"prices":{"additionalProperties":{"type":"number"},"type":"object","title":"Prices","default":{}}},"type":"object","required":["observed_at"],"title":"SnapshotLinePoint","description":"One snapshot's per-book prices for a line. prices maps bookmaker ->\ndecimal odds for the requested side; a book absent from the map didn't quote\nthat side at that snapshot."},"SnapshotResponse":{"properties":{"snapshot":{"additionalProperties":true,"type":"object","title":"Snapshot"},"content_hash":{"type":"string","title":"Content Hash"},"snapshot_id":{"type":"integer","title":"Snapshot Id"}},"type":"object","required":["snapshot","content_hash","snapshot_id"],"title":"SnapshotResponse","description":"The raw-only snapshot the routine reasons over, plus its stored hash."},"SubscriptionCreate":{"properties":{"tier":{"type":"string","enum":["game","lineups","starting_soon","logged_bets"],"title":"Tier"},"sport":{"type":"string","enum":["mlb","nhl","epl","nfl"],"title":"Sport"},"external_game_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Game Id"},"game_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Game Date"}},"type":"object","required":["tier","sport"],"title":"SubscriptionCreate"},"SubscriptionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"tier":{"type":"string","enum":["game","lineups","starting_soon","logged_bets"],"title":"Tier"},"sport":{"type":"string","enum":["mlb","nhl","epl","nfl"],"title":"Sport"},"external_game_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Game Id"},"game_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Game Date"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"unsubscribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unsubscribed At"}},"type":"object","required":["id","tier","sport","active","created_at"],"title":"SubscriptionResponse"},"SubscriptionsListResponse":{"properties":{"count":{"type":"integer","title":"Count"},"email":{"type":"string","title":"Email"},"subscriptions":{"items":{"$ref":"#/components/schemas/SubscriptionResponse"},"type":"array","title":"Subscriptions"}},"type":"object","required":["count","email","subscriptions"],"title":"SubscriptionsListResponse"},"TierSummary":{"properties":{"tier":{"type":"string","title":"Tier"},"n_picks":{"type":"integer","title":"N Picks"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"half_wins":{"type":"integer","title":"Half Wins","default":0},"half_losses":{"type":"integer","title":"Half Losses","default":0},"pushes":{"type":"integer","title":"Pushes"},"n_voided":{"type":"integer","title":"N Voided","default":0},"units_pnl":{"type":"number","title":"Units Pnl"},"roi_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Pct"},"clv_soft":{"$ref":"#/components/schemas/ClvSummary"},"clv_sharp":{"$ref":"#/components/schemas/ClvSummary"}},"type":"object","required":["tier","n_picks","wins","losses","pushes","units_pnl","clv_soft","clv_sharp"],"title":"TierSummary","description":"One conviction tier's record (conviction publishing, ADR 0002). Scoped\nto Design C picks: the tier names describe a vote split, and blending the\nretired Design B ledger's EV-derived labels into them would misstate both.\nThe blended whole-window record stays on TrackRecordSummary next to this."},"TrackRecordSummary":{"properties":{"n_picks":{"type":"integer","title":"N Picks"},"n_graded":{"type":"integer","title":"N Graded"},"n_pending":{"type":"integer","title":"N Pending"},"wins":{"type":"integer","title":"Wins"},"losses":{"type":"integer","title":"Losses"},"half_wins":{"type":"integer","title":"Half Wins","default":0},"half_losses":{"type":"integer","title":"Half Losses","default":0},"pushes":{"type":"integer","title":"Pushes"},"voids":{"type":"integer","title":"Voids"},"n_voided":{"type":"integer","title":"N Voided","default":0},"units_staked":{"type":"number","title":"Units Staked"},"units_pnl":{"type":"number","title":"Units Pnl"},"roi_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Roi Pct"},"clv_soft":{"$ref":"#/components/schemas/ClvSummary"},"clv_sharp":{"$ref":"#/components/schemas/ClvSummary"},"close_economics":{"$ref":"#/components/schemas/CloseEconomics"},"by_tier":{"items":{"$ref":"#/components/schemas/TierSummary"},"type":"array","title":"By Tier","default":[]},"n_no_close":{"type":"integer","title":"N No Close","default":0},"n_delisted":{"type":"integer","title":"N Delisted","default":0},"n_awaiting_close":{"type":"integer","title":"N Awaiting Close","default":0},"sample_size_label":{"type":"string","title":"Sample Size Label"}},"type":"object","required":["n_picks","n_graded","n_pending","wins","losses","pushes","voids","units_staked","units_pnl","clv_soft","clv_sharp","close_economics","sample_size_label"],"title":"TrackRecordSummary"},"UnsubscribeResponse":{"properties":{"status":{"type":"string","enum":["unsubscribed","already_inactive"],"title":"Status"},"subscription_id":{"type":"integer","title":"Subscription Id"},"description":{"type":"string","title":"Description","description":"Human-readable description of what was unsubscribed"}},"type":"object","required":["status","subscription_id","description"],"title":"UnsubscribeResponse"},"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"},"WindowCoverage":{"properties":{"games_scheduled":{"type":"integer","title":"Games Scheduled"},"games_with_2plus_books":{"type":"integer","title":"Games With 2Plus Books"},"two_plus_books_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Two Plus Books Share"},"median_books":{"$ref":"#/components/schemas/MedianBooksByMarket"},"games_stale":{"type":"integer","title":"Games Stale"},"stale_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Stale Share"},"outage_days":{"type":"integer","title":"Outage Days"}},"type":"object","required":["games_scheduled","games_with_2plus_books","two_plus_books_share","median_books","games_stale","stale_share","outage_days"],"title":"WindowCoverage","description":"One league's coverage metrics over one trailing window.\n\nEvery count is denominated by SCHEDULED games in the window, never\ngames-with-odds (which would flatter coverage). A league with zero\nscheduled games in the window still appears, with games_scheduled=0 and\nevery *_share field None (0/0 is undefined, not 0%)."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}