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.

Everything below ships on one key and one schema, the same response shape whether you're reading a live board or a settled result. Every claim carries a real call or real output so you can verify it yourself.

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.

Frequently asked questions

What is an esports API?

A programmatic feed of esports schedules, live match state, player and team stats, and props/odds — instead of scraping HLTV, Liquipedia, or a sportsbook yourself. KashRock covers CS2, Valorant, League of Legends, Dota 2, Call of Duty, Rainbow Six, Mobile Legends, Deadlock, and Apex Legends on one schema and one key.

Is there a CS2 data API?

Yes. GET /v7/cs2/... returns schedules, live boxscores (kills, deaths, assists, ADR, headshots) under 2 seconds on Builder/Pro, historical game logs, map veto/pick-ban intel, and settled results. Sandbox is free — 1,500 credits/day, no card.

What is a CS2 match ID?

kr_match_id is KashRock's stable identifier for a match — format kr_{sport}_{team-a}-vs-{team-b}-DD-MM-YYYY — used to join live boxscores, game logs, and settled results for the same match across every endpoint.

Is there an esports odds API?

Yes. GET /v7/{sport}/props and /lines return DFS props, sportsbook lines, and Kalshi/Polymarket quotes normalized onto one canonical propId, so every book's price on the same prop joins without reconciling separate schemas.

How current is KashRock's live esports data?

Under 2 seconds on Builder/Pro, REST or WebSocket — both read from the same Redis-backed publish path, stamped with a durable per-match sequence number so live state can't regress after a worker restart. Hobby REST is 15-second delayed; Sandbox has no live desk.

Does a team rebrand or cross-source naming disagreement break a lookup?

No. KashRock reconciles match identity across sources before it reaches you. On 12 Sep 2026, two of our ingestion paths disagreed on team order for a LoL fixture between FURIA and LOS and minted two different match IDs for the same game; the fix makes both converge on one canonical kr_match_id instead of forking.

Does the esports odds API flag +EV lines?

Yes. 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) and an ev_pct per price. A mispriced line comes back flagged, not just listed. Fair and EV are on every plan from Hobby ($29.99/mo) up.

Is there an esports arbitrage API?

Yes, on Quant ($299/mo). GET /v7/{sport}/arb returns every two-outcome market whose best price per side sums under 100% implied across venues: each arb's legs carry the book, decimal and American price, offer id, deeplink, and stake share. Legs on the same venue never count as separate counterparties.

What are KashRock signal alerts?

Pro ($199/mo) signals fire when the board diverges from fair: mispricing, steam moves (a side-share shift of 10+ points in 6h or 2+ books converging), and arb openings. Poll them on GET /v7/{sport}/signals or get pushes on Quant webhooks.

Can the API simulate match outcomes?

Yes. include=sim on a CS2 match runs a 1,000,000-simulation Monte Carlo per map: map-winner probabilities, total-rounds distribution, per-player kill distributions with probabilities over prop lines, and fair prices stamped onto the live prop board. Builder plan and above.