Get a key

V7 API

V7 is one route per question. Every endpoint reads a cache the workers already filled, so a response is a read, not a fan-out. Twelve sport routes plus a global /v7/meta and a live WebSocket. All routes take a sport slug in the path; several accept sport=all.

Shared conventions

These behave the same on every V7 route, so you only learn them once.

ParamTypeRequiredDescription
availablebool—false means the board could not be served. reason says why — never a silent empty 200.
reasonstring—Why a response is empty: stale, no_parlays, page_not_published, board_not_published, and similar.
fetched_atstring—When the served board was built. Present on every response.
fieldsstring—Comma-separated allow-list of top-level keys. available and fetched_at are always kept.
limit / offsetint—Page size and start. Caps differ per route (see each below).
cursorstring—Opaque offset. Takes precedence over offset. A non-integer cursor returns 400 bad_cursor.
formatstring—slim (default) or full, on /props and /lines. slim drops verbose per-row fields.

Plan tiers run Sandbox → Hobby → Builder → Pro. The tag beside each endpoint is the minimum plan. Authenticate with X-API-Key.

/v7/metaSandbox

The registry behind every other route: which sports are covered, which books are live, which markets exist, and the plan your key resolves to. Start here when wiring an integration — the book keys and market slugs it returns are the exact strings the other endpoints accept.

GET/v7/meta
ParamTypeRequiredDescription
includestring—Adds coverage, teams, tournaments, or changelog.
fieldsstring—Trim the response to named keys.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/meta"
200 · live (trimmed)
{
  "available": true,
  "plan": "pro",
  "sports": [
    "apex",
    "cod",
    "cs2",
    "deadlock",
    "dota2",
    "lol",
    "mlbb",
    "r6",
    "valorant"
  ],
  "books": [
    {
      "book_id": 1,
      "key": "prizepicks",
      "display_name": "PrizePicks",
      "status": "active",
      "aliases": [
        "prize picks",
        "pp"
      ]
    }
  ],
  "markets": [
    {
      "slug": "kills_maps_1_2",
      "label": "Maps 1–2 kills",
      "field": "kills",
      "maps": [
        1,
        2
      ]
    }
  ],
  "fetched_at": "2026-10-05T20:02:11.418Z"
}

/v7/{sport}/matchesSandbox

One match list — fixtures, in-progress and finished. include pulls extras from cache in the same call instead of a second round trip.

GET/v7/{sport}/matches
ParamTypeRequiredDescription
sportpathYesSport slug, or all.
statusstring—upcoming, live, finished.
datestring—YYYY-MM-DD.
q / teamstring—Free-text or team filter.
idsstring—Comma-separated kr_match_id list.
includestring—boxscore, prep, veto, maps, player_board, lines, streams, h2h.
limitint—1–500, default 50.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/matches?status=upcoming&limit=1"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "total": 74813,
  "returned": 1,
  "matches": [
    {
      "kr_match_id": "kr_cs2_aurora-gaming-vs-betboom-team-05-10-2026",
      "slug": "aurora-gaming-vs-betboom-team-05-10-2026",
      "status": "current",
      "tier": "s",
      "start_date": "2026-10-05T17:15:00.000+00:00",
      "team1": "Aurora Gaming",
      "team1_id": "kr_tm_56736b71f648",
      "team2": "BetBoom Team"
    }
  ]
}

/v7/{sport}/propsSandbox

Player props. board=dfs is the DFS apps, board=main is sportsbook named-player props, and board=all is both. Rows whose match has already started are dropped, so an empty board for a title usually means that slate has begun or the books have not posted it yet.

GET/v7/{sport}/props
ParamTypeRequiredDescription
sportpathYesSport slug.
boardstring—dfs (default), main, or all.
viewstring—groups (default), rows, or both.
marketstring—Market slug from /v7/meta.
playerstring—kr_pl_* or nickname.
bookstring—One book key.
formatstring—slim (default) or full.
limitint—1–500.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/lol/props?view=rows&limit=1"
200 · live (trimmed)
{
  "sport": "esports_lol",
  "board": "dfs",
  "total": 679,
  "props": [
    {
      "propId": "kr_prop_f77e4c7c3c97",
      "book_name": "Betr",
      "player_name": "Poby",
      "player_id": "kr_pl_0e0e19d6231c",
      "stat_type": "LOL_KILLS_MAPS_1_2",
      "line": 5,
      "odds": -137,
      "direction": "over",
      "team": "Natus Vincere",
      "opponent": "HANJIN BRION"
    }
  ]
}

/v7/{sport}/linesHobby

Team mainlines across every line book, with a consensus fair price. The booksobject reports each book's presence, row count and age in seconds, so you can see exactly which venues backed a number.

GET/v7/{sport}/lines
ParamTypeRequiredDescription
sportpathYesSport slug.
marketstring—Single market filter, e.g. match_winner.
viewstring—consensus or moneyline.
include_startedbool—Keep matches already underway. Default false.
formatstring—slim (default) or full.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/lines"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "market": null,
  "total_events": 83,
  "books": {
    "thunderpick": {
      "present": true,
      "age_seconds": 16.264,
      "prop_count": 3403
    },
    "pinnacle": {
      "present": true,
      "age_seconds": 5.264,
      "prop_count": 38
    },
    "bet365": {
      "present": false,
      "age_seconds": null,
      "prop_count": 0
    }
  },
  "computed_at": "2026-10-05T19:58:02.401Z"
}

/v7/{sport}/parlaysHobby

Two modes on one route. Pass ticket to price a specific multi-leg slip; omit it to discover ranked parlays. Every leg must price on the one book you name. Legs are independent main lines only — there is no same-game correlation modelling. Fair price and EV exclude the leg book itself (fair_excludes_leg_book), so a book is never used to grade its own number.

Discover returns non-negative-EV parlays by default. An empty result with reason: no_parlays means the board loaded and nothing cleared the bar — add include=all to see negative-EV tickets too.

GET/v7/{sport}/parlays
ParamTypeRequiredDescription
sportpathYesSport slug.
bookstringYesOne line book. All legs must price here.
ticketstring—Price mode: comma-separated kr_match_id:market:selection. Omit to discover.
marketstring—Main market filter. Default match_winner.
sizeint—Discover only: legs per parlay, 2 or 3.
includestring—Discover only: all keeps negative-EV parlays.
include_startedbool—Default false.
limitint—1–100, default 25.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/parlays?book=thunderpick&size=2"
200 · live (trimmed)
{
  "available": true,
  "mode": "discover",
  "book": "thunderpick",
  "market": "match_winner",
  "size": 2,
  "total": 14,
  "parlays": [
    {
      "legs": [
        {
          "kr_match_id": "kr_cs2_fnatic-vs-phantom-07-10-2026",
          "market": "match_winner",
          "selection": "kr_tm_d60a39d59027",
          "name": "Fnatic",
          "decimal": 1.4808,
          "american": -208,
          "fair_probability": 0.628141,
          "ev_pct": -6.98,
          "placeable": true,
          "placeable_basis": "book_price",
          "fair_books": [
            "1xbet",
            "betonline",
            "betway",
            "dexsport"
          ],
          "fair_excludes_leg_book": true
        }
      ],
      "decimal": 2.192769,
      "american": 119,
      "fair_probability": 0.3972571,
      "ev_pct": -12.89,
      "price_source": "computed"
    }
  ]
}

/v7/{sport}/flowHobby

Market-movement plays: where a price moved, how far, and which venue led. Each play carries the thresholds it had to clear, so a play is auditable rather than a bare signal.

GET/v7/{sport}/flow
ParamTypeRequiredDescription
sportpathYesSport slug.
kindstring—all (default), volume, shift, steam, or whale.
marketstring—Market filter.
limitint—1–100, default 25.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/flow?kind=steam"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "kind": "all",
  "total": 5,
  "plays": [
    {
      "play_id": "kr_flow_048788019ee10016",
      "kind": "steam",
      "kr_match_id": "kr_cs2_aurora-gaming-vs-betboom-team-05-10-2026",
      "market": "Map 3 Winner",
      "selection": "Aurora Gaming",
      "best_american": -1000,
      "best_decimal": 1.1,
      "best_source": "betway",
      "steam_american_delta": 1000
    }
  ]
}

/v7/{sport}/liveSandbox

Matches in progress now. sport=all returns every title in one call. include attaches the boxscore, event feed, current frame, or odds without a second request.

GET/v7/{sport}/live
ParamTypeRequiredDescription
sportpathYesSport slug, or all.
gamestring—One kr_match_id.
includestring—boxscore, events, frame, odds, odds_history.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/live?include=boxscore"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "total": 2,
  "games": [
    {
      "game_id": "kr_cs2_playing-ducks-vs-team-leisure-05-10-2026",
      "kr_match_id": "kr_cs2_playing-ducks-vs-team-leisure-05-10-2026",
      "league": "DACH CS Masters Season 6",
      "blue_code": "Team LEISURE",
      "red_code": "Playing Ducks",
      "blue_team_id": "kr_tm_400e5432efcf",
      "live_state": "in_map"
    }
  ]
}

A WebSocket mirror lives at /v7/live/ws, authenticated with an api_key query parameter.

/v7/{sport}/playersSandbox

Player directory and research. sort=rank ranks by the market you name; include attaches gamelogs, stats or media.

GET/v7/{sport}/players
ParamTypeRequiredDescription
sportpathYesSport slug.
qstring—Nickname search.
idstring—kr_pl_* id.
sortstring—rank.
marketstring—Ranking market. Default kills_maps_1_2.
includestring—research, gamelogs, stats, stats_full, history, media.
limitint—1–500, default 50.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/players?q=flamie"
200 · live (trimmed)
{
  "sport": "cs2",
  "returned": 1,
  "players": [
    {
      "player_id": "kr_pl_7521b1a502ac",
      "nickname": "flamie",
      "slug": "flamie",
      "first_name": "Egor",
      "last_name": "Vasilyev",
      "country": "Russian Federation"
    }
  ]
}

/v7/{sport}/teamsHobby

Team directory keyed by kr_tm_*. Pass team1 and team2 for a head-to-head.

GET/v7/{sport}/teams
ParamTypeRequiredDescription
sportpathYesSport slug.
idstring—kr_tm_* id.
qstring—Name search.
team1 / team2string—Head-to-head pair.
includestring—form, roster, maps, h2h, main_lines, upcoming.
limitint—1–500, default 50.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/teams?q=vitality&include=form"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "total": 8424,
  "teams": [
    {
      "canonical_team_id": "kr_tm_b349f7d0bab9",
      "name": "mens",
      "slug": "mens",
      "rank": null
    }
  ]
}

/v7/{sport}/resultsSandbox

Settled grades already stored — hit, miss, push, pending or error — with the actual value and the settlement rules version that produced it, so a grade can be reproduced later.

GET/v7/{sport}/results
ParamTypeRequiredDescription
sportpathYesSport slug.
gradestring—hit, miss, push, pending, error.
from / tostring—YYYY-MM-DD, inclusive.
limitint—1–500, default 50.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/results?grade=hit&limit=1"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "total": 720,
  "results": [
    {
      "propId": "kr_prop_2b32349b48ff",
      "player_name": "Gothic",
      "stat_type": "CS2_MAP_HANDICAP",
      "line": 1.5,
      "direction": "home",
      "grade": "hit",
      "actual_value": 2,
      "graded_at": "2026-10-05T19:36:21.835386+00:00",
      "settlement_rules_version": "pinnacle_cs2_map_stats_v1"
    }
  ]
}

/v7/{sport}/historyBuilder

Stored movement tapes. kind=contractis a single prop's tape (props is an alias); kind=lines is the team-line tape for a match. One of prop or match is required — calling it bare returns 400 with prop_or_match_required.

GET/v7/{sport}/history
ParamTypeRequiredDescription
sportpathYesSport slug.
kindstring—contract (default) or lines.
propstring—kr_prop_* id. Required for kind=contract.
matchstring—kr_match_id. Required for kind=lines.
bookstring—Restrict the tape to one book.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/history?kind=contract&prop=kr_prop_2b32349b48ff"

/v7/{sport}/breakdownBuilder

One fact bundle for a match, a team, or a head-to-head pair: odds, recent form, map record, starter props and targets, assembled from KashRock caches and vault only. Pass exactly one of match, team, or team1 + team2 — a bare call returns 400 with one_mode_required.

GET/v7/{sport}/breakdown
ParamTypeRequiredDescription
sportpathYesSport slug.
matchstring—kr_match_id.
teamstring—kr_tm_* id or slug.
team1 / team2string—Head-to-head pair.
limitint—1–100, default 50.
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/breakdown?match=kr_cs2_aurora-gaming-vs-betboom-team-05-10-2026"

Published pages

Two keyless routes behind the public breakdown pages. /breakdown/index lists what is published, for sitemaps and hubs; /breakdown/published/{kind}/{slug}returns one page's payload. kind is h2h, team, match, player or tournament; an unknown kind is a 400 and an unpublished slug is available: false with page_not_published.

GET/v7/{sport}/breakdown/index
GET/v7/{sport}/breakdown/published/{kind}/{slug}
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/breakdown/index?kind=match"
200 · live (trimmed)
{
  "available": true,
  "sport": "cs2",
  "returned": 19,
  "pages": [
    {
      "sport": "cs2",
      "kind": "match",
      "slug": "9z-team-vs-natus-vincere-05-10-2026"
    }
  ]
}

Which books each endpoint serves

Twenty-three books are live. They split by what they offer, which is why a book that appears on /lines may be absent from /props. Full per-book detail is on the books reference; the live registry is always /v7/meta.

EndpointBooks
/props board=dfsprizepicks, underdog, parlayplay, dabble, betr, boom, pick6, sleeper
/lines, /parlays, /flow1xbet, bet365, betonline, betrivers, betway, bovada, cloudbet, courtside, dexsport, ggbet, kalshi, picklebet, pinnacle, polymarket, prizepicks, sleeper, thunderpick, underdog
/props board=mainLine books that list named-player props.

PrizePicks, Underdog and Sleeper appear in both sets: they serve player props on /props and publish team mainlines onto /lines. Kalshi and Polymarket are prediction markets and carry team markets only. A book listed in /v7/meta but showing present: false on a board simply has nothing posted for that sport right now.

Identifiers

Every V7 route speaks KashRock ids: kr_match_id for matches, kr_pl_* for players, kr_tm_* for teams, and kr_prop_* for props. They are stable across books and sports, so an id you store today still resolves after a rename or a merge. See the ID system.