{"openapi":"3.0.3","info":{"title":"NFL Preseason Rankings API","description":"Model-driven 2026 NFL preseason fantasy football rankings. $1.00/call (full list) or $3 for 7-day bundle. x402 micropayments on Base (USDC). No account required.","version":"v1.0.0","x-guidance":"This API sells NFL 2026 preseason fantasy football data via x402 micropayments (USDC on Base). Call any paid endpoint without a payment-signature header to receive a 402 with payment details. Use /v1/free/players to list all valid player_id values. Paid endpoints: GET /v1/rankings/preseason ($1.00), GET /v1/rankings/preseason/{player_id} ($0.10), GET /v1/draft-board/half-ppr ($1.00), GET /v1/draft-board/half-ppr/{player_id} ($0.10), POST /v1/bundle/purchase ($3.00 for 7-day JWT). Free endpoints: GET /v1/health, GET /v1/free/players, GET /v1/free/rankings/top1, GET /v1/free/meta."},"paths":{"/v1/health":{"get":{"tags":["free"],"summary":"Health check + data version","description":"Returns API status, data version string, and API version. Free. No payment required.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}},"security":[]}},"/v1/free/meta":{"get":{"tags":["free"],"summary":"Data metadata + paid endpoint catalog","description":"Returns data version, build timestamp, total player count, and the full list of paid endpoints with prices. Free. Rate-limited.","operationId":"meta_v1_free_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaResponse"}}}}},"security":[]}},"/v1/discovery/resources":{"get":{"tags":["free"],"summary":"x402 discovery manifest","description":"Machine-readable list of all payable resources: paths, prices in USDC atomic units, and descriptions. Used by x402 indexers and autonomous agents discovering what this API sells. Free.","operationId":"discovery_resources_v1_discovery_resources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/free/players":{"get":{"tags":["free"],"summary":"Full player directory (free)","description":"Returns all player IDs with names, positions, and teams — the full roster used in the paid rankings endpoints. Use this to look up `player_id` values before calling the $0.10-per-player endpoints. Free. Rate-limited to 30 req/min/IP.","operationId":"player_directory_v1_free_players_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerDirectoryResponse"}}}}},"security":[]}},"/v1/free/rankings/top1":{"get":{"tags":["free"],"summary":"Top-ranked player at each position (free)","description":"Returns the #1-ranked player at QB, RB, WR, and TE with projected FP/game and confidence score. Free taste-test endpoint. Rate-limited to 30 req/min/IP. No payment required.","operationId":"top1_per_position_v1_free_rankings_top1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Top1Response"}}}}},"security":[]}},"/v1/bazaar":{"get":{"tags":["free"],"summary":"Bazaar service catalog (agentic.market discovery)","description":"Agentic.market / Bazaar discovery endpoint. Always returns HTTP 402 with the full x402 payment manifest and Bazaar extension describing all paid services offered by this API. Register this URL with Bazaar/agentic.market seller tools. Free — PaymentMiddleware does not intercept this path.","operationId":"bazaar_catalog_v1_bazaar_get","responses":{"402":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/rankings/preseason":{"get":{"tags":["rankings"],"summary":"Full 2026 preseason rankings","description":"Returns model-driven fantasy point projections for up to 412 NFL players (QB/RB/WR/TE). Each row includes projected FP/game, projected season total, confidence score (0-1), age adjustment, SOS rating, depth chart rank, and injury-return flag. Filter by `position`, `min_confidence`, or `limit`. Sorted by overall rank. **Requires x402 payment ($1.00 USDC on Base) or a valid bundle JWT bearer token.**","operationId":"preseason_rankings_v1_rankings_preseason_get","parameters":[{"name":"position","in":"query","required":false,"schema":{"description":"Filter by position","title":"Position","enum":["QB","RB","WR","TE"],"type":"string","nullable":true},"description":"Filter by position"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max rows returned (default 50, max 500)","default":50,"title":"Limit"},"description":"Max rows returned (default 50, max 500)"},{"name":"min_confidence","in":"query","required":false,"schema":{"description":"Minimum confidence score (0–1)","title":"Min Confidence","type":"number","maximum":1.0,"minimum":0.0,"nullable":true},"description":"Minimum confidence score (0–1)"},{"name":"accept","in":"query","required":false,"schema":{"description":"Set to 'csv' to stream as CSV instead of JSON","title":"Accept","type":"string","nullable":true},"description":"Set to 'csv' to stream as CSV instead of JSON"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"402":{"description":"Payment Required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}},"security":[{"x402Payment":[]}],"x-payment":{"amount":"1.00","currency":"USDC","network":"eip155:8453","atomic_amount":"1000000","scheme":"exact"},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"position":{"type":"string","enum":["QB","RB","WR","TE"],"description":"Filter by position (optional)"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":50,"description":"Max rows returned (default 50, max 500)"},"min_confidence":{"type":"number","minimum":0.0,"maximum":1.0,"description":"Minimum confidence score filter (0–1)"},"accept":{"type":"string","enum":["csv"],"description":"Set to 'csv' to receive CSV instead of JSON"}}}}}}}},"/v1/rankings/preseason/{player_id}":{"get":{"tags":["rankings"],"summary":"Single player by ID","description":"Returns the full projection row for one player by nflreadpy `player_id` (e.g. `00-0036971`). Same fields as the full rankings endpoint. Use `/v1/free/players` to look up valid player IDs. **Requires x402 payment ($0.10 USDC on Base) or a valid bundle JWT.**","operationId":"player_ranking_v1_rankings_preseason__player_id__get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all IDs.","title":"Player Id","example":"00-0036971"},"description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all IDs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RankingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"402":{"description":"Payment Required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}},"security":[{"x402Payment":[]}],"x-payment":{"amount":"0.10","currency":"USDC","network":"eip155:8453","atomic_amount":"100000","scheme":"exact"},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"player_id":{"type":"string","description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all valid IDs.","example":"00-0036971"}},"required":["player_id"]}}}}}},"/v1/draft-board/half-ppr":{"get":{"tags":["draft-board"],"summary":"Half-PPR VOR draft board","description":"Returns a VOR-based (Value Over Replacement) draft board for half-PPR scoring. Each row includes VOR rank, projected FP, floor, ceiling, confidence, sigma tier, and ADP comparison. Filter by `position` or `tier`. Sorted by draft value. **Requires x402 payment ($1.00 USDC on Base) or a valid bundle JWT bearer token.**","operationId":"draft_board_v1_draft_board_half_ppr_get","parameters":[{"name":"position","in":"query","required":false,"schema":{"description":"Filter by position","title":"Position","enum":["QB","RB","WR","TE"],"type":"string","nullable":true},"description":"Filter by position"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":600,"minimum":1,"description":"Max rows returned (default 200, max 600)","default":200,"title":"Limit"},"description":"Max rows returned (default 200, max 600)"},{"name":"tier","in":"query","required":false,"schema":{"description":"Filter by draft tier (integer, 1 = top tier)","title":"Tier","type":"integer","minimum":1,"nullable":true},"description":"Filter by draft tier (integer, 1 = top tier)"},{"name":"accept","in":"query","required":false,"schema":{"description":"Set to 'csv' to stream as CSV instead of JSON","title":"Accept","type":"string","nullable":true},"description":"Set to 'csv' to stream as CSV instead of JSON"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftBoardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"402":{"description":"Payment Required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}},"security":[{"x402Payment":[]}],"x-payment":{"amount":"1.00","currency":"USDC","network":"eip155:8453","atomic_amount":"1000000","scheme":"exact"},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"1.00"},"protocols":[{"x402":{}}]},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"position":{"type":"string","enum":["QB","RB","WR","TE"],"description":"Filter by position (optional)"},"limit":{"type":"integer","minimum":1,"maximum":600,"default":200,"description":"Max rows returned (default 200, max 600)"},"tier":{"type":"integer","minimum":1,"description":"Filter by draft tier (1 = top tier, optional)"},"accept":{"type":"string","enum":["csv"],"description":"Set to 'csv' to receive CSV instead of JSON"}}}}}}}},"/v1/draft-board/half-ppr/{player_id}":{"get":{"tags":["draft-board"],"summary":"Single player draft slot","description":"Returns the VOR draft board row for one player by nflreadpy `player_id`. Use `/v1/free/players` to look up valid player IDs. **Requires x402 payment ($0.10 USDC on Base) or a valid bundle JWT.**","operationId":"player_draft_slot_v1_draft_board_half_ppr__player_id__get","parameters":[{"name":"player_id","in":"path","required":true,"schema":{"type":"string","description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all IDs.","title":"Player Id","example":"00-0036971"},"description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all IDs."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftBoardResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}},"402":{"description":"Payment Required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}}},"security":[{"x402Payment":[]}],"x-payment":{"amount":"0.10","currency":"USDC","network":"eip155:8453","atomic_amount":"100000","scheme":"exact"},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"player_id":{"type":"string","description":"nflreadpy player ID (e.g. 00-0036971). Use /v1/free/players to browse all valid IDs.","example":"00-0036971"}},"required":["player_id"]}}}}}},"/v1/bundle/purchase":{"post":{"tags":["bundle"],"summary":"Purchase 7-day unlimited bundle","description":"Pay $3.00 USDC on Base (via x402) to receive a JWT bearer token granting unlimited access to all paid endpoints for 7 days. Token is returned immediately after payment settles. Pass it as `Authorization: Bearer <token>` on subsequent calls.","operationId":"purchase_bundle_v1_bundle_purchase_post","requestBody":{"description":"No request body required. Payment is provided via the `payment-signature` header (x402 protocol, $3.00 USDC on Base).","content":{"application/json":{"schema":{"type":"object"},"example":{}}},"required":false},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundlePurchaseResponse"}}}}}}},"/v1/bundle/status":{"get":{"tags":["bundle"],"summary":"Check bundle token validity","description":"Returns wallet, expiry, and issue timestamp for the provided JWT. Requires `Authorization: Bearer <token>` header.","operationId":"bundle_status_v1_bundle_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleStatusResponse"}}}}},"security":[]}},"/v1/bundle/draft_kit.zip":{"get":{"tags":["bundle"],"summary":"Download draft kit ZIP (bundle only)","description":"Streams a ZIP archive containing the full rankings CSV, VOR draft board CSV, and a methodology README. Requires a valid bundle JWT (`Authorization: Bearer <token>`).","operationId":"draft_kit_v1_bundle_draft_kit_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/api":{"get":{"summary":"API overview","description":"Returns a pointer to the interactive docs and OpenAPI spec. Free. No payment required.","operationId":"api_overview_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}}},"components":{"schemas":{"BundlePurchaseResponse":{"properties":{"token":{"type":"string","title":"Token"},"expires_at":{"type":"string","title":"Expires At"},"tier":{"type":"string","title":"Tier"},"duration_days":{"type":"integer","title":"Duration Days"}},"type":"object","required":["token","expires_at","tier","duration_days"],"title":"BundlePurchaseResponse"},"BundleStatusResponse":{"properties":{"wallet":{"type":"string","title":"Wallet"},"expires_at":{"type":"string","title":"Expires At"},"issued_at":{"type":"string","title":"Issued At"},"jti":{"type":"string","title":"Jti"}},"type":"object","required":["wallet","expires_at","issued_at","jti"],"title":"BundleStatusResponse"},"DraftBoardResponse":{"properties":{"data_version":{"type":"string","title":"Data Version"},"scoring":{"type":"string","title":"Scoring"},"position_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Filter"},"count":{"type":"integer","title":"Count"},"results":{"items":{"$ref":"#/components/schemas/DraftBoardRow"},"type":"array","title":"Results"}},"type":"object","required":["data_version","scoring","count","results"],"title":"DraftBoardResponse"},"DraftBoardRow":{"properties":{"vor_rank":{"type":"integer","title":"Vor Rank"},"player_id":{"type":"string","title":"Player Id"},"player_display_name":{"type":"string","title":"Player Display Name"},"position":{"type":"string","title":"Position"},"team":{"type":"string","title":"Team"},"proj_fp_adjusted":{"type":"number","title":"Proj Fp Adjusted"},"adp_rank":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Adp Rank"},"pos_rank_proj":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pos Rank Proj"},"repl_fp":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Repl Fp"},"vor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vor"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"fp_sd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Sd"},"fp_floor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Floor"},"fp_ceiling":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Ceiling"},"cv":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cv"},"vor_floor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vor Floor"},"vor_ceiling":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vor Ceiling"},"sigma_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sigma Tier"},"tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tier"},"adp_vs_vor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Adp Vs Vor"}},"type":"object","required":["vor_rank","player_id","player_display_name","position","team","proj_fp_adjusted"],"title":"DraftBoardRow"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"data_version":{"type":"string","title":"Data Version"},"version":{"type":"string","title":"Version"}},"type":"object","required":["status","data_version","version"],"title":"HealthResponse"},"MetaResponse":{"properties":{"data_version":{"type":"string","title":"Data Version"},"built_at":{"type":"string","title":"Built At"},"total_players":{"type":"integer","title":"Total Players"},"last_refresh_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Refresh Timestamp"},"paid_endpoints":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Paid Endpoints"}},"type":"object","required":["data_version","built_at","total_players","paid_endpoints"],"title":"MetaResponse"},"PlayerDirectoryEntry":{"properties":{"player_id":{"type":"string","title":"Player Id"},"player_display_name":{"type":"string","title":"Player Display Name"},"position":{"type":"string","title":"Position"},"team":{"type":"string","title":"Team"}},"type":"object","required":["player_id","player_display_name","position","team"],"title":"PlayerDirectoryEntry"},"PlayerDirectoryResponse":{"properties":{"data_version":{"type":"string","title":"Data Version"},"count":{"type":"integer","title":"Count"},"results":{"items":{"$ref":"#/components/schemas/PlayerDirectoryEntry"},"type":"array","title":"Results"}},"type":"object","required":["data_version","count","results"],"title":"PlayerDirectoryResponse"},"PlayerRow":{"properties":{"rank":{"type":"integer","title":"Rank"},"player_id":{"type":"string","title":"Player Id"},"player_display_name":{"type":"string","title":"Player Display Name"},"position":{"type":"string","title":"Position"},"team":{"type":"string","title":"Team"},"projected_fp_per_game":{"type":"number","title":"Projected Fp Per Game"},"projected_fp_season":{"type":"number","title":"Projected Fp Season"},"model_fp":{"type":"number","title":"Model Fp"},"age_next":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Age Next"},"age_adj":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Age Adj"},"sos_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sos Rating"},"sos_adj":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sos Adj"},"depth_rank":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth Rank"},"depth_adj":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Depth Adj"},"contract_apy":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Apy"},"contract_adj":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Adj"},"season_games":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season Games"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"data_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Data Source"},"fp_sd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Sd"},"fp_floor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Floor"},"fp_ceiling":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fp Ceiling"},"cv":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cv"}},"type":"object","required":["rank","player_id","player_display_name","position","team","projected_fp_per_game","projected_fp_season","model_fp"],"title":"PlayerRow"},"PlayerSummary":{"properties":{"rank":{"type":"integer","title":"Rank"},"player_id":{"type":"string","title":"Player Id"},"player_display_name":{"type":"string","title":"Player Display Name"},"team":{"type":"string","title":"Team"},"projected_fp_per_game":{"type":"number","title":"Projected Fp Per Game"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["rank","player_id","player_display_name","team","projected_fp_per_game"],"title":"PlayerSummary","description":"Minimal fields for the free top-1 endpoint."},"RankingsResponse":{"properties":{"data_version":{"type":"string","title":"Data Version"},"tier":{"type":"string","title":"Tier"},"position_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position Filter"},"count":{"type":"integer","title":"Count"},"results":{"items":{"$ref":"#/components/schemas/PlayerRow"},"type":"array","title":"Results"}},"type":"object","required":["data_version","tier","count","results"],"title":"RankingsResponse"},"Top1Response":{"properties":{"qb":{"$ref":"#/components/schemas/PlayerSummary"},"rb":{"$ref":"#/components/schemas/PlayerSummary"},"wr":{"$ref":"#/components/schemas/PlayerSummary"},"te":{"$ref":"#/components/schemas/PlayerSummary"}},"type":"object","required":["qb","rb","wr","te"],"title":"Top1Response"},"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"},"PaymentRequired":{"type":"object","description":"x402 payment challenge returned when a paid endpoint is called without a valid payment-signature header.","properties":{"x402Version":{"type":"integer","example":2},"error":{"type":"string","example":"payment_required"},"accepts":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","example":"exact"},"network":{"type":"string","example":"eip155:8453"},"asset":{"type":"string","description":"USDC contract address on Base"},"amount":{"type":"string","description":"Amount in USDC atomic units (6 decimals)"},"pay_to":{"type":"string","description":"Recipient wallet address"},"max_timeout_seconds":{"type":"integer","example":300}}}}}}},"securitySchemes":{"x402Payment":{"type":"http","scheme":"bearer","bearerFormat":"x402-usdc","description":"x402 micropayment protocol — USDC on Base mainnet (eip155:8453). Call the endpoint without a payment header to receive a 402 with payment details. See https://x402.org"}}}}