{"openapi":"3.1.0","info":{"title":"fbdata","description":"Point-in-time NFL data and prediction-ready leaderboards for autonomous models.","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","description":"Liveness and data freshness, cheap enough to poll every few seconds.\n\nDeliberately does not render a page or touch every dataset. A health check\nthat costs as much as a real request gets sampled less often, which defeats\nthe point.\n\nReports 200 whenever the process can answer and the historical store is\nreadable. Stale live prices are a warning rather than a failure: on\nCloudflare the container boots with whatever the image carries and repairs\nitself on the next poll, and taking the site out of rotation for that would\nturn a cosmetic problem into an outage.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}}}},"/v1/leaders/{table}":{"get":{"summary":"Leaders Api","description":"Leaderboards as JSON or CSV, driven by the same SPECS as the HTML tables.\n\nSharing the spec is the point: a column added to the site appears in the API\nin the same commit, so the two surfaces cannot drift into disagreeing about\nwhat a metric is called or which direction is good.","operationId":"leaders_api_v1_leaders__table__get","parameters":[{"name":"table","in":"path","required":true,"schema":{"type":"string","title":"Table"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/futures":{"get":{"summary":"Futures Board","description":"Championship futures as consensus probability, with the vig removed.\n\nQuoted outright prices are not probabilities: summed across the field they\nexceed 100% by the book's margin. This devigs each book's board, takes the\nmedian across books, and reports the fair price at that consensus so a\nquoted number can be judged against it.","operationId":"futures_board_v1_futures_get","parameters":[{"name":"future_type","in":"query","required":false,"schema":{"type":"string","description":"super_bowl | afc | nfc","default":"super_bowl","title":"Future Type"},"description":"super_bowl | afc | nfc"},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601. Omit for latest.","title":"As Of"},"description":"ISO-8601. Omit for latest."},{"name":"min_books","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":1,"title":"Min Books"}},{"name":"prior_season","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Season for the efficiency prior.","title":"Prior Season"},"description":"Season for the efficiency prior."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":64,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Futures Board V1 Futures Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/futures/model":{"get":{"summary":"Futures Model","description":"Championship probability from a simulated season, not from a price.\n\n`/v1/futures` reports what the market thinks. This plays the season out:\nratings drive 272 scheduled games, wins drive division races and seeding,\nand the bracket drives a champion, counted over tens of thousands of runs.\n\nBecause it simulates the real structure, every column is mutually consistent\n-- title, conference, division, playoff and seed probabilities all come from\nthe same runs, so they agree with each other by construction rather than by\nbeing reconciled afterwards.\n\n`market_weight` is the dial that matters. Ratings are fitted so that\nsimulating them reproduces the futures board, then blended with the\nprior-season efficiency prior on the rating scale. At 1.0 the output restates\nthe market in richer form; at 0.0 it is last season's efficiency with no\nknowledge of the offseason; the default leans heavily on the market because\nthe market has seen the roster and the prior has not. `edge` is the model\nminus the market, and it is only meaningful below 1.0.","operationId":"futures_model_v1_futures_model_get","parameters":[{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Season to simulate. Defaults to the latest scheduled.","title":"Season"},"description":"Season to simulate. Defaults to the latest scheduled."},{"name":"prior_season","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Season supplying the efficiency prior.","title":"Prior Season"},"description":"Season supplying the efficiency prior."},{"name":"market_weight","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"description":"0 = efficiency only, 1 = reproduce the futures board.","default":0.8,"title":"Market Weight"},"description":"0 = efficiency only, 1 = reproduce the futures board."},{"name":"n_sims","in":"query","required":false,"schema":{"type":"integer","maximum":200000,"minimum":1000,"default":25000,"title":"N Sims"}},{"name":"carryover","in":"query","required":false,"schema":{"type":"number","maximum":1.0,"minimum":0.0,"default":0.35,"title":"Carryover"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601. Omit for latest.","title":"As Of"},"description":"ISO-8601. Omit for latest."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Futures Model V1 Futures Model Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/predictions/games":{"get":{"summary":"Game Predictions","description":"Reproducible baseline spreads, totals and win probabilities.","operationId":"game_predictions_v1_predictions_games_get","parameters":[{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":22,"minimum":1},{"type":"null"}],"title":"Week"}},{"name":"model_season","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Model Season"}},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Game Predictions V1 Predictions Games Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sources":{"get":{"summary":"Sources Api","description":"Connection, licensing and freshness contract for every upstream feed.","operationId":"sources_api_v1_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sources Api V1 Sources Get"}}}}}}},"/v1/private/enrichment":{"get":{"summary":"Private Enrichment","description":"Private PFF and Sharp evidence for one matchup.","operationId":"private_enrichment_v1_private_enrichment_get","parameters":[{"name":"game_id","in":"query","required":true,"schema":{"type":"string","description":"Canonical nflverse game_id","title":"Game Id"},"description":"Canonical nflverse game_id"},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Private Enrichment V1 Private Enrichment Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/agent/context":{"get":{"summary":"Agent Context","description":"One token-efficient decision packet for one NFL game.","operationId":"agent_context_v1_agent_context_get","parameters":[{"name":"game_id","in":"query","required":true,"schema":{"type":"string","description":"Canonical nflverse game_id","title":"Game Id"},"description":"Canonical nflverse game_id"},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"As Of"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Agent Context V1 Agent Context Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/props/settlements":{"get":{"summary":"Prop Settlements","description":"Grade every observed prop quote whose final result is available.","operationId":"prop_settlements_v1_props_settlements_get","parameters":[{"name":"game_id","in":"query","required":true,"schema":{"type":"string","title":"Game Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20000,"minimum":1,"default":5000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Prop Settlements V1 Props Settlements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/search":{"get":{"summary":"Search Api","description":"Find a player id by name. Use before /v1/player/{player_id}.","operationId":"search_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Search Api V1 Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/player/{player_id}":{"get":{"summary":"Player Api","description":"Full profile for one player: bio, season totals, and weekly game log.","operationId":"player_api_v1_player__player_id__get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","title":"Player Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Player Api V1 Player  Player Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/odds":{"get":{"summary":"Odds Api","description":"Game lines with per-book prices and the devigged consensus.","operationId":"odds_api_v1_odds_get","parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","default":"spreads","title":"Market"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":64,"minimum":1,"default":16,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Odds Api V1 Odds Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/markets":{"get":{"summary":"Markets Api","description":"Prediction-market contracts, and their gap against devigged book consensus.\n\nExchange prices are probabilities already -- a contract settles at $1 -- so\nthey are reported as mid-market with the bid-ask spread alongside. The\nsportsbook column is devigged first, because a quoted price carries the\nbook's margin and comparing it raw would manufacture a gap that is really\njust overround.","operationId":"markets_api_v1_markets_get","parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","description":"compare | kalshi | polymarket","default":"compare","title":"View"},"description":"compare | kalshi | polymarket"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":60,"title":"Limit"}},{"name":"series","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Restrict to one series ticker or slug.","title":"Series"},"description":"Restrict to one series ticker or slug."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Markets Api V1 Markets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ask":{"get":{"summary":"Ask Api","description":"Resolve a plain-language question to a URL, with the reading made explicit.","operationId":"ask_api_v1_ask_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Ask Api V1 Ask Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/catalog":{"get":{"summary":"Catalog","description":"What exists, how far back, and how much of it has been revised.","operationId":"catalog_v1_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Catalog V1 Catalog Get"}}}}}}},"/v1/schema/{dataset}":{"get":{"summary":"Schema","description":"Column-level schema including the revision group of each field.\n\nThe `group` field is the part an agent cannot get anywhere else. `derived`\ncolumns are upstream model outputs: they change when the vendor refits, not\nwhen football changes. A model training on them without pinning `as_of` is\nreading numbers the feed did not carry on the date it is modelling.","operationId":"schema_v1_schema__dataset__get","parameters":[{"name":"dataset","in":"path","required":true,"schema":{"type":"string","title":"Dataset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Schema V1 Schema  Dataset  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/query":{"get":{"summary":"Query","description":"History as fbdata knew it at `as_of`.","operationId":"query_v1_query_get","parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string","description":"e.g. pbp","title":"Dataset"},"description":"e.g. pbp"},{"name":"as_of","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601. Omit for latest.","title":"As Of"},"description":"ISO-8601. Omit for latest."},{"name":"partition","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. 2024","title":"Partition"},"description":"e.g. 2024"},{"name":"columns","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated column list. Omit on a wide dataset to get a narrow preview; pass '*' to force every column.","default":"","title":"Columns"},"description":"Comma-separated column list. Omit on a wide dataset to get a narrow preview; pass '*' to force every column."},{"name":"where","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SQL predicate, e.g. \"posteam = 'BUF'\"","title":"Where"},"description":"SQL predicate, e.g. \"posteam = 'BUF'\""},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Query V1 Query Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/history":{"get":{"summary":"History","description":"Every revision of one entity -- the audit trail behind an as-of answer.","operationId":"history_v1_history_get","parameters":[{"name":"dataset","in":"query","required":true,"schema":{"type":"string","title":"Dataset"}},{"name":"where","in":"query","required":true,"schema":{"type":"string","description":"Predicate identifying one entity.","title":"Where"},"description":"Predicate identifying one entity."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response History V1 History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/snapshots":{"get":{"summary":"Snapshots","description":"The ingestion log. Every byte served traces back to a row here.","operationId":"snapshots_v1_snapshots_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Snapshots V1 Snapshots Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}