Fixed Goal Lines: Every Over/Under Line Priced, Not Just the One That Moves

· 3 min read odds goals new

The goal line most APIs give you is the one the book moves. It opens at 2.5, drifts to 2.75 when the money comes in, sits at 3.0 after the early goal. Handy for a ticker; awkward for a model, because the "goal line price" on one match is a 2.5 price and on the next it is a 2.75 price, and the two are not the same number.

Bet365 also quotes the whole ladder — Over/Under 0.5, 1.5, 2.5 and so on up to 9.5 — side by side, each line with its own price, each line staying open while the main line walks away from it. As of today that ladder is in the API.

What you get

On GET /v1/fixtures/{id}/odds the bet365 entry carries a new market, goal_line_fixed: one entry per line with opening, closing and in-play prices. This is a J2 League fixture from this afternoon, trimmed to four lines:

"goal_line": {
  "opening": { "line": 2.5,  "over": 1.825, "under": 1.975 },
  "closing": { "line": 2.75, "over": 2.0,   "under": 1.8 }
},
"goal_line_fixed": [
  { "line": 2.5, "opening": { "over": 1.8,  "under": 2.0 },   "closing": { "over": 1.8,  "under": 2.0 },   "inplay": { "over": 1.833, "under": 1.833 } },
  { "line": 3.5, "opening": { "over": 2.75, "under": 1.4 },   "closing": { "over": 2.75, "under": 1.4 },   "inplay": { "over": 3.5,   "under": 1.286 } },
  { "line": 4.5, "opening": { "over": 5.5,  "under": 1.143 }, "closing": { "over": 5.5,  "under": 1.143 }, "inplay": { "over": 9.0,   "under": 1.071 } },
  { "line": 7.5, "opening": { "over": 51.0, "under": 1.002 }, "closing": { "over": 51.0, "under": 1.002 }, "inplay": null }
]

The main line moved from 2.5 to 2.75 before kickoff. The 2.5 line did not go anywhere — it kept its own price the whole time, and it is the same strike on every other fixture in the database.

A line the book withdraws shows up as null for that stage. A fixture with no ladder at all gets []: lower leagues usually carry the 2.5 line only, and roughly four matches in ten carry the full set.

On GET /v1/fixtures/{id}/odds/history?market=goalline_fixed you get every price change on every line, grouped per line, in one call — the page is sized for a whole match, so there is no paging through nine lines separately. &line=2.5 narrows it to one strike if that is all you want.

Why a fixed line is the better number

It is comparable. "Over 2.5 at 1.80" means the same thing on a Bundesliga match and on a Norwegian second-division one. "The goal line at 1.90" does not, until you also know what the line was.

It is a distribution, not a point. Nine priced lines are nine points on the market's cumulative goals distribution. Strip the margin and you have P(goals ≤ 0.5), P(goals ≤ 1.5), … straight from the book — a Poisson fit you can check against the market instead of against last season's averages.

Closing line value works on it. If your model says a match is a 2.5 match and the book closes 2.5 at a shorter price than you got it at, you were right, on the strike you actually chose. On the main line that comparison keeps moving underneath you.

Coverage and plans

Bet365 only, for now — none of the other books we record quote a ladder. Prices are recorded pre-match and in play, from 26 September 2026 onwards; fixtures before that date return an empty ladder. The snapshot on /odds comes with every plan that has odds, which includes the free tier on the top-five leagues. The tick history is on Ultra, like every other market's history.

The changelog has the field-by-field notes.

Build with real football data

Live scores, fixtures, standings, corner and card statistics, and bookmaker odds with the full tick history. Free tier covers the top-5 European leagues, no card; paid plans start at $5/month.

Keep reading