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.
| Param | Type | Required | Description |
|---|---|---|---|
| available | bool | — | false means the board could not be served. reason says why — never a silent empty 200. |
| reason | string | — | Why a response is empty: stale, no_parlays, page_not_published, board_not_published, and similar. |
| fetched_at | string | — | When the served board was built. Present on every response. |
| fields | string | — | Comma-separated allow-list of top-level keys. available and fetched_at are always kept. |
| limit / offset | int | — | Page size and start. Caps differ per route (see each below). |
| cursor | string | — | Opaque offset. Takes precedence over offset. A non-integer cursor returns 400 bad_cursor. |
| format | string | — | 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.
| Param | Type | Required | Description |
|---|---|---|---|
| include | string | — | Adds coverage, teams, tournaments, or changelog. |
| fields | string | — | Trim the response to named keys. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/meta"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug, or all. |
| status | string | — | upcoming, live, finished. |
| date | string | — | YYYY-MM-DD. |
| q / team | string | — | Free-text or team filter. |
| ids | string | — | Comma-separated kr_match_id list. |
| include | string | — | boxscore, prep, veto, maps, player_board, lines, streams, h2h. |
| limit | int | — | 1–500, default 50. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/matches?status=upcoming&limit=1"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| board | string | — | dfs (default), main, or all. |
| view | string | — | groups (default), rows, or both. |
| market | string | — | Market slug from /v7/meta. |
| player | string | — | kr_pl_* or nickname. |
| book | string | — | One book key. |
| format | string | — | slim (default) or full. |
| limit | int | — | 1–500. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/lol/props?view=rows&limit=1"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| market | string | — | Single market filter, e.g. match_winner. |
| view | string | — | consensus or moneyline. |
| include_started | bool | — | Keep matches already underway. Default false. |
| format | string | — | slim (default) or full. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/lines"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| book | string | Yes | One line book. All legs must price here. |
| ticket | string | — | Price mode: comma-separated kr_match_id:market:selection. Omit to discover. |
| market | string | — | Main market filter. Default match_winner. |
| size | int | — | Discover only: legs per parlay, 2 or 3. |
| include | string | — | Discover only: all keeps negative-EV parlays. |
| include_started | bool | — | Default false. |
| limit | int | — | 1–100, default 25. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/parlays?book=thunderpick&size=2"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| kind | string | — | all (default), volume, shift, steam, or whale. |
| market | string | — | Market filter. |
| limit | int | — | 1–100, default 25. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/flow?kind=steam"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug, or all. |
| game | string | — | One kr_match_id. |
| include | string | — | boxscore, events, frame, odds, odds_history. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/live?include=boxscore"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| q | string | — | Nickname search. |
| id | string | — | kr_pl_* id. |
| sort | string | — | rank. |
| market | string | — | Ranking market. Default kills_maps_1_2. |
| include | string | — | research, gamelogs, stats, stats_full, history, media. |
| limit | int | — | 1–500, default 50. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/players?q=flamie"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| id | string | — | kr_tm_* id. |
| q | string | — | Name search. |
| team1 / team2 | string | — | Head-to-head pair. |
| include | string | — | form, roster, maps, h2h, main_lines, upcoming. |
| limit | int | — | 1–500, default 50. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/teams?q=vitality&include=form"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| grade | string | — | hit, miss, push, pending, error. |
| from / to | string | — | YYYY-MM-DD, inclusive. |
| limit | int | — | 1–500, default 50. |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/results?grade=hit&limit=1"
{
"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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| kind | string | — | contract (default) or lines. |
| prop | string | — | kr_prop_* id. Required for kind=contract. |
| match | string | — | kr_match_id. Required for kind=lines. |
| book | string | — | Restrict the tape to one book. |
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.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | Sport slug. |
| match | string | — | kr_match_id. |
| team | string | — | kr_tm_* id or slug. |
| team1 / team2 | string | — | Head-to-head pair. |
| limit | int | — | 1–100, default 50. |
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.
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/breakdown/index?kind=match"
{
"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.
| Endpoint | Books |
|---|---|
| /props board=dfs | prizepicks, underdog, parlayplay, dabble, betr, boom, pick6, sleeper |
| /lines, /parlays, /flow | 1xbet, bet365, betonline, betrivers, betway, bovada, cloudbet, courtside, dexsport, ggbet, kalshi, picklebet, pinnacle, polymarket, prizepicks, sleeper, thunderpick, underdog |
| /props board=main | Line 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.