# Changelog

Changes to the API that affect what your code reads, newest first.

## October 2026: odds are grouped by market

`GET /v1/odds`, `GET /v1/events/{event_id}/odds` and the [odds stream](https://sockodds.com/docs/streaming/) now group prices by market. Each event has `markets`, each market its `outcomes`, and each outcome its `prices`: one per bookmaker, best first. Every market and outcome appears once, however many bookmakers quote it, so responses are roughly a third to nearly half smaller.

What moved:

| Before | Now |
| --- | --- |
| `event.bookmakers[].markets[]` | `event.markets[]` |
| `outcome.decimal_odds`, `implied_probability`, `available`, `bookmaker`, `observed_at` | the same fields on each entry of `outcome.prices` |
| `outcome.alternate` | `market.alternate` |
| bookmaker `name` in each response | bookmaker keys; names from `GET /v1/bookmakers` |

Ids, keys, filters, the `data`, `meta` and `links` envelope and usage are unchanged: one object per event plus one per bookmaker price.

To keep the previous grouping, add `group_by=bookmaker` to the request. It returns exactly the earlier shape. See [Reading prices](https://sockodds.com/docs/odds/).
