Nine DFS books, one board: the esports pick'em market

Updated · Published

Quick answer: KashRock serves esports props from nine DFS pick'em books, PrizePicks, Underdog, Sleeper, Betr, Boom, Pick6, Dabble, ParlayPlay and Chalkboard, normalized onto one schema. Every offer on the same player market joins on the same canonical player, stat type and event, so line shopping across nine books is a filter, not a join.

BookKeyWhat lands on /props
PrizePicksprizepicksPick'em lines on canonical player + event ids
UnderdogunderdogPick'em lines on canonical player + event ids
SleepersleeperPick'em lines on canonical player + event ids
BetrbetrPick'em lines on canonical player + event ids
BoomboomPick'em lines on canonical player + event ids
Pick6pick6Pick'em lines on canonical player + event ids
DabbledabblePick'em lines on canonical player + event ids
ParlayPlayparlayplayPick'em lines on canonical player + event ids
ChalkboardchalkboardPick'em lines, the deepest per-map board on CS2

Nine books, 32 sources, one shape

Chalkboard makes nine DFS pick'em books on the board and 32 sources in total. Every one of them posts its own lines in its own app, and every one of them lands on GET /v7/{sport}/props as the same row: player, stat type, line, direction, price, book.

The normalization is the product. JamYoung on Chalkboard is the same canonical player as JamYoung on PrizePicks, on the same canonical event, so nine apps' worth of boards collapse into one market per player-stat-match. No fuzzy name matching on your side.

What a soft line looks like in the response

These are real rows off the board on 3 November 2026. Same player, same stat, same canonical_event_id: Betr posts the over at 27.5 and 28.5 while Boom hangs 29.0, a kill and a half of disagreement on one market:

GET /v7/cs2/props?view=rows
{
  "source": "kashrock",
  "sport": "cs2",
  "board": "dfs",
  "props": [
    {
      "book_name": "Betr",
      "propId": "kr_prop_8d0caba5639f",
      "player_name": "d1Ledez",
      "stat_type": "CS2_KILLS_MAPS_1_2",
      "line": 27.5,
      "direction": "over",
      "odds": -137,
      "decimal_odds": 1.7299,
      "canonical_event_id": "kr_ev_3032b8e6575d",
      "canonical_event_name": "BetBoom Team vs Aurora Gaming",
      "kr_match_id": "kr_cs2_aurora-gaming-vs-betboom-team-04-11-2026"
    },
    {
      "book_name": "Betr",
      "propId": "kr_prop_156b210eeebf",
      "player_name": "d1Ledez",
      "stat_type": "CS2_KILLS_MAPS_1_2",
      "line": 28.5,
      "direction": "over",
      "canonical_event_id": "kr_ev_3032b8e6575d",
      "kr_match_id": "kr_cs2_aurora-gaming-vs-betboom-team-04-11-2026"
    },
    {
      "book_name": "Boom",
      "propId": "kr_prop_bae5f62e31bc",
      "player_name": "d1Ledez",
      "stat_type": "CS2_KILLS_MAPS_1_2",
      "line": 29,
      "direction": "over",
      "odds": -132,
      "decimal_odds": 1.76,
      "canonical_event_id": "kr_ev_3032b8e6575d",
      "canonical_event_name": "Aurora Gaming vs BetBoom Team",
      "kr_match_id": "kr_cs2_aurora-gaming-vs-betboom-team-04-11-2026"
    }
  ]
}

Notice the books do not even agree on the fixture order: Betr says BetBoom vs Aurora, Boom says Aurora vs BetBoom. The canonical event and the kr_match_id are the same, so the comparison never breaks on ordering. Each propId is the offer id for that book's line; the market is the canonical player, stat type and event they share.

Read one book or the whole board

One book's rows

curl -s -H "X-API-Key: $KASHROCK_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/props?book=chalkboard"

Every book's over on one market

const { props } = await kr.props("cs2", { view: "rows", market: "CS2_KILLS_MAPS_1_2" })
const mine = props.filter((p) => p.player_name === "d1Ledez" && p.direction === "over")
for (const p of mine) console.log(p.book_name, p.line, p.decimal_odds)

DFS rows vs sportsbook rows

Pick'em lines live on the dfs board (the default), priced as over/under picks on a fixed line. Sportsbook player markets, where a book posts them, live on main, and all reads both. The books object on every response reports which venues are present, their row counts and age in seconds, so coverage is something you read, not assume.

The newest of the nine is Chalkboard, the deepest per-map book on CS2 today: the Chalkboard props post covers the book and the CS2 headshot props post maps who posts which headshot market. The DFS esports API page is the board's reference, and a free Sandbox key reads the CS2 board with 1,500 credits a day.

FAQ

Which DFS books does KashRock cover for esports props?

Nine pick'em books: PrizePicks, Underdog, Sleeper, Betr, Boom, Pick6, Dabble, ParlayPlay and Chalkboard, all normalized onto one prop schema with shared canonical player and event ids per market.

What is a propId?

The offer id for one book's line on a market. Rows on the same player market share the canonical player, stat type and event ids, which is the join you filter on to compare books.

How do I compare prop lines across DFS books?

Call GET /v7/{sport}/props and filter on the canonical player, stat type and event. Each book's line, direction and price for that market comes back on the same row shape, so the softest line is one sort away.

Are Chalkboard props included?

Yes. Chalkboard joined the board in November 2026 with CS2 kills and headshots plus LoL kills, assists and deaths, and on the board checked 3 November it was the only DFS book posting map-3 headshot lines.

Which plan do I need for DFS props?

The free Sandbox key reads the CS2 board with 1,500 credits per UTC day. Hobby ($29.99/mo) opens every title.