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
Requires the Quant plan.
| Param | Type | Required | Description |
|---|---|---|---|
| sport | path | Yes | cs2, valorant, lol, dota2, cod, r6, mlbb, deadlock |
| market | query | — | Registry market key (match_winner, map_winner, total_maps, map_handicap, ...). |
| match | query | — | kr_match_id or slug: one match only. |
| min_margin | query | — | Minimum margin_pct to return. Default 0. |
| stake | query | — | Total stake; scales each leg stake and adds profit. |
| include_started | query | — | true admits markets on matches already started. |
| limit, offset, fields | query | — | 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.
curl -H "X-API-Key: YOUR_API_KEY" \ "https://kashrock.up.railway.app/v7/cs2/arb?min_margin=1&stake=100"
{
"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.
