Get a key

Lines

Cross-venue consensus for match/map mainlines. Thunderpick sportsbook + Kalshi + Polymarket prediction markets. De-vig, weighted fair probability, and gated edges.

GET/v6/esports/{sport}/lines

Auth: X-API-Key. Base https://kashrock.up.railway.app. Requires Hobby plan (Sandbox is blocked).

ParamTypeRequiredDescription
sportpathYescs2, valorant, lol, dota2
event_idstringOptional. Canonical event id or matchup key. Omit = all upcoming.
marketstringmatch_winner | map_winner | total_maps | map_handicap. Omit = all (top-level market stays null).
pm_weightfloatPrediction-market weight vs sportsbook (default 1.5)
cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v6/esports/cs2/lines?market=match_winner"
200 · consensus
{
  "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

FieldMeaning
market (top-level)Echo of ?market=. null when you omit the filter (all markets returned).
mapMap number for map_winner only. null on match_winner / totals / handicap.
lineSet for total_maps and map_handicap. null on match_winner / map_winner.
consensus_probabilityDe-vigged, venue-weighted fair probability for the outcome.
best_priceBest payout on the outcome: decimal, implied prob, edge_pct.
edge_pctEV 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.
qualityGate flags: source_count, max_disagreement, unreliable, low_confidence, suspect_edge, surfaced.
top_edgesOnly 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 key
  • 403 — plan below Hobby (Sandbox)
  • 400 — invalid market

Related: Props · Markets · Route index · Consensus product page