Server definition
- Hash
- sha256:02e2892bc3fedd22a6b97a84d33133d504d1b12b2984525503a37e80ad1c0ec8
- What it is
- What a remote MCP server returned when asked what it offers: 34 tools
The blob, as servednamed by its sha256
{
"instructions": "DFS workflow: (1) list_slates(playable=true) -> pick slate_id. (2) slate_health(slate_id, sport) BEFORE generate_lineups — a slate-locked blocker is a hard stop; 'odds/projections not cached' is only a WARNING (generate fetches them live; call slate_refresh first for the freshest data and the latest confirmations). (3) Resolve the contest: contest_advice(name) -> live_match.contest_id, or list_contests / list_live_contests. Pass a UNIQUE contest_id, never a name: if contest_advice returns ambiguous:true (same name on >1 slate), pick from alternatives by slate_id/start_time. (4) generate_lineups(date, sport, slate_id, contest_id, preset, lineups) — pass entry_template_csv (your downloaded FanDuel entries-template) for an upload-ready CSV; WITHOUT it you get a review-only roster CSV that FanDuel rejects with '0 entries updated'. Pass X-API-Key on heavy tools.",
"tools": [
{
"description": "Issue Key\n\nIdempotently issue a user's API key and ALWAYS return the paste-able\nconnect block. Returns the email's existing active key (or mints one) so a\nuser keeps a single key across dashboard reloads; with rotate=true, revokes\nthe existing keys and mints a fresh one. Admin-gated — the dashboard's\nper-user provision route (which verifies the user's Firebase token) calls\nthis server-side, never the browser.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"api_key\": \"Api Key\",\n \"tier\": \"Tier\",\n \"limits\": {}\n}\n```\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"email": {
"maxLength": 200,
"minLength": 5,
"title": "email",
"type": "string"
},
"rotate": {
"default": false,
"description": "Revoke existing keys and mint a fresh one.",
"title": "rotate",
"type": "boolean"
},
"tier": {
"default": "personal",
"pattern": "^(starter|personal|business)$",
"title": "tier",
"type": "string"
}
},
"required": [
"email"
],
"title": "admin_issue_keyArguments",
"type": "object"
},
"name": "admin_issue_key",
"outputSchema": null
},
{
"description": "Agent Guide\n\nSelf-serve onboarding: connect any agent (Claude/MCP or REST) to drive the\nV12 motor, the same engine the dashboard agent uses. No auth. Returns\ncopy-paste MCP + REST config with a PLACEHOLDER key, the endpoint map, and the\ngenerate body fields. Operators: issue each user their OWN key via\nPOST /v1/admin/create-key — never share one key.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
"inputSchema": {
"properties": {},
"title": "agent_guideArguments",
"type": "object"
},
"name": "agent_guide",
"outputSchema": null
},
{
"description": "Betting Agent Guide\n\nHow any agent uses the MLB betting tools + how to read the output.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
"inputSchema": {
"properties": {},
"title": "betting_agent_guideArguments",
"type": "object"
},
"name": "betting_agent_guide",
"outputSchema": null
},
{
"description": "Analyze Prop\n\nModel a single player's prop vs tonight's FanDuel line -> edge.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"name": {
"title": "name",
"type": "string"
},
"prop": {
"default": "home_run",
"title": "prop",
"type": "string"
},
"season": {
"default": 2026,
"title": "season",
"type": "integer"
},
"threshold": {
"default": 2,
"title": "threshold",
"type": "integer"
}
},
"required": [
"name"
],
"title": "betting_analyze_propArguments",
"type": "object"
},
"name": "betting_analyze_prop",
"outputSchema": null
},
{
"description": "Best Bets\n\nTHE board sweep — scans EVERY main prop market (HR/RBI/hit/total_bases/\n2+hits/stolen_base) in one call and returns the top edges across all of them,\nnot just home runs. Power props carry the Savant validation (CONFIRMED power\nranked above neutral/noise). Use this for an open 'what's hot / best plays /\nwhat do you recommend tonight' so you NEVER conclude off a single-market scan.\nA SCREEN vs the vig line — validate with CLV; game-side value is separate\n(betting_sharp / betting_game_model).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"limit": {
"default": 12,
"title": "limit",
"type": "integer"
},
"min_edge": {
"default": 2,
"title": "min_edge",
"type": "number"
}
},
"title": "betting_best_betsArguments",
"type": "object"
},
"name": "betting_best_bets",
"outputSchema": null
},
{
"description": "Build Parlay\n\nDeterministic parlay analysis for BOTH leg shapes. Body:\n{legs:[...], ticket_odds?}. PROP legs {name, prop, threshold} keep the\nlegacy correlation-aware EV. GAME-side legs (ML / run line / total / team\ntotal / F5, selected by the `market` field) — the slips users actually\npaste — are priced from the CURRENT de-vigged market at that exact market/\nline (canonical team resolution), falling back to the market-anchored run\nmodel for totals; per-leg fair prob + edge vs the slip's price, combined\npayout / breakeven / fair prob / EV under a documented independence\nassumption. Legs sharing a game are flagged correlated=true and get a\ncorrelation_warning INSTEAD of a combined edge. ticket_odds (the slip's\nprinted combined price) is verified vs the leg product — >2% off flags\nticket_odds_mismatch (the slip was misread; do not trust the numbers).\nNEVER estimate a parlay in prose — this endpoint is the math.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"legs": {
"items": {
"description": "One parlay leg — TWO shapes, discriminated by the `market` field.\n\nPROP leg (legacy): {name, prop, threshold?}\nGAME-side leg (C12): {market: moneyline|run_line|total|team_total|\n f5_moneyline|f5_total, team, side: over/under/home/\n away/<team>, line?, american_odds (the SLIP's price —\n authoritative for the payout math)}.",
"properties": {
"american_odds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "American Odds"
},
"line": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "Line"
},
"market": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Market"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Name"
},
"prop": {
"default": "home_run",
"title": "Prop",
"type": "string"
},
"side": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Side"
},
"team": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Team"
},
"threshold": {
"default": 2,
"title": "Threshold",
"type": "integer"
}
},
"title": "_ParlayLeg",
"type": "object"
},
"title": "legs",
"type": "array"
},
"ticket_odds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "ticket_odds",
"type": "integer"
}
},
"required": [
"legs"
],
"title": "betting_build_parlayArguments",
"type": "object"
},
"name": "betting_build_parlay",
"outputSchema": null
},
{
"description": "Cross Book\n\nCross-book value: FanDuel vs DraftKings (DK pulled via ESPN's public API,\nno key/WS). LINE_SHOP (the books hang different numbers — take the easier\nside) and PRICE_SHOP (better price, same line) are CONFIRMED edges, no model\nneeded. Arbitrage is NOT auto-reported (needs over/under sides, which ESPN\ndoesn't label). Overnight only pitcher_strikeouts overlaps; richer markets\nappear near game time.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"prop": {
"default": "pitcher_strikeouts",
"title": "prop",
"type": "string"
}
},
"title": "betting_cross_bookArguments",
"type": "object"
},
"name": "betting_cross_book",
"outputSchema": null
},
{
"description": "Game Lines\n\nGAME markets — moneyline / run total / run line for today's MLB games. This\nanswers the 'quién gana / cuántas carreras / pronóstico Yankees vs Toronto'\nquestions that player props CAN'T (V12 used to just refuse them). Optional\nteam filter ('Yankees', 'NYY'). MARKET data from ESPN's public scoreboard,\nsurfaced as-is — V12 has NO game-outcome model, so this is the book's own\nnumber, never a fabricated prediction. A book may not have posted a game yet\n(fields null) — say so, don't invent a line.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"team": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "team",
"type": "string"
}
},
"title": "betting_game_linesArguments",
"type": "object"
},
"name": "betting_game_lines",
"outputSchema": null
},
{
"description": "Game Model\n\nMODEL the GAME run markets — TEAM TOTALS (over/under) and NRFI/YRFI — vs\nthe FanDuel line, MARKET-ANCHORED: expected_runs = the book's de-vigged\nimplied mean + 0.25×(structural model − book), and every edge is computed vs\nthe FAIR (de-vigged) probability, never the raw vig price. The structural\ninputs (season runs/game, opposing STARTER + BULLPEN run factors, park;\nnegative-binomial tails) supply only the tilt. Entries with anchored=false /\nmodel_only=true carry edge=null — present them as context, NEVER as value.\nA SCREEN vs the market, not a lock — validate with CLV. For raw lines on\nevery market use betting_market.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"team": {
"title": "team",
"type": "string"
}
},
"required": [
"team"
],
"title": "betting_game_modelArguments",
"type": "object"
},
"name": "betting_game_model",
"outputSchema": null
},
{
"description": "Log Bet\n\nRecord a bet you placed (per user) so we can track P&L + CLV over time.\nBody: {uid, market, selection, odds (American), stake, line?, prop?, team?,\ngame?, book?}. Append-only — this is the evidence base that PROVES edge.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"book": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "book",
"type": "string"
},
"game": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "game",
"type": "string"
},
"line": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"title": "line",
"type": "number"
},
"market": {
"title": "market",
"type": "string"
},
"odds": {
"title": "odds",
"type": "integer"
},
"prop": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "prop",
"type": "string"
},
"selection": {
"title": "selection",
"type": "string"
},
"stake": {
"title": "stake",
"type": "number"
},
"team": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "team",
"type": "string"
},
"uid": {
"title": "uid",
"type": "string"
}
},
"required": [
"uid",
"market",
"selection",
"odds",
"stake"
],
"title": "betting_log_betArguments",
"type": "object"
},
"name": "betting_log_bet",
"outputSchema": null
},
{
"description": "Market\n\nFULL FanDuel market board for a team's game — EVERY market with real odds +\nde-vig fair price, so NO market question goes unanswered. Game lines (ML /\ntotal / run line), FIRST 5 INNINGS (F5), TEAM TOTALS, NRFI/YRFI, alternate\nlines, AND the full player-prop menu (HR / 2+ HR / hit / 2+ hits / RBI /\n2+ RBI / run / single / double / triple / total bases / stolen base / K).\nThe book's market surfaced as-is (no model). For our model edge on a prop,\nfollow up with betting_analyze_prop.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"team": {
"title": "team",
"type": "string"
}
},
"required": [
"team"
],
"title": "betting_marketArguments",
"type": "object"
},
"name": "betting_market",
"outputSchema": null
},
{
"description": "Market Movers\n\nMARKET pattern (not model opinion): how FanDuel lines MOVED today, from the\ncaptured snapshots. A line that shortened = money coming in (sharp/news); a\ndrift = money off. This is the 'obvious opportunity' signal — market-confirmed,\nindependent of our unproven model. Needs accumulated capture; thin → thin.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"min_move": {
"default": 3,
"title": "min_move",
"type": "number"
},
"prop": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "prop",
"type": "string"
}
},
"title": "betting_market_moversArguments",
"type": "object"
},
"name": "betting_market_movers",
"outputSchema": null
},
{
"description": "Matchup\n\nGROUNDING — the real game for a team today: probable pitchers + the POSTED\nlineup (ACTUAL player names from MLB statsapi) + the market line + the CONTEXT\na pro reasons with: home-plate UMPIRE (strike zone → totals/Ks), the INJURY\nreport (who's OUT / Day-To-Day), and BULLPEN health (ERA / blown saves). Call\nthis BEFORE naming any player or discussing a game. Name ONLY the players this\nreturns — never a roster from memory (that is how the agent ends up naming\nplayers who aren't on the team).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"team": {
"title": "team",
"type": "string"
}
},
"required": [
"team"
],
"title": "betting_matchupArguments",
"type": "object"
},
"name": "betting_matchup",
"outputSchema": null
},
{
"description": "My Bets\n\nA user's bet history + P&L / CLV summary. avg_clv_pct > 0 over time = you're\nbeating the closing line = real edge (the only durable proof).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"uid": {
"title": "uid",
"type": "string"
}
},
"required": [
"uid"
],
"title": "betting_my_betsArguments",
"type": "object"
},
"name": "betting_my_bets",
"outputSchema": null
},
{
"description": "Player Form\n\nStreak / splits / recent form for any player ('racha de X').\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"name": {
"title": "name",
"type": "string"
},
"season": {
"default": 2026,
"title": "season",
"type": "integer"
}
},
"required": [
"name"
],
"title": "betting_player_formArguments",
"type": "object"
},
"name": "betting_player_form",
"outputSchema": null
},
{
"description": "Scan Edges\n\nTonight's prop board ranked by model edge (VALUE first).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"coors": {
"default": false,
"title": "coors",
"type": "boolean"
},
"limit": {
"default": 15,
"title": "limit",
"type": "integer"
},
"min_edge": {
"default": 2,
"title": "min_edge",
"type": "number"
},
"prop": {
"default": "home_run",
"title": "prop",
"type": "string"
},
"season": {
"default": 2026,
"title": "season",
"type": "integer"
},
"threshold": {
"default": 2,
"title": "threshold",
"type": "integer"
}
},
"title": "betting_scan_edgesArguments",
"type": "object"
},
"name": "betting_scan_edges",
"outputSchema": null
},
{
"description": "Settle Bet\n\nSettle a logged bet. Body: {uid, bet_id, result: won|lost|push,\nclosing_odds?}. closing_odds lets us compute CLV (did you beat the close).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"bet_id": {
"title": "bet_id",
"type": "string"
},
"closing_odds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "closing_odds",
"type": "integer"
},
"result": {
"title": "result",
"type": "string"
},
"uid": {
"title": "uid",
"type": "string"
}
},
"required": [
"uid",
"bet_id",
"result"
],
"title": "betting_settle_betArguments",
"type": "object"
},
"name": "betting_settle_bet",
"outputSchema": null
},
{
"description": "Sharp\n\nSHARP value — FanDuel vs PINNACLE (the sharpest book, ~2% hold). Pinnacle's\nde-vigged line ≈ TRUE probability, so this is the most reliable value signal in\nthe kit, NO model needed: edge_vs_sharp = FD's price minus the sharp's true\nprob; POSITIVE means FanDuel pays MORE than fair (real value vs the market).\nPlus total line-shop. Pinnacle only lists UPCOMING games (gone once started).\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"team": {
"title": "team",
"type": "string"
}
},
"required": [
"team"
],
"title": "betting_sharpArguments",
"type": "object"
},
"name": "betting_sharp",
"outputSchema": null
},
{
"description": "Contest Advice\n\nAdvice for a concrete contest name. Resolves the name against the LIVE\nlobby FIRST so a real live contest is never reported missing (the curated\nregistry is only a subset — that was the \"$800 Wed MLB Home Run no existe\"\nbug), then layers registry strategy advice on top when a template matches.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"name": {
"title": "name",
"type": "string"
},
"platform": {
"default": "fd",
"title": "platform",
"type": "string"
},
"sport": {
"default": "MLB",
"title": "sport",
"type": "string"
}
},
"required": [
"name"
],
"title": "contest_adviceArguments",
"type": "object"
},
"name": "contest_advice",
"outputSchema": null
},
{
"description": "Contest Semaforo\n\nVIP-only: per-contest play/skip verdict from the owner's verified P&L\nbands + structure gates + rake/fill math. See core/data/contest_semaforo.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 60,
"title": "limit",
"type": "integer"
},
"platform": {
"default": "fd",
"title": "platform",
"type": "string"
},
"sport": {
"default": "MLB",
"title": "sport",
"type": "string"
}
},
"title": "contest_semaforoArguments",
"type": "object"
},
"name": "contest_semaforo",
"outputSchema": null
},
{
"description": "Fill Template\n\nFill a downloaded FanDuel/DK entries-template with already-generated\nlineups WITHOUT re-running the optimizer — the MCP-callable equivalent of the\ndashboard's fill_template. Keeps each entry row's leading columns (entry_id,\ncontest_id, fee) and replaces the roster-slot columns with a lineup's upload\ntokens, cycling lineups if there are more entry rows than lineups.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"lineups": {
"description": "Each lineup = upload tokens in template roster-slot order.",
"items": {
"items": {
"type": "string"
},
"type": "array"
},
"maxItems": 200,
"title": "lineups",
"type": "array"
},
"template_csv": {
"description": "Raw CSV of the entries-template (headers + entry rows).",
"maxLength": 8000000,
"title": "template_csv",
"type": "string"
}
},
"required": [
"template_csv",
"lineups"
],
"title": "fill_templateArguments",
"type": "object"
},
"name": "fill_template",
"outputSchema": null
},
{
"description": "Generate Lineups\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"status\": \"Status\",\n \"generated_at\": \"Generated At\",\n \"warnings\": [],\n \"exposures\": {},\n \"lineups\": []\n}\n```\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"allow_locked": {
"default": false,
"description": "Explicit replay/late-swap override. Default false blocks slate_id generation once any game has started.",
"title": "allow_locked",
"type": "boolean"
},
"auto_team_exposure_cap": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Default per-team portfolio cap (share of lineups containing ANY given team). Per-team entries in team_exposure_caps win over it.",
"title": "auto_team_exposure_cap",
"type": "number"
},
"avoids": {
"default": [],
"description": "Players to avoid",
"items": {},
"maxItems": 100,
"title": "avoids",
"type": "array"
},
"candidate_pool_size": {
"anyOf": [
{
"maximum": 5000,
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Exact candidate pool size for Pool→Rank→Keep-N selection. 0/None uses preset multiplier.",
"title": "candidate_pool_size",
"type": "integer"
},
"contest_fallback": {
"anyOf": [
{
"pattern": "^(slate_only)$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Escape hatch when a contest_id cannot be mapped to a slate (contest_slate_unresolved). 'slate_only' + an explicit slate_id builds on THAT slate and skips contest-specific behavior (field-size routing, entry-template mapping) instead of failing the whole generate. Requires slate_id; without it the request still fails closed. Omit for normal contest-anchored builds.",
"title": "contest_fallback",
"type": "string"
},
"contest_field_size": {
"anyOf": [
{
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Total entries (field size) of the selected contest. Governs the MLB objective: field <= 10 -> max-mean (mlb_small_field_se); field > 10 -> ceiling (mlb_se_ceiling) with a continuous ceiling tilt and the real field size fed into contest simulation. A matched contest_id lobby row is authoritative; this value is the fallback when that row is unavailable.",
"title": "contest_field_size",
"type": "integer"
},
"contest_id": {
"anyOf": [
{
"maxLength": 80,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional contest handle for building an entry-update CSV from the user's existing contest entries.",
"title": "contest_id",
"type": "string"
},
"contest_max_entries": {
"anyOf": [
{
"maximum": 150,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Max entries per user for the selected contest. Used to identify multi-entry mass GPPs (>=4) which keep the caller's preset. Field SIZE, not this, governs the MLB objective — see contest_field_size.",
"title": "contest_max_entries",
"type": "integer"
},
"date": {
"description": "Slate date YYYY-MM-DD",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"title": "date",
"type": "string"
},
"entry_template_csv": {
"anyOf": [
{
"maxLength": 4000000,
"type": "string"
},
{
"type": "null"
}
],
"description": "Raw CSV of a FanDuel entries-upload-template the operator already downloaded. When present, the entry-upload is filled from its OWN entry_ids locally — no FanDuel API / session / PerimeterX call. Fixes fd_entry_template_auth_expired when the user already has the template in hand.",
"title": "entry_template_csv",
"type": "string"
},
"exposure_caps": {
"additionalProperties": true,
"default": {},
"description": "Per-player exposure caps {name: 0.0-1.0}",
"title": "exposure_caps",
"type": "object"
},
"fd_user_id": {
"anyOf": [
{
"maxLength": 32,
"pattern": "^\\d+$",
"type": "string"
},
{
"type": "null"
}
],
"description": "DEPRECATED on /v1/generate: fd_user_id is bound server-side to your API key (see /v1/admin/bind-fd-user). Body value is IGNORED on the public route unless X-Internal-Secret matches. Kept on the schema for the internal admin path only.",
"title": "fd_user_id",
"type": "string"
},
"focus_games": {
"default": [],
"description": "Game keys to emphasize, e.g. ['PHI@BOS']. Applies a small documented projection nudge.",
"items": {
"type": "string"
},
"maxItems": 30,
"title": "focus_games",
"type": "array"
},
"lineups": {
"anyOf": [
{
"maximum": 150,
"minimum": 1,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Number of lineups (overrides preset default)",
"title": "lineups",
"type": "integer"
},
"locks": {
"default": [],
"description": "Players to lock in",
"items": {},
"maxItems": 15,
"title": "locks",
"type": "array"
},
"max_hitter_exposure": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Portfolio cap: max share of delivered lineups any ONE hitter may appear in (0.4 = 40%). Pitchers exempt.",
"title": "max_hitter_exposure",
"type": "number"
},
"max_pitcher_exposure": {
"anyOf": [
{
"exclusiveMinimum": 0,
"maximum": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Portfolio cap: max share of delivered lineups any ONE pitcher may appear in.",
"title": "max_pitcher_exposure",
"type": "number"
},
"n_sims": {
"anyOf": [
{
"maximum": 100000,
"minimum": 100,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Monte Carlo iterations when simulation is enabled.",
"title": "n_sims",
"type": "integer"
},
"plan_only": {
"default": false,
"description": "When true, the server resolves preset / contest / authoritative slate / top-run-env / locks but does NOT run the optimizer. Returns a Plan response so the user can review and confirm before spending credits on a real generate. Costs 0 credits; normal slate-open safety checks still apply.",
"title": "plan_only",
"type": "boolean"
},
"platform": {
"anyOf": [
{
"pattern": "^(fd|dk|fanduel|draftkings)$",
"type": "string"
},
{
"type": "null"
}
],
"default": "fd",
"description": "V12 platform profile: fd or dk.",
"title": "platform",
"type": "string"
},
"pool_oversample_multiplier": {
"anyOf": [
{
"maximum": 10,
"minimum": 1,
"type": "number"
},
{
"type": "null"
}
],
"description": "Candidate pool multiplier when candidate_pool_size is not set.",
"title": "pool_oversample_multiplier",
"type": "number"
},
"preset": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": "gpp_pro_pattern",
"description": "Strategy preset key.",
"title": "preset",
"type": "string"
},
"projection_overrides": {
"default": [],
"description": "User-uploaded projection/ownership rows. Supports name/player_id/team/position/projection/ownership/ceiling/floor/stddev.",
"items": {
"additionalProperties": true,
"type": "object"
},
"maxItems": 2000,
"title": "projection_overrides",
"type": "array"
},
"refresh_data": {
"default": true,
"description": "Force a fresh V12 data refresh for user-facing generation. Backtests should set false.",
"title": "refresh_data",
"type": "boolean"
},
"runs": {
"default": 5,
"description": "Accepted for tier limits and response metadata. Portfolio quality is controlled by preset, candidate_pool_size, pool_oversample_multiplier, and simulation settings.",
"maximum": 10,
"minimum": 1,
"title": "runs",
"type": "integer"
},
"seed": {
"default": 42,
"description": "Random seed for reproducibility",
"maximum": 999999,
"minimum": 0,
"title": "seed",
"type": "integer"
},
"sim_mode": {
"anyOf": [
{
"pattern": "^(off|mvn|on)$",
"type": "string"
},
{
"type": "null"
}
],
"description": "Simulation mode. NBA: mvn/off. MLB: on/off.",
"title": "sim_mode",
"type": "string"
},
"slate_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Specific slate ID from /v1/slates. Overrides date-based lookup.",
"title": "slate_id",
"type": "integer"
},
"sport": {
"anyOf": [
{
"pattern": "^(nba|mlb|NBA|MLB)$",
"type": "string"
},
{
"type": "null"
}
],
"default": "nba",
"description": "Sport engine to run: nba or mlb.",
"title": "sport",
"type": "string"
},
"strategy": {
"anyOf": [
{
"pattern": "^(gpp|cash)$",
"type": "string"
},
{
"type": "null"
}
],
"description": "GPP or cash game strategy",
"title": "strategy",
"type": "string"
},
"style": {
"anyOf": [
{
"pattern": "^(aggressive|balanced|safe)$",
"type": "string"
},
{
"type": "null"
}
],
"title": "style",
"type": "string"
},
"team_exposure_caps": {
"anyOf": [
{
"items": {
"maxItems": 2,
"minItems": 2,
"prefixItems": [
{
"type": "string"
},
{
"type": "number"
}
],
"type": "array"
},
"type": "array"
},
{
"additionalProperties": {
"type": "number"
},
"type": "object"
},
{
"type": "null"
}
],
"description": "Per-team portfolio caps, as [[\"COL\",0.5],...] pairs or {\"COL\":0.5} dict.",
"title": "team_exposure_caps",
"type": "object"
}
},
"required": [
"date"
],
"title": "generate_lineupsArguments",
"type": "object"
},
"name": "generate_lineups",
"outputSchema": null
},
{
"description": "Get Slate Players Endpoint\n\nGet the V12 player pool for a specific slate ID.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"compact": {
"default": false,
"title": "compact",
"type": "boolean"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "limit",
"type": "integer"
},
"slate_id": {
"title": "slate_id",
"type": "integer"
}
},
"required": [
"slate_id"
],
"title": "get_slate_playersArguments",
"type": "object"
},
"name": "get_slate_players",
"outputSchema": null
},
{
"description": "Health\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"status\": \"Status\",\n \"version\": \"Version\",\n \"timestamp\": \"Timestamp\"\n}\n```",
"inputSchema": {
"properties": {},
"title": "health_checkArguments",
"type": "object"
},
"name": "health_check",
"outputSchema": null
},
{
"description": "Health V12\n\nDeep health check for the V12 pipeline. Surfaces:\n - last nightly regression run (pass/fail + per-slate deltas)\n - regression baseline metadata\n - recent preflight blockers (if any cached)\nNo auth required — monitoring endpoint.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json",
"inputSchema": {
"properties": {},
"title": "health_v12Arguments",
"type": "object"
},
"name": "health_v12",
"outputSchema": null
},
{
"description": "Contest Registry\n\nList contest strategy registry entries for agents and the dashboard.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"platform": {
"default": "fd",
"title": "platform",
"type": "string"
},
"sport": {
"default": "MLB",
"title": "sport",
"type": "string"
}
},
"title": "list_contestsArguments",
"type": "object"
},
"name": "list_contests",
"outputSchema": null
},
{
"description": "Live Contests\n\nReturn latest V12 contest context without backend identifiers.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"compact": {
"default": true,
"title": "compact",
"type": "boolean"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": 250,
"title": "limit",
"type": "integer"
},
"platform": {
"default": "fd",
"title": "platform",
"type": "string"
},
"sport": {
"default": "MLB",
"title": "sport",
"type": "string"
}
},
"title": "list_live_contestsArguments",
"type": "object"
},
"name": "list_live_contests",
"outputSchema": null
},
{
"description": "Get Presets\n\nList the available strategy presets (gpp_pro_pattern, gpp_sniper, gpp_balanced, gpp_volume, cash_grinder, gpp_contrarian, gpp_mass_entry) with their configurations. No auth required.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"sport": {
"default": "nba",
"title": "sport",
"type": "string"
}
},
"title": "list_presetsArguments",
"type": "object"
},
"name": "list_presets",
"outputSchema": null
},
{
"description": "Get Slates\n\nList available V12 slates for today. Returns slate IDs, game counts, and lock times.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"compact": {
"default": false,
"title": "compact",
"type": "boolean"
},
"limit": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "limit",
"type": "integer"
},
"playable": {
"default": false,
"title": "playable",
"type": "boolean"
},
"site": {
"default": "fd",
"title": "site",
"type": "string"
},
"sport": {
"default": "NBA",
"title": "sport",
"type": "string"
}
},
"title": "list_slatesArguments",
"type": "object"
},
"name": "list_slates",
"outputSchema": null
},
{
"description": "Run Mlb Postmortem\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"status\": \"Status\",\n \"generated_at\": \"Generated At\",\n \"date\": \"Date\",\n \"game_id\": \"Game Id\",\n \"entries\": 1,\n \"field_lineups\": 1,\n \"training_rows\": 1,\n \"missing_sources\": [\n \"string\"\n ],\n \"results\": {},\n \"history_validation\": {},\n \"field\": {},\n \"diagnostics\": {},\n \"simulator_feed\": {},\n \"warnings\": [\n \"string\"\n ]\n}\n```\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"description": "Slate date YYYY-MM-DD",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"title": "date",
"type": "string"
},
"game_id": {
"description": "V12 slate/game handle, e.g. 129715.",
"maxLength": 32,
"minLength": 3,
"title": "game_id",
"type": "string"
},
"history_csv": {
"description": "Raw FanDuel contest-history CSV content.",
"minLength": 1,
"title": "history_csv",
"type": "string"
},
"history_filename": {
"default": "contest-history.csv",
"maxLength": 240,
"title": "history_filename",
"type": "string"
},
"sabersim_csv": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional external lineup export for comparison.",
"title": "sabersim_csv",
"type": "string"
},
"sync_supabase": {
"default": true,
"description": "Upsert simulator training rows to production store when configured.",
"title": "sync_supabase",
"type": "boolean"
},
"top_field_rank": {
"default": 200,
"maximum": 1000,
"minimum": 1,
"title": "top_field_rank",
"type": "integer"
},
"upload_csvs": {
"default": [],
"items": {
"properties": {
"content": {
"description": "Raw FanDuel upload/template CSV content.",
"minLength": 1,
"title": "Content",
"type": "string"
},
"filename": {
"default": "upload.csv",
"maxLength": 240,
"title": "Filename",
"type": "string"
}
},
"required": [
"content"
],
"title": "PostmortemUploadCsv",
"type": "object"
},
"maxItems": 20,
"title": "upload_csvs",
"type": "array"
}
},
"required": [
"date",
"game_id",
"history_csv"
],
"title": "run_mlb_postmortemArguments",
"type": "object"
},
"name": "run_mlb_postmortem",
"outputSchema": null
},
{
"description": "Scout Field\n\nVIP-only (owner order 8/16): opponent-scouting profiles for the small\nsingle-entry band. The owner's $65 table runs the SAME regulars nightly;\nthis returns each regular's fingerprint — days seen, avg score,\nchalkiness (overlap with field consensus), favorite pitchers/bats and\nhead-to-head vs the owner — built from harvested full fields\n(brain/scout_profiles.json, refreshed by the local scouting pipeline;\npackaged snapshot as fallback so the endpoint never 500s on a fresh\nvolume). Same fail-closed allowlist as the semaforo.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"contest": {
"default": "Knuckleball",
"title": "contest",
"type": "string"
},
"min_days": {
"default": 3,
"title": "min_days",
"type": "integer"
}
},
"title": "scout_fieldArguments",
"type": "object"
},
"name": "scout_field",
"outputSchema": null
},
{
"description": "Slate Diff\n\nCompute what changed since a previously-stored snapshot.\n\nBody shape:\n {\n \"slate_id\": 32867,\n \"date\": \"2026-05-11\",\n \"sport\": \"NBA\",\n \"site\": \"FD\",\n \"previous\": {\n \"v\": \"v1\",\n \"players\": [{\"id\",\"name\",\"status\",\"salary\",\"proj\"}, ...],\n \"odds\": [{\"game\",\"ou\",\"spread\",\"home_ml\",\"away_ml\"}, ...]\n }\n }\n\nReturns a structured diff: which players changed status / salary /\nprojection, which games moved spread or O/U, which players were added\nor removed from the pool. The thresholds for \"changed\":\n - status: any non-empty difference (Q→OUT, ''→OUT, GTD→IN, etc.)\n - salary: any integer delta\n - projection: |delta| >= 0.5 fantasy points\n - odds spread: |delta| >= 0.5\n - odds ou: |delta| >= 0.5\n - odds ml: |delta| >= 10 (American odds noise floor)\n\nNo auth required — read-only computation off in-memory current snapshot\nplus the caller-supplied previous one.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {},
"title": "slate_diffArguments",
"type": "object"
},
"name": "slate_diff",
"outputSchema": null
},
{
"description": "Slate Health\n\nPre-flight diagnostic for a slate. Returns whether odds, projections,\nmatchup, and FD master-session are ready BEFORE the agent invokes\n/v1/generate.\n\nEither slate_id or date is required. When slate_id is given, the slate\nmetadata is also returned (games list, lock times). When only date is\ngiven, the data-pillar checks still run but game coverage cannot be\ncomputed (returned as null).\n\nREADING THE PROJECTION FRESHNESS (MLB especially): `stokastic.age_min` is the\nage of the cached snapshot FILE, NOT a data-quality signal. For MLB the cache\nis refreshed only twice a day, so mid-afternoon it routinely reads several\nhours old AND THAT IS FINE — a user-facing generate fetches projections LIVE\n(refresh_data=true), and `stokastic.generate_fetches_live=true` flags this.\nA stale `age_min` with a loaded, populated pool is NOT \"projections broken /\naces at 0 / no edge\": probable pitchers are set days ahead (non-zero), and\nonly confirmed BATTING lineups firm up ~1-2h before lock. Do NOT treat a stale\ncache age as a blocker or tell the user to wait/re-refresh — check the actual\npool (get_slate_players) for non-zero pitcher projections instead.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"include_snapshot": {
"default": false,
"title": "include_snapshot",
"type": "boolean"
},
"last_known_fingerprint": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "last_known_fingerprint",
"type": "string"
},
"site": {
"default": "fd",
"title": "site",
"type": "string"
},
"slate_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "slate_id",
"type": "integer"
},
"sport": {
"default": "NBA",
"title": "sport",
"type": "string"
}
},
"title": "slate_healthArguments",
"type": "object"
},
"name": "slate_health",
"outputSchema": null
},
{
"description": "Slate Refresh\n\nRe-fetch projections + odds + slate metadata for a date.\n\nWrites to the configured store (Supabase in prod). Returns a summary\ndict (date, slate_id, n_games, n_players, n_upserted, n_odds, backend).\n\nAuth: requires X-API-Key OR X-Internal-Secret (cron use). This is a\nwrite op that costs one Stokastic + one ESPN API call.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n**422**: Validation Error\nContent-Type: application/json\n\n**Example Response:**\n```json\n{\n \"detail\": [\n {\n \"loc\": [],\n \"msg\": \"Message\",\n \"type\": \"Error Type\",\n \"ctx\": {}\n }\n ]\n}\n```",
"inputSchema": {
"properties": {
"date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "date",
"type": "string"
},
"site": {
"default": "FD",
"title": "site",
"type": "string"
},
"sport": {
"default": "NBA",
"title": "sport",
"type": "string"
}
},
"title": "slate_refreshArguments",
"type": "object"
},
"name": "slate_refresh",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:02e2892bc3fedd22a6b97a84d33133d504d1b12b2984525503a37e80ad1c0ec8 | sha256sum