Real-time esports data.
Live scores, rounds, and player boards.

Quick answer: Yes — KashRock streams real-time esports data: live match state, map scores, and per-player K/D/A over REST and WebSocket, no scraping required.

Pull live match lists, map scores, round clock, and per-player K/D/A without scraping. Push updates under 2 seconds after Redis write. Use GET /v6/esports/{sport}/live/games and /live/{game_id}/boxscore, or subscribe on WS /v6/esports/live/ws.

What the live feed carries

Real-time here means in-match: the round that is being played right now, not last night's result. The feed carries live game lists, per-map scores, the round clock, per-player K/D/A, and discrete events as they happen.

  • —Live game list with league, teams, and start time
  • —Map score, series score, round number, and round phase
  • —Per-player kills, deaths, assists, headshots, ADR, alive
  • —Discrete events — kills, round wins, bomb plants and defuses

Live endpoints

Poll REST while you build, then subscribe on WebSocket when you need the numbers the moment they write. Same ids, same payload shape, no re-mapping.

EndpointWhat it returnsKey param
GET /v6/esports/{sport}/live/gamesEvery game currently on the live boardsport
GET /v6/esports/{sport}/live/{game_id}/boxscorePer-player K/D/A plus map, round, and clockgame_id (kr_match_id)
GET /v6/esports/{sport}/live/{game_id}/frameRound phase, economy, and board stategame_id
GET /v6/esports/{sport}/live/{game_id}/eventsKILL, ROUND_WIN, BOMB_PLANT, BOMB_DEFUSE, ROUND_STARTgame_id
WS /v6/esports/live/wsPush updates under 2 seconds after Redis write — Builder and Pro onlysubscribe by sport or kr_match_id
GET /v6/esports/live/healthMeasured p50/p95 latency per live gamenone

A real live boxscore

A live boxscore mid-map: Vitality vs magic on Mirage, round 19. The players array is the scoreboard — ten rows of K/D/A that update as rounds close.

GET /v6/esports/cs2/live/kr_cs2_vitality-vs-magic-ru-17-09-2026/boxscore
{
  "sport": "cs2",
  "game_id": "kr_cs2_vitality-vs-magic-ru-17-09-2026",
  "boxscore": {
    "map_name": "Mirage",
    "map_number": 1,
    "round": 19,
    "blue": {
      "kills": 82,
      "map_score": 13,
      "series_score": 1
    },
    "red": {
      "kills": 52,
      "map_score": 6,
      "series_score": 0
    },
    "players": [
      {
        "player_id": "kr_pl_5ea13ced730e",
        "nickname": "ropz",
        "side": "blue",
        "kills": 23,
        "deaths": 10,
        "assists": 3,
        "headshots": 12,
        "adr": 114.19999694824219
      },
      {
        "player_id": "kr_pl_a9020751a3a8",
        "nickname": "apEX",
        "side": "blue",
        "kills": 22,
        "deaths": 11,
        "assists": 7,
        "headshots": 10,
        "adr": 133.1999969482422
      },
      {
        "player_id": "kr_pl_fd87dbd9d1c1",
        "nickname": "flameZ",
        "side": "blue",
        "kills": 16,
        "deaths": 13,
        "assists": 8,
        "headshots": 7,
        "adr": 89.5
      },
      {
        "player_id": "kr_pl_4764e4b8d73a",
        "nickname": "ZywOo",
        "side": "blue",
        "kills": 11,
        "deaths": 9,
        "assists": 7,
        "headshots": 3,
        "adr": 57.400001525878906
      },
      {
        "player_id": "kr_pl_36c966f11204",
        "nickname": "mezii",
        "side": "blue",
        "kills": 10,
        "deaths": 9,
        "assists": 5,
        "headshots": 8,
        "adr": 54.5
      },
      {
        "player_id": "kr_pl_2cc82eb14944",
        "nickname": "MaSvAl",
        "side": "red",
        "kills": 17,
        "deaths": 15,
        "assists": 1,
        "headshots": 13,
        "adr": 87.9000015258789
      },
      {
        "player_id": "kr_pl_5e5e69089419",
        "nickname": "sFade8",
        "side": "red",
        "kills": 11,
        "deaths": 17,
        "assists": 4,
        "headshots": 6,
        "adr": 67.0999984741211
      },
      {
        "player_id": "kr_pl_64ea67e35230",
        "nickname": "eksiver",
        "side": "red",
        "kills": 10,
        "deaths": 16,
        "assists": 0,
        "headshots": 2,
        "adr": 45.20000076293945
      },
      {
        "player_id": "kr_pl_218807e67435",
        "nickname": "mo0n",
        "side": "red",
        "kills": 9,
        "deaths": 15,
        "assists": 6,
        "headshots": 4,
        "adr": 51.099998474121094
      },
      {
        "player_id": "kr_pl_630e7229e428",
        "nickname": "tENZY",
        "side": "red",
        "kills": 5,
        "deaths": 19,
        "assists": 7,
        "headshots": 5,
        "adr": 48.900001525878906
      }
    ]
  }
}

Vitality vs magic, map 1 Mirage, 17 Sep 2026. Same KashRock ids and KDA fields as live REST.

Which sports publish live boards

Live K/D/A comes from in-game feeds on tournament matches. Where a title has no feed wired, the board stays empty — KashRock does not invent stats.

TitleLive statusWhat the board carries
CS2LiveKills, deaths, assists, headshots, ADR per map
ValorantLiveK/D/A per map on tournament games
League of LegendsLiveK/D/A per map on tournament games
Dota 2LiveK/D/A per map on tournament games
Rainbow SixLiveK/D/A per map on tournament games
Call of DutyLiveK/D/A per map on tournament games
DeadlockLiveK/D/A per map on tournament games
Mobile LegendsWaiting on feedLive boards stay empty until a feed is wired

How the latency SLA is enforced

Push updates under 2 seconds after Redis write. On REST, Builder and Pro read the same real-time board in under 2 seconds; Sandbox and Hobby are served delayed snapshots —live scores, 30-60 second delay and live scores, 5-second delay respectively. The health endpoint publishes the measured p50/p95 per game so you can watch the pipeline instead of trusting it.

Speed by plan

Live speed is a plan feature, not a different pipeline. Every tier reads the same Redis boards — cheaper plans are served a genuinely older snapshot instead of a relabeled real-time read.

PlanPriceLive speedMonthly requests
Sandbox$0Live scores, 30-60 second delay on REST500 requests / UTC day
Hobby$29Live scores, 5-second delay on REST2,160,000 requests / month
Builder$99Live player kills, deaths, and assists updated in under 2 seconds + WebSocket push4,320,000 requests / month
Pro$199Live player kills, deaths, and assists updated in under 2 seconds + WebSocket push10,800,000 requests / month

Start in minutes

  • —Create a free Sandbox key on Pricing — $0, no card, 500 requests every UTC day
  • —List what is live: GET /v6/esports/{sport}/live/games and copy the kr_match_id off a game
  • —Pull the board: GET /v6/esports/{sport}/live/{game_id}/boxscore
  • —Upgrade to Builder when you need real-time (no delay) or WebSocket push — Sandbox and Hobby are rejected at the WS handshake

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

How fast are live player stats?

Live player kills, deaths, and assists updated in under 2 seconds on Builder and Pro. Sandbox REST is live scores, 30-60 second delay, and Hobby is live scores, 5-second delay.

REST or WebSocket?

Both. REST reads Redis. WebSocket: Push updates under 2 seconds after Redis write — Builder and Pro only.

Which sports have live K/D/A today?

CS2, Valorant, LoL, Dota 2, Rainbow Six, Call of Duty, and Deadlock tournament games publish live K/D/A. Mobile Legends live boards stay empty until a feed is connected. We do not invent stats.

What ID do the live endpoints take?

The KashRock match id — kr_match_id — returned by GET /v6/esports/{sport}/live/games or any match listing. You never pass a provider's numeric id.

Does real-time esports data require WebSocket?

No. REST already reads the live board — WebSocket adds push so you do not poll. Sandbox can use live REST today (delayed); the WS stream is Builder and Pro.

What comes back for a finished game?

It leaves the live board and lands on the results and boxscore endpoints with the same kr_match_id — live and history share one id space, so nothing needs re-keying.