DocsChangelog

Changelog

Changes to the OddsRelay API, newest first. Subscribe with RSS.

Breaking changes ship only as a new version, with 6 months' notice. Versioning policy

  1. Raw winner markets sold each-way now carry places, place_fraction and extra_place (golf, horse racing and greyhounds, from 19:18 UTC). A bookmaker's other each-way terms for the same event are their own market, outright_winner_ew_<places>, and an exchange's own each-way market is outright_each_way; both are raw only. The market keys added from 2 to 5 November, such as result_btts and handicap_3way, are listed by GET /v2/coverage.

  2. Added in-play prices and exchange history. From 13:52 UTC, inPlay on GET /v2/odds/raw and GET /v2/odds/event/{id} (exclude, the default, include or only), and from 15:30 UTC on GET /v2/odds/{type} for standard and dutching (exclude or only), with in_play on each event it serves; an in-play call costs what the same pre-match call costs. From 10:46 UTC, GET /v2/historical/odds/raw and GET /v2/historical/events/{id}/odds answer with Betfair, Smarkets and Matchbook beside the bookmakers by default, exchanges and exchangesOnly=true answer instead of 403, and bookmakersOnly=true on those two routes and on GET /v2/historical/closing gives the bookmakers-only answer, byte for byte. Closing lines and the files stay bookmakers only.

    Contract diff

    Added

    • parameter: GET /v2/odds/{type} query:inPlay
    • enum value: GET /v2/odds/{type} query:inPlay: "exclude"
    • enum value: GET /v2/odds/{type} query:inPlay: "only"
    • parameter: GET /v2/odds/raw query:inPlay
    • enum value: GET /v2/odds/raw query:inPlay: "exclude"
    • enum value: GET /v2/odds/raw query:inPlay: "include"
    • enum value: GET /v2/odds/raw query:inPlay: "only"
    • parameter: GET /v2/odds/event/{id} query:inPlay
    • enum value: GET /v2/odds/event/{id} query:inPlay: "exclude"
    • enum value: GET /v2/odds/event/{id} query:inPlay: "include"
    • enum value: GET /v2/odds/event/{id} query:inPlay: "only"
    • parameter: GET /v2/historical/odds/raw query:bookmakersOnly
    • enum value: GET /v2/historical/odds/raw query:bookmakersOnly: "true"
    • enum value: GET /v2/historical/odds/raw query:bookmakersOnly: "false"
    • parameter: GET /v2/historical/events/{id}/odds query:bookmakersOnly
    • enum value: GET /v2/historical/events/{id}/odds query:bookmakersOnly: "true"
    • enum value: GET /v2/historical/events/{id}/odds query:bookmakersOnly: "false"
    • parameter: GET /v2/historical/closing query:bookmakersOnly
    • enum value: GET /v2/historical/closing query:bookmakersOnly: "true"
    • enum value: GET /v2/historical/closing query:bookmakersOnly: "false"
  3. Contract diff

    Added

    • required field: #/components/schemas/PriceRegion: products
    • required field: #/components/schemas/HistoricalPrices: snapshot
    • required field: #/components/schemas/HistoricalPrices: event
    • required field: #/components/schemas/HistoricalPrices: closing
    • required field: #/components/schemas/HistoricalPrices: file_per_mb
    • required field: #/components/schemas/HistoricalPrices: free_closing_days
  4. Added historical odds, bookmakers only, in five routes: a past board (GET /v2/historical/odds/raw), one event's price changes (GET /v2/historical/events/{id}/odds), a day's closing lines (GET /v2/historical/closing), and the nightly day files (GET /v2/historical/files and its download). They are priced from regions.uk.historical in /v2/pricing.

    Contract diff

    Added

    • path: GET /v2/historical/odds/raw
    • parameter: GET /v2/historical/odds/raw query:date
    • parameter: GET /v2/historical/odds/raw query:sports
    • parameter: GET /v2/historical/odds/raw query:region
    • enum value: GET /v2/historical/odds/raw query:region: "uk"
    • parameter: GET /v2/historical/odds/raw query:format
    • enum value: GET /v2/historical/odds/raw query:format: "envelope"
    • enum value: GET /v2/historical/odds/raw query:format: "bare"
    • parameter: GET /v2/historical/odds/raw query:oddsFormat
    • enum value: GET /v2/historical/odds/raw query:oddsFormat: "decimal"
    • enum value: GET /v2/historical/odds/raw query:oddsFormat: "american"
    • parameter: GET /v2/historical/odds/raw query:dateFormat
    • enum value: GET /v2/historical/odds/raw query:dateFormat: "iso"
    • enum value: GET /v2/historical/odds/raw query:dateFormat: "unix"
    • parameter: GET /v2/historical/odds/raw query:bookmakers
    • parameter: GET /v2/historical/odds/raw query:exchanges
    • parameter: GET /v2/historical/odds/raw query:markets
    • parameter: GET /v2/historical/odds/raw query:eventIds
    • parameter: GET /v2/historical/odds/raw query:exchangesOnly
    • enum value: GET /v2/historical/odds/raw query:exchangesOnly: "true"
    • enum value: GET /v2/historical/odds/raw query:exchangesOnly: "false"
    • parameter: GET /v2/historical/odds/raw query:includeLiquidity
    • enum value: GET /v2/historical/odds/raw query:includeLiquidity: "true"
    • enum value: GET /v2/historical/odds/raw query:includeLiquidity: "false"
    • parameter: GET /v2/historical/odds/raw query:limit
    • parameter: GET /v2/historical/odds/raw query:cursor
    • parameter: GET /v2/historical/odds/raw query:quote
    • parameter: GET /v2/historical/odds/raw header:Accept-Encoding
    • path: GET /v2/historical/events/{id}/odds
    • parameter: GET /v2/historical/events/{id}/odds path:id
    • parameter: GET /v2/historical/events/{id}/odds query:from
    • parameter: GET /v2/historical/events/{id}/odds query:to
    • parameter: GET /v2/historical/events/{id}/odds query:region
    • enum value: GET /v2/historical/events/{id}/odds query:region: "uk"
    • parameter: GET /v2/historical/events/{id}/odds query:oddsFormat
    • enum value: GET /v2/historical/events/{id}/odds query:oddsFormat: "decimal"
    • enum value: GET /v2/historical/events/{id}/odds query:oddsFormat: "american"
    • parameter: GET /v2/historical/events/{id}/odds query:bookmakers
    • parameter: GET /v2/historical/events/{id}/odds query:exchanges
    • parameter: GET /v2/historical/events/{id}/odds query:markets
    • parameter: GET /v2/historical/events/{id}/odds query:exchangesOnly
    • enum value: GET /v2/historical/events/{id}/odds query:exchangesOnly: "true"
    • enum value: GET /v2/historical/events/{id}/odds query:exchangesOnly: "false"
    • parameter: GET /v2/historical/events/{id}/odds query:limit
    • parameter: GET /v2/historical/events/{id}/odds query:cursor
    • parameter: GET /v2/historical/events/{id}/odds query:quote
    • path: GET /v2/historical/closing
    • parameter: GET /v2/historical/closing query:date
    • parameter: GET /v2/historical/closing query:sports
    • parameter: GET /v2/historical/closing query:region
    • enum value: GET /v2/historical/closing query:region: "uk"
    • parameter: GET /v2/historical/closing query:bookmakers
    • parameter: GET /v2/historical/closing query:exchanges
    • parameter: GET /v2/historical/closing query:markets
    • parameter: GET /v2/historical/closing query:exchangesOnly
    • enum value: GET /v2/historical/closing query:exchangesOnly: "true"
    • enum value: GET /v2/historical/closing query:exchangesOnly: "false"
    • parameter: GET /v2/historical/closing query:limit
    • parameter: GET /v2/historical/closing query:cursor
    • parameter: GET /v2/historical/closing query:quote
    • path: GET /v2/historical/files
    • parameter: GET /v2/historical/files query:tier
    • enum value: GET /v2/historical/files query:tier: "closing"
    • enum value: GET /v2/historical/files query:tier: "60s"
    • enum value: GET /v2/historical/files query:tier: "5s"
    • enum value: GET /v2/historical/files query:tier: "1s"
    • enum value: GET /v2/historical/files query:tier: "changes"
    • parameter: GET /v2/historical/files query:sports
    • parameter: GET /v2/historical/files query:from
    • parameter: GET /v2/historical/files query:to
    • parameter: GET /v2/historical/files query:region
    • enum value: GET /v2/historical/files query:region: "uk"
    • path: GET /v2/historical/files/{tier}/{sport}/{file}
    • parameter: GET /v2/historical/files/{tier}/{sport}/{file} path:tier
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} path:tier: "closing"
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} path:tier: "60s"
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} path:tier: "5s"
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} path:tier: "1s"
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} path:tier: "changes"
    • parameter: GET /v2/historical/files/{tier}/{sport}/{file} path:sport
    • parameter: GET /v2/historical/files/{tier}/{sport}/{file} path:file
    • parameter: GET /v2/historical/files/{tier}/{sport}/{file} query:region
    • enum value: GET /v2/historical/files/{tier}/{sport}/{file} query:region: "uk"
    • parameter: GET /v2/historical/files/{tier}/{sport}/{file} query:quote
    • error code: 400 date_out_of_range
    • error code: 403 exchange_history_unavailable
    • error code: 403 files_need_whole_scope
    • error code: 404 no_history
    • error code: 429 too_many_downloads
    • required field: #/components/schemas/HistoricalRawMeta: feed_type
    • required field: #/components/schemas/HistoricalRawMeta: region
    • required field: #/components/schemas/HistoricalRawMeta: odds_format
    • required field: #/components/schemas/HistoricalRawMeta: processed_at
    • required field: #/components/schemas/HistoricalRawMeta: count
    • required field: #/components/schemas/HistoricalRawMeta: version
    • required field: #/components/schemas/HistoricalRawMeta: next_cursor
    • required field: #/components/schemas/HistoricalRawMeta: total
    • required field: #/components/schemas/HistoricalRawMeta: board_version
    • required field: #/components/schemas/HistoricalRawMeta: historical
    • required field: #/components/schemas/HistoricalRawMeta: timestamp
    • required field: #/components/schemas/HistoricalRawMeta: previous_timestamp
    • required field: #/components/schemas/HistoricalRawMeta: next_timestamp
    • required field: #/components/schemas/HistoricalRawMeta: complete
    • enum value: #/components/schemas/HistoricalRawMeta/properties/feed_type: "raw"
    • enum value: #/components/schemas/HistoricalRawMeta/properties/odds_format: "decimal"
    • enum value: #/components/schemas/HistoricalRawMeta/properties/odds_format: "american"
    • enum value: #/components/schemas/HistoricalRawMeta/properties/historical: true
    • required field: #/components/schemas/HistoricalRawEnvelope: meta
    • required field: #/components/schemas/HistoricalRawEnvelope: data
    • required field: #/components/schemas/ChangeRow: timestamp
    • required field: #/components/schemas/ChangeRow: event_id
    • required field: #/components/schemas/ChangeRow: bookmaker
    • required field: #/components/schemas/ChangeRow: market
    • required field: #/components/schemas/ChangeRow: outcome
    • required field: #/components/schemas/ChangeRow: last_update
    • enum value: #/components/schemas/ChangeRow/properties/removed: true
    • required field: #/components/schemas/HistoricalEventEnvelope: meta
    • required field: #/components/schemas/HistoricalEventEnvelope: data
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: feed_type
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: event_id
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: ids
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: from
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: to
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: count
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: next_cursor
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: historical
    • required field: #/components/schemas/HistoricalEventEnvelope/properties/meta: gaps
    • enum value: #/components/schemas/HistoricalEventEnvelope/properties/meta/properties/feed_type: "historical_event"
    • required field: #/components/schemas/ClosingOutcome: name
    • required field: #/components/schemas/ClosingEvent: id
    • required field: #/components/schemas/ClosingEvent: bookmakers
    • required field: #/components/schemas/ClosingEnvelope: meta
    • required field: #/components/schemas/ClosingEnvelope: data
    • enum value: #/components/schemas/ClosingEnvelope/properties/meta/properties/feed_type: "historical_closing"
    • required field: #/components/schemas/HistoricalFile: name
    • required field: #/components/schemas/HistoricalFile: tier
    • required field: #/components/schemas/HistoricalFile: sport
    • required field: #/components/schemas/HistoricalFile: day
    • required field: #/components/schemas/HistoricalFile: size
    • required field: #/components/schemas/HistoricalFile: url
    • required field: #/components/schemas/HistoricalFile: cost
    • enum value: #/components/schemas/HistoricalFile/properties/tier: "closing"
    • enum value: #/components/schemas/HistoricalFile/properties/tier: "60s"
    • enum value: #/components/schemas/HistoricalFile/properties/tier: "5s"
    • enum value: #/components/schemas/HistoricalFile/properties/tier: "1s"
    • enum value: #/components/schemas/HistoricalFile/properties/tier: "changes"
    • required field: #/components/schemas/FilesEnvelope: meta
    • required field: #/components/schemas/FilesEnvelope: data
    • enum value: #/components/schemas/FilesEnvelope/properties/meta/properties/feed_type: "historical_files"
  5. Contract diff

    Added

    • path: GET /v2/spotlight
    • parameter: GET /v2/spotlight query:region
    • required field: #/components/schemas/Spotlight: region
    • required field: #/components/schemas/Spotlight: generated_at
    • required field: #/components/schemas/Spotlight: arb
    • required field: #/components/schemas/Spotlight: pairs
    • required field: #/components/schemas/SpotlightArb: event_id
    • required field: #/components/schemas/SpotlightArb: sport_key
    • required field: #/components/schemas/SpotlightArb: sport_title
    • required field: #/components/schemas/SpotlightArb: home_team
    • required field: #/components/schemas/SpotlightArb: away_team
    • required field: #/components/schemas/SpotlightArb: commence_time
    • required field: #/components/schemas/SpotlightArb: market
    • required field: #/components/schemas/SpotlightArb: legs
    • required field: #/components/schemas/SpotlightArb: rating
    • enum value: #/components/schemas/SpotlightArb/properties/market: "h2h"
    • required field: #/components/schemas/SpotlightArb/properties/legs/items: outcome
    • required field: #/components/schemas/SpotlightArb/properties/legs/items: bookmaker
    • required field: #/components/schemas/SpotlightArb/properties/legs/items: price
    • required field: #/components/schemas/SpotlightPair: event_id
    • required field: #/components/schemas/SpotlightPair: sport_key
    • required field: #/components/schemas/SpotlightPair: sport_title
    • required field: #/components/schemas/SpotlightPair: commence_time
    • required field: #/components/schemas/SpotlightPair: market
    • required field: #/components/schemas/SpotlightPair: selection
    • required field: #/components/schemas/SpotlightPair: back
    • required field: #/components/schemas/SpotlightPair: lay
    • enum value: #/components/schemas/SpotlightPair/properties/market: "h2h"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "totals"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "btts"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "correct_score"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "double_chance"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "draw_no_bet"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "half_time_full_time"
    • enum value: #/components/schemas/SpotlightPair/properties/market: "win"
    • required field: #/components/schemas/SpotlightPair/properties/back: bookmaker
    • required field: #/components/schemas/SpotlightPair/properties/back: price
    • required field: #/components/schemas/SpotlightPair/properties/lay: exchange
    • required field: #/components/schemas/SpotlightPair/properties/lay: price
    • required field: #/components/schemas/SpotlightPair/properties/lay: available
  6. Contract diff

    Added

    • error code: 400 sport_not_served_by_this_worker
  7. Contract diff

    Added

    • required field: #/components/schemas/CoverageSummary: markets
  8. Contract diff

    Added

    • error code: 403 exchange_not_in_plan
    • error code: 403 market_not_in_plan
    • error code: 403 sport_not_in_plan
    • required field: #/components/schemas/Usage: scope
    • required field: #/components/schemas/Usage: scope_version
  9. Contract diff

    Added

    • parameter: GET /v2/odds/raw query:requireBookmakers
  10. Breaking

    Contract diff

    Removed

    • required field: #/components/schemas/MatchedMeta: unreliable_links
    • required field: #/components/schemas/MatchedMeta/properties/unreliable_links/items: bookmaker
    • required field: #/components/schemas/MatchedMeta/properties/unreliable_links/items: sport
  11. Documented the Accept-Encoding request header on GET /v2/odds/{type} and GET /v2/odds/raw. A request that does not send it gets a plain, uncompressed body.

    Contract diff

    Added

    • parameter: GET /v2/odds/{type} header:Accept-Encoding
    • parameter: GET /v2/odds/raw header:Accept-Encoding
  12. Breaking

    upgrade_url is no longer always present in a 402 error. A custom Enterprise plan does not carry one.

    Contract diff

    Removed

    • required field: #/components/schemas/Error402/properties/error: upgrade_url
  13. API version 2026-07-08

    The first published version: 14 endpoints and 31 error codes.