Lines
Cross-venue consensus for match/map mainlines across sportsbooks (Bovada, Thunderpick, Cloudbet, BetRivers, Pinnacle, Courtside, Betway, Dexsport, Picklebet, 1xBet, BetOnline, Bet365, BetWhale), DFS Teams (PrizePicks / Underdog / Sleeper), and Kalshi + Polymarket prediction markets. De-vig, weighted fair probability, and gated edges. Upcoming events only by default.
Auth: X-API-Key. Base https://kashrock.up.railway.app. Requires Hobby plan (Sandbox is blocked).
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | cs2, valorant, lol, dota2, cod, r6, mlbb, deadlock |
| event_id | string | — | Optional. Canonical event id or matchup key. Omit = all upcoming. |
| market | string | — | match_winner | map_winner | total_maps | map_handicap | correct_score | outright | objective | round_winner. Omit = all (top-level market stays null). correct_score returns every listed final score with each book’s own price and the best price, with no consensus. outright returns tournament futures tables (Winner, To Reach Final and similar) — every listed pick with each book’s own price, no consensus. objective is which team takes the xth map objective (baron, dragon, tower…) — the line is the ordinal. round_winner is an in-play single-round winner — the line is the round index. |
| pm_weight | float | — | Prediction-market weight vs sportsbook (default 1.5) |
| live_only | bool | — | true (default) = upcoming only; false = include started/past kickoffs still on the tape |
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v6/esports/cs2/lines?market=match_winner"
{
"source": "kashrock",
"sport": "cs2",
"market": null,
"pm_weight": 1.5,
"books": [
"thunderpick",
"kalshi",
"polymarket"
],
"total_events": 1,
"total_top_edges": 1,
"events": [
{
"event_id": "kr_ev_example",
"home_team": "Team Vitality",
"away_team": "Lynn Vision",
"event_time": "2026-09-12T15:00:00Z",
"matchup_key": "lynn vision__team vitality",
"markets": [
{
"market": "match_winner",
"map": null,
"line": null,
"consensus_confidence": 0.91,
"sources_used": [
"thunderpick",
"kalshi",
"polymarket"
],
"outcomes": [
{
"name": "team vitality",
"consensus_probability": 0.62,
"sources": [
{
"source": "thunderpick",
"type": "sportsbook",
"probability": 0.58,
"decimal": 1.65,
"american": -154,
"volume": null,
"open_interest": null,
"liquidity": null
},
{
"source": "kalshi",
"type": "prediction_market",
"probability": 0.63,
"decimal": 1.59,
"american": -170,
"volume": 1200,
"open_interest": 800,
"liquidity": null
},
{
"source": "polymarket",
"type": "prediction_market",
"probability": 0.6,
"decimal": 1.67,
"american": -150,
"volume": 5000,
"open_interest": null,
"liquidity": 2200
}
],
"best_price": {
"source": "thunderpick",
"type": "sportsbook",
"decimal": 1.72,
"probability": 0.58,
"edge_pct": 6.64
}
}
],
"best_edge": {
"source": "thunderpick",
"outcome": "team vitality",
"decimal": 1.72,
"edge_pct": 6.64,
"adjusted_edge_pct": 5.2,
"liquidity_score": 0.9
},
"quality": {
"source_count": 3,
"max_disagreement": 0.05,
"unreliable": false,
"low_confidence": false,
"suspect_edge": false,
"surfaced": true
},
"entity_match": "ok"
}
],
"best_edge": {
"market": "match_winner",
"map": null,
"line": null,
"outcome": "team vitality",
"source": "thunderpick",
"edge_pct": 6.64,
"surfaced": true
}
}
],
"top_edges": [
{
"event_id": "kr_ev_example",
"home_team": "Team Vitality",
"away_team": "Lynn Vision",
"market": "match_winner",
"outcome": "team vitality",
"source": "thunderpick",
"edge_pct": 6.64,
"adjusted_edge_pct": 5.2,
"sources_used": [
"thunderpick",
"kalshi",
"polymarket"
]
}
]
}Field reference
| Field | Meaning |
|---|---|
| market (top-level) | Echo of ?market=. null when you omit the filter (all markets returned). |
| map | Map number for map_winner only. null on match_winner / totals / handicap. |
| line | Set for total_maps and map_handicap. null on match_winner / map_winner. |
| consensus_probability | De-vigged, venue-weighted fair probability for the outcome. |
| best_price | Best payout on the outcome: decimal, implied prob, edge_pct, and links.bet when the winning source has a URL. |
| edge_pct | EV vs consensus: consensus × decimal − 1. Positive = value (informational). |
| sources[] | Per-venue price. Includes links.bet when the underlying prop has a bet/market/event URL (sportsbooks, DFS Teams, prediction markets). |
| deeplink | On each sources[] entry and on best_price: a URL that opens that book to bet, or null. |
| deeplink_level | selection, player, match, or board (best first). Pinnacle, Bovada, Polymarket, Picklebet, Betway, Dexsport, and BetOnline link to the match. Thunderpick, Kalshi, 1xBet, Bet365, and DFS Teams link to the board. null when unavailable. |
| quality | Gate flags: source_count, max_disagreement, unreliable, low_confidence, suspect_edge, surfaced. |
| top_edges | Only markets that clear every quality gate. Thin or disagreeing markets stay in events only. |
How consensus works
Prediction markets are read as probabilities. Sportsbook and DFS Teams American odds are converted to implied probability, then each source is de-vigged so outcomes sum to 1.0. Consensus is a weighted mean (prediction markets default weight 1.5). Edge is informational EV vs that fair number — not betting advice.
Hard quality gates before a pick is surfaced in top_edges: Kalshi/Polymarket liquidity floors, at least 3 sources, max source disagreement of 12 points, and raw edge capped at 8%. Ranking uses confidence × liquidity × edge. Thin or disagreeing markets stay in events with quality flags but are excluded from the top feed.
Markets: match winner, map winner, total maps, map handicap. Kalshi has no map handicap on the live board — that source is omitted for handicap only. total_maps requires same matchup + same line across venues.
Errors
401— missing / invalid API key403— plan below Hobby (Sandbox)400— invalidmarket
Closing prints after a match leaves this board: History tape · closing mainlines (GET …/matches/{slug}/lines/history, Builder+).
Related: Props · Markets · Route index · Consensus product page