> ## Documentation Index
> Fetch the complete documentation index at: https://docs.odds-api.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Product updates and changes to Odds-API.io

<Update label="18 Sep 2026" tags={["Billing"]}>
  ## Annual plans: 12 months for the price of 10

  Every plan (Solo, Starter, Growth, Pro and their WebSocket variants) can now be billed yearly at 10x the monthly price.

  * Choose **Annual** at checkout on [odds-api.io/pricing](https://odds-api.io/pricing)
  * Existing monthly customers can switch from the dashboard Billing page. The switch is prorated and charged to the stored card straight away
  * Annual plans are card only for now. Extra request packages stay monthly and cannot be combined with a yearly plan
  * Promo codes apply to monthly plans only, since annual already includes 2 months free
</Update>

<Update label="17 Sep 2026" tags={["Coverage"]}>
  ## The bookmaker catalogue passed 365 books

  `GET /v3/bookmakers` now returns 365 bookmakers, 360 of them active. 80 books became available in the last seven days.

  **New this week**

  * 🇳🇱 711 NL, Betcity NL, Betnation NL, Bingoal NL, Hommerson NL, Jacks NL, Unibet NL
  * 🇸🇪 BetMGM SE, Casumo SE, Hajper, LeoVegas SE, Snabbare
  * 🇬🇧 32Red, BetMGM UK, Casumo, Sky Bet
  * 🇧🇬 Bet.bg, Inbet
  * 🇨🇴 Codere CO, RushBet CO
  * 🇪🇪 Paf EE, Vivatbet
  * 🇪🇸 Casumo ES, Codere ES
  * 🇨🇦 NorthStar Bets
  * 🇩🇪 Winamax DE
  * 🇮🇪 BoyleSports
  * 🇮🇹 Stanleybet IT
  * 🇱🇻 Paf LV
  * 🌐 Bet2Fun, Betandyou, BetFriday, Betfrom, Betfury, Betlabel, BetMartini, BetRebels, BetsAmigo, Betspino, Betstro, BetWhale, BillyBets, Bitz, Bons, Boomerang Bet, Campobet, Casino-X, Casinova, Casinozer, Casombie, Cazimbo, Chips.gg, Cosmobet, Excitewin, FanSport, Fastbet, Helabet, Highbet, JoyCasino, Lilibet, Linebet, MalinaCasino, Marathonbet, Mobilebet, MrPacho, NovaJackpot, Nucleonbet, Paripesa, PlayZilla, Rakebit, Ramenbet, Riobet, Spinanga, Spinsy, Superboss, WallaceBet, Winnerz, WinWinBet, XpariBet, Yonibet
</Update>

<Update label="15 Sep 2026" tags={["Odds", "WebSocket"]}>
  ## ON Sharp: one consensus line from the sharpest books

  **ON Sharp** is a new bookmaker computed by odds-api.io. It blends the sharpest, highest-limit books in the market into one line: each book is de-vigged, the fair probabilities are blended, and the result is re-priced at a fixed margin of 2% on two-way markets and 2.5% on three-way markets. Strip the margin with one division and you have the sharp market's fair probability.

  It covers prematch `ML`, `Spread` and `Totals` (full match and first half) across football, basketball, tennis, American football, baseball, ice hockey and esports, plus football corners, tennis game lines and baseball first five innings. Lines update in real time on the WebSocket and every change is kept in `/v3/odds/movements`, so you can measure closing line value against it.

  Available on all paid plans. Add **ON Sharp** to your bookmaker selection and request it like any other book: `/v3/odds?eventId=...&bookmakers=ON Sharp`. Details in the [ON Sharp guide](/guides/on-sharp).
</Update>

<Update label="15 Sep 2026" tags={["Odds", "WebSocket"]}>
  ## Delta fetching for `/v3/odds/updated`, and gzip on every response

  `GET /v3/odds/updated` now accepts a `markets` parameter (comma-separated, max 20) to shrink the payload to markets you care about, and a `limit` parameter (1-10000, default 10000) to cap how many rows come back. Every response also carries two new headers: `X-Server-Time` (the server's clock at response time) and `X-Next-Since` (pass this straight back as your next `since` value). Recipe: start with `since = now - 20`, then on each poll set `since` to the previous response's `X-Next-Since`.

  Every REST response is now sent gzip-compressed, whether or not your request sends an `Accept-Encoding` header. Most HTTP clients decompress this automatically; see the [Best Practices guide](/guides/best-practices#5-responses-are-gzip-compressed) if yours doesn't.

  WebSocket clients must negotiate `permessage-deflate` compression. Uncompressed connections will stop being accepted soon. Node `ws`, browsers and Python `websockets` all negotiate this by default; if you're on Python `websocket-client` or PHP `textalk/websocket`, switch to `websockets` / `amphp/websocket-client`. See the [WebSocket guide](/guides/websockets) for details.

  `GET /v3/odds` and `GET /v3/odds/multi` now accept the same optional `markets` parameter as `/v3/odds/updated` (comma-separated, case-insensitive, max 20). Leave it out to get every market, as before.
</Update>

<Update label="7 Sep 2026" tags={["Odds"]}>
  ## Retired market names are gone

  The deprecated names from the 15 Aug rename stopped being served on 5 September 2026, as announced. Every market now returns under its standard name only. If you still filter on an old name (`Half Time Result`, `Alternative Run Line`, `1st Map Moneyline`, `Pitcher Strikeouts O/U`, ...) you will get no rows back: switch to the replacement in the mapping table below, or check `GET /v3/markets?sport=<sport>` for the current catalogue.
</Update>

<Update label="15 Aug 2026" tags={["New endpoint"]}>
  ## Market catalogue: `GET /v3/markets`

  See every market we serve, per sport, straight from live coverage:

  ```
  GET /v3/markets?apiKey=YOUR_KEY&sport=football
  ```

  Each market has a **`shape`** telling you how to parse its odds (`moneyline`, `line`, `outcomes`, `yesno`, `labelled`), a **`period`** (match, first-half, set, …) and **`prematch`**/**`live`** flags. Omit `sport` to get everything keyed by sport slug.
</Update>

<Update label="15 Aug 2026" tags={["Odds", "Coverage"]}>
  ## Market normalization and much wider Bet365 coverage

  We've normalized market names and shapes across all our scrapers, mostly affecting Bet365. Markets that used bookmaker-specific names now return under the same standard names as every other book, so cross-bookmaker filtering and comparison just works.

  **Bet365 got a lot more.** All handicap and goal lines now come back instead of only the main one (`Spread` went from 1 to \~5 lines per event, `Totals` from 1 to \~8), around 30 new pre-match football markets, wider in-play football, and in-play tennis grew from 3 markets to 33: per-set totals, handicaps and scores, plus per-game winners.

  **Player props are one market on every bookmaker.** Bet365 used to send \~58 separate per-stat markets (`Points O/U`, `Pitcher Strikeouts O/U`, ...), and with the WebSocket's 20-market filter limit you could not cover them. Baseball, basketball, American football and ice hockey props now come back in a single **`Player Props`** market with `Player (Stat)` labels on every book, so one filter covers the lot and props compare across bookmakers. Stat names and player names were unified too: batter hits read `Hits` (not `Pitching Hits`).

  **Nothing breaks today.** Every renamed market keeps returning under its old name for three weeks. On **5 September 2026** the deprecated names below stop being served, so switch to the standard name before then. The full list:

  | Deprecated                                                                                                                                                           | Use instead                                                                                                                                  |
  | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
  | `Half Time Result`                                                                                                                                                   | `ML HT`                                                                                                                                      |
  | `1st Half Handicap`                                                                                                                                                  | `European Handicap HT`                                                                                                                       |
  | `Corners 2-Way`, `Team Corners Home`/`Away`                                                                                                                          | `Corners Totals` (+ `Home`/`Away`)                                                                                                           |
  | `Team Cards Home`/`Away`                                                                                                                                             | `Bookings Totals Home`/`Away`                                                                                                                |
  | `Match Shots`, `Team Shots Home`/`Away`                                                                                                                              | `Total Shots` (+ `Home`/`Away`)                                                                                                              |
  | `Match Shots on Target`, `Team Shots on Target Home`/`Away`                                                                                                          | `Total Shots on Target` (+ `Home`/`Away`)                                                                                                    |
  | `Match Offsides`, `Team Offsides Home`/`Away`                                                                                                                        | `Total Offsides` (+ `Home`/`Away`)                                                                                                           |
  | `Match Tackles`, `Team Tackles Home`/`Away`                                                                                                                          | `Total Tackles` (+ `Home`/`Away`)                                                                                                            |
  | `Alternative Asian Handicap`                                                                                                                                         | `Spread`                                                                                                                                     |
  | `Alternative Goal Line`, `Alternative Total Goals`                                                                                                                   | `Totals`                                                                                                                                     |
  | `Alternative 1st Half Asian Handicap`                                                                                                                                | `Spread HT`                                                                                                                                  |
  | `Alternative 1st Half Goal Line`                                                                                                                                     | `Totals HT`                                                                                                                                  |
  | `Alternative Spread`, `Alternative Totals`, `Alternative Run Line`                                                                                                   | `Spread` / `Totals`                                                                                                                          |
  | `3-Way` (ice hockey, baseball)                                                                                                                                       | `3-Way Result`                                                                                                                               |
  | `Total Rounds` (MMA/boxing), `Total Match Runs` (cricket)                                                                                                            | `Totals`                                                                                                                                     |
  | `Set Spread` (tennis)                                                                                                                                                | `Spread`                                                                                                                                     |
  | `1st Map Moneyline` … `5th Map Moneyline` (esports)                                                                                                                  | `1st Map ML` … `5th Map ML`                                                                                                                  |
  | Every `Map N - …` board: `Winner`, `Kill Handicap`, `Rounds`, `Race to # Rounds`, `Winning Margin`, `Correct Round Score` and their `Alternative` variants (esports) | `{N} Map ML` / `Handicap` / `Rounds Handicap` / `Total Kills` / `Total Rounds` / `Race to Rounds` / `Winning Margin` / `Correct Round Score` |
  | Every per-stat player-prop market: the `X O/U` spellings (`Points O/U`, `Pitcher Strikeouts O/U`, …) and the bare ones (`Points`, `Hits`, …)                         | `Player Props` (one market, `Player (Stat)` labels)                                                                                          |
</Update>

<Update label="11 Aug 2026" tags={["Billing"]}>
  ## Pay with crypto

  You can now pay for any plan with cryptocurrency. Choose **Crypto** at checkout and pay with BTC, ETH, USDC, USDT, SOL, LTC or 70+ other coins. Payments are handled by [CoinGate](https://coingate.com), licensed as a crypto-asset service provider by the Bank of Lithuania.

  Upgrades, extra requests and the WebSocket add-on work on crypto too, with the prorated amount shown before you confirm.

  One difference from cards: crypto cannot be charged automatically, so each renewal arrives as an invoice with a payment link, by email and in your dashboard. Your API access continues while the invoice is open. Full details in the [crypto payments guide](/guides/paying-with-crypto).
</Update>

<Update label="3 Aug 2026" tags={["Historical", "New endpoint"]}>
  ## Find finished matches by team name

  `/v3/historical/events` needs an exact sport and league, so a team name alone was never enough to find a finished match. The new **`/v3/historical/events/search`** endpoint fixes that:

  ```
  GET /v3/historical/events/search?query=Brann&sport=football
  ```

  `query` matches home or away team (case-insensitive, minimum 3 characters); `sport` and a `from`/`to` window of up to 31 days are optional. Up to 100 results, newest first, in the same shape as `/v3/historical/events`, so event IDs plug straight into `/v3/historical/odds`. Available on every plan. Details in the [historical data guide](/guides/historical).
</Update>

<Update label="2 Aug 2026" tags={["Coverage"]}>
  ## New lower-tier leagues for football and basketball

  We've added a batch of lower-tier and niche competitions, with live scores and the [live clock](/guides/live-events) included.

  **Football:** Bhutan Premier League, Kuwait First Division, Guatemala Primera División de Ascenso, Vietnam Women's National League, Mexico U19 League, Poland IV Liga, and Brazilian lower tiers.

  **Basketball:** Rwanda Basketball League is live now; Uganda NBL, Singapore NBL, Bahrain, Iraq, Malaysia MBL, Morocco, Albania, Bolivia, Puerto Rico and Brazil LBF follow as their seasons schedule fixtures.

  **Missing a league you need?** Tell us in support chat or at [hello@odds-api.io](mailto:hello@odds-api.io) and we'll usually have it live within a day or two.
</Update>

<Update label="1 Aug 2026" tags={["Historical", "New endpoint"]}>
  ## Historical closing lines in a single request

  Pulling closing lines used to mean listing events for a league, then making one request per match. For a full season across several leagues that ran to roughly 1,900 requests.

  The new **`/v3/historical/closing-lines`** endpoint does it in one call. Give it a sport, up to 10 leagues, a date range, the markets you want and your bookmakers, and it returns every settled event in that window with closing odds attached:

  ```
  GET /v3/historical/closing-lines
    ?sport=football
    &leagues=england-premier-league,spain-la-liga
    &from=2026-03-01T00:00:00Z&to=2026-12-01T00:00:00Z
    &markets=ML
    &bookmakers=Bet365,Unibet
  ```

  Responses are capped at 100 events, with `limit` and `skip` for paging. The date span goes up to 366 days, so a whole season fits in one range.

  Closing odds go back to December 2025.

  This endpoint is available on paid plans. `/v3/historical/events` and `/v3/historical/odds` are unchanged and still available on every plan, including free.

  **Also new:** `/v3/historical/odds` now accepts an optional **`markets`** parameter, so you can ask for just the markets you need instead of filtering hundreds of them client-side.

  See the [historical odds guide](/guides/historical) for the full reference.
</Update>

<Update label="31 Jul 2026" tags={["WebSockets"]}>
  ## Live match clocks in WebSocket updates

  Live `score` and `status` messages now include an optional `clock` snapshot when clock data is available. Use it to re-anchor a client-side match timer after every score or status change without repeatedly polling the API.

  Seed the initial value from [`GET /events/live`](/guides/live-events) when you connect, then use subsequent WebSocket snapshots to keep it aligned. The clock is omitted for non-live events and sports without clock data. See the [WebSocket guide](/guides/websockets) for subscription details.
</Update>

<Update label="30 Jul 2026" tags={["Free tier"]}>
  ## More sharp books moved to paid plans

  Two additional sharp bookmakers now require a paid plan: **Crown** and **188bet**. As before, the free plan keeps every recreational book. See the full list of paid-only bookmakers below.
</Update>

<Update label="22 Jul 2026" tags={["Free tier"]}>
  ## Free tier changes

  Starting **26 July 2026**, we're refocusing the free plan as a way to **test the API** before choosing a paid plan, not a place to run production workloads. Two changes:

  * **Sharp and exchange bookmakers move to paid plans.** The free plan keeps every recreational book (Bet365, DraftKings, FanDuel, Unibet, and many more). Betting exchanges, sharp bookmakers, and prediction markets require a paid plan.
  * **A daily request limit.** The free plan will be capped at **500 requests/day** (the 100/hour burst limit is unchanged). That's plenty to evaluate the API, and paid plans get 5,000 requests an hour.

  Need full access? [See plans](https://odds-api.io/#pricing) from £49/mo.

  ### Bookmakers that require a paid plan

  **Betting exchanges:** Betfair Exchange, Orbit Exchange, Piwi247 Exchange, Sharp Exchange, Fair999 Exchange, NoVig, SkyExchange

  **Sharp & Asian bookmakers:** Sbobet, Circa, SingBet, Crown, 188bet, BetOnline.ag, LowVig AG, SportBetting AG, Tiger Gaming, 10BET, 12bet, DafaBet

  **Prediction markets:** Polymarket, Kalshi
</Update>
