{"openapi":"3.1.0","info":{"title":"Play Clock API","description":"Pay-per-analysis NFL fantasy football intelligence, priced in USDC micropayments on\nAlgorand via the [x402](https://x402.org) protocol. Humans pay from a wallet; AI agents\npay programmatically. There are no accounts and no subscriptions — the wallet is the\nidentity, and each answer is bought one at a time.\n\n**How to call a paid endpoint**\n\n1. Call it with no payment. You get `402 Payment Required` whose body carries the\n   payment requirements (`accepts[]`), the resource description, and a Bazaar\n   discovery block describing the exact request and response shape.\n2. Pay and retry with the signed payload in the `PAYMENT-SIGNATURE` header\n   (the legacy `X-PAYMENT` name is also accepted).\n3. You get the analysis, plus a settlement receipt in `PAYMENT-RESPONSE`.\n\nPayment is verified before the handler runs and settled only after it returns 2xx: a\nfailed analysis is never charged.\n\n**Free endpoints:** `/v1/health`, `/v1/catalog`, `/v1/trending/preview`. Machine-readable\nprices and schemas live at `/v1/catalog`; an agent quickstart lives at `/llms.txt`.\n\n**Data attribution:** Data: nflverse (CC-BY 4.0), Sleeper. Player statistics come from\n[nflverse](https://github.com/nflverse) under\n[CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/); market signal, league and\nroster data come from the public read-only [Sleeper API](https://docs.sleeper.com/).\n\n**Every paid response** carries `verdict`, `confidence`, `reasoning`, `stats_cited[]`,\n`sources[]` and `meta` (generation time, per-dataset freshness, cache state). Trust is\nthe product: if a number is claimed, it is cited.","contact":{"name":"Play Clock","url":"https://github.com/"},"license":{"name":"MIT"},"version":"1.0.0"},"paths":{"/v1/health":{"get":{"tags":["free"],"summary":"Service health and data freshness","description":"Report liveness, the resolved NFL week, and how fresh the ingested data is.\n\n``status`` is ``\"degraded\"`` when ``meta/freshness`` is empty — the store is\nreachable but ingest has never written, which means every paid answer would\nbe built on nothing. That is worth an alert even though the process is up.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/catalog":{"get":{"tags":["free"],"summary":"Machine-readable endpoint catalog for agents","description":"Return every endpoint with its price, schemas, cache policy and payment config.\n\nThis is the agent-facing discovery document (PRD §4.1). It is assembled from\nthe same :data:`api.x402.ENDPOINT_SPECS` the 402 challenges are built from\nand the same price table the payment layer charges against, so a price shown\nhere is by construction the price a caller will be quoted.","operationId":"catalog_v1_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Catalog"}}}}}}},"/v1/trending/preview":{"get":{"tags":["free"],"summary":"Free teaser: top five trending players, no analysis","description":"Return the top movers with identity and trend count only.\n\nAdds come first (that is where waiver interest lives); drops top the list up\nwhen fewer than ``limit`` adds have been ingested. No engine runs here — the\nrows are read straight from the ``trending/{add,drop}`` documents the\n30-minute poll writes, joined to ``players/`` only for identity fields the\npoll did not already carry.","operationId":"trending_preview_v1_trending_preview_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5,"minimum":1,"description":"Rows to return. Capped at the free-teaser size.","default":5,"title":"Limit"},"description":"Rows to return. Capped at the free-teaser size."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/stats":{"get":{"tags":["free"],"summary":"Aggregate usage: how much has actually been paid for","description":"Free proof of life, built from settled receipts.\n\nExists for two audiences at once. A human deciding whether this is real\nwants to know somebody else already paid; the challenge submission wants\nevidence of non-self payers. Both are served by counts, so no payer address\nis republished here — how *many* people paid is the useful number, and it is\nthe one that cannot embarrass anybody.","operationId":"stats_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}}}},"/v1/trending":{"get":{"tags":["paid"],"summary":"Full trending board with analysis and add/fade verdicts","description":"Top trending adds and drops with per-player stat context and a verdict.","operationId":"trending_v1_trending_get","parameters":[{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"NFL week. Defaults to the current week.","title":"Week"},"description":"NFL week. Defaults to the current week."},{"name":"lookback_hours","in":"query","required":false,"schema":{"type":"integer","maximum":168,"minimum":1,"description":"Sleeper trending window.","default":24,"title":"Lookback Hours"},"description":"Sleeper trending window."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Board size.","default":25,"title":"Limit"},"description":"Board size."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrendingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sleepers":{"get":{"tags":["paid"],"summary":"Weekly sleeper picks with usage and matchup reasoning","description":"Eight to twelve low-rostered starts for the week, with confidence tiers.","operationId":"sleepers_v1_sleepers_get","parameters":[{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"NFL week. Defaults to the current week.","title":"Week"},"description":"NFL week. Defaults to the current week."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":25,"minimum":1,"description":"Maximum picks to return.","default":12,"title":"Limit"},"description":"Maximum picks to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SleepersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/waivers":{"get":{"tags":["paid"],"summary":"Waiver wire big board with FAB guidance","description":"Ranked waiver targets with stash/start labels and suggested FAB bids.","operationId":"waivers_v1_waivers_get","parameters":[{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"NFL week. Defaults to the current week.","title":"Week"},"description":"NFL week. Defaults to the current week."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Board size.","default":15,"title":"Limit"},"description":"Board size."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaiversResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/report":{"get":{"tags":["paid"],"summary":"League-wide weekly briefing (cached 12h)","description":"Emerging players, injury fallout chains, stock up/down, rookies, streamers.","operationId":"report_v1_report_get","parameters":[{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"NFL week. Defaults to the current week.","title":"Week"},"description":"NFL week. Defaults to the current week."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/player":{"post":{"tags":["paid"],"summary":"Deep dive on one player","description":"Last-four-week trends, usage trajectory, schedule outlook and a verdict.","operationId":"player_v1_player_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matchup":{"post":{"tags":["paid"],"summary":"Start/sit ranking across two to four players","description":"Rank the supplied players best-to-worst start for the week.","operationId":"matchup_v1_matchup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/roster":{"post":{"tags":["paid"],"summary":"Full roster audit (Sleeper username or pasted roster)","description":"Grade a roster, call the lineup, and name the adds available in that league.\n\nWith a ``sleeper_username`` the roster and the league's free-agent pool are\npulled live from Sleeper; with a pasted ``roster`` no league is known, so\n``free_agents`` is left **absent** rather than empty — absent means \"we do\nnot know who is available\", empty would mean \"nobody is\", and the engine\ntreats those differently.","operationId":"roster_v1_roster_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/team-report":{"post":{"tags":["paid"],"summary":"Team-aware deep report graded against your actual leaguemates","description":"Positional strength vs. leaguemates, league-available fixes, manager review.\n\nEvery league-relative number is computed in Python by\n:func:`api.data.team_analytics.build_team_report_facts` from Sleeper matchup\nhistory and passed to the engine as ``team_analytics`` — the engine narrates\nthose numbers and never produces them (tech spec §6). That history covers\ncompleted weeks only; see ``history_week`` below.","operationId":"team_report_v1_team_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/draft-board":{"get":{"tags":["paid"],"summary":"Tiered pre-draft board ranked against the market","description":"A tiered draft board with the market's values and reaches called out.","operationId":"draft_board_v1_draft_board_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":25,"description":"How many players to rank.","default":200,"title":"Limit"},"description":"How many players to rank."},{"name":"scoring","in":"query","required":false,"schema":{"type":"string","description":"Scoring format the board assumes.","default":"ppr","title":"Scoring"},"description":"Scoring format the board assumes."}],"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"}}}}}}},"/v1/draft-report":{"post":{"tags":["paid"],"summary":"Grade a completed fantasy draft","description":"Grade one drafted roster pick by pick against where the market had them.","operationId":"draft_report_v1_draft_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AnalysisMeta":{"properties":{"generated_at":{"type":"string","format":"date-time","title":"Generated At","description":"UTC timestamp when this analysis was produced."},"data_freshness":{"additionalProperties":{"type":"string"},"type":"object","title":"Data Freshness","description":"Per-dataset as-of markers, e.g. {'weekly_stats': '2026-09-16T09:00:00Z', 'trending': '2026-09-16T13:30:00Z'}. Mirrors the meta/freshness doc that ingest maintains."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Model id used for synthesis; None for the deterministic engine."},"cache":{"anyOf":[{"type":"string","enum":["hit","miss","fresh"]},{"type":"null"}],"title":"Cache","description":"Whether the body was served from cache, freshly cached, or uncached."},"attribution":{"type":"string","title":"Attribution","description":"Data source attribution (nflverse is CC-BY 4.0).","default":"Data: nflverse (CC-BY 4.0), Sleeper"}},"type":"object","required":["generated_at"],"title":"AnalysisMeta","description":"Provenance envelope attached to every paid response."},"AvailableFix":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"why":{"type":"string","title":"Why","description":"How this player addresses the deficiency."}},"type":"object","required":["player_id","name","position","why"],"title":"AvailableFix","description":"A concrete roster fix drawn from the league's actual free-agent pool."},"Catalog":{"properties":{"service":{"type":"string","title":"Service","description":"Product name."},"version":{"type":"string","title":"Version","description":"API version string."},"network":{"type":"string","title":"Network","description":"Algorand network payments settle on: 'testnet' or 'mainnet'."},"pay_to":{"type":"string","title":"Pay To","description":"Algorand address receiving USDC for every endpoint (Composite entry)."},"asset_id":{"type":"integer","title":"Asset Id","description":"USDC ASA id on the active network. 0 means payments are not configured."},"facilitator_url":{"type":"string","title":"Facilitator Url","description":"x402 facilitator base URL used for verify/settle."},"challenge_tag":{"type":"string","title":"Challenge Tag","description":"x402 challenge tag included in payment metadata."},"endpoints":{"items":{"$ref":"#/components/schemas/CatalogEntry"},"type":"array","title":"Endpoints","description":"Every endpoint, free and paid."},"attribution":{"type":"string","title":"Attribution","description":"Data source attribution.","default":"Data: nflverse (CC-BY 4.0), Sleeper"}},"additionalProperties":false,"type":"object","required":["service","version","network","pay_to","asset_id","facilitator_url","challenge_tag","endpoints"],"title":"Catalog","description":"Machine-readable catalog served at ``GET /v1/catalog`` (PRD §4.1)."},"CatalogEntry":{"properties":{"path":{"type":"string","title":"Path","description":"URL path, e.g. '/v1/player'."},"method":{"type":"string","enum":["GET","POST"],"title":"Method","description":"HTTP method."},"key":{"type":"string","title":"Key","description":"Stable endpoint key (see api.core.config.ENDPOINT_KEYS). Empty for free endpoints."},"price_usdc":{"type":"number","title":"Price Usdc","description":"Price in USDC. 0 for free endpoints."},"description":{"type":"string","title":"Description","description":"What the payment unlocks, in one sentence."},"request_schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Schema","description":"Name of the request model in the OpenAPI components, if any."},"response_schema":{"type":"string","title":"Response Schema","description":"Name of the response model in the OpenAPI components."},"free":{"type":"boolean","title":"Free","description":"Whether the endpoint is callable without payment."},"cache_ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Ttl Seconds","description":"How long a generated response is reused; None = always fresh."}},"additionalProperties":false,"type":"object","required":["path","method","key","price_usdc","description","response_schema","free"],"title":"CatalogEntry","description":"One endpoint as advertised to agents and the Bazaar."},"Deficiency":{"properties":{"position":{"type":"string","title":"Position","description":"Position group that is weak."},"severity":{"type":"string","enum":["high","medium","low"],"title":"Severity","description":"'high' = costing wins now."},"detail":{"type":"string","title":"Detail","description":"What is wrong, with the supporting numbers."},"available_fixes":{"items":{"$ref":"#/components/schemas/AvailableFix"},"type":"array","title":"Available Fixes","description":"Fixes restricted to players unrostered in THIS league (derived free-agent pool)."}},"type":"object","required":["position","severity","detail"],"title":"Deficiency","description":"A weak spot on the roster plus what can actually be done about it."},"DraftBoardPlayer":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"Team abbreviation; None for free agents."},"rank":{"type":"integer","title":"Rank","description":"Our overall board rank, 1 = first off the board."},"market_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Rank","description":"Sleeper draft-popularity rank (`search_rank`), lower = drafted earlier. This is a market signal, NOT a consensus ADP from a projection service."},"value_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value Delta","description":"How many places we move the player against the market's ordering OF THIS SAME BOARD. Positive means we rank him earlier than the market does (a value); negative means the market likes him more than we do. Compared position-to-position, not against the global market_rank, which would call every player on a truncated board a value."},"note":{"type":"string","title":"Note","description":"Why this player sits here, grounded in prior-season usage."}},"type":"object","required":["player_id","name","position","rank","note"],"title":"DraftBoardPlayer","description":"One player on the draft board, ranked against the market."},"DraftBoardResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"season":{"type":"integer","title":"Season","description":"NFL season this board is for."},"scoring":{"type":"string","title":"Scoring","description":"Scoring format the board assumes.","default":"ppr"},"tiers":{"items":{"$ref":"#/components/schemas/DraftTier"},"type":"array","title":"Tiers","description":"Tiered board, best tier first."},"values":{"items":{"$ref":"#/components/schemas/DraftBoardPlayer"},"type":"array","title":"Values","description":"Players we rank furthest ABOVE their market rank — draft-day values."},"reaches":{"items":{"$ref":"#/components/schemas/DraftBoardPlayer"},"type":"array","title":"Reaches","description":"Players we rank furthest BELOW their market rank — let someone else."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","season","tiers"],"title":"DraftBoardResponse","description":"A tiered pre-draft board with value and reach calls against the market."},"DraftPickReview":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"round":{"type":"integer","title":"Round","description":"Draft round."},"pick_no":{"type":"integer","title":"Pick No","description":"Overall pick number."},"verdict":{"type":"string","enum":["value","fair","reach"],"title":"Verdict","description":"Value, fair, or reach."},"value_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value Delta","description":"pick_no - market_rank. Positive = value; the callouts rank on this."},"note":{"type":"string","title":"Note","description":"Why, grounded in usage and market rank."}},"type":"object","required":["player_id","name","round","pick_no","verdict","note"],"title":"DraftPickReview","description":"A pick worth calling out, good or bad."},"DraftReportRequest":{"properties":{"draft_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Id","description":"Sleeper draft id. Preferred when known."},"sleeper_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleeper Username","description":"Sleeper username; the season's most recent draft is used."},"draft_slot":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Draft Slot","description":"Which seat in the draft to grade, 1-indexed. Only needed when a 'draft_id' is given without a username, since a draft contains every team's picks and a report grades one roster."},"season":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Season","description":"NFL season. Defaults to the active season."}},"additionalProperties":false,"type":"object","title":"DraftReportRequest","description":"Body for ``POST /v1/draft-report``.\n\nEither identifier works: a ``draft_id`` names the draft directly, while a\n``sleeper_username`` finds that user's most recent draft for the season."},"DraftReportResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"draft_id":{"type":"string","title":"Draft Id","description":"Sleeper draft id this report covers."},"season":{"type":"integer","title":"Season","description":"NFL season."},"grade":{"type":"string","title":"Grade","description":"Overall letter grade for the draft, e.g. 'B+'."},"roster":{"items":{"$ref":"#/components/schemas/DraftedPlayer"},"type":"array","title":"Roster","description":"Every pick, in draft order."},"positional_balance":{"items":{"$ref":"#/components/schemas/PositionalGrade"},"type":"array","title":"Positional Balance","description":"Grade per position group as drafted."},"best_picks":{"items":{"$ref":"#/components/schemas/DraftPickReview"},"type":"array","title":"Best Picks","description":"The picks that beat the market."},"worst_picks":{"items":{"$ref":"#/components/schemas/DraftPickReview"},"type":"array","title":"Worst Picks","description":"The picks that cost value."},"week_one_plan":{"items":{"type":"string"},"type":"array","title":"Week One Plan","description":"Concrete actions before Week 1: waiver targets, roles to watch."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","draft_id","season","grade","roster"],"title":"DraftReportResponse","description":"A graded post-draft report on one drafted roster."},"DraftTier":{"properties":{"tier":{"type":"integer","title":"Tier","description":"Tier number, 1 = best."},"label":{"type":"string","title":"Label","description":"Short tier name, e.g. 'Every-down RB1s'."},"players":{"items":{"$ref":"#/components/schemas/DraftBoardPlayer"},"type":"array","title":"Players","description":"Players in this tier, best first."}},"type":"object","required":["tier","label","players"],"title":"DraftTier","description":"A group of players who should be treated as interchangeable on the clock."},"DraftedPlayer":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"Team abbreviation."},"round":{"type":"integer","title":"Round","description":"Draft round this pick was made in."},"pick_no":{"type":"integer","title":"Pick No","description":"Overall pick number."},"market_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Market Rank","description":"Sleeper draft-popularity rank at the time of ingest."},"value_delta":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value Delta","description":"pick_no - market_rank. Positive means the player was taken LATER than the market drafts him — value; negative means earlier — a reach."}},"type":"object","required":["player_id","name","position","round","pick_no"],"title":"DraftedPlayer","description":"One pick made in the draft being graded."},"DropCandidate":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"reason":{"type":"string","title":"Reason","description":"Why they are droppable — usage collapse, role loss, bye-week math."},"risk":{"type":"string","enum":["high","medium","low"],"title":"Risk","description":"Risk of the drop backfiring: 'high' = think twice."}},"type":"object","required":["player_id","name","position","reason","risk"],"title":"DropCandidate","description":"A rosterable player the manager should consider cutting."},"EndpointUsage":{"properties":{"key":{"type":"string","title":"Key","description":"Endpoint key, e.g. 'trending'."},"paid_calls":{"type":"integer","title":"Paid Calls","description":"Settled payments for this endpoint."},"usdc":{"type":"number","title":"Usdc","description":"USDC settled through this endpoint."}},"type":"object","required":["key","paid_calls","usdc"],"title":"EndpointUsage","description":"How much one endpoint has been bought."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","enum":["ok","degraded"],"title":"Status","description":"Overall service health."},"version":{"type":"string","title":"Version","description":"Deployed API version."},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week","description":"Current NFL week as resolved from the schedule."},"season":{"type":"integer","title":"Season","description":"Active NFL season year."},"store_backend":{"type":"string","title":"Store Backend","description":"Active Store implementation."},"engine":{"type":"string","title":"Engine","description":"Active analysis engine."},"data_freshness":{"additionalProperties":{"type":"string"},"type":"object","title":"Data Freshness","description":"Per-dataset as-of markers from meta/freshness."}},"additionalProperties":false,"type":"object","required":["status","version","season","store_backend","engine"],"title":"HealthResponse","description":"Free ``GET /v1/health`` body."},"InjuryFallout":{"properties":{"injured_player":{"type":"string","title":"Injured Player","description":"Who went down."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"Their NFL team abbreviation."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Reported status, e.g. 'Out 4-6 weeks'."},"beneficiaries":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Beneficiaries","description":"Handcuffs and role-inheritors, best first."}},"type":"object","required":["injured_player"],"title":"InjuryFallout","description":"An injury and the downstream opportunity it creates."},"ManagerReview":{"properties":{"bench_points_lost":{"type":"number","title":"Bench Points Lost","description":"Total points scored by benched players who should have started, season to date."},"optimal_vs_actual":{"type":"number","title":"Optimal Vs Actual","description":"Optimal-lineup points minus actual points, season to date."},"lineup_efficiency_pct":{"type":"number","title":"Lineup Efficiency Pct","description":"actual / optimal as a percentage, e.g. 92.4."},"efficiency_rank":{"type":"integer","title":"Efficiency Rank","description":"Lineup-efficiency rank in the league, 1 = best."},"league_size":{"type":"integer","title":"League Size","description":"Number of teams in the league."},"luck_note":{"type":"string","title":"Luck Note","description":"Points-for vs. points-against and record-vs-expected analysis in plain language."},"expected_wins":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Wins","description":"Wins expected from points scored against an all-play schedule."},"actual_wins":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Actual Wins","description":"Actual wins to date."},"mis_start_patterns":{"items":{"type":"string"},"type":"array","title":"Mis Start Patterns","description":"Recurring positional mis-start patterns, each with its cost."},"observations":{"items":{"type":"string"},"type":"array","title":"Observations","description":"Non-computable behavioural observations. Explicitly not statistics."}},"type":"object","required":["bench_points_lost","optimal_vs_actual","lineup_efficiency_pct","efficiency_rank","league_size","luck_note"],"title":"ManagerReview","description":"Manager performance review computed from Sleeper matchup history.\n\nEvery field here is deterministic arithmetic (tech spec §6). Behavioural\nobservations that are not computable belong in ``observations`` and must be\nlabelled as observations, not statistics."},"ManualRosterPlayer":{"properties":{"name":{"type":"string","title":"Name","description":"Player name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation, if known."},"starter":{"type":"boolean","title":"Starter","description":"Whether they are currently in the lineup.","default":false}},"type":"object","required":["name"],"title":"ManualRosterPlayer","description":"One pasted roster slot, for managers not on Sleeper."},"MatchupRanking":{"properties":{"rank":{"type":"integer","title":"Rank","description":"1 = start this one first."},"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"opponent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent","description":"Week opponent team abbreviation."},"projection_note":{"type":"string","title":"Projection Note","description":"Expected outcome in plain language, with the drivers."},"def_vs_pos_rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Def Vs Pos Rank","description":"Opponent's rank in fantasy points allowed to this position (1 = worst defense)."},"call":{"type":"string","enum":["start","sit","flex","bench"],"title":"Call","description":"Start / sit / flex call for this player."}},"type":"object","required":["rank","player_id","name","position","projection_note","call"],"title":"MatchupRanking","description":"One player's placement in a start/sit comparison."},"MatchupRequest":{"properties":{"players":{"items":{"type":"string"},"type":"array","maxItems":4,"minItems":2,"title":"Players","description":"2–4 player names or Sleeper player_ids to compare."},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week","description":"Week to compare. Defaults to the current NFL week."}},"additionalProperties":false,"type":"object","required":["players"],"title":"MatchupRequest","description":"Body for ``POST /v1/matchup``. 2–4 players, names or Sleeper ids."},"MatchupResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"Week the comparison is scoped to."},"ranked":{"items":{"$ref":"#/components/schemas/MatchupRanking"},"type":"array","title":"Ranked","description":"Players ordered best-to-worst start."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week","ranked"],"title":"MatchupResponse","description":"Start/sit ranking across 2–4 players."},"PlayerProfile":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Injury/roster status, e.g. 'Questionable'."},"recent_weeks":{"items":{"$ref":"#/components/schemas/WeeklyStatLine"},"type":"array","title":"Recent Weeks","description":"Last four weeks of stat lines, oldest first."},"usage_trajectory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usage Trajectory","description":"Direction of usage: 'rising', 'flat', 'declining', with the delta."},"schedule_outlook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Outlook","description":"Upcoming schedule difficulty summary."}},"type":"object","required":["player_id","name","position"],"title":"PlayerProfile","description":"Identity + trajectory block for a single player."},"PlayerRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Player name; resolved via the player_index. e.g. 'Bijan Robinson'."},"player_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Id","description":"Sleeper player_id. Preferred when known — skips name resolution."},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week","description":"Week to analyse. Defaults to the current NFL week."}},"additionalProperties":false,"type":"object","title":"PlayerRequest","description":"Body for ``POST /v1/player``. Supply ``name`` or ``player_id``."},"PlayerResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"player":{"$ref":"#/components/schemas/PlayerProfile","description":"The player under analysis."},"week":{"type":"integer","title":"Week","description":"Week the analysis is scoped to."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","player","week"],"title":"PlayerResponse","description":"Deep dive on one player."},"PositionalGrade":{"properties":{"position":{"type":"string","title":"Position","description":"Position group, e.g. 'RB'."},"grade":{"type":"string","title":"Grade","description":"Letter grade, e.g. 'A-', 'C+'."},"note":{"type":"string","title":"Note","description":"One-line justification for the grade."}},"type":"object","required":["position","grade","note"],"title":"PositionalGrade","description":"Letter grade for one roster position group."},"PositionalStrength":{"properties":{"position":{"type":"string","title":"Position","description":"Position group, e.g. 'WR'."},"league_rank":{"type":"integer","title":"League Rank","description":"Rank within the league, 1 = best."},"league_size":{"type":"integer","title":"League Size","description":"Number of teams in the league."},"points_per_week":{"type":"number","title":"Points Per Week","description":"Average points from this position group per week."},"league_avg_points_per_week":{"type":"number","title":"League Avg Points Per Week","description":"League average for this position group."},"grade":{"type":"string","title":"Grade","description":"Letter grade relative to leaguemates."}},"type":"object","required":["position","league_rank","league_size","points_per_week","league_avg_points_per_week","grade"],"title":"PositionalStrength","description":"How one position group grades against the manager's actual leaguemates.\n\nComputed deterministically in Python from Sleeper matchup history — the LLM\nnarrates these numbers, it never produces them (tech spec §6)."},"ReportPlayerNote":{"properties":{"player_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player Id","description":"Sleeper player_id, when resolved."},"name":{"type":"string","title":"Name","description":"Player name."},"position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"note":{"type":"string","title":"Note","description":"The callout itself, grounded in a stat or a news event."}},"type":"object","required":["name","note"],"title":"ReportPlayerNote","description":"A single named callout inside a weekly-report section."},"ReportResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"NFL week this briefing covers."},"season":{"type":"integer","title":"Season","description":"NFL season year."},"emerging":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Emerging","description":"Usage-delta x trending detections: players 'coming up' before consensus."},"injury_fallout":{"items":{"$ref":"#/components/schemas/InjuryFallout"},"type":"array","title":"Injury Fallout","description":"Injuries and their handcuff/opportunity chains."},"stock_up":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Stock Up","description":"Rising value."},"stock_down":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Stock Down","description":"Falling value."},"rookie_watch":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Rookie Watch","description":"Rookies whose role is trending up."},"streamers":{"items":{"$ref":"#/components/schemas/ReportPlayerNote"},"type":"array","title":"Streamers","description":"One-week plays: QB/TE/DEF/K streaming options."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week","season"],"title":"ReportResponse","description":"League-wide weekly briefing — the flagship cached product."},"RosterRequest":{"properties":{"sleeper_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleeper Username","description":"Sleeper username; we pull the roster via the free Sleeper API."},"league_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id","description":"Sleeper league id. Omitted: first NFL league for the season is used."},"roster":{"anyOf":[{"items":{"$ref":"#/components/schemas/ManualRosterPlayer"},"type":"array"},{"type":"null"}],"title":"Roster","description":"Manually pasted roster, for non-Sleeper managers."},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week","description":"Week to audit. Defaults to the current NFL week."}},"additionalProperties":false,"type":"object","title":"RosterRequest","description":"Body for ``POST /v1/roster``. Supply ``sleeper_username`` **or** ``roster``."},"RosterResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"Week the audit is scoped to."},"sleeper_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sleeper Username","description":"Sleeper username, when the roster was pulled rather than pasted."},"league_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id","description":"Sleeper league id, when known."},"positional_grades":{"items":{"$ref":"#/components/schemas/PositionalGrade"},"type":"array","title":"Positional Grades","description":"Grade per position group."},"start_sit":{"items":{"$ref":"#/components/schemas/StartSitCallout"},"type":"array","title":"Start Sit","description":"This week's start/sit calls."},"drop_candidates":{"items":{"$ref":"#/components/schemas/DropCandidate"},"type":"array","title":"Drop Candidates","description":"Players worth cutting, worst first."},"waiver_adds":{"items":{"$ref":"#/components/schemas/WaiverAdd"},"type":"array","title":"Waiver Adds","description":"Top available adds. When a league is known, restricted to that league's free-agent pool."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week"],"title":"RosterResponse","description":"Full roster audit for one manager's team."},"SleeperPick":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"opponent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent","description":"Week opponent team abbreviation."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence tier for this individual pick."},"usage_note":{"type":"string","title":"Usage Note","description":"The usage trend that makes them a sleeper: snap %, target share, RZ touches."},"matchup_note":{"type":"string","title":"Matchup Note","description":"Why the matchup helps — opponent defense vs. position."},"rationale":{"type":"string","title":"Rationale","description":"One-paragraph case for starting them this week."}},"type":"object","required":["player_id","name","position","confidence","usage_note","matchup_note","rationale"],"title":"SleeperPick","description":"One weekly sleeper recommendation."},"SleepersResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"NFL week these picks apply to."},"season":{"type":"integer","title":"Season","description":"NFL season year."},"picks":{"items":{"$ref":"#/components/schemas/SleeperPick"},"type":"array","title":"Picks","description":"Sleeper picks, best first."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week","season","picks"],"title":"SleepersResponse","description":"8–12 weekly sleeper picks with usage and matchup reasoning."},"SourceRef":{"properties":{"title":{"type":"string","title":"Title","description":"Headline or page title."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Canonical URL, when the grounding tool gave one."},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published","description":"Publication timestamp or human label, e.g. '2026-09-14' or '2h ago'."}},"type":"object","required":["title"],"title":"SourceRef","description":"A news/research citation produced by the google_search-grounded agent."},"StartSitCallout":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"call":{"type":"string","enum":["start","sit","flex","bench"],"title":"Call","description":"Start / sit / flex / bench."},"reason":{"type":"string","title":"Reason","description":"Why, grounded in usage and matchup."}},"type":"object","required":["player_id","name","position","call","reason"],"title":"StartSitCallout","description":"A single start/sit recommendation within a roster audit."},"StatCitation":{"properties":{"stat":{"type":"string","title":"Stat","description":"Stat name, e.g. 'target_share', 'snap_pct', 'rz_touches'."},"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"integer"}],"title":"Value","description":"The cited value, as returned by the data tool."},"player":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Player","description":"Player this stat is about; None for team/defense-level stats."},"source":{"type":"string","title":"Source","description":"Dataset and slice, e.g. 'nflverse weekly_stats 2026w3' or 'sleeper trending/add'."}},"type":"object","required":["stat","value","source"],"title":"StatCitation","description":"One hard number backing a claim.\n\nThe stats agent may only cite numbers that came back from a tool call — never\na model-recalled figure (tech spec §5). ``source`` records which dataset and\nslice the number came from so a reader can go verify it."},"StatsResponse":{"properties":{"paid_analyses":{"type":"integer","title":"Paid Analyses","description":"Total settled payments served."},"unique_payers":{"type":"integer","title":"Unique Payers","description":"Distinct paying addresses."},"usdc_settled":{"type":"number","title":"Usdc Settled","description":"Total USDC settled."},"network":{"type":"string","title":"Network","description":"Algorand network these settlements are on."},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since","description":"Timestamp of the first settlement."},"by_endpoint":{"items":{"$ref":"#/components/schemas/EndpointUsage"},"type":"array","title":"By Endpoint","description":"Per-endpoint breakdown, busiest first."}},"type":"object","required":["paid_analyses","unique_payers","usdc_settled","network"],"title":"StatsResponse","description":"Aggregate usage, built from settled receipts. Free, and deliberately coarse.\n\nIndividual payer addresses are public on chain but are not republished here:\nthe useful number is how many different people paid, not who they were."},"TeamReportRequest":{"properties":{"sleeper_username":{"type":"string","title":"Sleeper Username","description":"Sleeper username whose team is analysed."},"league_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Id","description":"Sleeper league id. Omitted: the first NFL league for the season is used."},"week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Week","description":"Week through which to analyse. Defaults to the current NFL week."}},"additionalProperties":false,"type":"object","required":["sleeper_username"],"title":"TeamReportRequest","description":"Body for ``POST /v1/team-report``."},"TeamReportResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"Week the report is scoped to."},"season":{"type":"integer","title":"Season","description":"NFL season year."},"sleeper_username":{"type":"string","title":"Sleeper Username","description":"Sleeper username the report was built for."},"league_id":{"type":"string","title":"League Id","description":"Sleeper league id analysed."},"league_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"League Name","description":"League display name."},"positional_strength_vs_league":{"items":{"$ref":"#/components/schemas/PositionalStrength"},"type":"array","title":"Positional Strength Vs League","description":"Position-by-position grading against actual leaguemates."},"deficiencies":{"items":{"$ref":"#/components/schemas/Deficiency"},"type":"array","title":"Deficiencies","description":"Weak spots with league-available fixes."},"manager_review":{"$ref":"#/components/schemas/ManagerReview","description":"Deterministic manager performance review."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week","season","sleeper_username","league_id","manager_review"],"title":"TeamReportResponse","description":"Team-aware deep report: roster strength, deficiencies, and a manager review."},"TrendingPlayer":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position, e.g. 'RB', 'WR', 'TE', 'QB', 'K', 'DEF'."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation; None for free agents."},"trend":{"type":"string","enum":["add","drop"],"title":"Trend","description":"Whether managers are adding or dropping."},"trend_count":{"type":"integer","title":"Trend Count","description":"Sleeper add/drop count over the lookback window."},"analysis":{"type":"string","title":"Analysis","description":"Why this is happening — usage, injury, or opportunity change."},"verdict":{"type":"string","enum":["add","fade","hold"],"title":"Verdict","description":"'add' = follow the crowd, 'fade' = the market is wrong, 'hold' = no action."}},"type":"object","required":["player_id","name","position","trend","trend_count","analysis","verdict"],"title":"TrendingPlayer","description":"One row of the trending add/drop board, with our take on it."},"TrendingPreviewPlayer":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"trend":{"type":"string","enum":["add","drop"],"title":"Trend","description":"Add or drop."},"trend_count":{"type":"integer","title":"Trend Count","description":"Sleeper add/drop count over the lookback window."}},"type":"object","required":["player_id","name","position","trend","trend_count"],"title":"TrendingPreviewPlayer","description":"Free-teaser row: identity and trend count only, no analysis (PRD §4.1)."},"TrendingPreviewResponse":{"properties":{"players":{"items":{"$ref":"#/components/schemas/TrendingPreviewPlayer"},"type":"array","title":"Players","description":"Top 5 trending players, no analysis."},"lookback_hours":{"type":"integer","title":"Lookback Hours","description":"Sleeper trending lookback window used.","default":24},"upsell":{"type":"string","title":"Upsell","description":"Pointer to the paid endpoint.","default":"Full board with analysis and add/fade verdicts: GET /v1/trending"},"attribution":{"type":"string","title":"Attribution","description":"Data source attribution.","default":"Data: nflverse (CC-BY 4.0), Sleeper"}},"additionalProperties":false,"type":"object","required":["players"],"title":"TrendingPreviewResponse","description":"Free ``GET /v1/trending/preview`` body. Carries no verdict block by design."},"TrendingResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"players":{"items":{"$ref":"#/components/schemas/TrendingPlayer"},"type":"array","title":"Players","description":"Ranked trending players, adds and drops."},"lookback_hours":{"type":"integer","title":"Lookback Hours","description":"Sleeper trending lookback window used.","default":24}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","players"],"title":"TrendingResponse","description":"Full trending board (top 25) with per-player stat context."},"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"},"WaiverAdd":{"properties":{"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"reason":{"type":"string","title":"Reason","description":"Why they fit this roster's needs."},"priority":{"type":"integer","title":"Priority","description":"1 = claim first."}},"type":"object","required":["player_id","name","position","reason","priority"],"title":"WaiverAdd","description":"A waiver-wire add suggested for this specific roster."},"WaiverTarget":{"properties":{"rank":{"type":"integer","title":"Rank","description":"Board rank, 1 = top priority."},"player_id":{"type":"string","title":"Player Id","description":"Sleeper player_id."},"name":{"type":"string","title":"Name","description":"Full player name."},"position":{"type":"string","title":"Position","description":"Position abbreviation."},"team":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team","description":"NFL team abbreviation."},"trend_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trend Count","description":"Sleeper add count — our proxy for % rostered movement."},"stash_or_start":{"type":"string","enum":["stash","start","streamer"],"title":"Stash Or Start","description":"'start' = plays now, 'stash' = future value, 'streamer' = one-week play."},"fab_bid_pct":{"type":"number","title":"Fab Bid Pct","description":"Suggested FAB bid as a percentage of remaining budget, e.g. 12.5."},"rationale":{"type":"string","title":"Rationale","description":"Why they are worth the claim, grounded in usage/opportunity."}},"type":"object","required":["rank","player_id","name","position","stash_or_start","fab_bid_pct","rationale"],"title":"WaiverTarget","description":"One row of the waiver-wire big board."},"WaiversResponse":{"properties":{"verdict":{"type":"string","title":"Verdict","description":"The headline call, in one sentence. The thing they paid for."},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence","description":"Confidence in the verdict."},"reasoning":{"type":"string","title":"Reasoning","description":"Written justification. The only long-prose field; dropped in compact mode."},"stats_cited":{"items":{"$ref":"#/components/schemas/StatCitation"},"type":"array","title":"Stats Cited","description":"Every hard number referenced by the reasoning."},"sources":{"items":{"$ref":"#/components/schemas/SourceRef"},"type":"array","title":"Sources","description":"News/research citations supporting the reasoning."},"meta":{"$ref":"#/components/schemas/AnalysisMeta","description":"Provenance: when, from what data, by which model."},"week":{"type":"integer","title":"Week","description":"NFL week this board applies to."},"season":{"type":"integer","title":"Season","description":"NFL season year."},"board":{"items":{"$ref":"#/components/schemas/WaiverTarget"},"type":"array","title":"Board","description":"Waiver targets, best first."}},"additionalProperties":false,"type":"object","required":["verdict","confidence","reasoning","meta","week","season","board"],"title":"WaiversResponse","description":"Ranked waiver-wire big board for the week."},"WeeklyStatLine":{"properties":{"week":{"type":"integer","title":"Week","description":"NFL week."},"opponent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Opponent","description":"Opponent team abbreviation."},"fantasy_points":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fantasy Points","description":"Fantasy points (PPR unless noted)."},"snap_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Snap Pct","description":"Share of team offensive snaps, 0–1."},"targets":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Targets","description":"Targets."},"target_share":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Share","description":"Share of team targets, 0–1."},"carries":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Carries","description":"Rush attempts."},"rz_touches":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rz Touches","description":"Red-zone touches (carries + targets)."}},"type":"object","required":["week"],"title":"WeeklyStatLine","description":"One player-week stat line as ingested from nflverse."}}},"tags":[{"name":"free","description":"No payment required. Health, the endpoint catalog, and the trending teaser."},{"name":"paid","description":"x402-gated. Returns 402 with payment requirements until a valid payment is presented; settles only after a successful response."}]}