Score Box — the Saba payout ladders
Score Box Handicap and Score Box Over/Under (catalog markets 590/591, Saba bet types 468/469): one stake buys a whole row of 3–5 buckets — win-score margins or total goals — and the landed bucket settles at its signed multiplier: positive wins that many stakes, negative loses that many, 0.00 pushes. Results beyond the row settle at the edge columns, and the account risk is |most negative rung| × stake — a loss can exceed the stake.
Nova88's example (rules §2.2.23, Liverpool v Chelsea):
| Win Score | 2 | 1 | Draw | −1 | −2 |
|---|---|---|---|---|---|
| Home | 4.13 | 1.40 | 0.00 | −2.01 | −5.92 |
| Away | −5.11 | −1.73 | 0.00 | 1.62 | 4.80 |
$100 on Home: 1-0 pays $140; 2-0 — and any heavier win — pays $413 (the cap); a draw pushes; 0-1 costs $201; 0-2 or worse, $592.
On the wire
| field | meaning |
|---|---|
hdp1 | top column — highest win-score (468) / highest total (469) |
hdp2 | rung count, 3–5 |
cs1x / cs0x (468) | Home / Away ladders over descending win-score columns (0 = Draw) |
cs0x / cs1x (469) | Equal/Over / Equal/Under ladders, low totals first |
oddsspreada | box spread s — constant 1.12 (468) / 1.20 (469) |
Live handicap columns count from the current score (like the live AH); totals
columns are absolute. Rungs are stake multiples, not convertible odds — the catalog
stores them as custom prices[]/labels[].
The smell
Five fingerprints, reverse-engineered from Nova88 captures:
- The pivot is the main line, verbatim. The anchor's own column settles like the anchored bet: quarter line — loser exactly −0.50, winner half its quoted Malay price; integer line — 0.00 push.
- De-shaded, the ladder is geometric. Column midpoints F = (win + |loss|)/2 step by one shared ratio per box: R ≈ 1.70 + 3.60/E[goals] (handicap), 1.52 + 3.40/E[goals] (totals).
- Each side's expected win-leg is one stake. Σ π·F = 1 over the winning columns — the scale law that pins the bases and makes the fair ladder zero-EV.
- Affine shading. win = F·(1−δm) − δa, loss = −(F·(1+δm) + δa), with δm = 0.9·(s−1) and δa = (s−1)/2 — so either side's EV ≈ −(s−1)/2 of its max risk (−6% handicap, −10% totals).
- The window follows the anchor. Five columns centred on the anchor's integer (a −0.5 line boards [3, 2, 1, Draw, −1]; a 4.5 total boards [2…6]), shrinking to 4 then 3 while an edge bucket sits under ~8%.
Caveat: live boxes go stale. Mid-match captures sat up to a goal off their own main line, EVs drifting ±30% — a fresh box shows fingerprint 4's EV symmetry, a stale one doesn't. Fit only against boxes whose pivot mirrors the live main line.
The lab
No back-solve here — a box is a pure function of a score grid and an anchor. Enter the bivariate-Poisson rates λ₁ / λ₂ / λ₃ (the triple the goal-regular step 4 fits; its result box pastes straight in). Per box: Line (blank = the grid's balanced quarter line), Spread (shading deltas + the EV target), R law a/b or the R override; plus the global edge π floor, board ticks, and the fair ladder / buckets π rows. With no quoted pair, the pivot price derives from the grid — the EV-fair favourite price less half the pair spread. The Saba capture presets pin the captured lines and print Saba's rungs under the generated ones.
| Win Score | 3 | 2 | 1 | Draw | -1 |
|---|---|---|---|---|---|
| Home | 4.75 | 1.59 | 0.51 | -1.18 | -3.30 |
| Win Score | 3 | 2 | 1 | Draw | -1 |
| Away | -6.00 | -2.12 | -0.77 | 0.84 | 2.55 |
| Total Goals | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Equal/Over | -4.00 | -1.58 | 0.45 | 1.00 | 2.82 |
| Total Goals | 1 | 2 | 3 | 4 | 5 |
| Equal/Under | 2.62 | 0.93 | -0.50 | -1.68 | -4.30 |
Configuring it as a product
| knob | Saba runs | controls |
|---|---|---|
| spread s per box | 1.12 (HDP) / 1.20 (O/U) | whole-box margin — the −(s−1)/2 EV |
| R law (a, b) per box | ≈ (1.70, 3.60) / (1.52, 3.40) | payout escalation vs goal expectation |
| edge π floor | ≈ 0.08 | 5 → 4 → 3 column shrink |
| pair spread | 0.08 / 0.10 | pivot price when no pair is quoted |
| board ticks | on | display rounding |
Everything else follows from the grid and the main line;
src/lib/odds/__tests__/score-box.test.ts pins the recipe to the captures rung by rung.