Esports line gap checker.
Same prop. Different DFS lines.
Why book-vs-book gaps matter
DFS apps do not publish the same number for the same player. A five-kill gap on maps 1–2 is a shopping problem, not a model problem — you need every book's line on one row before tip-off.
Practical rule: gaps are book-vs-book spreads, not model edges. line_gap = line_max − line_min.
What a gap row is
Each gap row is one player, one event, one market, with every DFS book that posted a line. Softest line is line_min, hardest is line_max, and the spread is line_gap.
Checker endpoint
Call GET /v7/{sport}/props?view=gaps or the get_gaps MCP tool. Hobby and above.
| Endpoint | Purpose | Key filters |
|---|---|---|
| GET /v7/{sport}/props?view=gaps | DFS book-vs-book line spreads (Hobby+) | min_gap, player, market, book, limit |
| GET /v7/{sport}/props | Full live board per book | book=prizepicks|underdog|… |
| MCP get_gaps | Same surface from Cursor or Claude | Hobby+ |
Identity and join keys
- —player_id — kr_pl_* so renames do not break the join
- —stat_type — map scope is part of the key
- —propId per book — bind the offer you actually take
A live CS2 gap
Live CS2 board: Mercury maps 1–2 kills — Betr 20.5 through Underdog 25.5, a 5.0 gap across five DFS books.
| Field | Example | Used for |
|---|---|---|
| line_gap | 5.0 | line_max − line_min across DFS books |
| line_min / line_max | 20.5 / 25.5 | Softest and hardest posted lines |
| books[] | betr…underdog | One entry per book, sorted by line |
| stat_type | CS2_KILLS_MAPS_1_2 | Exact market — map1 ≠ maps 1–2 |
| gap_id | gap_9106dc5a5adb | Stable hash of sport|event|player|stat |
{
"source": "kashrock",
"sport": "cs2",
"min_gap": 0.5,
"total": 154,
"returned": 1,
"gaps": [
{
"gap_id": "gap_9106dc5a5adb",
"player_id": "kr_pl_be615ee3ec83",
"player_name": "Mercury",
"team": "TyLoo",
"opponent": "FUT Esports",
"stat_type": "CS2_KILLS_MAPS_1_2",
"market": "kills",
"line": 24.5,
"line_min": 20.5,
"line_max": 25.5,
"line_gap": 5,
"book_count": 5,
"books": [
{
"book": "betr",
"line": 20.5,
"propId": "kr_prop_3cfad033d531"
},
{
"book": "boom",
"line": 24.5,
"propId": "kr_prop_0e2d140cc478"
},
{
"book": "pick6",
"line": 24.5,
"propId": "kr_prop_ffcb4b236613"
},
{
"book": "prizepicks",
"line": 24.5,
"propId": "kr_prop_195304f116d9"
},
{
"book": "underdog",
"line": 25.5,
"propId": "kr_prop_969ab9d4e34e"
}
]
}
]
}Which books count
PrizePicks, Underdog, Betr, Sleeper, Boom, Pick6, ParlayPlay, and the other DFS venues on the board. Sportsbook moneylines are not this product — use the odds API for those.
| Source | Schema | Best use |
|---|---|---|
| Manual line shopping | Slow, easy to miss a book | One-off checks |
| Single-book scrape | One venue, breaks often | Personal alerts |
| KashRock gaps | Joined rows, same IDs as props | Board-wide shopping at scale |
Using gaps responsibly
A gap is a shopping signal before the match. After settlement, grade the offer you took with the prop grader — do not treat line_gap as a guaranteed edge.
Operational practices
- —Filter min_gap so tiny noise stays out of alerts.
- —Always store propId per book when you take a side.
- —Sandbox learns the schema on CS2; live gaps need Hobby+.
Quick reference
GET /v7/cs2/props?view=gaps returns line_gap rows. Get your free key on Sandbox, then upgrade for live gaps.
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.