Esports Data API Features
Quick answer: KashRock is an esports data API for CS2, Valorant, League of Legends, Dota 2, Call of Duty, Rainbow Six, Mobile Legends, Deadlock, and Apex Legends — live player kills, deaths, and assists under 2 seconds on REST and WebSocket, canonical IDs that hold even when sources disagree on team naming or order, a fair probability and EV% on every book price on the board, signal alerts on Pro, and a cross-book arbitrage scanner on Quant. One schema, one key.
What's included
- —Fair Price + EV on Every Line: The lines board is not raw odds. GET /v7/{sport}/lines returns every book's price on a market next to a KashRock fair probability, built only from books that price both sides themselves, and an ev_pct on each price: fair probability x decimal price - 1. A mispriced number comes back flagged, not just listed. Every price also carries observed_at, price_changed_at, suspended state, and the series format the book reports. The same fair powers ranked +EV parlays, signal alerts, and the arb board, and it is on every plan from Hobby ($29.99/mo) up.Live example
GET /v7/cs2/lines Team Vitality vs 9z Team, map_handicap, fair available 9z Team prices, sorted best to worst: betwhale 12.00 (+1100) ev_pct +7.15 pinnacle 11.28 (+1028) ev_pct +0.72 cloudbet 11.00 (+1000) ev_pct -1.78 bovada 11.00 (+1000) ev_pct -1.78 betonline 10.14 (+914) ev_pct -9.45 thunderpick 10.00 (+900) ev_pct -10.71
- —Every Market, Not Just Moneyline: One call without a market filter returns the main markets: match_winner, map_winner, total_maps, team_total_maps, map_handicap, correct_score, and dfs_team_pick. Ask for more with market=: round_handicap, total_rounds, kill_handicap, total_kills, outright (tournament futures where every listed pick gets each book's own price), objective (map objectives like xth baron, dragon, or tower), and round_winner (in-play round markets where the line is the round index). Round and kill markets state their overtime class per book, and books are never blended across different settlement rules.Live example
GET /v7/cs2/lines (one event) match_winner 2-way winner map_handicap -1.5 / +1.5 total_maps 2.5 total_rounds 18.5 / 19.5 / 20.5 / 21.5 dfs_team_pick payout multipliers, not blended prices same event, five market contracts side by side
- —Signals, Arbitrage & Trade Tools: Pro ($199/mo) adds signal alerts: mispricing, steam moves, and arb openings that fire when the board diverges from fair, pollable on GET /v7/{sport}/signals or pushed to your endpoint. Quant ($299/mo) adds the cross-book arbitrage board on GET /v7/{sport}/arb: every two-outcome market whose best price per side sums under 100% implied across venues, each arb broken into legs with the book, decimal and American price, offer id, deeplink, and stake share, plus CLV tracking per bet and per book, backtests on real settled lines, portfolio grading, and webhook delivery.Live example
GET /v7/cs2/arb MIBR vs Eternal Fire, total_rounds 18.5 (map 2) overround 0.8531 margin_pct 14.69 legs: ggbet Over 1.61 (-164) stake_share 0.728 pinnacle Under 4.31 (+331) stake_share 0.272 kr_cs2_eternal-fire-vs-mibr-27-10-2026
- —Ranked +EV Parlay Discovery: GET /v7/{sport}/parlays works two ways. Pass a ticket of comma-separated legs and it prices the whole slip; omit it and it discovers ranked parlays on the book you name, 2 to 8 legs, default +EV only (include=all keeps the negatives). Every leg's fair excludes the leg's own book, so a book never grades its own number, and each parlay states its price_source (product of legs or a native book price) and placeable_basis. Same-match parlays are not supported anywhere; cross-match only.Live example
GET /v7/cs2/parlays?book=bovada&size=4 4 legs american +4628 ev_pct +3.91 price_source: computed placeable_basis: book_price match_winner kr_tm_2c47 +500 fair 16.8% ev +1.03 match_winner kr_tm_f3f7 -135 fair 55.3% ev -3.74 match_winner kr_tm_b213 -135 fair 55.5% ev -3.38 match_winner kr_tm_d8c3 +160 fair 42.5% ev +10.59
- —Money Flow & Steam Moves: GET /v7/{sport}/flow surfaces four play types with the thresholds each one cleared: volume (money floor plus a lopsided side share), shift (a side-share move of 10+ points in 6 hours), steam (2+ public books converging or one big exchange move), and whale (trade-level prints). Each play carries its trigger data so a signal is auditable rather than a bare alert.Live example
GET /v7/cs2/flow { "kind": "volume", "match": "Donstu Esports vs Quintessence", "selection": "Donstu Esports", "money_behind": 23686.62, "side_share": 0.7402, "best_american": 174, "best_source": "1xbet", "ev_pct": 5.7056, "ev_basis": "consensus_fair" } - —CS2 Map Monte Carlo Sims: include=sim on GET /v7/cs2/matches runs a 1,000,000-simulation Monte Carlo per map, on demand: map winner probabilities against the exact round solver, total-rounds distribution with p05/p50/p95 and a full PMF, per-player kill distributions (mean, percentiles, probability over every common prop line), correlated markets like winner-and-total, a typical game drawn round by round, and fair prices stamped onto the live kill-prop board. Pass map= for a specific map and n_sims= to scale the run. Builder and above.Live example
GET /v7/cs2/matches/kr_cs2_mellren-vs-saint-sinners-08-10-2026?include=sim n_sims: 1,000,000 map: Dust2 map_winner: Saint Sinners 65.3% mellren 34.7% total_rounds: mean 22.84 p05 17 p50 22 p95 30 player kills: mean + P(over) on every board line
- —Live Scoreboard + Player Stats: Live kills, deaths, and assists update in under 2 seconds on Builder and Pro (15-second delay on Hobby). The same fields are available for upcoming, live, and finished matches, so a live boxscore and a three-month-old gamelog read identically.Live example
GET /v7/cs2/matches (live row) { "nickname": "torzsi", "team": "MOUZ", "kills": 23, "deaths": 16, "assists": 2, "headshots": 10, "adr": 69.6, "weapon": "awp", "alive": true, "rounds_played": 29 } - —Live Event Feed: GET /v7/{sport}/live?include=events streams every live event as it happens: kills, plants, defuses, explosions, round wins, map pick and ban vetoes, and map and match start and end markers, on CS2 today with other titles answering unavailable rather than silent. In-play odds and the in-play tape come with include=odds and include=odds_history.Live example
GET /v7/cs2/live?include=events map_veto map pick/ban in order map_started per-map begin marker kill player, weapon, round plant bomb planted defuse bomb defused round_won side + score after map_won final map score one ordered stream, round numbers on every row
- —Live WebSocket: Subscribe on /v7/live/ws for real-time live scores and in-play odds instead of polling: per-match subscriptions on Builder (2 connections, 5 matches), full-board subscribe on Pro (10 connections, every live match), and 20 connections with 50 subscriptions on Quant. REST and WS read from the same publish path, so a poller and a subscriber never disagree.Live example
wss://kashrock.up.railway.app/v7/live/ws -> { "subscribe": ["kr_cs2_mouz-vs-team-liquid-24-10-2026"] } <- { "type": "score", "map": 2, "team1": 9, "team2": 11 } <- { "type": "score", "map": 2, "team1": 10, "team2": 11 } <- { "type": "map_won", "map": 2, "winner": "Team Liquid" } same publish path as REST: a poller and a subscriber never disagree - —Player Props Boards: GET /v7/{sport}/props serves DFS pick'em boards, main boards, or both (board=dfs, main, all) in grouped, row, or combined views, filterable by market, player name, and book. DFS payout multipliers are surfaced as payout_multiplier alongside an American-format equivalent, never blended into the line-price fair.Live example
GET /v7/cs2/props?board=dfs&player=syph0 syph0 (Nemiga vs Legacy), Betr pick'em at 1.73x: kr_prop_845ac626385e HEADSHOTS_MAPS_1_2 15.5 -137 kr_prop_d8726afbdaa8 KILLS_MAPS_1_2 24.5 -137 kr_prop_4fd276d78e80 KILLS_MAPS_1_2 26.5 -137 kr_prop_c1eaa79163b4 KILLS_MAPS_1_2 27.5 -137 one propId per contract per line
- —Match Intel Includes: GET /v7/{sport}/matches and /{match_ref} answer with include= blocks on one call: boxscore (finished maps with player stats), prep (team stats, recent form, map pools), veto (the map pick-ban sequence), maps (the tournament map pool), player_board (per-player board), lines (match-level markets), streams (broadcast links), h2h (head-to-head), and sim (the CS2 Monte Carlo).Live example
GET /v7/cs2/matches/mouz-vs-team-liquid-24-10-2026?include=prep,veto,h2h one call returns: prep team stats, recent form, map pools veto the pick-ban order h2h their meeting history plus boxscore, maps, player_board, lines, streams, sim
- —Player Research & Rankings: GET /v7/{sport}/players covers the player directory with q= name search, sort=rank for the rankings, and include= blocks for research, gamelogs (deep per-game history), stats, stats_full, history, and media. Player ids are kr_pl_* and join to props, boxscores, and grades.Live example
GET /v7/cs2/players?q=zywoo { "player_id": "kr_pl_3d4767fa9400", "nickname": "ZywOo", "first_name": "Mathieu", "last_name": "Herbaut", "team": "Team Vitality", "country": "France", "role": "gun" } kr_pl_* joins to props, boxscores, and grades - —Team Profiles & Schedules: GET /v7/{sport}/teams gives the team directory: q= name search, id=kr_tm_* lookup, team1 and team2 for their meetings, and include= for form, roster, maps, h2h, main_lines, and upcoming. Schedules are filterable by status and date range on /matches with the team's finished record paged back through the vault.Live example
GET /v7/cs2/teams?q=vitality { "name": "Team Vitality", "canonical_team_id": "kr_tm_e9ac39acbe73", "rank": 3, "country_id": 29, "alias": "Vitality" } include=form,roster,upcoming in the same call - —Match Overview (UAV): GET /v7/{sport}/uav is one match prematch through live in a single response: the match card, current phase, a WebSocket subscribe hint, and every include block the phase supports (lines, prep, veto, maps, player_board, streams, h2h prematch; boxscore, events, frame, odds, odds_history live), plus the match's own flow plays.Live example
GET /v7/cs2/uav?match=mouz-vs-team-liquid-24-10-2026 phase: live card teams, score, competition odds in-play board events kills, plants, round wins in order flow money plays tagged to this match ws_hint the subscribe payload for this match prematch and live blocks in one response
- —Match Breakdowns: GET /v7/{sport}/breakdown is the actionable fact bundle for a match, team, or head-to-head pair: odds, form, maps, starter props, and targets in one call. Published breakdown pages are indexed under /breakdown/index and addressable by kind and slug.Live example
GET /v7/cs2/breakdown?team1=mouz&team2=liquid one call instead of five: odds current board for the match form recent results both sides maps the map pool for the series props starter prop targets h2h pair or single team, same shape
- —History Vault & Quote Tapes: GET /v7/{sport}/history?kind=contract returns a prop contract's full quote tape tick by tick, and kind=lines returns a match's line tape (single match or a comma list of up to 5). Tapes run from KBs to MBs with total counts always stated, and history depth is plan-scoped: 90 days on Hobby, the full vault on Builder and above.Live example
GET /v7/cs2/history?kind=lines&match=kr_cs2_g2-esports-vs-natus-vincere-24-10-2026 { "tape_total": 15492, "quotes": [ { "book": "pinnacle", "line": 20.5, "side": "over", "american": -110 }, { "book": "pinnacle", "line": 20.5, "side": "over", "american": -115 } ] } every tick on the tape, counts always stated - —Outcome Verification: Settled hit/miss/push/void grades for kills, deaths, assists, headshots, ADR, and first kills across CS2, Valorant, League of Legends, Dota 2, Call of Duty, and Rainbow Six, graded from live and vault boxscore data, not self-reported. GET /v7/{sport}/results filters by grade. Every quote on a history tape can be annotated with its settled grade, so a tape reads as a scored record, not just a price series.Live example
GET /v7/cs2/results?grade=hit { "propId": "kr_prop_a3132e07b5b3", "player_name": "Nemesis", "stat_type": "CS2_MAP_HANDICAP", "line": 0.5, "grade": "hit", "actual_value": 1.0, "opening_odds": -169, "closing_odds": -169 } graded from boxscore data, not self-reported - —CLV, Backtest & Portfolio: Quant adds the trading ledger: GET /v7/{sport}/clv tracks closing line value per bet and per book, /backtest runs a flat-stake strategy against settled matches (last 30 days by default, up to 180, with a min_edge trigger and full P&L, hit rate, and ROI summary), and /portfolio grades your positions automatically with running P&L.Live example
GET /v7/cs2/backtest?min_edge=3&stake=100 { "window_days": 30, "bets_fired": 214, "hit_rate": 0.571, "pnl": 1840.20, "roi_pct": 8.6 } flat-stake against settled lines, per book or all - —Webhooks & Execution: Quant adds webhook delivery on /v7/webhooks (create, list, delete) so alerts push to your endpoint instead of polling, plus a trade WebSocket at /v7/trade for execution intents and a /v7/ws-ticket flow for ticket-based actions.Live example
POST /v7/webhooks { "url": "https://your.endpoint/hooks", "events": ["signal", "arb"] } then the push lands the moment the board moves, no polling. /v7/trade carries execution intents - —Nine Titles, One Schema: CS2, Valorant, League of Legends, Dota 2, Call of Duty, Rainbow Six Siege, Mobile Legends: Bang Bang, Deadlock, and Apex Legends: schedules, DFS/sportsbook/prediction-market props, player and team stats, and settled outcomes on one canonical schema. One key, nine titles, no per-book integration to maintain.Live example
same route shape on every title: cs2 valorant lol dota2 cod r6 mlbb deadlock apex /v7/{sport}/matches /v7/{sport}/props /v7/{sport}/lines /v7/{sport}/results one key, nine titles, one schema - —Books in One Feed: Sportsbook lines, DFS pick'em boards (PrizePicks, Underdog, Sleeper, Dabble, ParlayPlay, Betr, Boom, Pick6), and prediction-market quotes (Kalshi, Polymarket) normalized onto one response. /v7/meta lists every book with its kind and what it supports (lines, props, parlays), and include=boards shows which books have live lines per title right now.Live example
22 books on the CS2 board right now: pinnacle ggbet betway thunderpick bovada betwhale dexsport betonline kalshi polymarket 1xbet courtside sleeper underdog cloudbet betrivers ... sportsbook, DFS pick'em, and prediction market prices normalized onto one response
- —Canonical IDs: KashRock mints one stable ID per match, player, team, and prop: kr_match_id (or a human slug like mouz-vs-team-liquid-24-10-2026), kr_pl_*, kr_tm_*, kr_prop_*, and canonical_event_id. IDs survive upstream naming drift and reconcile when two ingestion paths disagree, so joins never fork into two records. Caller contracts accept KR ids and slugs only.Live example
one id joins every surface: kr_cs2_mouz-vs-team-liquid-24-10-2026 -> /matches schedule row -> /live boxscore -> /lines board -> /history tape -> /results settled grade kr_pl_* kr_tm_* kr_prop_* kr_ev_*
- —Granular Stat Depth: Map-scoped stat types like CS2_HEADSHOTS_MAPS_1_2 and CS2_KILLS_MAP_1: kills, deaths, assists, headshots, ADR, and first kills broken out per map or map range, not just series totals. The same field names appear on live boxscores, historical game logs, and settled results, so there is no schema change between live and history.Live example
map-scoped stat types as first-class contracts: CS2_KILLS_MAP_1 first map only CS2_KILLS_MAPS_1_2 maps one and two CS2_HEADSHOTS_MAPS_1_2 headshots, maps 1+2 CS2_FIRST_KILLS_MAP_1 first kills, map one same field names live, history, and settled
- —Predictable Contract: Every endpoint answers a shaped envelope: available:false with a machine-readable reason on a cache miss, an error object with code, status, and param on bad input, and a plan_required error naming the lowest tier that includes a gated feature. /v7/meta publishes the sports, books, markets, and the full route table so discovery is one call.Live example
a miss states why, never an empty object: { "available": false, "reason": "lines_not_cached" } a bad param answers with: { "error": { "code", "status", "param" } } a gated feature names the lowest plan that has it - —Plans & Throughput: Sandbox is free forever (CS2 eval, 1,500 credits/UTC day, no card). Hobby $29.99/mo: every title, the full book board, +EV lines, flow, parlays, 15s-delayed live, 90-day vault. Builder $99/mo: real-time live, WebSocket, full history, sims. Pro $199/mo: signal alerts, full-board live subscribe, trade tools. Quant $299/mo: arb, CLV, backtest, portfolio, webhooks. Published rates, instant key, no sales call.Live example
published rates, instant key: sandbox $0 CS2 eval, 1,500 credits/day hobby $29.99 every title, +EV lines, flow, 90-day vault builder $99 real-time live, WS, full history, sims pro $199 signal alerts, trade tools quant $299 arb, CLV, backtest, portfolio, webhooks each tier a superset of the last
If you need a normalized feed instead of another UI wrapper, the esports api exposes live boards, schedules, and history on one schema — with the IDs and outcome patterns that keep backtests and grading honest. Start free on Sandbox, or see published pricing.