Coverage & data model
SharpRelay delivers a reviewed, independently operated REST contract around Pinnacle-sourced sports, events, prices, results, and special markets. The catalog is broad, but availability remains event- and time-specific.
The authenticated data contract has 12 read-only routes.
Its prop surface supports event-level discovery, latest or available history
for one prop_id per request, and outright discovery with per-ID
prices. Event-wide bulk prop prices and prop-specific opening, closing, results,
and CLV operations are not exposed in v1 beta.
44 sports with historical standard-market data, 2.4B+ reported odds rows, five normalized core market families, and history since 2021. Eleven sports were observed within 24 hours of the snapshot and eleven within seven days. The rounded aggregate size labels were last observed 2026-08-05 23:24 UTC; those and the coverage timestamps are evidence, not uptime or future-availability promises.
Use /v1/catalog/sports and the related catalog routes at
integration time. A historical catalog proves archive depth; the authenticated
catalog response is the integration-time authority relative to this dated page.
It can be served from the disposable response cache for roughly one hour, so
inspect X-Cache and refresh it on a slow timer rather than assuming
zero-staleness.
Historical sport catalog
The reviewed snapshot contains: Soccer, Basketball, Tennis, Baseball, Hockey, E Sports, Football, Handball, Volleyball, Rugby Union, MMA, Rugby League, Aussie Rules, Golf, Futsal, Boxing, Badminton, Water Polo, Darts, Snooker, Cycling, Biathlon, Curling, Cricket, Bandy, Cross Country, Alpine Skiing, Athletics, Olympics, Formula 1, Ski Jumping, Table Tennis, Sumo, Chess, Beach Volleyball, Padel Tennis, Field Hockey, Entertainment, Squash, Slap Fighting, Motorsport, Lacrosse, Softball, and Crossfit.
Historical depth varies substantially by sport. The static list deliberately does not freeze sport IDs, league IDs, period definitions, or offering flags; discover those through the authenticated catalog so your integration remains correct when source metadata changes.
Market surface
| SharpRelay market | Typical sides | Availability |
|---|---|---|
moneyline | Home / draw / away | Full event and sport-specific periods when offered |
spread | Home / away against a handicap | Main and alternate lines when offered |
totals | Over / under a combined total | Main and alternate lines when offered |
home_totals | Over / under the home-team total | Event- and period-specific |
away_totals | Over / under the away-team total | Event- and period-specific |
Prices are decimal. Corresponding margin-removed fair prices are included when supplied. The contract also covers opening lines, closing lines, available historical movement, event results, cancellations, re-settlements, and CLV analysis.
Props, specials & outrights
The reviewed source snapshot reported specials data across ten source sport labels, including player props, team props, and game props. Coverage is contestant-based and can change independently of standard event lines. One specials-only source label was not silently merged with a standard sport; resolve the current sport and market IDs through the API catalog.
Outrights cover competition and tournament markets that are not tied to one
event. Their publication and settlement timelines differ from event markets,
so discover them through /v1/outrights rather than inferring them
from event availability. For both event props and outrights, use the returned
special_id as prop_id on
/v1/props/{prop_id}/odds and retrieve one market at a time.
The v1 beta intentionally does not expose event-wide bulk prop prices or prop-specific opening, closing, results, and CLV operations.
What the contract covers
| Area | Available data | How to discover it |
|---|---|---|
| Sports | Current sport IDs, names, and offering indicators | GET /v1/catalog/sports |
| Leagues | League IDs, names, country codes, and groupings when supplied | GET /v1/catalog/leagues?sport_id=… |
| Periods | Sport-specific period numbers and market labels; period 0 is the full event | GET /v1/catalog/periods?sport_id=… |
| Pre-game events | Future fixtures by default: without an explicit window or identifier, starts remain strictly after the request boundary and in the future at final validation. Includes participants, start times, availability flags, parent relationships, and update versions. A present or future starts_from remains locally enforced as a future lower bound; a supplied starts_to is locally enforced as an inclusive timestamp or complete UTC-day upper bound. Only a genuinely past lower bound opts into historical discovery. | GET /v1/events |
| In-play events | Currently offered live events selected from the complete bounded candidate boundary for the requested filters. Every returned event has live_status=1; its latest odds are bound to that event and include an explicitly open line with a cutoff strictly after final validation. Expiry is rechecked at final validation. Expired, settled, historical-only, and fully suspended records are excluded. No arbitrary update-age or kickoff-age floor is applied. Each request is freshly verified and is not response-cached. Broad pages verify at most max(4, 2 × limit), capped at 512, from a boundary of up to 1,000 fixture candidates; exact event lookup verifies one. | GET /v1/events?live=1 |
| Core prices | By default, every primary and alternate market row at the greatest positive line_id for each event and period; older off-board line IDs are excluded. full_history and since explicitly select history. | GET /v1/events/{event_id}/odds |
| Line lifecycle | Latest, incremental, or available history plus opening and closing rows | Event odds, opening-lines, and closing-lines routes |
| Results | Period scores and settlement, cancellation, or re-settlement state | GET /v1/events/{event_id}/results |
| Props & specials | Event prop discovery plus latest or available historical prices for one prop_id per request. Event-wide bulk prop prices and prop-specific opening, closing, results, and CLV are outside the v1 beta contract. | GET /v1/events/{event_id}/props, then GET /v1/props/{prop_id}/odds |
| Outrights | Competition and tournament market discovery, followed by latest or available historical prices one returned special_id at a time | GET /v1/outrights?sport_id=…, then use special_id as prop_id |
| CLV | Observed/fair closing price, expected win, and closing-line value for a matched bet | GET /v1/analytics/clv |
Coverage discovery workflow
- List the current API sport catalog and retain the opaque
sport_id; account for its roughly one-hour cache window. - Enumerate the sport's leagues and period definitions.
- Query
/v1/eventsby league or sport for future pre-match fixtures. Without an explicit kickoff window, ordinary discovery applies a request-current lower bound and filters again at delivery, so returned starts remain strictly future. Supplying a present or futurestarts_from, normally together withstarts_to, narrows the future window and remains locally enforced; only a genuinely past lower bound is the explicit historical-discovery path. Exactevent_idandparent_idlookups are lifecycle-specific rather than future-only. - Query
live=1separately for currently offered in-play events. Without an explicitstarts_from, live discovery applies no minimum kickoff; add one only to narrow the candidate window. This route is not response-cached. It reads the complete bounded candidate boundary, then performs bounded per-page verification. Every returned event must havelive_status=1and an event-bound latest open line whose cutoff is still strictly future when expiry is rechecked at final validation. - Use returned event IDs and availability flags to request odds, opening, closing, results, and special markets.
- For
live=1, follow everyX-Next-Cursorwithin five minutes—even after an empty page—until the header is absent. IfX-Result-Truncated: trueremains without a next cursor, narrow the sport, league, or kickoff window. For pre-game incremental discovery, use a movingsincevalue; the implicit future boundary still applies unless you explicitly choose a kickoff window.
Price-side semantics
| Field | Moneyline / spread | Totals-style market |
|---|---|---|
odds1 | Home-side decimal price | Over decimal price |
odds0 | Draw decimal price when applicable | Middle outcome when supplied |
odds2 | Away-side decimal price | Under decimal price |
todds* | Corresponding margin-removed fair decimal price when supplied | |
Availability and completeness
Fields are optional or nullable because availability varies by sport, event,
market, and lifecycle state. Unknown source fields are removed. A successful
empty array means no matching rows are currently available; a CLV 404
means no suitable event or closing line could be matched and is not a zero-value
analysis.
Event odds default to the greatest positive line_id snapshot for
each event and period, retaining every primary and alternate market row present
at that snapshot and excluding older off-board line IDs. Prop odds default to
one greatest-line_id row per special_id + contestant_line_id;
handicap is a value on the winning row, not a separate latest
identity. Set
full_history=1 to request available matching history. Event odds
additionally accept a moving since cursor for incremental history;
use it by itself or with full_history=1, because
since=...&full_history=0 is rejected. Inspect
X-Result-Truncated and never assume a historical response is
complete. Opening and closing routes return the first or latest available line,
respectively, only where those snapshots exist. Closing rows and results can be
corrected or re-settled, so refresh them whenever revisions matter.
SharpRelay is data-only: no bet placement, balances, account wagering, parlay construction, bookmaker comparison, or public streaming/WebSocket contract. Pinnacle is the underlying data source; SharpRelay is independent and is not affiliated with, endorsed by, or sponsored by Pinnacle.