Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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-s
.claude/skills/machina-sports-kalshi/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 17% | 0% |
Before writing queries, consult references/api-reference.md for sport codes, series tickers, and command parameters.
Prefer the CLI — it avoids Python import path issues:
bashsports-skills kalshi search_markets --sport=nba sports-skills kalshi get_todays_events --sport=nba sports-skills kalshi get_sports_config sports-skills kalshi get_markets --series_ticker=KXNBA --status=open
Python SDK (alternative):
pythonfrom sports_skills import kalshi kalshi.search_markets(sport='nba') kalshi.search_markets(sport='nba', query='Lakers') kalshi.get_todays_events(sport='nba') kalshi.get_sports_config() kalshi.get_markets(series_ticker="KXNBA", status="open")
CRITICAL: Before calling any market endpoint, verify:
sport parameter is always passed to search_markets and get_todays_events for single-game markets.status="open" is used when querying markets to exclude settled/closed markets.Without the sport parameter:
WRONG: search_markets(query="Leeds") → 0 results
RIGHT: search_markets(sport='epl', query='Leeds') → returns all Leeds marketsepl, ucl, laliga, bundesliga, seriea, ligue1, mls, worldcup.last_price of 20 means 20% implied probability. Scale is 0-100 (not 0-1 like Polymarket).status="open" when querying markets, otherwise results include settled/closed markets.search_markets(sport=...), get_todays_events(sport=...), and get_sports_config() work the same way on both platforms.search_markets --sport=nba — finds all open NBA markets.--query="Lakers" to filter by keyword.get_todays_events --sport=nba — open events with nested markets.get_markets --series_ticker=<ticker> --status=openlast_price descending.search_markets --sport=nba.get_market_candlesticks --series_ticker=<s> --ticker=<t> --start_ts=<start> --end_ts=<end> --period_interval=60See references/api-reference.md for the full command list with parameters.
| Command | Description | |---|---| | get_sports_config | Available sport codes and series tickers | | get_todays_events | Today's events for a sport with nested markets | | search_markets | Find markets by sport and/or keyword | | get_esports_odds | Esports markets (cs2/lol/dota2): prices in cents (0-100) plus implied_probability (0-1) and decimal_odds | | get_markets | Market listing (raw API) | | get_event | Event details | | get_market | Market details | | get_trades | Recent trades | | get_market_candlesticks | OHLC price history |
Example 1: NBA market search User says: "What NBA markets are on Kalshi?" Actions:
search_markets(sport='nba')Result: All open NBA markets with yes/no prices and volume
Example 2: EPL game markets User says: "Show me Leeds vs Man City odds on Kalshi" Actions:
search_markets(sport='epl', query='Leeds')Result: Leeds EPL markets across all EPL series with prices and volume
Example 3: Today's EPL events User says: "What EPL games are available on Kalshi?" Actions:
get_todays_events(sport='epl')Result: Today's EPL events with nested markets
Example 4: Champions League futures User says: "Who will win the Champions League?" Actions:
search_markets(sport='ucl') or get_markets(series_ticker="KXUCL", status="open")last_price descending (price = implied probability)Result: Top UCL contenders with yes_sub_title, last_price (%), and volume
Example 5: Market price history User says: "Show me the price history for this NBA game" Actions:
search_markets(sport='nba')get_market_candlesticks(series_ticker="KXNBA", ticker="...", start_ts=..., end_ts=..., period_interval=60)Result: OHLC price data with volume
get_odds~~ — does not exist. Use search_markets or get_markets to find market prices.get_team_schedule~~ — does not exist. Kalshi has markets, not schedules. Use the sport-specific skill for schedules.get_scores~~ / ~~get_results~~ — does not exist. Kalshi is a prediction market. Use the sport-specific skill.If a command is not listed in references/api-reference.md, it does not exist.
Error: search_markets returns 0 results Cause: The sport parameter is missing — without it, search only returns high-volume futures and misses single-game markets Solution: Always pass sport='<code>' to search_markets. Check references/api-reference.md for valid sport codes
Error: Markets returned include settled/expired contracts Cause: status parameter is not set Solution: Always pass status="open" to filter to open markets only
Error: Series ticker returns no results Cause: The series ticker may be incorrect or have no open markets Solution: Call get_series_list() to discover available tickers, or check references/series-tickers.md
Error: Football/soccer markets not found when searching "Football" Cause: On Kalshi, "Football" refers to NFL — soccer uses league-specific codes Solution: Use sport='epl', sport='ucl', sport='laliga', etc. for soccer leagues
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,379 | 6,856 | +57% | 1 | 1 | 0% | 680 | 2,071 | +205% | 0 | 0 | — |
case-02 | fail→fail | 4,986 | 8,397 | +68% | 1 | 1 | 0% | 836 | 2,176 | +160% | 0 | 0 | — |
case-03 | fail→fail | 7,621 | 6,565 | -14% | 1 | 1 | 0% | 1,242 | 2,014 | +62% | 0 | 0 | — |
case-04 | pass→fail | 3,764 | 8,685 | +131% | 1 | 1 | 0% | 535 | 2,143 | +301% | 0 | 0 | — |
case-05 | pass→pass | 3,044 | 5,086 | +67% | 1 | 1 | 0% | 384 | 2,507 | +553% | 0 | 0 | — |
case-06 | pass→pass | 2,993 | 10,745 | +259% | 1 | 1 | 0% | 462 | 2,565 | +455% | 0 | 0 | — |
case-07 | fail→fail | 9,500 | 7,349 | -23% | 1 | 1 | 0% | 1,515 | 2,536 | +67% | 0 | 0 | — |
case-08 | pass→pass | 9,216 | 2,938 | -68% | 1 | 1 | 0% | 1,706 | 2,282 | +34% | 0 | 0 | — |
case-09 | pass→pass | 6,611 | 4,549 | -31% | 1 | 1 | 0% | 1,317 | 2,401 | +82% | 0 | 0 | — |
case-10 | fail→pass | 11,043 | 3,670 | -67% | 1 | 1 | 0% | 2,142 | 2,410 | +13% | 0 | 0 | — |
case-11 | fail→fail | 4,258 | 4,987 | +17% | 1 | 1 | 0% | 658 | 1,889 | +187% | 0 | 0 | — |
case-12 | fail→pass | 9,509 | 3,608 | -62% | 1 | 1 | 0% | 1,752 | 2,400 | +37% | 0 | 0 | — |
case-13 | pass→pass | 8,061 | 3,199 | -60% | 1 | 1 | 0% | 1,409 | 2,279 | +62% | 0 | 0 | — |
case-14 | pass→pass | 14,741 | 4,312 | -71% | 1 | 1 | 0% | 2,322 | 2,460 | +6% | 0 | 0 | — |
case-15 | pass→pass | 9,810 | 4,696 | -52% | 1 | 1 | 0% | 1,892 | 2,614 | +38% | 0 | 0 | — |
case-16 | fail→pass | 7,919 | 3,416 | -57% | 1 | 1 | 0% | 1,519 | 2,187 | +44% | 0 | 0 | — |
case-17 | fail→pass | 10,516 | 4,151 | -61% | 1 | 1 | 0% | 1,881 | 2,514 | +34% | 0 | 0 | — |
case-18 | pass→pass | 5,597 | 3,921 | -30% | 1 | 1 | 0% | 1,074 | 2,465 | +130% | 0 | 0 | — |
case-19 | fail→pass | 11,923 | 4,170 | -65% | 1 | 1 | 0% | 2,164 | 2,531 | +17% | 0 | 0 | — |
case-20 | pass→pass | 6,743 | 2,688 | -60% | 1 | 1 | 0% | 1,290 | 2,111 | +64% | 0 | 0 | — |
case-21 | fail→pass | 4,183 | 3,582 | -14% | 1 | 1 | 0% | 705 | 2,290 | +225% | 0 | 0 | — |
case-22 | fail→pass | 8,568 | 6,608 | -23% | 1 | 1 | 0% | 1,697 | 2,632 | +55% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 17 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +27 percentage points is the difference between those two pass rates over the 17 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.