Which endpoint
The choice is made by the legs, not by preference.1
All legs in one fixture?
Use
GET /fixtures/odds/sgp. The bookmaker prices it, so price reflects
the real correlation between the legs — “over 2.5 goals” and “home win” are
not independent events, and a naive product would overprice the slip.2
Legs across several fixtures?
Use
GET /fixtures/odds/parlay. Legs are independent, so the price is the
product of the decimal odds, computed locally and instantly.3
A mix?
/sgp rejects it — all legs must share one fixture. Either split the slip
or price the whole thing with /parlay and accept the uncorrelated number.- /parlay — a plain product
- /sgp — the bookmaker's quote
parlayId, two different prices. singlesPrice is the naive
product in both; on /sgp the gap down to price is the correlation margin.
Showing both numbers is what makes an SGP legible to a user.
Comparing bookmakers
Legs are grouped by bookmaker, andparlayId is built the same way on both
endpoints (sorted, deduped oddsIds joined by ,). Two consequences you can
build on:
- Request the same selection at several books in one call and you get every
book’s price for that slip side by side, under the same
parlayId. - A
/parlayresult and an/sgpresult for an identical selection are directly comparable — same key, different pricing model.
Keeping a live slip priced
A betslip is a long-lived object and prices move under it.- Re-price on every leg change.
parlayIdchanges the moment the selection changes, so cached prices are keyed correctly for free. - Re-price on a clock, not on every tick. Both endpoints are capped at
10 requests/second. Poll a live slip on a fixed interval rather than
chasing every odds update — an
/sgpcall can round-trip the bookmaker, so it is the slower of the two even where the budget is the same. - Cap at 20 legs. Both endpoints reject more.
Degrading gracefully
Three different things can make a slip unpriceable, and a good UI distinguishes them:
That third row is the one that surprises people: every leg was found on our
side, but the bookmaker’s own pricing service could not resolve the parlay. The
section is empty and nothing is reported as missing, because nothing was
missing. Read suspended vs missing
legs for the full
inactiveReason list.
The odds section is never filtered for you — inactive legs come back
included, deliberately, so you can render a suspended leg in place instead of
having it vanish from the slip.
Periods and legs
Legs from different periods of the same fixture combine normally — afulltime
1X2 and a p1 totals line are two legs like any other. If you are building
market groupings to select from, read Periods per sport
first: whether a sport even offers fulltime depends on its structure, and
assuming it does is the most common source of empty market buckets.
Related
Parlays & SGP reference
Every field, error and
inactiveReason.Rate limits
Authoritative per-endpoint budgets.
Periods per sport
Which periods exist where, and why.
Powering a sportsbook
The full pipeline this slip sits inside.