Esports arbitrage API.
Cross-book arbs with the stake split already done.
Why this surface exists
Esports books disagree more often than traditional sports books. An arb API has to join the same market across venues, compute the stake split, and keep offer_ids so you can place what you scanned — not re-price by hand.
Practical rule: margin_pct is how far under 100% implied the pair sits — not a model edge.
What the record represents
Each arb row is one market on one match: legs[], margin_pct, overround, and confidence. Each leg carries source, decimal/american, stake_share, offer_id, and a deeplink when the book has one.
Core endpoints
Scan with GET /v7/{sport}/arb or MCP v7_arb. Pair with /lines for the consensus board and /uav for the match card when you act.
| Endpoint | Purpose | Key filters |
|---|---|---|
| GET /v7/{sport}/arb | Cross-book arbs on the lines board (Quant+) | market, limit |
| GET /v7/{sport}/signals?kind=arb | Arb alerts in the signals feed (Pro+) | kind=arb |
| GET /v7/{sport}/lines | Consensus board the arbs are built from | Hobby+ |
| MCP v7_arb | Same surface from Cursor or Claude | sport |
Canonical IDs
- —kr_match_id — the fixture both legs share
- —offer_id — the exact book offer on each leg
- —matchup_key — stable home/away join when event ids still diverge
Sample payload
Live CS2 board: mouz vs TYLOO map-1 total rounds 20.5 — BetWhale Over 1.74 and GG.bet Under 3.61, margin about 14.8%, stake split already on the row.
| Field | Example | Used for |
|---|---|---|
| margin_pct | 14.83 | How far under 100% implied the pair sits |
| legs[].source | betwhale / ggbet | Book on each side |
| legs[].stake_share | 0.67 / 0.33 | How to split a unit stake |
| legs[].offer_id | kr_offer_* | Exact offer to bind |
| kr_match_id | kr_cs2_… | Match join for UAV, CLV, results |
| confidence | low|… | Quality flag on the opportunity |
{
"available": true,
"sport": "cs2",
"total": 271,
"arbs": [
{
"kr_match_id": "kr_cs2_mouz-vs-tyloo-02-11-2026",
"market": "total_rounds",
"map": 1,
"line": 20.5,
"margin_pct": 14.8279,
"overround": 0.851721,
"confidence": "low",
"legs": [
{
"source": "betwhale",
"outcome": "Over",
"decimal": 1.74,
"american": -135,
"stake_share": 0.674766,
"offer_id": "kr_offer_8377c7ab415c"
},
{
"source": "ggbet",
"outcome": "Under",
"decimal": 3.61,
"american": 261,
"stake_share": 0.325234,
"offer_id": "kr_offer_a16439d7baee"
}
]
}
]
}Comparing sources
Sportsbooks and prediction venues on the lines board. DFS pick'em apps are a different product — use props and gaps for those.
| Source | Schema | Best use |
|---|---|---|
| Manual two-tab shopping | Slow, easy to miss | One-off checks |
| Single-book scrape | One venue | Personal alerts |
| KashRock /arb | Joined legs + stake split | Board-wide scanning |
How to use it
An arb is a pricing lock, not a prediction. After settlement, grade each leg with /results or track the ticket in /portfolio.
Operational practices
- —Filter confidence and margin_pct so noise stays out of alerts.
- —Always store offer_id per leg when you place.
- —Quant unlocks /arb; start on Sandbox free to learn IDs.
Quick reference
GET /v7/cs2/arb returns cross-book arbs with stake_share and margin_pct. Get your free key.
If you need a normalized feed instead of another UI wrapper, the esports api exposes live boards, schedules, and history on one schema — with the IDs and outcome patterns that keep backtests and grading honest. Start free on Sandbox, or see published pricing.