Kalshi Sports Markets Scraper
Pricing
from $2.00 / 1,000 market rows
Kalshi Sports Markets Scraper
Kalshi Premier League and sports prediction markets as clean structured rows, with parsed teams, competitions, bet types, kickoff times and settled outcomes.
Pricing
from $2.00 / 1,000 market rows
Rating
0.0
(0)
Developer
George Semaan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Kalshi Sports Markets Scraper: Premier League, Soccer, NFL, NBA Odds & Prediction Markets
$2.00 per 1,000 rows. No API key. No proxies. A default run finishes in seconds.
Pulls Kalshi's sports prediction markets and returns them as flat, spreadsheet-ready rows with the fixture, the subject team, the competition, the bet type and the kickoff time already parsed into their own columns.
Defaults to the English Premier League. Point it at any of Kalshi's 3,600+ sports series and it works the same way: soccer, NFL, NBA, tennis, golf, esports, cricket, MMA.
What you get
One flat row per market. No nested JSON, no reading rules text to work out which club a ticker belongs to.
| ticker | home_team | away_team | team | market_kind | proposition | game_date | yes_bid | yes_ask | volume |
|---|---|---|---|---|---|---|---|---|---|
| KXEPLGAME-26AUG29LFCNFO-LFC | Liverpool | Nottingham | Liverpool | game_winner | Liverpool | 2026-08-29 | 0.68 | 0.69 | 980960.72 |
| KXEPLSPREAD-26AUG29LFCNFO-LFC3 | Liverpool | Nottingham Forest | Liverpool | spread | Liverpool wins by more than 2.5 goals | 2026-08-29 | 0.22 | 0.23 | 15540.31 |
| KXEPLTOTAL-26AUG29LFCNFO-1 | Liverpool | Nottingham Forest | total | Over 0.5 goals scored | 2026-08-29 | 0.95 | 0.96 | 11047.72 |
Season-long markets have no fixture, so they come back keyed on the club:
| ticker | team | market_kind | season | proposition | yes_bid | yes_ask |
|---|---|---|---|---|---|---|
| KXEPLRELEGATION-27-ARS | Arsenal | relegation | 2026-27 | Arsenal | 0.03 | 0.06 |
Coverage
Measured on a live default run:
- 208 open markets across the core EPL series, in 11 requests and about five seconds.
- 100% of rows resolve a fixture, a subject team or a competition.
- Bet types on that run: game winner 78, totals 60, spreads 40, relegation 20, both teams to score 10.
The default covers the five core Premier League series. The full Sports catalogue
is 3,613 series, reachable by naming them in seriesFilter: every EPL market
type (corners, correct score, goalscorer, assists, half-time lines, top four,
champion), plus 1,403 soccer series overall, 537 American football, 527
basketball, 214 baseball, 135 tennis, 114 golf, 107 esports, 70 hockey, 64
motorsport, 56 cricket, 38 MMA.
Join on team_id, not on the club name
Kalshi does not spell a club the same way in every series. In a single live run the same three clubs appeared as:
| One series says | Another says |
|---|---|
| Nottingham | Nottingham Forest |
| Newcastle | Newcastle United |
| Coventry | Coventry City |
Every row carries team_id, Kalshi's own identifier for the club, which is
stable across series and seasons. Join on that and the variants stop mattering.
There is deliberately no derived team_canonical column. Rows are written a
series at a time so that an interrupted run keeps its work, which means any
"canonical" name learned mid-run is only whatever has been seen so far. Testing
showed the same club emitted under two different canonical names inside one run.
A join key that is not stable is worse than no join key, so this actor publishes
the identifier Kalshi already guarantees instead of inventing one.
Input
Every field is optional.
| Field | Default | What it does |
|---|---|---|
mode | live | live for open markets and prices, settled for outcomes, both. |
seriesFilter | the five core EPL series | Which series to fetch. Clear it entirely to fetch every sports series with open markets, which is slow: the catalogue is over 3,600 series. |
includeOrderbook | false | Add resting bid depth, a derived yes-ask and the spread. Batched, so it costs very few extra requests. |
includeRecentTrades | false | Add recent executed trades. Costs one request per market. |
historyDays | 7 | Settlement lookback window. |
incremental | false | Remember the newest settlement seen and fetch only newer ones next run. |
maxResults | 5000 | Safety cap on rows per run. |
requestsPerSecond | 2 | Politeness limit. |
Filters
Ask for the slice you want instead of downloading everything and filtering locally. Filters run before rows are written, so a narrower request returns fewer rows and costs less.
| Field | What it does |
|---|---|
teams | Keep only markets involving these clubs, e.g. ["Arsenal", "Liverpool"]. Matches the home side, the away side and the subject team, so a club's away fixtures are included. Case and punctuation insensitive. |
competitions | Keep only these competitions, e.g. ["EPL"]. Read from Kalshi's event metadata, not parsed from text. |
sports | Keep only these sports, e.g. ["Soccer"]. |
marketKinds | Keep only these bet types, e.g. ["game_winner", "spread"]. |
seasonMarketsOnly | season for relegation, champion and top-four style markets; fixture for single matches. |
minStrike / maxStrike | Strike window in the market's own unit: goals for a total, goal margin for a spread. A market is kept when any part of its range overlaps the window, so open-ended lines like "over 2.5 goals" are not silently dropped. |
dateFrom / dateTo | Kickoff-date window, YYYY-MM-DD. |
minVolume | Drop markets that have traded less than this. The most effective single lever for cutting a run down to markets anyone is actually trading. |
minOpenInterest | Drop markets with fewer open contracts than this. |
minProbability / maxProbability | Implied-probability window, 0 to 1. 0.4 to 0.6 finds near coin-flips; maxProbability: 0.05 finds longshots. |
results | Settled modes only: keep only yes, no or scalar outcomes. |
// Every Arsenal market anyone is actually trading{ "mode": "live", "teams": ["Arsenal"], "minVolume": 100 }// This weekend's match winners only{ "mode": "live", "marketKinds": ["game_winner"], "dateFrom": "2026-08-29", "dateTo": "2026-08-31" }// Season-long markets: relegation, champion, top four{ "mode": "live", "seasonMarketsOnly": "season" }
Output fields
Identity: ticker, event_ticker, series_ticker, market_title,
event_title, series_title, category, status, market_type.
Fixture: home_team, away_team, home_abbr, away_abbr,
team_order_source. The order is Kalshi's own listing order; nothing in the
payload states which side is at home, and team_order_source records that.
Subject: team, team_side, team_source, team_id, proposition.
proposition is Kalshi's own wording for the claim, passed through untouched.
Classification: sport, competition, competition_scope, market_kind,
market_kind_source, is_season_market, frequency, tags.
Timing: kickoff_time, game_date, season, open_time, close_time,
expiration_time.
Strike: strike_type, floor_strike, cap_strike, floor_inclusive,
cap_inclusive, bracket_label.
Prices: yes_bid, yes_ask, no_bid, no_ask, last_price,
previous_price, implied_probability_yes, yes_bid_size, yes_ask_size.
Size: volume, volume_24h, open_interest, liquidity, notional_value.
Settlement: result, settlement_value, settlement_ts.
Raw: rules_primary, rules_secondary, passed through untouched.
Every row carries schema_version. Provenance columns (team_source,
market_kind_source, team_order_source) let you filter to values read directly
from the payload rather than derived.
Notes on accuracy
- Prices are decimal dollars from 0 to 1, not integer cents. Volumes and sizes can be fractional.
market_kindcomes from Kalshi's owncompetition_scopewhere available. A bet type this actor has not seen before is emitted as a slug of its own name rather than as a blank, so new Kalshi market types are filterable immediately.game_datecomes fromoccurrence_datetime, the scheduled kickoff, not from the market's close time.resultcan beyes,noorscalar.scalarmeans a voided or partial settlement.- Settled markets can later be
disputedoramended.updated_timeis included so you can upsert rather than append.
Compliance
This is an unofficial tool and is not affiliated with, endorsed by, or
connected to Kalshi. It reads Kalshi's public, unauthenticated market data
endpoints, the same ones documented with copy-paste examples at
docs.kalshi.com, at a deliberately conservative 2 requests per second. No
account, API key or login is used.
Keywords
kalshi scraper, kalshi api, kalshi sports, premier league odds api, EPL odds scraper, english premier league data, soccer prediction markets, football betting odds api, prediction market data, sports betting odds scraper, kalshi nfl, kalshi nba, implied probability api, match winner odds, over under goals data, both teams to score data, relegation odds, sports market data feed