Skip to content

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.