Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,552Letters: 14Defects: 1,323counted 2 min ago
teppi

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 yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:02e2892bc3fedd22a6b97a84d33133d504d1b12b2984525503a37e80ad1c0ec8 | sha256sum