CS2 prop grader.
Every posted line, resolved against the final map.

What is a CS2 prop grader?

A CS2 prop grader takes each prop line a book posts — kills, headshots, or map totals — and resolves it hit, miss, or push against the finalized match record. KashRock grades every CS2 line it lists across PrizePicks, Underdog and the sportsbooks, and keeps each line's opening and closing price so the CLV is on the row. Results are served at GET /v6/esports/cs2/results; a free Sandbox key sees the last 30 days.

You needEndpointWhat comes back
Settled prop gradesGET /v6/esports/cs2/resultshit/miss/push rows with actual_value and open/close tape
Today's board to bind a propIdGET /v6/esports/cs2/propsLive lines across books with kr_prop_* ids
The stats a grade resolved fromGET /v6/esports/cs2/players/{slug}/gamelogsFinalized per-map player stats
The tape behind open/closeGET /v6/esports/history/contractEvery line and odds tick for one offer

Updated

You took over 17.5 headshots and the player put up 16. Was the read wrong, or did the line beat you before the match started? A prop grader answers with the finalized number — hit, miss, or push — and keeps the opening and closing price so you can see whether you were on the right side of the move.

Why grading CS2 props is harder than it looks

Grading a CS2 prop sounds simple until the line is map-scoped. A kills over on maps 1–2 is not the same bet as the same number on map 1, and the book board that posted the line is gone by the time the series ends. Three things break hand-rolled graders: scope — grading a maps 1–2 line from series totals; line drift — the 18.5 you took closed at 17.5, and only the quote tape knows which line you actually held; and identity — the player who renamed between the board and the boxscore.

What a real grader has to prove

A grade is only as good as the evidence under it. The grader has to prove which player, which maps, and which line it resolved — then keep the tape that shows where the number opened and closed. Anything less is a vibe check, not a result.

Practical rule: never grade from screenshots or the final score alone. Grade from the finalized map record, and store the evidence beside the grade.

What a graded result row is

A graded result row joins three things: the offer the book posted, the exact line that settled, and the finalized stat it resolved against. KashRock keeps all three on one row — plus the open/close tape — so a grade can be re-checked instead of trusted.

The grade field

grade is hit, miss, push, pending, or error. Hit and miss mean the finalized map record contained the stat and the line resolved. Push is the stat landing exactly on the threshold. Pending means the match has not finalized; error means the evidence was not there — never an invented grade.

One prop, many lines

A book offers a ladder — 16.5, 17.5, 18.5 headshots — as one prop. The propId stays put while lines move, and each line carries its own line_prop_id graded on its own. That is how over 17.5 can be a miss while over 16.5 on the same prop is a hit.

Grader endpoints

The grader is one route: /v6/esports/cs2/results. Everything around it exists to make the grade checkable — the live board to bind a propId before the match, gamelogs for the finalized numbers, and the contract tape for the open/close behind every grade.

The same rows are on /v7/cs2/results and the get_results / v7_results MCP tools, so an agent can pull settled grades with a date window instead of an HTTP call.

EndpointPurposeKey filters
GET /v6/esports/cs2/resultsSettled prop and line-odds gradesgrade, from, to, book, stat_type, limit, offset
GET /v6/esports/cs2/propsLive board — bind propId at placementbook, market, market_contains
GET /v6/esports/cs2/players/{slug}/gamelogsFinalized per-map stats a grade resolved fromlimit
GET /v6/esports/history/contractQuote tape behind open/close on a gradeprop_id, book, market_key
GET /v6/esports/cs2/matches/{slug}/boxscoreSeries and map record for manual checks—

IDs that keep a grade honest

Grades survive renames because they join on canonical IDs, not display strings. A player who changes their handle keeps one canonical_player_id, and the match keeps one canonical_event_id even when two books spell the teams differently.

  • —propId — the book's offer; stable while the line moves
  • —line_prop_id — the exact line that was graded
  • —offer_id — prop + side + book; the ticket-level key
  • —kr_pl_* / kr_ev_* — player and event joins that survive renames
Practical rule: bind the propId and direction at placement time. If you record only a player name and a number, you cannot prove which offer you held.

A real graded CS2 prop

This is a real settled grade from the live feed — HeavyGod over 17.5 headshots on maps 1–2, graded a miss on 16. The line opened 18.5 and closed 17.5, so the CLV is on the row, not reconstructed later.

FieldExampleUsed for
results[].propIdkr_prop_569251f0d61cThe book offer you bound at placement
results[].line_prop_idkr_prop_b5b7b9755a8cThe exact line that was graded
results[].stat_typeCS2_HEADSHOTS_MAPS_1_2Sport-prefixed, map-scoped market
results[].line / direction17.5 / overThreshold and side the grade resolved
results[].grademisshit | miss | push | pending | error
results[].actual_value16.0Finalized stat the line graded against
results[].opening_line → closing_line18.5 → 17.5CLV straight off the quote tape
results[].canonical_player_idkr_pl_e15bf1b3cd64Player join that survives renames
GET /v6/esports/cs2/results?book=underdog
{
  "source": "kashrock",
  "sport": "cs2",
  "total": 19439,
  "results": [
    {
      "propId": "kr_prop_569251f0d61c",
      "line_prop_id": "kr_prop_b5b7b9755a8c",
      "book_name": "underdog",
      "player_name": "HeavyGod",
      "canonical_player_id": "kr_pl_e15bf1b3cd64",
      "stat_type": "CS2_HEADSHOTS_MAPS_1_2",
      "line": 17.5,
      "direction": "over",
      "grade": "miss",
      "actual_value": 16,
      "team": "G2 Esports",
      "opponent": "ShindeN",
      "event_time": "2026-10-05T09:00:00+00:00",
      "graded_at": "2026-10-06T18:54:01.935701+00:00",
      "canonical_event_id": "kr_ev_bededa5f4687",
      "offer_id": "kr_prop_569251f0d61c_2_over",
      "opening_line": 18.5,
      "opening_odds": -112,
      "closing_line": 17.5,
      "closing_odds": -112
    }
  ]
}

Ways to grade CS2 props

Most graders stop at the scoreboard. The difference below is whether the book's line — the thing the bet was actually against — survives to settlement with its price history intact.

SourceSchemaBest use
Book app / screenshotsToday's board onlyBets you remember placing
Stat trackers (HLTV)Final scores, no book linesChecking one result by hand
Single-book exportsOne venue, one shapePersonal bet logs
KashRock resultsNormalized rows + open/close tapeGrading every posted line at scale

How KashRock grades a prop

Each posted line waits for the finalized map record, then resolves: the actual stat lands in actual_value, the grade follows, and the quote tape fills opening_* / closing_* where it exists.

  • —Hit / miss — the canonical map record contained the stat and the line resolved.
  • —Push — the stat landed exactly on the threshold.
  • —Pending / error — not finalized, or no evidence; never an invented grade.

Running a grader in production

  • —Bind propId + direction at placement; grades arrive on their own after settlement.
  • —Page older grades with from/to on graded_at — Sandbox 30d, Hobby 90d, Builder+ vault.
  • —Use line_prop_id when the same prop carried a ladder of lines.
  • —Filter book, stat_type, or grade=hit|miss|push to build hit-rate views.

Quick reference

Keep this open: GET /v6/esports/cs2/results returns hit/miss/push with actual_value and open/close tape; grade is never invented — pending and error are explicit. Full contract: results endpoint docs.

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.

Frequently asked questions

What is a CS2 prop grader?

A tool that takes each prop line a book posts — kills, headshots, map totals — and resolves it hit, miss, or push against the finalized match record. KashRock grades every CS2 line it lists and serves the results at GET /v6/esports/cs2/results.

Which CS2 props get graded?

Player stat lines like kills and headshots across map scopes, plus team markets — moneyline, map handicap, total maps — across PrizePicks, Underdog, and the listed sportsbooks.

How far back does CS2 prop grading go?

Sandbox keys see the last 30 days of grades, Hobby the last 90, and Builder and above the full vault. Every plan reads the same row shape.

Can I see whether a line moved before it settled?

Yes. Rows carry opening_line, opening_odds, closing_line and closing_odds when the quote tape has them — that is the CLV on the bet, not an estimate.

Is the CS2 prop grader available as an API?

Yes — REST at GET /v6/esports/cs2/results, the official SDK, and the get_results / v7_results MCP tools. A free Sandbox key covers CS2 with 500 requests a day.