Returns historical closing odds per sportsbook: moneyline, spread and total at close for archived games, with the provenance of each row.
Returns historical closing odds per sportsbook: moneyline, spread and total at close for archived games, with the provenance of each row.
Either eventId or sport is required, and sport alone is rejected as too broad: add startDate, book, source or season.
Rows from different sources coexist for the same event and book and are not interchangeable: published-close is the book's final published closing price, live-derived is the last snapshot captured at or before the start time (only as close to the close as capture ran) and exists only for games with a known start time from 2026-09-16, and archive-1, archive-2 and archive-3 are third-party historical archives kept distinct because several can coexist for one event and book.
Three-way moneylines carry a draw key; two-outcome sports omit the key entirely rather than sending null.
Pass the event's eventId field, the {sport}:{away}@{home}-{YYYYMMDD} form. The numeric id field beside it is the sportsbook's own and returns 400 here rather than an empty result. The date in eventId is the UTC start date, except for MLB games starting from 2026-10-11T10:00Z, which carry the US Eastern date; earlier MLB games keep the UTC date. Before that change, an MLB game starting at 8 PM ET or later and the next day's game between the same teams could share one eventId. NBA and NHL stay UTC-dated. NBA has about one pair of games a season sharing an eventId. NHL has about one pair a season of the same teams on one date, home and away swapped: two eventIds, but the /api/v1/history endpoints match both orderings, so each id returns both games' rows.
Historical endpoints share a per-key in-flight limit that is lower than the general concurrent-request limit. A request beyond it returns 429 with a Retry-After header giving the delay in seconds; wait that long and resend.
503 with a Retry-After header means the archive could not serve that request: the query was too expensive to run in one request, or the archive read path was busy. Wait the indicated seconds before resending; if it repeats, narrow the request with the filters this endpoint accepts.
Page one event at a time with limit and offset and stop when a page comes back shorter than limit. Do not fan out one request per book or market in parallel.
Request
- Base URL: https://api.owlsinsight.com
- URL: https://api.owlsinsight.com/api/v1/history/closing-odds
- Auth: HTTP bearer
Query parameters
Archived game identifier. Optional when sport plus a narrowing filter is given.
Filter by sport key. Required when eventId is omitted.
Restrict to one sportsbook.
Restrict to one provenance.
Earliest game date to include, YYYY-MM-DD.
Latest game date to include, YYYY-MM-DD.
Season label, for example 2024-25. Only sports with a labelled season match; where none is recorded the filter matches nothing, so narrow with startDate or book instead.
Page size. Default 50, maximum 100.
Number of rows to skip, for pagination.
Response
OK
Changes
No recorded changes to this operation across all 1 revision of this API.