{"openapi":"3.1.0","info":{"title":"draftkings api","version":"1.1.0","description":"Observed sportsbook mainlines, selected multi-sport Pick6 props, multi-sport DFS and ESPN game/player/team statistics. Source scope and clocks are explicit; no redistribution license implied. New monthly plans: Free 500 requests/month (20/minute), Developer 10,000/month (60/minute), Production 50,000/month (120/minute). Legacy accounts retain original daily terms. Limits are shared across account keys."},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"},"sessionCookie":{"type":"apiKey","in":"cookie","name":"__Secure-neon-auth.session_token","description":"Neon Auth managed browser session; use the signed-in dashboard. Bearer keys do not authenticate hook management."}},"schemas":{"StatsPage":{"type":"object","required":["dataset","kind","sport","season","available","data","pagination","coverage","caveats"],"properties":{"dataset":{"const":"espn-independent-stats"},"kind":{"type":"string","enum":["games","player-games","team-games"]},"sport":{"type":"string","enum":["NBA","NFL","NHL"]},"season":{"type":"integer"},"available":{"type":"boolean"},"data":{"type":"array","maxItems":200,"items":{"type":"object","required":["data"],"properties":{"data":{"type":"object","description":"Game, player-game or team-game W4 payload; original typed stat values remain intact."},"game":{"type":"object","description":"Game context for player/team rows, including original evidence URL, observed_at, HTTP Date, Last-Modified and SHA256. Unknown source_updated_at stays null."}}}},"pagination":{"type":"object","required":["limit","next","has_more"],"properties":{"limit":{"type":"integer","minimum":1,"maximum":200},"next":{"type":["string","null"]},"has_more":{"type":"boolean"}}},"coverage":{"type":"string"},"caveats":{"type":"string"}}}}},"paths":{"/api/v1/pick6/projections":{"get":{"summary":"pick6/projections","description":"Selected multi-sport/category market rows; older NBA rows may be retained and stale; includes paused/live and alternative lines. Multipliers are standings values, not odds. Three-part identity. No full-board or unique-player claim. Source offer update unknown.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z0-9 ]{2,16}$"}},{"name":"stat","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pick_group_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_market_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"format","in":"query","required":false,"schema":{"default":"json","type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/pick6/history":{"get":{"summary":"pick6/history","description":"Selected multi-sport/category market rows; older NBA rows may be retained and stale; includes paused/live and alternative lines. Multipliers are standings values, not odds. Three-part identity. No full-board or unique-player claim. Source offer update unknown.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z0-9 ]{2,16}$"}},{"name":"stat","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pick_group_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_market_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"format","in":"query","required":false,"schema":{"default":"json","type":"string","enum":["json","csv"]}},{"name":"after","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/projections":{"get":{"summary":"projections","description":"Selected multi-sport/category market rows; older NBA rows may be retained and stale; includes paused/live and alternative lines. Multipliers are standings values, not odds. Three-part identity. No full-board or unique-player claim. Source offer update unknown.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z0-9 ]{2,16}$"}},{"name":"stat","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pick_group_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_market_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"format","in":"query","required":false,"schema":{"default":"json","type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/changes":{"get":{"summary":"changes","description":"Selected multi-sport/category market rows; older NBA rows may be retained and stale; includes paused/live and alternative lines. Multipliers are standings values, not odds. Three-part identity. No full-board or unique-player claim. Source offer update unknown.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z0-9 ]{2,16}$"}},{"name":"stat","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pick_group_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"pickable_market_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"format","in":"query","required":false,"schema":{"default":"json","type":"string","enum":["json","csv"]}},{"name":"after","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/dfs/sports":{"get":{"summary":"dfs/sports","description":"Separate DFS dataset; salaries are lineup budget values.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/dfs/contests":{"get":{"summary":"dfs/contests","description":"Separate DFS dataset; salaries are lineup budget values.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"slate_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,15}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/dfs/slates":{"get":{"summary":"dfs/slates","description":"Separate DFS dataset; salaries are lineup budget values.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"slate_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,15}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/dfs/players":{"get":{"summary":"dfs/players","description":"Separate DFS dataset; salaries are lineup budget values.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"slate_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,15}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/events":{"get":{"summary":"events","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":180}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/odds":{"get":{"summary":"odds","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":180}},{"name":"market","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/history":{"get":{"summary":"history","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[a-zA-Z0-9_ -]{1,60}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":180}},{"name":"offer_id","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":180}},{"name":"market","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/coverage":{"get":{"summary":"coverage","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/context/games":{"get":{"summary":"context/games","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z]{2,8}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}},{"name":"athlete_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/context/player-stats":{"get":{"summary":"context/player-stats","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z]{2,8}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}},{"name":"athlete_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/context/team-stats":{"get":{"summary":"context/team-stats","description":"Stored observations with provenance and capture ages; inspect actual sport/market and context coverage.","security":[{"bearerAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"type":"integer","minimum":1,"maximum":100}},{"name":"offset","in":"query","required":false,"schema":{"default":0,"type":"integer","minimum":0,"maximum":10000}},{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z]{2,8}$"}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}},{"name":"athlete_id","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{1,20}$"}}],"responses":{"200":{"description":"Actual stored observations with provenance, age/stale and bounded pagination. Changes contain only changed subsequent observations.","content":{"application/json":{"schema":{"type":"object"}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"403":{"description":"Redistribution not approved"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/stats/games":{"get":{"summary":"Independent ESPN games","description":"Readonly latest accepted independent statistics snapshots, with original game/evidence clocks. Limited retained samples, not a full-season feed, native sportsbook props, as-of correction history or settlement. Empty filtered pages explicitly return available=false. JSON only; duplicate/unknown filters, offset and CSV format are rejected.","security":[{"bearerAuth":[]}],"parameters":[{"name":"sport","in":"query","required":true,"schema":{"type":"string","enum":["NBA","NFL","NHL"]}},{"name":"season","in":"query","required":true,"description":"NFL starting year; NBA/NHL ending year. Valid scope does not establish captured coverage.","schema":{"type":"integer","minimum":2000,"maximum":2027}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}},{"name":"completed","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"from","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"to","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"after","in":"query","required":false,"description":"Use pagination.next unchanged. Cursor pages are not a frozen export.","schema":{"type":"string","minLength":1,"maxLength":300,"pattern":"^[\\w:./-]+$"}}],"responses":{"200":{"description":"Stored matching rows or explicit empty available=false result. Player/team rows retain game context and original evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsPage"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/stats/player-games":{"get":{"summary":"Independent ESPN player-games","description":"Readonly latest accepted independent statistics snapshots, with original game/evidence clocks. Limited retained samples, not a full-season feed, native sportsbook props, as-of correction history or settlement. Empty filtered pages explicitly return available=false. JSON only; duplicate/unknown filters, offset and CSV format are rejected.","security":[{"bearerAuth":[]}],"parameters":[{"name":"sport","in":"query","required":true,"schema":{"type":"string","enum":["NBA","NFL","NHL"]}},{"name":"season","in":"query","required":true,"description":"NFL starting year; NBA/NHL ending year. Valid scope does not establish captured coverage.","schema":{"type":"integer","minimum":2000,"maximum":2027}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}},{"name":"completed","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"from","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"to","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"after","in":"query","required":false,"description":"Use pagination.next unchanged. Cursor pages are not a frozen export.","schema":{"type":"string","minLength":1,"maxLength":300,"pattern":"^[\\w:./-]+$"}},{"name":"team_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}},{"name":"athlete_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}}],"responses":{"200":{"description":"Stored matching rows or explicit empty available=false result. Player/team rows retain game context and original evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsPage"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/stats/team-games":{"get":{"summary":"Independent ESPN team-games","description":"Readonly latest accepted independent statistics snapshots, with original game/evidence clocks. Limited retained samples, not a full-season feed, native sportsbook props, as-of correction history or settlement. Empty filtered pages explicitly return available=false. JSON only; duplicate/unknown filters, offset and CSV format are rejected.","security":[{"bearerAuth":[]}],"parameters":[{"name":"sport","in":"query","required":true,"schema":{"type":"string","enum":["NBA","NFL","NHL"]}},{"name":"season","in":"query","required":true,"description":"NFL starting year; NBA/NHL ending year. Valid scope does not establish captured coverage.","schema":{"type":"integer","minimum":2000,"maximum":2027}},{"name":"event_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}},{"name":"completed","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"from","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"to","in":"query","required":false,"description":"ISO8601 offset timestamp or YYYY-MM-DD interpreted at UTC midnight; from must not follow to.","schema":{"type":"string","anyOf":[{"format":"date-time"},{"format":"date"}]}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"after","in":"query","required":false,"description":"Use pagination.next unchanged. Cursor pages are not a frozen export.","schema":{"type":"string","minLength":1,"maxLength":300,"pattern":"^[\\w:./-]+$"}},{"name":"team_id","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,20}$"}}],"responses":{"200":{"description":"Stored matching rows or explicit empty available=false result. Player/team rows retain game context and original evidence.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsPage"}}}},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"429":{"description":"Shared account limit reached"},"503":{"description":"Storage or dataset unavailable"}}}},"/api/v1/stream/snapshot":{"get":{"summary":"Atomic retained Pick6 snapshot and durable cursor","description":"Operator-enabled Developer/Production monthly feature. Retained stored rows, not full upstream coverage. Maximum10,000rows/2MB;413requires a sport filter. One metered request. Resume using snapshot_cursor; client-filter subsequent stream events when a sport filter was used.","security":[{"bearerAuth":[]}],"parameters":[{"name":"sport","in":"query","required":false,"schema":{"type":"string","pattern":"^[A-Z0-9 ]{2,16}$"}}],"responses":{"200":{"description":"Retained snapshot and atomic cursor","content":{"application/json":{"schema":{"type":"object","required":["snapshot_cursor","data"],"properties":{"snapshot_cursor":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"},"data":{"type":"array","maxItems":10000,"items":{"type":"object"}}}}}}},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}}},"/api/v1/stream":{"get":{"summary":"Bounded resumable Pick6 change stream","description":"Operator-enabled Developer/Production feature. Each55second connection costs one request. Supply a bootstrap cursor or explicitly start=latest without a baseline. Durable decimal bigint IDs. A delivery.error without id never advances past an oversized event. At-least-once resume, no full-board or latency SLA.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Last-Event-ID","in":"header","required":false,"schema":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"}},{"name":"after","in":"query","required":false,"schema":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"}},{"name":"start","in":"query","required":false,"schema":{"type":"string","enum":["latest"]},"description":"Explicitly opt out of a baseline; cannot combine with a cursor."}],"responses":{"200":{"description":"pick6.change and checkpoint SSE events","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"428":{"description":"Bootstrap cursor or explicit start=latest required"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}}},"/api/account/webhooks":{"get":{"summary":"List owned hooks and latest100delivery diagnostics","description":"Operator-enabled browser session management, not Bearer authentication. Production monthly entitlement for creation/replay, signed-in ownership for revoke. Exact canonical Origin required for mutations. Maximum5active hooks. Replay interval(after,through] reuses logical IDs. At-least-once HMAC-signed callbacks, no automatic data deletion or unlimited replay window. Storage pressure pauses work preserving pending evidence.","security":[{"sessionCookie":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"{hooks,deliveries}, no secrets or event bodies"},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}},"post":{"summary":"Register a public HTTPS receiver; secret shown once","description":"Operator-enabled browser session management, not Bearer authentication. Production monthly entitlement for creation/replay, signed-in ownership for revoke. Exact canonical Origin required for mutations. Maximum5active hooks. Replay interval(after,through] reuses logical IDs. At-least-once HMAC-signed callbacks, no automatic data deletion or unlimited replay window. Storage pressure pauses work preserving pending evidence.","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","maxLength":2000}}}}}},"responses":{"201":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"{id,secret}; secret returned once"},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}},"delete":{"summary":"Revoke an owned hook","description":"Operator-enabled browser session management, not Bearer authentication. Production monthly entitlement for creation/replay, signed-in ownership for revoke. Exact canonical Origin required for mutations. Maximum5active hooks. Replay interval(after,through] reuses logical IDs. At-least-once HMAC-signed callbacks, no automatic data deletion or unlimited replay window. Storage pressure pauses work preserving pending evidence.","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"{revoked:true}"},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}},"patch":{"summary":"Replay at most100retained source changes","description":"Operator-enabled browser session management, not Bearer authentication. Production monthly entitlement for creation/replay, signed-in ownership for revoke. Exact canonical Origin required for mutations. Maximum5active hooks. Replay interval(after,through] reuses logical IDs. At-least-once HMAC-signed callbacks, no automatic data deletion or unlimited replay window. Storage pressure pauses work preserving pending evidence.","security":[{"sessionCookie":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["id","after","through"],"properties":{"id":{"type":"string","format":"uuid"},"after":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"},"through":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"}}}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"{replay_queued:true}"},"400":{"description":"Invalid or duplicate input"},"401":{"description":"Authentication required"},"403":{"description":"Effective subscription, canonical origin or ownership denied"},"409":{"description":"Cursor ahead or subscription limit"},"410":{"description":"Cursor purged; take a new snapshot"},"413":{"description":"Payload or replay exceeds bound"},"429":{"description":"Account quota reached"},"503":{"description":"Feature disabled or storage/configuration unavailable"}}}},"/api/v1/sportsbook/scopes":{"get":{"summary":"Discover actual native sportsbook scopes","description":"All valid plans including Free; normal request quotas. Actual scope IDs, region/site/league metadata, readiness, original observation clocks and retained entity counts. Operator gated; not global/full-book coverage.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Actual stored scoped native data; no full-book or latency guarantee","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Unknown, duplicate or malformed query; URL API keys are never accepted"},"401":{"description":"Invalid or revoked Bearer key"},"403":{"description":"Canonical origin denied; WebSocket additionally requires matching paid monthly entitlement"},"429":{"description":"Account request allowance or active connection limit reached"},"503":{"description":"Operator feature disabled, missing/stale baseline, expired source transport, or storage unavailable"}}}},"/api/v1/sportsbook/snapshot":{"get":{"summary":"Atomic scoped native sportsbook snapshot and cursor","description":"All valid plans including Free. Current events/markets/selections and a separate native global string cursor read atomically. Requires healthy authoritative baseline. Bounded at10000 entities/8MiB; overflow fails rather than returning incomplete state. Persist snapshot state and cursor together. Not the Pick6 stream cursor or a provider recovery offset.","security":[{"bearerAuth":[]}],"parameters":[{"name":"scope","in":"query","required":true,"description":"Actual scope_id returned by /api/v1/sportsbook/scopes; region/site/league/subcategory are scope-specific.","schema":{"type":"string","minLength":1,"maxLength":256}}],"responses":{"200":{"description":"Actual stored scoped native data; no full-book or latency guarantee","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Unknown, duplicate or malformed query; URL API keys are never accepted"},"401":{"description":"Invalid or revoked Bearer key"},"403":{"description":"Canonical origin denied; WebSocket additionally requires matching paid monthly entitlement"},"429":{"description":"Account request allowance or active connection limit reached"},"503":{"description":"Operator feature disabled, missing/stale baseline, expired source transport, or storage unavailable"}}}},"/api/v1/sportsbook/ws":{"get":{"summary":"Native sportsbook WebSocket upgrade","description":"Server-side ws client with Authorization: Bearer header; never URL/subprotocol credentials. Paid monthly Developer/Production only with matching billing account/mode. One request per upgrade;280second rotation within300second function budget. Two Developer/five Production concurrent connections across instances. Requires scope and native snapshot cursor. sportsbook.change and payload-free checkpoint frames carry decimal string cursors; commit cursor only after your durable apply. Normal rotation emits reconnect: resume the last durable cursor without another snapshot. Customer-network disconnect can attempt durable resume; resync_required requires a fresh snapshot.262KiB outgoing bound; source rebaseline, expired transport, cursor gap and slow clients close explicitly. No provider reconnect-replay, full-book or latency SLA.","security":[{"bearerAuth":[]}],"parameters":[{"name":"scope","in":"query","required":true,"description":"Actual scope_id returned by /api/v1/sportsbook/scopes; region/site/league/subcategory are scope-specific.","schema":{"type":"string","minLength":1,"maxLength":256}},{"name":"after","in":"query","required":true,"schema":{"type":"string","pattern":"^(0|[1-9][0-9]{0,18})$"}}],"responses":{"101":{"description":"Actual WebSocket protocol upgrade; JSON frames follow on the socket"},"400":{"description":"Unknown, duplicate or malformed query; URL API keys are never accepted"},"401":{"description":"Invalid or revoked Bearer key"},"403":{"description":"Canonical origin denied; WebSocket additionally requires matching paid monthly entitlement"},"426":{"description":"WebSocket Upgrade header required"},"428":{"description":"Take a scoped native snapshot first and provide its cursor"},"429":{"description":"Account request allowance or active connection limit reached"},"503":{"description":"Operator feature disabled, missing/stale baseline, expired source transport, or storage unavailable"}}}},"/api/v1/demo/pick6":{"get":{"summary":"Keyless Pick6 sample","description":"No API key and no quota. Static invented rows in the shape of /api/v1/pick6/projections, each labeled sample:true, with a top-level demo object. Query parameters are ignored. Not observations: call the real endpoint with a key for stored data.","security":[],"responses":{"200":{"description":"Sample rows labeled sample:true, in the real response shape. Invented data, not observations.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/demo/dfs":{"get":{"summary":"Keyless DFS sample","description":"No API key and no quota. Static invented rows in the shape of /api/v1/dfs/players, each labeled sample:true, with a top-level demo object. Query parameters are ignored. Not observations: call the real endpoint with a key for stored data.","security":[],"responses":{"200":{"description":"Sample rows labeled sample:true, in the real response shape. Invented data, not observations.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/v1/onboarding":{"get":{"summary":"Account setup fields and available data endpoints","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Setup field reference and data endpoint list"},"401":{"description":"Invalid or revoked key"},"429":{"description":"Shared account limit reached"}}},"post":{"summary":"Save the authenticated account's project intent","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["data_wanted","use_case"],"properties":{"data_wanted":{"type":"string","minLength":3,"maxLength":1000},"use_case":{"type":"string","minLength":3,"maxLength":1000},"found_us":{"type":"string","maxLength":300},"notes":{"type":"string","maxLength":500},"setup_mode":{"type":"string","enum":["manual","agent"],"default":"manual"},"agent":{"type":"string","enum":["claude","codex","cursor","other"]}}}}}},"responses":{"200":{"description":"Saved intent identifier"},"400":{"description":"Invalid query"},"401":{"description":"Invalid or revoked key"},"429":{"description":"Shared account limit reached"}}}},"/api/health":{"get":{"summary":"Measured capture inventory and source health","responses":{"200":{"description":"Database reachable and coverage"},"503":{"description":"Storage unavailable"}}}}}}