Lines
Cross-venue consensus for match/map mainlines. Thunderpick sportsbook + Kalshi + Polymarket prediction markets. De-vig, weighted fair probability, and gated edges.
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 |
| event_id | string | — | Optional. Canonical event id or matchup key. Omit = all upcoming. |
| market | string | — | match_winner | map_winner | total_maps | map_handicap. Omit = all (top-level market stays null). |
| pm_weight | float | — | Prediction-market weight vs sportsbook (default 1.5) |
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. |
| edge_pct | EV vs consensus: consensus × decimal − 1. Positive = value (informational). |
| sources[] | Per-venue price. Thunderpick volume/liquidity are null (sportsbook). Kalshi uses volume/OI. Polymarket uses volume/liquidity. |
| 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. Thunderpick 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
Related: Props · Markets · Route index · Consensus product page