
markets
Markets orchestration — connects ESPN live schedules with Kalshi and Polymarket prediction markets. Unified dashboards, odds comparison, entity search, and bet evaluation across platforms. Use when: user wants to see prediction market odds alongside ESPN game schedules, compare odds across platforms, search for a team/player on Kalshi or Polymarket, check for arbitrage between ESPN odds and prediction markets, or evaluate a specific game's market value. Don't use when: user wants raw prediction market data without ESPN context — use polymarket or kalshi directly. For pure odds math (conversion, de-vigging, Kelly) — use betting. For live scores without market data — use the sport-specific skill.
- Installs
- 862
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/machina-sports/sports-skills --skill markets- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads markets automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Markets Orchestration
Bridges ESPN live schedules (NBA, NFL, MLB, NHL, WNBA, CFB, CBB) with Kalshi and Polymarket prediction markets. Before writing queries, consult references/api-reference.md for supported sport codes, command parameters, and price normalization formats.
Quick Start
sports-skills markets get_todays_markets --sport=nba
sports-skills markets search_entity --query="Lakers" --sport=nba
sports-skills markets compare_odds --sport=nba --event_id=401234567
sports-skills markets compare_market_url --url=https://polymarket.com/event/nfl-sf-sea-2026-10-11
sports-skills markets get_sport_markets --sport=nfl
sports-skills markets get_sport_schedule --sport=nba
sports-skills markets normalize_price --price=0.65 --source=polymarket
sports-skills markets evaluate_market --sport=nba --event_id=401234567 --fee_per_contract=<verified fee>
sports-skills markets match_markets --sport=mlb --date=2026-06-06
sports-skills markets get_market_price --venue=kalshi --ticker=KXMENWORLDCUP-26-FR
sports-skills markets get_price_history --venue=kalshi --ticker=KXMENWORLDCUP-26-FR --interval=1d
Python SDK:
from sports_skills import markets
markets.get_todays_markets(sport="nba")
markets.search_entity(query="Lakers", sport="nba")
markets.compare_odds(sport="nba", event_id="401234567")
markets.compare_market_url(url="https://kalshi.com/markets/kxnflgame/sf-vs-sea/kxnflgame-26oct11sfsea")
markets.get_sport_markets(sport="nfl")
markets.get_sport_schedule(sport="nba", date="2025-02-26")
markets.normalize_price(price=0.65, source="polymarket")
markets.evaluate_market(sport="nba", event_id="401234567", fee_per_contract=fee) # fee: verified (user-stated or documented venue fee)
markets.match_markets(sport="mlb", date="2026-06-06")
markets.get_market_price(venue="kalshi", ticker="KXMENWORLDCUP-26-FR", at_time="2026-05-01T12:00:00+00:00")
markets.get_price_history(venue="polymarket", token_id="<token_id>", interval="1h")
CRITICAL: Before Any Query
CRITICAL: Before calling any orchestration command, verify:
- A
sportcode is provided for sport-aware commands (get_todays_markets,compare_odds,get_sport_markets,evaluate_market). - Price sources are identified correctly before normalization:
espn= American odds,polymarket/novig/gemini= 0-1 probability,kalshi= 0-100 integer.
Important Notes
- Sport context is passed through.
--sport=nbamaps automatically to the correct Polymarket sport code and Kalshi series ticker. - Venues differ by command.
get_todays_markets,search_entityandcompare_oddsinclude Kalshi, Polymarket, ProphetX, Novig and Gemini where supported. Gemini discovery accepts no sport ornba,wnba,nfl,cfb,mlb,nhl,epl,laliga,mls,ligamx,ufc,f1,golf. The daily dashboard includes Gemini for supported ESPN scoreboard sports (nba,wnba,nfl,cfb,mlb,nhl). Gemini comparison is NBA-only until settlement equivalence is verified for other sports; those sports leave Gemini out ofsources. Unsupported discovery sports skip Gemini without a request.normalize_priceacceptsgemini(0-1 probability).get_sport_markets,match_marketsandevaluate_marketuse Kalshi and Polymarket only;compare_market_url,get_market_priceandget_price_historydo not support Gemini. - Sport-aware search. Polymarket uses
sport→ series_id; Kalshi searches every series mapped for the sport (game winners, spreads, totals, futures). - Prices are normalized. Everything is converted to implied probability for comparison.
- Discovery is not verification. Raw market lists (
*_markets,get_sport_markets,search_entity) are search hits, not verified equivalents of a given game's contract. Onlycompare_oddsside_prices(andevaluate_market) are identity-checked.
Workflows
Today's NBA Dashboard
sports-skills markets get_todays_markets --sport=nba
Returns each game with ESPN info, DraftKings odds, and matching Kalshi, Polymarket, ProphetX, Novig and Gemini (gemini_markets) markets. Gemini dashboard discovery covers NBA, WNBA, NFL, CFB, MLB and NHL; it does not verify that each search hit is the same contract.
Find Arb on a Specific Game
- Get the ESPN event ID:
get_sport_schedule --sport=nba - Compare odds:
compare_odds --sport=nba --event_id=<id> - If arbitrage detected, response includes allocation percentages and ROI — computed from reference prices (
price_basis: "reference"), so confirm both legs on each venue's order book before trading it. sourcesandcompletenesssay which venues actually priced this game; a provider error is reported aserror, not as "no markets".- For a direct price comparison read
side_prices.home/side_prices.away: each listsquotes(venue,implied_probability,price_basis: "reference",execution_guaranteed: false) admitted as this game's full-game moneyline, pluslowest_reference(nullwhen a side has no quote; ties keep the first-listed venue). The lowest reference is not an executable quote, not fee-adjusted, and not a bet recommendation. Checkwarningsandcompleteness.completebefore calling a comparison complete. - Venues searched: Kalshi, Polymarket, ProphetX and Novig. Novig counts only when the event date matches and a full-game
MONEYmarket has a two-way order book. Its price is the derived ask (1 − best opposite bid), a cached snapshot. Catalog-only markets, spreads and period markets show up innovig_marketsbut never price a side.search_entityandget_todays_marketsalso include anovigsection with the same results. - Gemini (nba only) counts only for exactly one active, full-contest moneyline (
moneyline/contest/full_contest) of the same league whosestartTimeequals ESPN's start instant, with exactly two active, open, non-combo contracts whose sides agree with ESPN's teams and whose buy-YES prices are both in (0, 1). Its price is that buy-YES price from a cached public snapshot — a reference, not an executable quote, and volume says nothing about liquidity. Child markets (spreads, totals, props, periods), combos, three-way markets, closed/settled contracts, missing or malformed prices, other start times and duplicate candidates are refused with a reason insources.gemini.detail; they still appear ingemini_markets. A Gemini failure iserror; a partial scan (later page failed or scan truncated) is listed insources.gemini.warnings.
Compare a Pasted Market Link
compare_market_url
compare_market_url --url=<link>. Supported links:https://polymarket.com/event/<event-slug>[/<market-slug>]andhttps://kalshi.com/markets/<series>/<slug>/<event-ticker>(www.allowed), for single games of nfl, nba, mlb, nhl, wnba, cfb, cbb.- The link is never fetched. The host must match exactly. Credentials, ports, fragments, encoded or odd path segments, and unknown query keys are refused before any call (only
utm_*and other click-tracking keys are ignored). - The venue API resolves exactly one open full-game two-way moneyline (Polymarket) or the two open game-winner contracts (Kalshi). Closed, non-moneyline, three-way or ambiguous sources are refused, and so is a provider answer that names another slug/ticker.
- ESPN scoreboards for the source date ±1 day must yield exactly one game whose teams and date validate. Doubleheaders and multiple matches are refused, and a scoreboard failure is reported as a failure, not as "no game".
- Returns the
compare_oddspayload unchanged (side_prices,sources,warnings, …) plussource_market(venue, canonicalurl, event/market ids,espn_event_id,in_downstream_search). When the source contract is missing from the comparison's venue search, a warning says so and no price is invented. - This matches the same game's moneyline only. It does not mean the venues settle identically, and it guarantees no execution. Novig, ProphetX and Gemini links are not accepted yet, though those venues still appear in the comparison where
compare_oddssearches them.
Full Bet Evaluation
evaluate_market --sport=nba --event_id=<id> --outcome=0 --fee_per_contract=<dollars per $1 contract>- Verifies the market is this game's full-game winner market for the chosen side, then reads the ask off the order book
- Pipes ask + fee through
betting.evaluate_bet: devig → edge → Kelly - Returns fair probability, edge, EV, Kelly fraction, and recommendation
Without fee_per_contract the ask is reported but evaluation is null — the net numbers are refused rather than assumed free. A ticker or token_id that names another team, another date, or a derivative (first-half, spread) market is refused, not substituted. Pass the fee via the CLI (--fee_per_contract=<dollars>) or the Python wrapper. The fee must be an explicit, verified assumption: one the user stated, or the venue's officially documented fee schedule (say which). Never silently assume 0. If no fee can be verified, evaluation stays null.
Same Game on Both Venues
match_markets --sport=mlb --date=2026-06-06- Each match pairs the Kalshi event (with market tickers) and the Polymarket event (with moneyline token IDs) for the same game — joined deterministically on date + team codes, fuzzy title match as fallback.
- Feed
kalshi.market_tickers[i]andpolymarket.markets[i].token_ids[j]straight intoget_market_priceto compare prices.
Price Movement Over Time
get_market_price --venue=kalshi --ticker=<ticker> --at_time=2026-05-01for a single point-in-time price (bothyes/nosides, 0-1).get_price_history --venue=kalshi --ticker=<ticker> --interval=1dfor the full series — same{timestamp, price}shape on either venue.
Examples
Example 1: Today's games with prediction market odds User says: "What NBA games are on today and what are the prediction market odds?" Actions:
- Call
get_todays_markets(sport="nba")Result: Unified dashboard with each game's ESPN info and Kalshi/Polymarket/ProphetX/Novig/Gemini markets
Example 2: Cross-platform team search User says: "Find me Lakers markets on Kalshi and Polymarket" Actions:
- Call
search_entity(query="Lakers", sport="nba")Result: Lakers search hits from Kalshi, Polymarket, ProphetX, Novig and Gemini (discovery only — not verified as the same contract)
Example 3: Odds comparison for a specific game User says: "Compare the odds for this Celtics game across ESPN and Polymarket" Actions:
- Get event_id from
get_sport_schedule(sport="nba") - Call
compare_odds(sport="nba", event_id="<id>")Result:side_pricesper side (admitted reference quotes +lowest_reference) and an arbitrage check on reference prices
Example 4: Full market evaluation User says: "Is there edge on the Chiefs game?" Actions:
- Get event_id from
get_sport_schedule(sport="nfl") - Establish a verified fee (user-stated or the venue's documented fee), then call
evaluate_market(sport="nfl", event_id="<id>", fee_per_contract=<verified fee>)Result: Fair probability, edge percentage, EV, Kelly fraction, and bet recommendation. Without a verified fee, the executable ask is reported andevaluationisnull.
Example 5: Browse all markets for a sport User says: "Show me all NFL prediction markets" Actions:
- Call
get_sport_markets(sport="nfl")Result: All open NFL markets across Kalshi and Polymarket
Example 6: Price conversion User says: "Convert a Polymarket price of 65 cents to American odds" Actions:
- Call
normalize_price(price=0.65, source="polymarket")Result: Common structure with implied probability (0.65), American odds (-185.7), and decimal (1.54)
Example 7: Pair a game across venues User says: "Find the Mets game on both Kalshi and Polymarket" Actions:
- Call
match_markets(sport="mlb", date="<game date>")Result: The game paired across venues — Kalshi market tickers and Polymarket moneyline token IDs side by side
Example 8: Historical price User says: "What was France's World Cup price a month ago?" Actions:
- Call
get_market_price(venue="kalshi", ticker="KXMENWORLDCUP-26-FR", at_time="2026-05-03T12:00:00+00:00")Result: Yes/no prices (0-1) as of that moment; useget_price_historyfor the full curve
Commands that DO NOT exist — never call these
— does not exist. Useget_oddscompare_oddsto see odds across sources.— does not exist on the markets module. Usesearch_marketssearch_entityinstead.— does not exist. Useget_scheduleget_sport_scheduleinstead.
If a command is not listed in references/api-reference.md or in this file's workflows (e.g. compare_market_url), it does not exist.
Troubleshooting
Error: No markets returned for a sport
Cause: Sport code may be missing or incorrect
Solution: Check references/api-reference.md for valid sport codes. Use the exact code (e.g., nba, epl, laliga)
Error: compare_odds returns no data for an event
Cause: The event_id is incorrect or the game has not been indexed yet
Solution: Call get_sport_schedule(sport=...) to retrieve the correct event_id first
Error: One source shows warnings in the response Cause: Kalshi or Polymarket is temporarily unavailable Solution: The module returns partial results — use what is available. Retry the unavailable source separately using the kalshi or polymarket skill directly
Error: normalize_price returns unexpected American odds value
Cause: Wrong source parameter — Kalshi uses 0-100 integers, Polymarket uses 0-1 decimals
Solution: Verify the source. Kalshi price of 65 requires source="kalshi", Polymarket price of 0.65 requires source="polymarket"
FAQ
What does the markets skill do?
Markets orchestration — connects ESPN live schedules with Kalshi and Polymarket prediction markets. Unified dashboards, odds comparison, entity search, and bet evaluation across platforms. Use when: user wants to see prediction market odds alongside ESPN game schedules, compare odds across platforms, search for a team/player on Kalshi or Polymarket, check for arbitrage between ESPN odds and prediction markets, or evaluate a specific game's market value. Don't use when: user wants raw prediction market data without ESPN context — use polymarket or kalshi directly. For pure odds math (conversion, de-vigging, Kelly) — use betting. For live scores without market data — use the sport-specific skill.
How do I install markets?
Run npx skills add https://github.com/machina-sports/sports-skills --skill markets in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/markets/ (personal) or .claude/skills/markets/ (project).
Which AI agents can use markets?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is markets safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains markets?
It is published by machina-sports in machina-sports/sports-skills. It has 862 recorded installs.
More from machina-sports/sports-skills
football-data
machina-sports/sports-skills
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, MLS, Champions League, World Cup, Championship, Serie B, Eredivisie, Primeira Liga, Serie A Brazil, Russian Premier League, Scottish/Belgian/Turkish top flights, European Championship, and more (call getcompetitions for the live list). Use when: user asks about football/soccer standings, fixtures, match stats, xG, lineups, player values, transfers, injury news, league tables, daily fixtures, player profiles, head-to-head records, team strength/Elo ratings, or match odds/forecasts. Don't use when: user asks about American football/NFL (use nfl-data), college football (use cfb-data), NBA (use nba-data), WNBA (use wnba-data), college basketball (use cbb-data), NHL (use nhl-data), MLB (use mlb-data), tennis (use tenn
betting
machina-sports/sports-skills
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.
polymarket
machina-sports/sports-skills
Polymarket sports prediction markets — read-only live odds, prices, order books, events, series, and market search. No auth required. Covers NFL, NBA, MLB, football (EPL, UCL, La Liga), tennis, cricket, MMA, esports. Supports moneyline, spreads, totals, and player props. Use when: user asks about sports betting odds, prediction markets, win probabilities, market sentiment, or "who is favored to win" questions and only needs read-only market intelligence. Don't use when: user asks about actual match results, scores, or statistics — use the sport-specific skill. Don't use for historical match data. Don't use for news — use sports-news instead. Don't use for placing, cancelling, or managing orders — use the separate polymarket-trading skill only after explicit user approval.
sports-news
machina-sports/sports-skills
Sports news via RSS/Atom feeds and Google News. Fetch headlines, search by query, filter by date. Covers football news, transfer rumors, match reports, and any sport via Google News. Use when: user asks for recent news, headlines, transfer rumors, or articles about any sport. Good for "what's the latest on [team/player]" questions. Supports any Google News query and curated RSS feeds (BBC Sport, ESPN, The Athletic, Sky Sports). Don't use when: user asks for structured data like standings, scores, statistics, or xG — use the sport-specific skill instead: football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), tennis-data (tennis), golf-data (golf), cricket-data (cricket), cfb-data (college football), cbb-data (college basketball), or fastf1 (F1). Don't use for prediction market odds — use polymarket or kalshi. News results are text articles, not structured data.
kalshi
machina-sports/sports-skills
Kalshi prediction markets — events, series, markets, trades, and candlestick data. Public API, no auth required for reads. US-regulated exchange (CFTC). Covers football (EPL, UCL, La Liga), basketball, baseball, tennis, NFL, hockey event contracts. Use when: user asks about Kalshi-specific markets, event contracts, CFTC-regulated prediction markets, or candlestick/OHLC price history on sports outcomes. Don't use when: user asks about actual match results, scores, or statistics — use the sport-specific skill: football-data (soccer), nfl-data (NFL), nba-data (NBA), wnba-data (WNBA), nhl-data (NHL), mlb-data (MLB), tennis-data (tennis), golf-data (golf), cricket-data (cricket), cfb-data (college football), cbb-data (college basketball), or fastf1 (F1). Don't use for general "who will win" questions unless Kalshi is specifically mentioned — try polymarket first (broader sports coverage). Don't use for news — use sports-news instead.
nba-data
machina-sports/sports-skills
NBA data via ESPN public endpoints, the NBA live CDN, and NBA Stats (stats.nba.com) — scores, standings, rosters, schedules, game summaries, play-by-play, injuries, futures, depth charts, leaders, and news, plus an analytics backend: advanced ratings, per-shot court coordinates, career splits, and history to 1946. Zero config, no API keys. Use when: user asks about NBA scores, standings, team rosters, schedules, game stats, box scores, play-by-play, injuries, transactions, betting futures, depth charts, team/player statistics, NBA news, shot charts, advanced ratings/pace, career stats, or historical NBA seasons. Don't use when: user asks about WNBA (use wnba-data), college basketball (use cbb-data), or other sports.
Popular media & creative skills
hyperframes
heygen-com/hyperframes
Read first to make, edit, animate or render any video with HyperFrames (HTML rendered to video), including launch films, explainers, music videos, charts, maps, vertical clips, title cards, captions and overlays. Holds the render contract, the work loop and what each kind of video needs.
media-use
heygen-com/hyperframes
Get or make any media for a HyperFrames video - music, sound effects, images, icons, logos, voiceover, avatar and generated video, transcripts, cutouts, colour grades and looks - with HeyGen or free local tools, and mix placed audio. Also for footage that looks dark, flat or dull, or should be stylized or hidden.
hyperframes-registry
heygen-com/hyperframes
About 450 ready-made HyperFrames blocks and components installed as editable source - transitions, overlays, titles, kinetic type, captions, charts, map overlays, 3D, camera moves. Use it before hand-building any named visual (CRT scanlines, glitch, film grain, a chart); also for hyperframes add and catalog.
hyperframes-creative
heygen-com/hyperframes
Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use hyperframes-animation.
ai-video-generation
101-skills/superpowers
Generate AI videos with Google Veo, Seedance 2.0, HappyHorse, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 2.0, HappyHorse 1.0, Wan 2.5, Grok Imagine Video, OmniHuman, Fabric, HunyuanVideo. Capabilities: text-to-video, image-to-video, reference-to-video, video editing, lipsync, avatar animation, video upscaling, foley sound. Use for: social media videos, marketing content, explainer videos, product demos, AI avatars. Triggers: video generation, ai video, text to video, image to video, veo, animate image, video from image, ai animation, video generator, generate video, t2v, i2v, ai video maker, create video with ai, runway alternative, pika alternative, sora alternative, kling alternative, seedance, happyhorse
ai-image-generation
101-skills/superpowers
Generate AI images with GPT-Image-2, FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: GPT-Image-2, FLUX Dev LoRA, FLUX.2 Klein LoRA, Gemini 3 Pro Image, Grok Imagine, Seedream 4.5, Reve, ImagineArt. Capabilities: text-to-image, image-to-image, inpainting, LoRA, image editing, upscaling, text rendering. Use for: AI art, product mockups, concept art, social media graphics, marketing visuals, illustrations. Triggers: flux, image generation, ai image, text to image, stable diffusion, generate image, ai art, midjourney alternative, dall-e alternative, text2img, t2i, image generator, ai picture, create image with ai, generative ai, ai illustration, grok image, gemini image, gpt image, openai image, chatgpt image