Historical esports data.
Without the scrape tax.
What does the historical esports data API return?
The historical esports data API returns closing lines, the quote tape for a contract, player map game logs and settled results, all on KashRock IDs. A match's closing lines come from GET /v6/esports/{sport}/matches/{slug}/lines/history on Builder and above, with an open and a close for each book and the time each was observed. Free Sandbox keys include 30 days of match history.
| You need | Endpoint | What comes back |
|---|---|---|
| Closing lines for a match | GET /v6/esports/{sport}/matches/{slug}/lines/history | Opening and closing winner, totals and spreads per book |
| The quote tape for a contract | GET /v6/esports/history/contract | Line, price and status over time for one market |
| A player's map history | GET /v6/esports/{sport}/players/{slug}/gamelogs | Vault-backed map rows to score a prop against |
| Settled results | The results feed | Props and lines graded against what happened |
Updated
Why historical esports data is hard to find
If you searched for historical PrizePicks lines, CS2 kill tapes, or LoL prop backtests, you already know the gap. The pain is not "more scrapers." It is missing a vault that remembers what was offered and how it settled.
- —Books do not sell you a history API — PrizePicks, Underdog, and the rest show today's board. Yesterday's line is gone from the app. Scrapers that worked last month break when the payload or CDN changes.
- —Stats sites are not book-native — HLTV, VLR, and DatDota tell you what happened on the map. They do not tell you what line the DFS app posted at 2pm — so hit-rate models invent joins that never match production props.
- —IDs drift across every source — One player, five spellings. One market, six stat strings. Without stable prop and player IDs, historical joins silently miss rows and your backtest looks better than live.
How KashRock solves it
Workers ingest live boards and match stats continuously. History endpoints read what was stored — so your backtest uses the same contract IDs as production.
- —Quote tape per contract — GET /v6/esports/history/contract returns the vault tape for a market_key or prop_id+book — line, price, status — without live fan-out on the request.
- —Closing mainlines by match — GET /v6/esports/{sport}/matches/{slug}/lines/history returns opening and closing match winner, totals, and spreads. Builder+. MCP get_lines_history.
- —Player map gamelogs — GET /v6/esports/{sport}/players/{slug}/gamelogs pulls vault-backed map rows so you can score a prop against what the player actually posted.
- —Settled results — The results feed grades props and line odds (moneyline, spread, total) against outcomes so you can measure hit / miss / push on the same IDs you used for the live board.
Start with one contract
Pull the vault tape for a market you already saw on the live board:
curl -H "X-API-Key: YOUR_KEY" \
"https://kashrock.up.railway.app/v6/esports/history/contract?market_key=kr_mk_…"
curl -H "X-API-Key: YOUR_KEY" \
"https://kashrock.up.railway.app/v6/esports/cs2/matches/{slug}/lines/history"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.