Serveur MCP

v12-dfs

io.github.Jorgeperez0825/v12-dfs
Données et analytique Gaming Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Analyzes MLB betting markets and player props, compares sportsbook lines, models edges, tracks bets and CLV, and generates optimized MLB and NBA daily fantasy lineups.

admin_issue_key
Issue Key Idempotently issue a user's API key and ALWAYS return the paste-able connect block. Returns the email's existing active key (or mints one) so a user keeps a single key across dashboard reloads; with rotate=true, revokes the existing keys and mints a fresh one. Admin-gated — the dashboard's per-user provision route (which verifies the user's Firebase token) calls this server-side, never the browser. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "api_key": "Api Key", "tier": "Tier", "limits": {} } ``` **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'admin_issue_keyArguments', 'required': ['email'], 'properties': {'tier': {'type': 'string', 'title': 'tier', 'default': 'personal', 'pattern': '^(starter|personal|business)$'}, 'email': {'type': 'string', 'title': 'email', 'maxLength': 200, 'minLength': 5}, 'rotate': {'type': 'boolean', 'title': 'rotate', 'default': False, 'description': 'Revoke existing keys and mint a fresh one.'}}}
agent_guide
Agent Guide Self-serve onboarding: connect any agent (Claude/MCP or REST) to drive the V12 motor, the same engine the dashboard agent uses. No auth. Returns copy-paste MCP + REST config with a PLACEHOLDER key, the endpoint map, and the generate body fields. Operators: issue each user their OWN key via POST /v1/admin/create-key — never share one key. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json
Schéma d’entrée
{'type': 'object', 'title': 'agent_guideArguments', 'properties': {}}
betting_agent_guide
Betting Agent Guide How any agent uses the MLB betting tools + how to read the output. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json
Schéma d’entrée
{'type': 'object', 'title': 'betting_agent_guideArguments', 'properties': {}}
betting_analyze_prop
Analyze Prop Model a single player's prop vs tonight's FanDuel line -> edge. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_analyze_propArguments', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'name'}, 'prop': {'type': 'string', 'title': 'prop', 'default': 'home_run'}, 'season': {'type': 'integer', 'title': 'season', 'default': 2026}, 'threshold': {'type': 'integer', 'title': 'threshold', 'default': 2}}}
betting_best_bets
Best Bets THE board sweep — scans EVERY main prop market (HR/RBI/hit/total_bases/ 2+hits/stolen_base) in one call and returns the top edges across all of them, not just home runs. Power props carry the Savant validation (CONFIRMED power ranked above neutral/noise). Use this for an open 'what's hot / best plays / what do you recommend tonight' so you NEVER conclude off a single-market scan. A SCREEN vs the vig line — validate with CLV; game-side value is separate (betting_sharp / betting_game_model). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_best_betsArguments', 'properties': {'limit': {'type': 'integer', 'title': 'limit', 'default': 12}, 'min_edge': {'type': 'number', 'title': 'min_edge', 'default': 2.0}}}
betting_build_parlay
Build Parlay Deterministic parlay analysis for BOTH leg shapes. Body: {legs:[...], ticket_odds?}. PROP legs {name, prop, threshold} keep the legacy correlation-aware EV. GAME-side legs (ML / run line / total / team total / F5, selected by the `market` field) — the slips users actually paste — are priced from the CURRENT de-vigged market at that exact market/ line (canonical team resolution), falling back to the market-anchored run model for totals; per-leg fair prob + edge vs the slip's price, combined payout / breakeven / fair prob / EV under a documented independence assumption. Legs sharing a game are flagged correlated=true and get a correlation_warning INSTEAD of a combined edge. ticket_odds (the slip's printed combined price) is verified vs the leg product — >2% off flags ticket_odds_mismatch (the slip was misread; do not trust the numbers). NEVER estimate a parlay in prose — this endpoint is the math. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_build_parlayArguments', 'required': ['legs'], 'properties': {'legs': {'type': 'array', 'items': {'type': 'object', 'title': '_ParlayLeg', 'properties': {'line': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Line'}, 'name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Name'}, 'prop': {'type': 'string', 'title': 'Prop', 'default': 'home_run'}, 'side': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Side'}, 'team': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Team'}, 'market': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Market'}, 'threshold': {'type': 'integer', 'title': 'Threshold', 'default': 2}, 'american_odds': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'American Odds'}}, '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)}."}, 'title': 'legs'}, 'ticket_odds': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'ticket_odds'}}}
betting_cross_book
Cross Book Cross-book value: FanDuel vs DraftKings (DK pulled via ESPN's public API, no key/WS). LINE_SHOP (the books hang different numbers — take the easier side) and PRICE_SHOP (better price, same line) are CONFIRMED edges, no model needed. Arbitrage is NOT auto-reported (needs over/under sides, which ESPN doesn't label). Overnight only pitcher_strikeouts overlaps; richer markets appear near game time. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_cross_bookArguments', 'properties': {'prop': {'type': 'string', 'title': 'prop', 'default': 'pitcher_strikeouts'}}}
betting_game_lines
Game Lines GAME markets — moneyline / run total / run line for today's MLB games. This answers the 'quién gana / cuántas carreras / pronóstico Yankees vs Toronto' questions that player props CAN'T (V12 used to just refuse them). Optional team filter ('Yankees', 'NYY'). MARKET data from ESPN's public scoreboard, surfaced as-is — V12 has NO game-outcome model, so this is the book's own number, never a fabricated prediction. A book may not have posted a game yet (fields null) — say so, don't invent a line. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_game_linesArguments', 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'team': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'team'}}}
betting_game_model
Game Model MODEL the GAME run markets — TEAM TOTALS (over/under) and NRFI/YRFI — vs the FanDuel line, MARKET-ANCHORED: expected_runs = the book's de-vigged implied mean + 0.25×(structural model − book), and every edge is computed vs the FAIR (de-vigged) probability, never the raw vig price. The structural inputs (season runs/game, opposing STARTER + BULLPEN run factors, park; negative-binomial tails) supply only the tilt. Entries with anchored=false / model_only=true carry edge=null — present them as context, NEVER as value. A SCREEN vs the market, not a lock — validate with CLV. For raw lines on every market use betting_market. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_game_modelArguments', 'required': ['team'], 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'team': {'type': 'string', 'title': 'team'}}}
betting_log_bet
Log Bet Record a bet you placed (per user) so we can track P&L + CLV over time. Body: {uid, market, selection, odds (American), stake, line?, prop?, team?, game?, book?}. Append-only — this is the evidence base that PROVES edge. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_log_betArguments', 'required': ['uid', 'market', 'selection', 'odds', 'stake'], 'properties': {'uid': {'type': 'string', 'title': 'uid'}, 'book': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'book'}, 'game': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'game'}, 'line': {'type': 'number', 'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'line'}, 'odds': {'type': 'integer', 'title': 'odds'}, 'prop': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'prop'}, 'team': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'team'}, 'stake': {'type': 'number', 'title': 'stake'}, 'market': {'type': 'string', 'title': 'market'}, 'selection': {'type': 'string', 'title': 'selection'}}}
betting_market
Market FULL FanDuel market board for a team's game — EVERY market with real odds + de-vig fair price, so NO market question goes unanswered. Game lines (ML / total / run line), FIRST 5 INNINGS (F5), TEAM TOTALS, NRFI/YRFI, alternate lines, AND the full player-prop menu (HR / 2+ HR / hit / 2+ hits / RBI / 2+ RBI / run / single / double / triple / total bases / stolen base / K). The book's market surfaced as-is (no model). For our model edge on a prop, follow up with betting_analyze_prop. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_marketArguments', 'required': ['team'], 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'team': {'type': 'string', 'title': 'team'}}}
betting_market_movers
Market Movers MARKET pattern (not model opinion): how FanDuel lines MOVED today, from the captured snapshots. A line that shortened = money coming in (sharp/news); a drift = money off. This is the 'obvious opportunity' signal — market-confirmed, independent of our unproven model. Needs accumulated capture; thin → thin. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_market_moversArguments', 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'prop': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'prop'}, 'min_move': {'type': 'number', 'title': 'min_move', 'default': 3.0}}}
betting_matchup
Matchup GROUNDING — the real game for a team today: probable pitchers + the POSTED lineup (ACTUAL player names from MLB statsapi) + the market line + the CONTEXT a pro reasons with: home-plate UMPIRE (strike zone → totals/Ks), the INJURY report (who's OUT / Day-To-Day), and BULLPEN health (ERA / blown saves). Call this BEFORE naming any player or discussing a game. Name ONLY the players this returns — never a roster from memory (that is how the agent ends up naming players who aren't on the team). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_matchupArguments', 'required': ['team'], 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'team': {'type': 'string', 'title': 'team'}}}
betting_my_bets
My Bets A user's bet history + P&L / CLV summary. avg_clv_pct > 0 over time = you're beating the closing line = real edge (the only durable proof). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_my_betsArguments', 'required': ['uid'], 'properties': {'uid': {'type': 'string', 'title': 'uid'}}}
betting_player_form
Player Form Streak / splits / recent form for any player ('racha de X'). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_player_formArguments', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'name'}, 'season': {'type': 'integer', 'title': 'season', 'default': 2026}}}
betting_scan_edges
Scan Edges Tonight's prop board ranked by model edge (VALUE first). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_scan_edgesArguments', 'properties': {'prop': {'type': 'string', 'title': 'prop', 'default': 'home_run'}, 'coors': {'type': 'boolean', 'title': 'coors', 'default': False}, 'limit': {'type': 'integer', 'title': 'limit', 'default': 15}, 'season': {'type': 'integer', 'title': 'season', 'default': 2026}, 'min_edge': {'type': 'number', 'title': 'min_edge', 'default': 2.0}, 'threshold': {'type': 'integer', 'title': 'threshold', 'default': 2}}}
betting_settle_bet
Settle Bet Settle a logged bet. Body: {uid, bet_id, result: won|lost|push, closing_odds?}. closing_odds lets us compute CLV (did you beat the close). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_settle_betArguments', 'required': ['uid', 'bet_id', 'result'], 'properties': {'uid': {'type': 'string', 'title': 'uid'}, 'bet_id': {'type': 'string', 'title': 'bet_id'}, 'result': {'type': 'string', 'title': 'result'}, 'closing_odds': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'closing_odds'}}}
betting_sharp
Sharp SHARP value — FanDuel vs PINNACLE (the sharpest book, ~2% hold). Pinnacle's de-vigged line ≈ TRUE probability, so this is the most reliable value signal in the kit, NO model needed: edge_vs_sharp = FD's price minus the sharp's true prob; POSITIVE means FanDuel pays MORE than fair (real value vs the market). Plus total line-shop. Pinnacle only lists UPCOMING games (gone once started). ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'betting_sharpArguments', 'required': ['team'], 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'team': {'type': 'string', 'title': 'team'}}}
contest_advice
Contest Advice Advice for a concrete contest name. Resolves the name against the LIVE lobby FIRST so a real live contest is never reported missing (the curated registry is only a subset — that was the "$800 Wed MLB Home Run no existe" bug), then layers registry strategy advice on top when a template matches. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'contest_adviceArguments', 'required': ['name'], 'properties': {'name': {'type': 'string', 'title': 'name'}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'MLB'}, 'platform': {'type': 'string', 'title': 'platform', 'default': 'fd'}}}
contest_semaforo
Contest Semaforo VIP-only: per-contest play/skip verdict from the owner's verified P&L bands + structure gates + rake/fill math. See core/data/contest_semaforo. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'contest_semaforoArguments', 'properties': {'limit': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'limit', 'default': 60}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'MLB'}, 'platform': {'type': 'string', 'title': 'platform', 'default': 'fd'}}}
fill_template
Fill Template Fill a downloaded FanDuel/DK entries-template with already-generated lineups WITHOUT re-running the optimizer — the MCP-callable equivalent of the dashboard's fill_template. Keeps each entry row's leading columns (entry_id, contest_id, fee) and replaces the roster-slot columns with a lineup's upload tokens, cycling lineups if there are more entry rows than lineups. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'fill_templateArguments', 'required': ['template_csv', 'lineups'], 'properties': {'lineups': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}, 'title': 'lineups', 'maxItems': 200, 'description': 'Each lineup = upload tokens in template roster-slot order.'}, 'template_csv': {'type': 'string', 'title': 'template_csv', 'maxLength': 8000000, 'description': 'Raw CSV of the entries-template (headers + entry rows).'}}}
generate_lineups
Generate Lineups ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "status": "Status", "generated_at": "Generated At", "warnings": [], "exposures": {}, "lineups": [] } ``` **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'generate_lineupsArguments', 'required': ['date'], 'properties': {'date': {'type': 'string', 'title': 'date', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Slate date YYYY-MM-DD'}, 'runs': {'type': 'integer', 'title': 'runs', 'default': 5, 'maximum': 10.0, 'minimum': 1.0, 'description': 'Accepted for tier limits and response metadata. Portfolio quality is controlled by preset, candidate_pool_size, pool_oversample_multiplier, and simulation settings.'}, 'seed': {'type': 'integer', 'title': 'seed', 'default': 42, 'maximum': 999999.0, 'minimum': 0.0, 'description': 'Random seed for reproducibility'}, 'locks': {'type': 'array', 'items': {}, 'title': 'locks', 'default': [], 'maxItems': 15, 'description': 'Players to lock in'}, 'sport': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(nba|mlb|NBA|MLB)$'}, {'type': 'null'}], 'title': 'sport', 'default': 'nba', 'description': 'Sport engine to run: nba or mlb.'}, 'style': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(aggressive|balanced|safe)$'}, {'type': 'null'}], 'title': 'style'}, 'avoids': {'type': 'array', 'items': {}, 'title': 'avoids', 'default': [], 'maxItems': 100, 'description': 'Players to avoid'}, 'n_sims': {'type': 'integer', 'anyOf': [{'type': 'integer', 'maximum': 100000.0, 'minimum': 100.0}, {'type': 'null'}], 'title': 'n_sims', 'description': 'Monte Carlo iterations when simulation is enabled.'}, 'preset': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'preset', 'default': 'gpp_pro_pattern', 'description': 'Strategy preset key.'}, 'lineups': {'type': 'integer', 'anyOf': [{'type': 'integer', 'maximum': 150.0, 'minimum': 1.0}, {'type': 'null'}], 'title': 'lineups', 'description': 'Number of lineups (overrides preset default)'}, 'platform': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(fd|dk|fanduel|draftkings)$'}, {'type': 'null'}], 'title': 'platform', 'default': 'fd', 'description': 'V12 platform profile: fd or dk.'}, 'sim_mode': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(off|mvn|on)$'}, {'type': 'null'}], 'title': 'sim_mode', 'description': 'Simulation mode. NBA: mvn/off. MLB: on/off.'}, 'slate_id': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'slate_id', 'description': 'Specific slate ID from /v1/slates. Overrides date-based lookup.'}, 'strategy': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(gpp|cash)$'}, {'type': 'null'}], 'title': 'strategy', 'description': 'GPP or cash game strategy'}, 'plan_only': {'type': 'boolean', 'title': '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.'}, 'contest_id': {'type': 'string', 'anyOf': [{'type': 'string', 'maxLength': 80}, {'type': 'null'}], 'title': 'contest_id', 'description': "Optional contest handle for building an entry-update CSV from the user's existing contest entries."}, 'fd_user_id': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^\\d+$', 'maxLength': 32}, {'type': 'null'}], 'title': 'fd_user_id', '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.'}, 'focus_games': {'type': 'array', 'items': {'type': 'string'}, 'title': 'focus_games', 'default': [], 'maxItems': 30, 'description': "Game keys to emphasize, e.g. ['PHI@BOS']. Applies a small documented projection nudge."}, 'allow_locked': {'type': 'boolean', 'title': 'allow_locked', 'default': False, 'description': 'Explicit replay/late-swap override. Default false blocks slate_id generation once any game has started.'}, 'refresh_data': {'type': 'boolean', 'title': 'refresh_data', 'default': True, 'description': 'Force a fresh V12 data refresh for user-facing generation. Backtests should set false.'}, 'exposure_caps': {'type': 'object', 'title': 'exposure_caps', 'default': {}, 'description': 'Per-player exposure caps {name: 0.0-1.0}', 'additionalProperties': True}, 'contest_fallback': {'type': 'string', 'anyOf': [{'type': 'string', 'pattern': '^(slate_only)$'}, {'type': 'null'}], 'title': 'contest_fallback', '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."}, 'contest_field_size': {'type': 'integer', 'anyOf': [{'type': 'integer', 'minimum': 1.0}, {'type': 'null'}], 'title': 'contest_field_size', '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.'}, 'entry_template_csv': {'type': 'string', 'anyOf': [{'type': 'string', 'maxLength': 4000000}, {'type': 'null'}], 'title': 'entry_template_csv', '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.'}, 'team_exposure_caps': {'type': 'object', 'anyOf': [{'type': 'array', 'items': {'type': 'array', 'maxItems': 2, 'minItems': 2, 'prefixItems': [{'type': 'string'}, {'type': 'number'}]}}, {'type': 'object', 'additionalProperties': {'type': 'number'}}, {'type': 'null'}], 'title': 'team_exposure_caps', 'description': 'Per-team portfolio caps, as [["COL",0.5],...] pairs or {"COL":0.5} dict.'}, 'candidate_pool_size': {'type': 'integer', 'anyOf': [{'type': 'integer', 'maximum': 5000.0, 'minimum': 0.0}, {'type': 'null'}], 'title': 'candidate_pool_size', 'description': 'Exact candidate pool size for Pool→Rank→Keep-N selection. 0/None uses preset multiplier.'}, 'contest_max_entries': {'type': 'integer', 'anyOf': [{'type': 'integer', 'maximum': 150.0, 'minimum': 1.0}, {'type': 'null'}], 'title': 'contest_max_entries', '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."}, 'max_hitter_exposure': {'type': 'number', 'anyOf': [{'type': 'number', 'maximum': 1.0, 'exclusiveMinimum': 0.0}, {'type': 'null'}], 'title': 'max_hitter_exposure', 'description': 'Portfolio cap: max share of delivered lineups any ONE hitter may appear in (0.4 = 40%). Pitchers exempt.'}, 'max_pitcher_exposure': {'type': 'number', 'anyOf': [{'type': 'number', 'maximum': 1.0, 'exclusiveMinimum': 0.0}, {'type': 'null'}], 'title': 'max_pitcher_exposure', 'description': 'Portfolio cap: max share of delivered lineups any ONE pitcher may appear in.'}, 'projection_overrides': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'projection_overrides', 'default': [], 'maxItems': 2000, 'description': 'User-uploaded projection/ownership rows. Supports name/player_id/team/position/projection/ownership/ceiling/floor/stddev.'}, 'auto_team_exposure_cap': {'type': 'number', 'anyOf': [{'type': 'number', 'maximum': 1.0, 'exclusiveMinimum': 0.0}, {'type': 'null'}], 'title': 'auto_team_exposure_cap', 'description': 'Default per-team portfolio cap (share of lineups containing ANY given team). Per-team entries in team_exposure_caps win over it.'}, 'pool_oversample_multiplier': {'type': 'number', 'anyOf': [{'type': 'number', 'maximum': 10.0, 'minimum': 1.0}, {'type': 'null'}], 'title': 'pool_oversample_multiplier', 'description': 'Candidate pool multiplier when candidate_pool_size is not set.'}}}
get_slate_players
Get Slate Players Endpoint Get the V12 player pool for a specific slate ID. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'get_slate_playersArguments', 'required': ['slate_id'], 'properties': {'limit': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'limit'}, 'compact': {'type': 'boolean', 'title': 'compact', 'default': False}, 'slate_id': {'type': 'integer', 'title': 'slate_id'}}}
health_check
Health ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "status": "Status", "version": "Version", "timestamp": "Timestamp" } ```
Schéma d’entrée
{'type': 'object', 'title': 'health_checkArguments', 'properties': {}}
health_v12
Health V12 Deep health check for the V12 pipeline. Surfaces: - last nightly regression run (pass/fail + per-slate deltas) - regression baseline metadata - recent preflight blockers (if any cached) No auth required — monitoring endpoint. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json
Schéma d’entrée
{'type': 'object', 'title': 'health_v12Arguments', 'properties': {}}
list_contests
Contest Registry List contest strategy registry entries for agents and the dashboard. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'list_contestsArguments', 'properties': {'sport': {'type': 'string', 'title': 'sport', 'default': 'MLB'}, 'platform': {'type': 'string', 'title': 'platform', 'default': 'fd'}}}
list_live_contests
Live Contests Return latest V12 contest context without backend identifiers. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'list_live_contestsArguments', 'properties': {'limit': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'limit', 'default': 250}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'MLB'}, 'compact': {'type': 'boolean', 'title': 'compact', 'default': True}, 'platform': {'type': 'string', 'title': 'platform', 'default': 'fd'}}}
list_presets
Get Presets List 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. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'list_presetsArguments', 'properties': {'sport': {'type': 'string', 'title': 'sport', 'default': 'nba'}}}
list_slates
Get Slates List available V12 slates for today. Returns slate IDs, game counts, and lock times. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'list_slatesArguments', 'properties': {'site': {'type': 'string', 'title': 'site', 'default': 'fd'}, 'limit': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'limit'}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'NBA'}, 'compact': {'type': 'boolean', 'title': 'compact', 'default': False}, 'playable': {'type': 'boolean', 'title': 'playable', 'default': False}}}
run_mlb_postmortem
Run Mlb Postmortem ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **Example Response:** ```json { "status": "Status", "generated_at": "Generated At", "date": "Date", "game_id": "Game Id", "entries": 1, "field_lineups": 1, "training_rows": 1, "missing_sources": [ "string" ], "results": {}, "history_validation": {}, "field": {}, "diagnostics": {}, "simulator_feed": {}, "warnings": [ "string" ] } ``` **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'run_mlb_postmortemArguments', 'required': ['date', 'game_id', 'history_csv'], 'properties': {'date': {'type': 'string', 'title': 'date', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Slate date YYYY-MM-DD'}, 'game_id': {'type': 'string', 'title': 'game_id', 'maxLength': 32, 'minLength': 3, 'description': 'V12 slate/game handle, e.g. 129715.'}, 'history_csv': {'type': 'string', 'title': 'history_csv', 'minLength': 1, 'description': 'Raw FanDuel contest-history CSV content.'}, 'upload_csvs': {'type': 'array', 'items': {'type': 'object', 'title': 'PostmortemUploadCsv', 'required': ['content'], 'properties': {'content': {'type': 'string', 'title': 'Content', 'minLength': 1, 'description': 'Raw FanDuel upload/template CSV content.'}, 'filename': {'type': 'string', 'title': 'Filename', 'default': 'upload.csv', 'maxLength': 240}}}, 'title': 'upload_csvs', 'default': [], 'maxItems': 20}, 'sabersim_csv': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'sabersim_csv', 'description': 'Optional external lineup export for comparison.'}, 'sync_supabase': {'type': 'boolean', 'title': 'sync_supabase', 'default': True, 'description': 'Upsert simulator training rows to production store when configured.'}, 'top_field_rank': {'type': 'integer', 'title': 'top_field_rank', 'default': 200, 'maximum': 1000.0, 'minimum': 1.0}, 'history_filename': {'type': 'string', 'title': 'history_filename', 'default': 'contest-history.csv', 'maxLength': 240}}}
scout_field
Scout Field VIP-only (owner order 8/16): opponent-scouting profiles for the small single-entry band. The owner's $65 table runs the SAME regulars nightly; this returns each regular's fingerprint — days seen, avg score, chalkiness (overlap with field consensus), favorite pitchers/bats and head-to-head vs the owner — built from harvested full fields (brain/scout_profiles.json, refreshed by the local scouting pipeline; packaged snapshot as fallback so the endpoint never 500s on a fresh volume). Same fail-closed allowlist as the semaforo. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'scout_fieldArguments', 'properties': {'contest': {'type': 'string', 'title': 'contest', 'default': 'Knuckleball'}, 'min_days': {'type': 'integer', 'title': 'min_days', 'default': 3}}}
slate_diff
Slate Diff Compute what changed since a previously-stored snapshot. Body shape: { "slate_id": 32867, "date": "2026-05-11", "sport": "NBA", "site": "FD", "previous": { "v": "v1", "players": [{"id","name","status","salary","proj"}, ...], "odds": [{"game","ou","spread","home_ml","away_ml"}, ...] } } Returns a structured diff: which players changed status / salary / projection, which games moved spread or O/U, which players were added or removed from the pool. The thresholds for "changed": - status: any non-empty difference (Q→OUT, ''→OUT, GTD→IN, etc.) - salary: any integer delta - projection: |delta| >= 0.5 fantasy points - odds spread: |delta| >= 0.5 - odds ou: |delta| >= 0.5 - odds ml: |delta| >= 10 (American odds noise floor) No auth required — read-only computation off in-memory current snapshot plus the caller-supplied previous one. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'slate_diffArguments', 'properties': {}}
slate_health
Slate Health Pre-flight diagnostic for a slate. Returns whether odds, projections, matchup, and FD master-session are ready BEFORE the agent invokes /v1/generate. Either slate_id or date is required. When slate_id is given, the slate metadata is also returned (games list, lock times). When only date is given, the data-pillar checks still run but game coverage cannot be computed (returned as null). READING THE PROJECTION FRESHNESS (MLB especially): `stokastic.age_min` is the age of the cached snapshot FILE, NOT a data-quality signal. For MLB the cache is refreshed only twice a day, so mid-afternoon it routinely reads several hours old AND THAT IS FINE — a user-facing generate fetches projections LIVE (refresh_data=true), and `stokastic.generate_fetches_live=true` flags this. A stale `age_min` with a loaded, populated pool is NOT "projections broken / aces at 0 / no edge": probable pitchers are set days ahead (non-zero), and only confirmed BATTING lineups firm up ~1-2h before lock. Do NOT treat a stale cache age as a blocker or tell the user to wait/re-refresh — check the actual pool (get_slate_players) for non-zero pitcher projections instead. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'slate_healthArguments', 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'site': {'type': 'string', 'title': 'site', 'default': 'fd'}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'NBA'}, 'slate_id': {'type': 'integer', 'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'slate_id'}, 'include_snapshot': {'type': 'boolean', 'title': 'include_snapshot', 'default': False}, 'last_known_fingerprint': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'last_known_fingerprint'}}}
slate_refresh
Slate Refresh Re-fetch projections + odds + slate metadata for a date. Writes to the configured store (Supabase in prod). Returns a summary dict (date, slate_id, n_games, n_players, n_upserted, n_odds, backend). Auth: requires X-API-Key OR X-Internal-Secret (cron use). This is a write op that costs one Stokastic + one ESPN API call. ### Responses: **200**: Successful Response (Success Response) Content-Type: application/json **422**: Validation Error Content-Type: application/json **Example Response:** ```json { "detail": [ { "loc": [], "msg": "Message", "type": "Error Type", "ctx": {} } ] } ```
Schéma d’entrée
{'type': 'object', 'title': 'slate_refreshArguments', 'properties': {'date': {'type': 'string', 'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'date'}, 'site': {'type': 'string', 'title': 'site', 'default': 'FD'}, 'sport': {'type': 'string', 'title': 'sport', 'default': 'NBA'}}}
Ajouté
betting_market_movers
17 September 2026 12:42
Ajouté
betting_matchup
17 September 2026 12:42
Ajouté
betting_game_model
17 September 2026 12:42
Ajouté
betting_sharp
17 September 2026 12:42
Ajouté
betting_market
17 September 2026 12:42
Ajouté
betting_game_lines
17 September 2026 12:42
Ajouté
betting_cross_book
17 September 2026 12:42
Ajouté
betting_settle_bet
17 September 2026 12:42
Ajouté
betting_my_bets
17 September 2026 12:42
Ajouté
betting_log_bet
17 September 2026 12:42
Ajouté
betting_build_parlay
17 September 2026 12:42
Ajouté
betting_best_bets
17 September 2026 12:42
Ajouté
betting_scan_edges
17 September 2026 12:42
Ajouté
betting_analyze_prop
17 September 2026 12:42
Ajouté
betting_player_form
17 September 2026 12:42
Ajouté
betting_agent_guide
17 September 2026 12:42
Ajouté
admin_issue_key
17 September 2026 12:42
Ajouté
fill_template
17 September 2026 12:42
Ajouté
contest_advice
17 September 2026 12:42
Ajouté
scout_field
17 September 2026 12:42
Ajouté
contest_semaforo
17 September 2026 12:42
Ajouté
list_live_contests
17 September 2026 12:42
Ajouté
list_contests
17 September 2026 12:42
Ajouté
run_mlb_postmortem
17 September 2026 12:42
Ajouté
generate_lineups
17 September 2026 12:42
Ajouté
list_presets
17 September 2026 12:42
Ajouté
slate_diff
17 September 2026 12:42
Ajouté
slate_refresh
17 September 2026 12:42
Ajouté
slate_health
17 September 2026 12:42
Ajouté
get_slate_players
17 September 2026 12:42