Odds¶
GET /odds[?league=<league>]
Our consensus: a live market-implied probability per outcome, updated in real time as markets move. Served
at its own host; / answers the same.
https://odds.halfpoint.tech
Listed are the games starting within the next 24 hours and those being played. Without league,
all leagues. There is no date: this is the current price; for updates as they happen, see the
stream.
| parameter | ||
|---|---|---|
league |
optional | one league, default all |
plan |
optional, x402 without a key only | x402.consensus (default, USD 0.01) or x402.risk (USD 0.05, with stop, widened and range) |
A REST answer is rebuilt at most once a second: at most 1 s behind the stream.
curl -H "X-Api-Key: $KEY" "https://odds.halfpoint.tech/odds?league=nba"
{
"updated": "2026-10-30T23:36:43.479Z",
"league": "nba",
"fixtures": [
{
"id": "nba-261030-mia-cha",
"league": "nba",
"start": "2026-10-30T23:40:00.000Z",
"markets": {
"moneyline": {
"home": 0.46,
"away": 0.54,
"recent": true,
"stop": false,
"widened": false,
"range": {"home": [0.45, 0.47], "away": [0.53, 0.55]},
"at": "2026-10-30T23:36:42.915Z"
}
}
}
]
}
Fixtures are ordered by start. id is the fixture id of the fixtures API, so
answers join on it. updated is when this answer was built. It is at most 1 s behind the prices;
polling faster returns the same answer (see Polling).
| field | |
|---|---|
id, league |
the fixture and its league |
start |
the game's start (UTC) |
markets |
prices by market: moneyline, or moneyline_3way for soccer (EPL, Bundesliga, LaLiga, Champions League) (see Markets) |
home, away, draw |
each outcome's probability, summing to 1, to two decimals, or three when an outcome is above 0.97 or below 0.03; draw in moneyline_3way only |
recent |
whether this is a current consensus (see below) |
stop |
Risk plan: the bet stop |
widened |
Risk plan: the market is reopening after a stop |
range |
Risk plan: the consensus range of home and away, each [low, high], where there is one |
at |
when this price was computed |
Recent¶
With recent: false the price is the last one we had, kept so you can see it: there is no current
consensus, and at tells its age. Treat it as a reference, not as a price.
When a game ends, its price freezes with recent: false. The market is removed once the fixture
is Final, Postponed or Cancelled, or after 6 hours without a price.
Prices¶
A price is republished when an outcome moves, when recent, stop or widened change, and
otherwise every 5 minutes. So an at a few minutes old on a recent price just means the price
didn't move.
Bet stop¶
stop: true tells you to widen or pull your quotes now: something just happened that can be
front-run, such as a score, or the market is too unsettled to trust one price. It says nothing
about the market itself, which keeps trading. These signals don't guarantee protection against
losses.
The price keeps updating during a stop, and only the flag changes. A stop lifts once the market has settled on its new level.
Consensus range¶
range is roughly a 90% confidence interval around our estimate of the market's consensus: how
far to trust the price right now. It isn't a forecast of the next price or of who wins.
It comes with each published price, for games being played, for home and away, on outcomes
priced between 0.05 and 0.95. Otherwise that outcome, or the whole field, is left out. A price
with recent: false has none.
Widened¶
widened: true marks a price less certain than usual, in the seconds after a bet stop: it is good
enough to quote around, but quote wider.