/betting
Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer
$ npx -y skills add machina-sports/sports-skills --skill betting --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/betting
Context preview
The summary Claude sees to decide when to auto-load this skill.
Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer
SKILL.md
betting.SKILL.mdname: betting
description: |
Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer probabilities).
Use when: user asks about bet sizing, expected value, edge analysis, Kelly criterion, arbitrage, parlays, line movement, odds conversion, or comparing odds across sources. Also use when you have odds from ESPN and a prediction market price and want to evaluate whether a bet has positive expected value.
Don't use when: user asks for live odds or market data — use polymarket, kalshi, or the sport-specific skill to fetch odds first, then use this skill to analyze them.
license: MIT
metadata:
author: machina-sports
version: "0.2.0"
Betting Analysis
Before writing queries, consult `references/api-reference.md` for odds formats, command parameters, and key concepts.
Quick Start
sports-skills betting convert_odds --odds=-150 --from_format=american
sports-skills betting devig --odds=-150,+130 --format=american
sports-skills betting find_edge --fair_prob=0.58 --market_prob=0.52
sports-skills betting evaluate_bet --book_odds=-150,+130 --market_prob=0.52
sports-skills betting find_arbitrage --market_probs=0.48,0.49
sports-skills betting parlay_analysis --legs=0.58,0.62,0.55 --parlay_odds=600
sports-skills betting line_movement --open_odds=-140 --close_odds=-160
Python SDK:
from sports_skills import betting
betting.convert_odds(odds=-150, from_format="american")
betting.devig(odds="-150,+130", format="american")
betting.find_edge(fair_prob=0.58, market_prob=0.52)
betting.find_arbitrage(market_probs="0.48,0.49")
betting.parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600)
betting.line_movement(open_odds=-140, close_odds=-160)
CRITICAL: Before Any Analysis
CRITICAL: Before calling any analysis command, verify:
- Odds format is correctly identified (american, decimal, or probability).
- ESPN odds are de-vigged with `devig` before computing edge vs prediction market prices.
- This module computes — it does not fetch. Obtain odds from sport-specific skills or polymarket/kalshi first.
Workflows
Compare ESPN vs Polymarket/Kalshi
1. Get ESPN moneyline odds (e.g., from `nba get_scoreboard`): Home: `-150`, Away: `+130` 2. Get Polymarket/Kalshi price for the same outcome (e.g., home at `0.52`) 3. De-vig: `devig --odds=-150,+130 --format=american` → Fair: Home 57.9%, Away 42.1% 4. Compare: `find_edge --fair_prob=0.579 --market_prob=0.52` → Edge: 5.9%, EV: 11.3% 5. Or all in one step: `evaluate_bet --book_odds=-150,+130 --market_prob=0.52`
Arbitrage Detection
1. Get best price per outcome from different sources (Polymarket home at 0.48, Kalshi away at 0.49) 2. `find_arbitrage --market_probs=0.48,0.49 --labels=home,away` 3. Total implied 0.97 (< 1.0) → arbitrage found, guaranteed ROI: 3.09%
Parlay Evaluation
1. De-vig each leg: Leg 1 → 0.58, Leg 2 → 0.55, Leg 3 → 0.50 2. `parlay_analysis --legs=0.58,0.55,0.50 --parlay_odds=600` 3. Returns combined fair probability, edge, and Kelly fraction
Line Movement Analysis
1. Get ESPN open and close lines: Open -140, Close -160 2. `line_movement --open_odds=-140 --close_odds=-160` 3. Returns probability shift, direction, and classification (sharp_action, steam_move, etc.)
Examples
Example 1: Edge check using ESPN and Polymarket prices User says: "Is there edge on the Lakers game? ESPN has them at -150 and Polymarket has them at 52 cents" Actions: 1. Call `devig(odds="-150,+130", format="american")` → fair home probability ~58% 2. Call `find_edge(fair_prob=0.58, market_prob=0.52)` → edge ~6%, positive EV 3. Call `kelly_criterion(fair_prob=0.58, market_prob=0.52)` → optimal bet fraction Result: Present edge percentage, EV per dollar, and recommended bet size as % of bankroll
Example 2: Arbitrage opportunity detection User says: "Can I arb this? Polymarket has home at 48 cents and Kalshi has away at 49 cents" Actions: 1. Call `find_arbitrage(market_probs="0.48,0.49", labels="home,away")` 2. Check `arbitrage_found` in result Result: If arbitrage: present allocation percentages and guaranteed ROI. If not: present overround and explain no guaranteed profit
Example 3: Parlay evaluation User says: "Is this 3-leg parlay at +600 worth it?" Actions: 1. De-vig each leg to get fair probabilities (e.g., 0.58, 0.62, 0.55) 2. Call `parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600)` Result: Present combined fair probability, edge, EV, +EV or -EV verdict, and Kelly fraction
Example 4: Line movement interpretation User says: "The line moved from -140 to -160, what does that mean?" Actions: 1. Call `line_movement(open_odds=-140, close_odds=-160)` Result: Present probability shift, direction, magnitude, and classification (sharp action, steam move, etc.)
Example 5: De-vig a standard spread User says: "What are the true odds for this spread? Both sides are -110" Actions: 1. Call `devig(odds="-110,-110", format="american")` Result: Present each side as 50% fair probability, vig is ~4.5%
Example 6: Odds format conversion User says: "Convert -200 to implied probability" Actions: 1. Call `convert_odds(odds=-200, from_format="american")` Result: Present 66.7% implied probability and 1.50 decimal odds
Commands that DO NOT exist — never call these
- ~~`get_odds`~~ — does not exist. This module analyzes odds; it does not fetch them. Use nba-data/nfl-data/etc. for ESPN odds, or polymarket/kalshi for prediction market prices.
- ~~`calculate_ev`~~ — does not exist. Use `find_edge` or `evaluate_bet` instead.
- ~~`compare_markets`~~ — does not exist. Use the `markets` skill for cross-platform comparison.
If a command is not listed in `references/api-reference.md`, it does not exist.
Troubleshooting
Error: `ValueError: unknown format` when calling `convert_odds` Cause: The `fr
Read more
name: betting description: | Betting analysis — odds conversion, de-vigging, edge detection, Kelly criterion, arbitrage detection, parlay analysis, and line movement. Pure computation, no API calls. Works with odds from any source: ESPN (American odds), Polymarket (decimal probabilities), Kalshi (integer probabilities). Use when: user asks about bet sizing, expected value, edge analysis, Kelly criterion, arbitrage, parlays, line movement, odds conversion, or comparing odds across sources. Also use when you have odds from ESPN and a prediction market price and want to evaluate whether a bet has positive expected value. Don't use when: user asks for live odds or market data — use polymarket, kalshi, or the sport-specific skill to fetch odds first, then use this skill to analyze them. license: MIT metadata: author: machina-sports version: "0.2.0"
Betting Analysis
Before writing queries, consult `references/api-reference.md` for odds formats, command parameters, and key concepts.
Quick Start
sports-skills betting convert_odds --odds=-150 --from_format=american sports-skills betting devig --odds=-150,+130 --format=american sports-skills betting find_edge --fair_prob=0.58 --market_prob=0.52 sports-skills betting evaluate_bet --book_odds=-150,+130 --market_prob=0.52 sports-skills betting find_arbitrage --market_probs=0.48,0.49 sports-skills betting parlay_analysis --legs=0.58,0.62,0.55 --parlay_odds=600 sports-skills betting line_movement --open_odds=-140 --close_odds=-160
Python SDK:
from sports_skills import betting betting.convert_odds(odds=-150, from_format="american") betting.devig(odds="-150,+130", format="american") betting.find_edge(fair_prob=0.58, market_prob=0.52) betting.find_arbitrage(market_probs="0.48,0.49") betting.parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600) betting.line_movement(open_odds=-140, close_odds=-160)
CRITICAL: Before Any Analysis
CRITICAL: Before calling any analysis command, verify:
- Odds format is correctly identified (american, decimal, or probability).
- ESPN odds are de-vigged with `devig` before computing edge vs prediction market prices.
- This module computes — it does not fetch. Obtain odds from sport-specific skills or polymarket/kalshi first.
Workflows
Compare ESPN vs Polymarket/Kalshi
1. Get ESPN moneyline odds (e.g., from `nba get_scoreboard`): Home: `-150`, Away: `+130` 2. Get Polymarket/Kalshi price for the same outcome (e.g., home at `0.52`) 3. De-vig: `devig --odds=-150,+130 --format=american` → Fair: Home 57.9%, Away 42.1% 4. Compare: `find_edge --fair_prob=0.579 --market_prob=0.52` → Edge: 5.9%, EV: 11.3% 5. Or all in one step: `evaluate_bet --book_odds=-150,+130 --market_prob=0.52`
Arbitrage Detection
1. Get best price per outcome from different sources (Polymarket home at 0.48, Kalshi away at 0.49) 2. `find_arbitrage --market_probs=0.48,0.49 --labels=home,away` 3. Total implied 0.97 (< 1.0) → arbitrage found, guaranteed ROI: 3.09%
Parlay Evaluation
1. De-vig each leg: Leg 1 → 0.58, Leg 2 → 0.55, Leg 3 → 0.50 2. `parlay_analysis --legs=0.58,0.55,0.50 --parlay_odds=600` 3. Returns combined fair probability, edge, and Kelly fraction
Line Movement Analysis
1. Get ESPN open and close lines: Open -140, Close -160 2. `line_movement --open_odds=-140 --close_odds=-160` 3. Returns probability shift, direction, and classification (sharp_action, steam_move, etc.)
Examples
Example 1: Edge check using ESPN and Polymarket prices User says: "Is there edge on the Lakers game? ESPN has them at -150 and Polymarket has them at 52 cents" Actions: 1. Call `devig(odds="-150,+130", format="american")` → fair home probability ~58% 2. Call `find_edge(fair_prob=0.58, market_prob=0.52)` → edge ~6%, positive EV 3. Call `kelly_criterion(fair_prob=0.58, market_prob=0.52)` → optimal bet fraction Result: Present edge percentage, EV per dollar, and recommended bet size as % of bankroll
Example 2: Arbitrage opportunity detection User says: "Can I arb this? Polymarket has home at 48 cents and Kalshi has away at 49 cents" Actions: 1. Call `find_arbitrage(market_probs="0.48,0.49", labels="home,away")` 2. Check `arbitrage_found` in result Result: If arbitrage: present allocation percentages and guaranteed ROI. If not: present overround and explain no guaranteed profit
Example 3: Parlay evaluation User says: "Is this 3-leg parlay at +600 worth it?" Actions: 1. De-vig each leg to get fair probabilities (e.g., 0.58, 0.62, 0.55) 2. Call `parlay_analysis(legs="0.58,0.62,0.55", parlay_odds=600)` Result: Present combined fair probability, edge, EV, +EV or -EV verdict, and Kelly fraction
Example 4: Line movement interpretation User says: "The line moved from -140 to -160, what does that mean?" Actions: 1. Call `line_movement(open_odds=-140, close_odds=-160)` Result: Present probability shift, direction, magnitude, and classification (sharp action, steam move, etc.)
Example 5: De-vig a standard spread User says: "What are the true odds for this spread? Both sides are -110" Actions: 1. Call `devig(odds="-110,-110", format="american")` Result: Present each side as 50% fair probability, vig is ~4.5%
Example 6: Odds format conversion User says: "Convert -200 to implied probability" Actions: 1. Call `convert_odds(odds=-200, from_format="american")` Result: Present 66.7% implied probability and 1.50 decimal odds
Commands that DO NOT exist — never call these
- ~~`get_odds`~~ — does not exist. This module analyzes odds; it does not fetch them. Use nba-data/nfl-data/etc. for ESPN odds, or polymarket/kalshi for prediction market prices.
- ~~`calculate_ev`~~ — does not exist. Use `find_edge` or `evaluate_bet` instead.
- ~~`compare_markets`~~ — does not exist. Use the `markets` skill for cross-platform comparison.
If a command is not listed in `references/api-reference.md`, it does not exist.
Troubleshooting
Error: `ValueError: unknown format` when calling `convert_odds` Cause: The `fr
Open-source agent skills for live sports data and prediction markets. Built for the Agent Skills spec. Works with sportsclaw, OpenClaw, Claude Code, Cursor, Copilot, Gemini CLI, Hermes Agent, and every major AI agent. Zero API keys. Zero signup.
Other skills on sports-skills.
- /cbb-data
College Basketball (CBB) data via ESPN public endpoints and the NCAA's official endpoints — scores, standings, rosters, schedules, game summaries, play-by-play, win probability, rankings, futures, team/player stats, and news for Division I men's basketball, plus official D2/D3
Open skill - /cfb-data
College Football (CFB) data via ESPN public endpoints and the NCAA's official endpoints — scores, standings, rosters, schedules, game summaries, play-by-play, rankings, injuries, futures, team/player stats, and news for FBS, plus official FCS scoreboards, NCAA game detail with
Open skill - /cricket-data
Cricket data via ESPN public endpoints and Cricsheet open data — live-ish series scoreboards, standings, match summaries and news (ESPN), plus historical ball-by-ball, player stats, and player registry (Cricsheet, ODC-BY 1.0). Zero config, no API keys. Use when: user asks about
Open skill - /esports
Esports data — Dota 2 (OpenDota) and League of Legends esports (Leaguepedia). Pro matches, tournaments, teams, and structured LoL competitive data. Use when: user asks about Dota 2 pro matches/teams/leagues, or LoL esports tournaments/rosters/results. Don't use when: user asks
Open skill - /fastf1
Formula 1 data — race schedules, results, lap timing, driver and team info. Powered by the FastF1 library. Covers F1 sessions, qualifying, practice, race results, sector times, tire strategy. Use when: user asks about F1 race results, qualifying, lap times, driver stats, team
Open skill - /football-data
Football (soccer) data across the world's major leagues — standings, schedules, match stats, xG, transfers, player profiles, head-to-head history, team strength (Elo), and match forecasts. Zero config, no API keys. Covers Premier League, La Liga, Bundesliga, Serie A, Ligue 1,
Open skill

