Arbitrage

Every two-outcome market on the lines board where the best price on each side sums to under 100% implied probability. Buy both sides across two venues and the payout covers the stake either way. Legs must sit at different operators: two keys under one book (for example Polymarket and Polymarket US) are the same counterparty and never count as an arb. MCP: v7_arb.

Cross-book arbs

GET/v7/{'{sport}'}/arb

Requires the Quant plan.

ParamTypeRequiredDescription
sportpathYescs2, valorant, lol, dota2, cod, r6, mlbb, deadlock
marketquery—Registry market key (match_winner, map_winner, total_maps, map_handicap, ...).
matchquery—kr_match_id or slug: one match only.
min_marginquery—Minimum margin_pct to return. Default 0.
stakequery—Total stake; scales each leg stake and adds profit.
include_startedquery—true admits markets on matches already started.
limit, offset, fieldsquery—Standard pagination and field narrowing.

Each arb carries overround (the implied sum), margin_pct (100 minus that sum), and two legs naming the best-priced book per side with its offer_id and deeplink. stake_share is the fraction of total stake for that leg; legs split so both sides return the same amount. kind is cross_book or same_book. The booksblock shows each book's freshness, a stale book's price is the classic phantom arb. Prediction-market legs carry the raw ask and exchange fees are not modeled. Same-line two-way markets only: totals and handicaps never mix lines.

cURLGET
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://kashrock.up.railway.app/v7/cs2/arb?min_margin=1&stake=100"
200
{
  "available": true,
  "sport": "cs2",
  "market": null,
  "fetched_at": "2026-10-18T07:58:12Z",
  "total": 1,
  "has_more": false,
  "arbs": [
    {
      "event_id": "kr_ev_9c1f2e",
      "matchup_key": "elite-klan-vs-passion-academy",
      "home_team": "Elite Klan",
      "away_team": "Passion Academy",
      "event_time": "2026-10-18T08:00:00Z",
      "kr_match_id": "kr_cs2_elite-klan-vs-passion-academy-18-10-2026",
      "slug": "elite-klan-vs-passion-academy-18-10-2026",
      "market": "match_winner",
      "map": null,
      "line": null,
      "overround": 0.9307,
      "margin_pct": 6.9286,
      "kind": "cross_book",
      "legs": [
        {
          "outcome": "Elite Klan",
          "team_id": "kr_tm_fac53dcc91e5",
          "source": "thunderpick",
          "type": "sportsbook",
          "decimal": 2.1,
          "american": "+110",
          "offer_id": "kr_of_8aa2c1",
          "deeplink": "https://thunderpick.io/esports/cs2",
          "deeplink_level": "event",
          "stake_share": 0.5117
        },
        {
          "outcome": "Passion Academy",
          "team_id": "kr_tm_d35cf9999a5f",
          "source": "polymarket",
          "type": "prediction_market",
          "decimal": 2.2,
          "american": "+120",
          "offer_id": "kr_of_5be91d",
          "deeplink": "https://polymarket.com/event/cs2-elite-klan-passion",
          "deeplink_level": "market",
          "liquidity": 412.5,
          "stake_share": 0.4883
        }
      ]
    }
  ],
  "books": {
    "thunderpick": {
      "fresh": true,
      "age_s": 4.2
    },
    "polymarket": {
      "fresh": true,
      "age_s": 6.1
    }
  }
}

An empty scan on a healthy board answers available: true with an empty list. A missing board answers lines_not_cached, a lagging one stale.