Score Box — the Saba payout ladders
Score Box Handicap and Score Box Over/Under (catalog markets 590/591, Saba bet types 468/469) are the ladder pair from the Saba/Nova88 book. They are not price books: one stake buys a whole row of 3–5 buckets — win-score margins for the handicap box, total goals for the totals box — and the bucket the final score lands in settles the bet with its signed multiplier. Positive pays that many stakes, negative costs that many, 0.00 pushes. A result beyond the listed row settles at its edge column (the caps), and the account holds |most negative rung| × stake as the risk — a Score Box can lose several stakes, which is why risk and settlement code must never assume loss ≤ stake.
Nova88's own worked example (Rules & Regulations §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 |
Back Home with $100: 1-0 pays $140, 2-0 pays $413, 3-0 still pays $413 (beyond the row → the cap), a draw returns the stake, 0-1 costs $201, 0-2 and any heavier defeat cost $592. The maximum negative rung is the deduction rule: at −6 the book reserves $600 against a $100 ticket.
On the wire
Live payloads (bet types 468/469) carry the whole board in one product row:
| field | meaning |
|---|---|
hdp1 | top column — the highest win-score (468) or highest total (469) |
hdp2 | rung count, 3–5 (Saba's "depending on real time situation") |
cs1x / cs0x (468) | Home ladder / Away ladder, over descending win-score columns (0 = Draw) |
cs0x / cs1x (469) | Equal/Over ladder / Equal/Under ladder, low totals first |
oddsspreada | the box spread s — constant 1.12 on 468 and 1.20 on 469 |
Two conventions matter for a normalizer: live handicap columns count from the current
score (the same convention as the live AH the box anchors on), while totals columns
are absolute final goals; and the ladders are quoted in stake multiples (HK-style
settlement), not in any convertible odds format — which is why the catalog stores them as
custom prices[]/labels[].
The smell
Plenty of constructions produce "correct" score-box numbers; Saba's boxes have a specific shape you can recognize in seconds and reproduce exactly. Reverse-engineered from Nova88 captures (live boxes at 0-0/1-0/1-1/0-2/3-0 plus freshly-priced prematch EPL/Serie A boxes, each alongside the same book's Correct Score / Exact Total Goals / Winning Margin / AH / OU quotes), the fingerprints are:
- The middle of the box is the main line, verbatim. The column the anchor line splits settles exactly like the anchored bet: on a quarter line the side the line just beats prints −0.50 (half the stake — every captured quarter-anchored box had it, to the cent) and the winning side prints half its quoted Malay price (away 0.80 → +0.40; the quote moved to 0.90, the rung moved to +0.45). An integer anchor prints 0.00 — the push — at its own column. If the middle of a box does not mirror the main line, it is not fresh (see the staleness note below).
- De-shaded, the ladder is geometric with one shared ratio. Write each column's fair value as the midpoint F = (win + |loss|)/2 of the two sides' rungs: every chain — home up, home down, away up, away down — steps by the same R (captured chains agree within ~1%), and R falls with the goal expectation: R ≈ 1.70 + 3.60/E[goals] for the margin box, 1.52 + 3.40/E[goals] for the totals box. Low-scoring matches climb the ladder faster.
- Each side's expected win-leg is one stake unit. Σ π·F over a side's winning columns lands at 1.00 (captured boxes: 0.88–1.13, noise from the probability sources) — which, with the mirror structure, makes the fair ladder zero-EV against the book's own score distribution. This is the scale law: it pins the bases the geometric chains grow from.
- The quote shades both multiplicatively and additively. win = F·(1−δm) − δa,
loss = −(F·(1+δm) + δa), with δm = 0.9·(s−1) and δa = (s−1)/2 off the box
spread s (
oddsspreada). Solving any two adjacent captured column-pairs for (F, δm, δa) reproduces the other rungs to two decimals. The consequence a bettor can measure: either side's EV ≈ −(s−1)/2 of its max risk (−6% on the handicap box, −10% on the totals box). - The window follows the anchor, not symmetry around zero. Five columns centred on the anchor's integer (a −0.5 handicap line boards [3, 2, 1, Draw, −1] — the extra column goes to the favourite's side; a 4.5 goal line boards [2…6]), shrinking to four and then three while an edge bucket holds under ~8% probability.
One operational caveat from the captures: live boxes go stale. Saba re-anchors the window and re-levels the rungs coarsely in play — mid-match boxes sat up to a full goal off their own concurrent main line, with per-side EVs drifting ±30% against the current distribution. A fresh box shows the EV symmetry of fingerprint 4; a stale one doesn't. Treat any mid-match 468/469 payload as a lagged quote, and fit or compare only against boxes whose pivot mirrors the live main line.
The lab
The widget below runs the exact generator the goal-regular page
uses in its Markets fold (src/lib/odds/score-box.ts), with every configuration knob a
book would own:
- Quotes — the period's Handicap and Total in Malay plus a decimal 1X2; the bivariate-Poisson engine recovers the score grid the boxes price from. The two Saba capture presets load real Nova88 quotes from 2026-07-11 and print Saba's actual rungs (muted rows) under the generated ones, with the mean per-rung gap in the note.
- Spread — the box's
oddsspreada. It drives both shading deltas (δm = 0.9·(s−1), δa = (s−1)/2) and therefore the EV target −(s−1)/2; widen it and watch both sides' rungs walk away from the fair ladder. - R law a / b — the ladder-ratio law R = a + b/E[goals]. Books tuning "how fast the ladder climbs" own these two numbers; the R override field freezes the ratio outright (blank = law).
- Edge π floor — the window-shrink threshold. Raise it to ~0.15 and the five-column board collapses to Saba's late-game three-column shape; drop it to 0 and the window always boards five.
- Board ticks — Saba's price grid (cents under 3, nickels to 6, dimes above). Turn it off to see the raw shaded values the rounding hides.
- Fair ladder / Buckets π — expose the intermediate rows: the pre-shading F values (fingerprints 2–3) and the bucket probabilities each rung was priced against.
| Win Score | 2 | 1 | Draw | -1 |
|---|---|---|---|---|
| Home | 2.75 | 0.87 | -1.30 | -3.75 |
| Win Score | 2 | 1 | Draw | -1 |
| Away | -3.55 | -1.22 | 0.94 | 2.93 |
| Total Goals | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| Equal/Over | -6.20 | -2.31 | -0.90 | 0.69 | 2.06 |
| Total Goals | 0 | 1 | 2 | 3 | 4 |
| Equal/Under | 4.10 | 1.43 | 0.46 | -1.23 | -3.20 |
Configuring it as a product
The generator's owner-facing surface is deliberately small — the same knobs Saba evidently operates:
| knob | Saba runs | what it controls |
|---|---|---|
| spread s per box | 1.12 (HDP) / 1.20 (O/U) | whole-box margin: shading deltas and the −(s−1)/2 EV |
| R law (a, b) per box | ≈ (1.70, 3.60) / (1.52, 3.40) | payout escalation per column vs goal expectation |
| edge π floor | ≈ 0.08 | when the board drops from 5 to 4 to 3 columns |
| pair spread | 0.08 / 0.10 | the pivot column's quoted half-settle when no live pair is supplied |
| board ticks | on | display rounding of the rungs |
Everything else — window placement, pivot settles, bases, caps — follows from the score
grid and the main line. src/lib/odds/__tests__/score-box.test.ts holds the whole recipe
to the captured Saba boxes rung by rung; the market-type reference lives in
Markets and the settlement semantics in the knowledge vault's
score-box pages.