Esports Data API

KashRock is a DaaS for esports books and apps. Default HTTP is /v7. Base https://kashrock.up.railway.app.

Plans & Upgrading

PlanRate limitQuotaLive data
Sandbox (free)10 req/min1,500 credits/dayCS2 eval (no live desk)
Hobby30 req/min1.5M credits/mo15s delayed
Builder100 req/min5M credits/moreal-time
Pro250 req/min10M credits/moreal-time
Quant500 req/min20M credits/moreal-time

Every call spends credits by weight: prematch endpoints 1, matches 2, props 5, history 5, live scores 10, lines 10. Credit packs (10K for $20, 50K for $75, 250K for $250) top up the same balance after your plan quota runs out.

Hit a limit or a plan gate and the API answers with an upgrade object, one sentence plus a tracked checkout link preselected to the cheapest plan that unlocks it. Upgrade to Hobby, Builder for real-time data, Pro, or build a custom plan.


Quick Start

HTTPS only. Pass your key on every request. Start with /v7/meta: it returns the sports, books, markets and a routes table naming every endpoint, its parameters and the plan it needs, so one call tells you what to ask for next.

cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/meta"
200 · routes table (excerpt)
{
  "available": true,
  "plan": "hobby",
  "sports": [
    "apex",
    "cod",
    "cs2",
    "deadlock",
    "dota2",
    "lol",
    "mlbb",
    "r6",
    "valorant"
  ],
  "routes": [
    {
      "route": "/v7/meta",
      "answers": "sports, books (kind + supports), markets, routes, your plan",
      "plan": "sandbox"
    },
    {
      "route": "/v7/{sport}/props",
      "params": "board, view, market, player, book, format",
      "answers": "player props (board=dfs|main|all)",
      "plan": "sandbox"
    },
    {
      "route": "/v7/{sport}/lines",
      "params": "market, view, include_started, format",
      "answers": "team mainlines with consensus fair price",
      "plan": "hobby"
    }
  ]
}

Then read a board. Every row carries KashRock ids you can join across props, matches and live data.

cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/props"
200 · live prop
{
  "propId": "kr_prop_883ba7a1e090",
  "eventId": "kr_ev_d9410a855f83",
  "offerId": "kr_prop_883ba7a1e090_6_over",
  "book_name": "Betr",
  "player_name": "mezii",
  "stat_type": "CS2_HEADSHOTS_MAPS_1_2",
  "line": 14.5,
  "direction": "over",
  "team": "Team Vitality",
  "opponent": "Lynn Vision Gaming",
  "event_time": "2026-08-16T13:55:00.000Z"
}

Full list: Route Index. Already calling V6? It keeps working, see V6 API and, when you want to move, Moving To V7.

Authentication

Create keys in the Console. Send either header:

  • X-API-Key: YOUR_API_KEY
  • Authorization: Bearer YOUR_API_KEY

Keep keys server-side. Do not ship them in browsers or public repos.

Sports

Use the slug in the path as {sport}.

cs2valorantloldota2codr6mlbbdeadlock

ID system

Every prop row carries six IDs. Use the kr_ fields to join books, matches, and live data.

FieldLayerPurpose
eventIdMatchSame game across every book's props and lines.
kr_match_idMatchSame match on /matches, /live, and /gamelogs, join a prop straight to its boxscore, no team/date matching required.
propIdMarketPlayer + stat + line. Shared by over and under.
offerIdSelectionOne book × direction. Use this on a bet slip.
source_event_idProviderRaw event id from the book.
source_prop_idProviderRaw prop id from the book.

eventId and kr_match_id are minted by two different pipelines for the same match, so every prop row now carries both directly, call GET /v7/{sport}/matches?ids={kr_match_id}&include=boxscore with the value straight off a props response. A prop from a match KashRock hasn't cross-referenced yet returns kr_match_id: null, that's honest "not yet available," not a broken join.

Errors

JSON body with a detail string.

StatusMeaning
401Missing or invalid API key.
403Key is not allowed on this route.
404No tape or player for that query.
409More than one player matches the name.
422Bad or missing parameter.
429Rate limited. Back off and retry.
503Vault or cache unavailable. Retry.