/api/settlement?event_id=… returns the final score, the status, and the per-line settlement.
Outcomes
Each line of thesettlement carries outcome_home, outcome_draw, outcome_away:
Settlement covers every priced period — full match, half, quarter, set — as soon as that period’s score is known. Each row carries its
period. A period whose score stays unknown produces no row rather than an approximate verdict: measured coverage is 87% of (event, period) pairs, 97% in football, 73% in tennis whose periods are games. Until the match is settled, settlement is empty and status reflects the current state (started, pending); it turns to ended on settlement.Quarter lines
A line in.25 or .75 is not one line but two half-stake bets, placed at line ± 0.25. On a -0.25 handicap with a draw, the half placed at 0 is refunded and the half placed at -0.5 loses: the verdict is half_loss, not loss.
The two halves can never contradict each other — they are 0.5 apart and a quarter line’s margin is never zero. Only half win and half loss exist.
Per-period results
/api/results?event_id=… is a separate route, in iso-BIC format: it returns an array, one object per settled period. On set-based sports, every set and every game is a binary result (1-0 / 0-1); period 0 carries the set count.
Discovering settled matches
/api/settled?since=… walks settled matches incrementally: every response carries a last cursor to pass back on the next call.
This is the only way to discover a settlement. A settled match has left the book — its disappearance is what triggers settlement — so it no longer shows up in /api/fixtures, not even with live=2. Without this walk, you would need to have stored the event_id before the match ended.
since comparison is inclusive: the last event of a page may reappear at the top of the next one. Several matches can share the same settlement second, and losing one would be worse than returning it twice — deduplicate on event_id.
Available filters: sport_id, league_id, limit (1 to 1000, default 200).