Asian handicap (AH) is the second-most-traded market in soccer after 1X2 — and the one that most often gets modeled incorrectly when teams build their first sportsbook. The math is straightforward; the data shape is the part that trips people up.
Asian handicap lives under market ID 1011 (per-line AH) in the soccer market dictionary. The full ladder for one match looks like:
{
"s5_p18983062": {
"1011": {
"s-0.5": { "2037": [180, 0, ...], "2038": [200, 0, ...] },
"s-0.25": { "2037": [170, 0, ...], "2038": [212, 0, ...] },
"s0": { "2037": [160, 0, ...], "2038": [225, 0, ...] },
"s+0.25": { "2037": [152, 0, ...], "2038": [240, 0, ...] },
"s+0.5": { "2037": [145, 0, ...], "2038": [255, 0, ...] }
}
}
}
Each "s<line>" key is one row of the ladder. 2037 is "home covers", 2038 is "away covers". The line itself is parsed straight from the key: s+0.5 → +0.5, s-0.25 → -0.25. (Behind the scenes Euro365 fills the outcome's special field from this suffix — see /docs.)
Most sportsbook UIs show one AH price per match in their main grid, then expand to the full ladder on click. The "main line" is the one closest to expected game state — usually the one whose home/away prices are closest to 1.90/1.90.
function pickMainAH(ladder) {
let best = null, bestSpread = Infinity;
for (const [key, outs] of Object.entries(ladder)) {
const h = outs['2037']?.[0] / 100;
const a = outs['2038']?.[0] / 100;
if (!h || !a) continue;
const spread = Math.abs(h - a);
if (spread < bestSpread) { bestSpread = spread; best = { line: key.slice(1), home: h, away: a }; }
}
return best;
}
| Line | Home wins by N | Outcome (bet on home) |
|---|---|---|
| -0.5 | 1 or more | Win |
| -0.5 | 0 (draw) | Lose |
| 0 (draw no bet) | 1+ | Win |
| 0 | 0 | Stake refunded (push) |
| -0.25 (split) | 1+ | Win full |
| -0.25 | 0 | Half lose, half refund |
| +0.25 | any draw | Half win, half refund |
Quarter-line settlement is what most homemade engines get wrong. The clean implementation: treat -0.25 as half the stake on -0 and half on -0.5, then settle each leg independently. Same for +0.25 = half on 0 + half on +0.5.
1011; the simple "Handicap" with no line ladder used to live at 1005 but is now a subset of 1011. Always read the market dictionary at /v1/markets rather than hardcoding IDs.Once you've modeled AH correctly, Over/Under at market 1018 is the same problem with a different outcome label (over/under instead of home/away). The ladder shape, the line parsing, the settlement halves — all identical. Two-for-one.