{"openapi":"3.1.0","info":{"title":"PrizePicks API","version":"1.0.0","description":"Independent developer data service. Live endpoints require an account-issued bearer key. Public /demo endpoints contain fictional, fixed-date fixtures. No official settlement dataset is currently exposed. All nullable values represent unknown or unavailable source information."},"servers":[{"url":"/"}],"paths":{"/api/v1/projections":{"get":{"operationId":"LiveProjections","summary":"Live current projections","security":[{"BearerAuth":[]}],"parameters":[{"name":"league","in":"query","description":"League code, for example NBA.","schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive player name search.","schema":{"type":"string"}},{"name":"stat","in":"query","description":"Exact stat name, case-insensitive.","schema":{"type":"string"}},{"name":"tier","in":"query","description":"Match either selection tier.","schema":{"type":"string","enum":["standard","demon","goblin","unknown"]}},{"name":"status","in":"query","description":"Availability filter.","schema":{"type":"string","enum":["active","unavailable","all"],"default":"active"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Projection"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/projections/{id}/history":{"get":{"operationId":"LiveHistory","summary":"Live change-only history. No retrospective backfill is implied.","security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/History"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/changes":{"get":{"operationId":"LiveChanges","summary":"Live replayable offer changes. Save the last returned event cursor for subsequent polls.","security":[{"BearerAuth":[]}],"parameters":[{"name":"league","in":"query","description":"Optional league filter.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/coverage":{"get":{"operationId":"LiveCoverage","summary":"Live declared observed coverage. An empty live list means no live ingestion.","security":[{"BearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Coverage"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/export":{"get":{"operationId":"LiveExport","summary":"Live projections CSV, one bounded page. Continue using X-Next-Cursor.","security":[{"BearerAuth":[]}],"parameters":[{"name":"league","in":"query","description":"League code, for example NBA.","schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive player name search.","schema":{"type":"string"}},{"name":"stat","in":"query","description":"Exact stat name, case-insensitive.","schema":{"type":"string"}},{"name":"tier","in":"query","description":"Match either selection tier.","schema":{"type":"string","enum":["standard","demon","goblin","unknown"]}},{"name":"status","in":"query","description":"Availability filter.","schema":{"type":"string","enum":["active","unavailable","all"],"default":"active"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"CSV page. X-Data-Mode identifies demo/live; X-Next-Cursor identifies another page.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/demo/projections":{"get":{"operationId":"DemoProjections","summary":"Demo current projections","security":[],"parameters":[{"name":"league","in":"query","description":"League code, for example NBA.","schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive player name search.","schema":{"type":"string"}},{"name":"stat","in":"query","description":"Exact stat name, case-insensitive.","schema":{"type":"string"}},{"name":"tier","in":"query","description":"Match either selection tier.","schema":{"type":"string","enum":["standard","demon","goblin","unknown"]}},{"name":"status","in":"query","description":"Availability filter.","schema":{"type":"string","enum":["active","unavailable","all"],"default":"active"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Projection"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/demo/projections/{id}/history":{"get":{"operationId":"DemoHistory","summary":"Demo change-only history. No retrospective backfill is implied.","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/History"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/demo/changes":{"get":{"operationId":"DemoChanges","summary":"Demo replayable offer changes. Save the last returned event cursor for subsequent polls.","security":[],"parameters":[{"name":"league","in":"query","description":"Optional league filter.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Change"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/demo/coverage":{"get":{"operationId":"DemoCoverage","summary":"Demo declared observed coverage. An empty live list means no live ingestion.","security":[],"parameters":[],"responses":{"200":{"description":"Successful response. Inspect meta.source_status and observation timestamps before use.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Coverage"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}},"/api/v1/demo/export":{"get":{"operationId":"DemoExport","summary":"Demo projections CSV, one bounded page. Continue using X-Next-Cursor.","security":[],"parameters":[{"name":"league","in":"query","description":"League code, for example NBA.","schema":{"type":"string"}},{"name":"search","in":"query","description":"Case-insensitive player name search.","schema":{"type":"string"}},{"name":"stat","in":"query","description":"Exact stat name, case-insensitive.","schema":{"type":"string"}},{"name":"tier","in":"query","description":"Match either selection tier.","schema":{"type":"string","enum":["standard","demon","goblin","unknown"]}},{"name":"status","in":"query","description":"Availability filter.","schema":{"type":"string","enum":["active","unavailable","all"],"default":"active"}},{"name":"limit","in":"query","description":"Maximum rows per page.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","description":"Opaque cursor from the preceding page. Changes and history use numeric sequence cursors.","schema":{"type":"string"}}],"responses":{"200":{"description":"CSV page. X-Data-Mode identifies demo/live; X-Next-Cursor identifies another page.","content":{"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Invalid query parameters."},"401":{"description":"Missing, invalid, or revoked bearer API key."},"429":{"description":"Monthly or per-minute quota reached."},"503":{"description":"Service unavailable. No demo fallback is substituted."}}}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"An API key created in your dashboard. Never expose it in browser source or URLs."}},"schemas":{"Meta":{"type":"object","required":["mode","schema_version","count","limit","next_cursor","source_status"],"properties":{"mode":{"type":"string","enum":["live","demo"]},"schema_version":{"const":"1.0"},"count":{"type":"integer"},"limit":{"type":"integer"},"next_cursor":{"type":["string","null"]},"observed_at":{"type":["string","null"],"format":"date-time"},"source_status":{"type":"string","enum":["demo","not_configured","fresh","stale","partial","failed"]},"observation_age_seconds":{"type":["integer","null"]},"source_age_seconds":{"type":["integer","null"]},"results_available":{"type":"boolean"},"warnings":{"type":"array","items":{"type":"string"}}}},"SourceContext":{"type":"object","description":"Optional context captured at observed_at. Does not assert current game state or customer promotional eligibility.","properties":{"observed_at":{"type":"string","format":"date-time"},"event":{"type":"object","properties":{"home_team":{"$ref":"#/components/schemas/SourceTeam"},"away_team":{"$ref":"#/components/schemas/SourceTeam"},"status":{"type":["string","null"]},"is_live":{"type":["boolean","null"]},"ends_at":{"type":["string","null"],"format":"date-time"}}},"player":{"type":"object","properties":{"is_combo":{"type":["boolean","null"]}}},"promotion":{"type":"object","properties":{"is_promotional":{"type":["boolean","null"]},"flash_line":{"type":["number","null"],"description":"Reported promotional context only; never replaces the base line."},"discount_name":{"type":["string","null"]},"discount_percentage":{"type":["number","null"],"minimum":0,"maximum":100},"eligibility":{"const":"unknown"}}},"popularity":{"type":"object","properties":{"trending_count":{"type":["integer","null"],"minimum":0},"rank":{"type":["integer","null"],"minimum":0},"definition":{"const":"source_reported_unverified"}}}}},"SourceTeam":{"type":"object","properties":{"id":{"type":["string","null"]},"abbreviation":{"type":["string","null"]},"name":{"type":["string","null"]}}},"Selection":{"type":"object","required":["side","available","tier","payout_multiplier"],"properties":{"side":{"enum":["more","less"]},"available":{"type":["boolean","null"]},"tier":{"enum":["standard","demon","goblin","unknown"]},"payout_multiplier":{"type":["number","null"],"description":"Only an observed source multiplier; never a synthetic probability."}}},"Projection":{"type":"object","required":["id","source_projection_id","source","player","league","event","market","line","selections","status","observed_at","is_demo"],"properties":{"id":{"type":"string"},"source_projection_id":{"type":"string"},"source":{"enum":["prizepicks","demo"]},"player":{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":"string"},"team":{"type":["string","null"]},"position":{"type":["string","null"]}}},"league":{"type":"string"},"event":{"type":"object","properties":{"id":{"type":["string","null"]},"opponent":{"type":["string","null"]},"starts_at":{"type":["string","null"],"format":"date-time"}}},"market":{"type":"object","properties":{"id":{"type":"string"},"stat":{"type":"string"},"period":{"type":"string"}}},"line":{"type":"number"},"selections":{"type":"array","items":{"$ref":"#/components/schemas/Selection"}},"status":{"enum":["active","unavailable"]},"observed_at":{"type":"string","format":"date-time"},"source_updated_at":{"type":["string","null"],"format":"date-time"},"source_board_time":{"type":["string","null"],"format":"date-time"},"first_seen_at":{"type":"string","format":"date-time"},"last_seen_at":{"type":"string","format":"date-time"},"is_demo":{"type":"boolean"},"source_context":{"$ref":"#/components/schemas/SourceContext"}}},"Change":{"type":"object","properties":{"id":{"type":"string"},"cursor":{"type":"string"},"type":{"enum":["offer.new","offer.changed","offer.unavailable","offer.restored"]},"projection_id":{"type":"string"},"league":{"type":"string"},"player_name":{"type":"string"},"stat":{"type":"string"},"previous_line":{"type":["number","null"]},"line":{"type":"number"},"observed_at":{"type":"string","format":"date-time"}}},"History":{"type":"object","properties":{"id":{"type":"string"},"projection_id":{"type":"string"},"line":{"type":"number"},"selections":{"type":"array","items":{"$ref":"#/components/schemas/Selection"}},"status":{"enum":["active","unavailable"]},"observed_at":{"type":"string","format":"date-time"},"source_updated_at":{"type":["string","null"],"format":"date-time"}}},"Coverage":{"type":"object","properties":{"league":{"type":"string"},"projection_count":{"type":"integer"},"first_observed_at":{"type":"string","format":"date-time"},"last_observed_at":{"type":"string","format":"date-time"},"markets":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"history_available":{"type":"boolean"},"results_available":{"type":"boolean"}}}}}}