puntersedge_sport_odds
Compare pre-match bookmaker odds for one sport's upcoming events, with per-book freshness, data-quality scores, and market-level prices to spot value.
Instructions
Every bookmaker's prices for one sport's upcoming events, with per-book freshness and a data-quality score. Costs 1 credit PER REQUESTED MARKET, so keep markets narrow. PRE-MATCH ONLY — there is no in-play feed.
Returns: [{id, sport_key, sport_title, competition, odds_format, commence_time, home_team, away_team, canonical_event_id, bookmakers:[{key, title, last_update, age_seconds, stale, quality:{score, status, issues, source_count, stale_after_seconds}, markets:[{key:'h2h', quality:{…}, outcomes:[{name, price, point}]}]}], data_quality, data_age_seconds, stale, stale_bookmakers}] (top-level ARRAY). Outcome name is a TEAM NAME, not home/away. An event LEAVES this endpoint the moment it starts — nothing here updates during a match. canonical_event_id joins the same fixture across books that spell the teams differently.
NOTE: this shape is from the vendor's documentation and has NOT been verified against a live response (we hold no key for this provider). Treat it as approximate — inspect the actual payload before relying on a field name.
Example: Head-to-head prices across every book for the NRL {"sport_key": "nrl", "markets": "h2h"}
Auth: needs your own key in PUNTERSEDGE_API_KEY.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| markets | No | Comma-separated markets: h2h, spreads, totals. Billed 1 credit EACH, deduplicated before billing, and an unknown market is a free 422 rather than a paid empty list. | h2h |
| sport_key | Yes | sport_key from puntersedge_sports, e.g. afl, nrl, soccer_epl. There is no racing sport_key — 'horse-racing' returns 404. Required — part of the URL path. | |
| bookmakers | No | Comma-separated bookmaker keys to restrict to, case-insensitive. An unrecognised key returns a free 422 naming the valid keys. | |
| oddsFormat | No | Price format. One of: decimal, american. | decimal |
| competition | No | Filter to one competition, case-insensitive exact match, e.g. NRLW. A value this sport has never carried returns a 422 listing the ones it has, not an empty 200. | |
| maxAgeMinutes | No | Exclude bookmaker markets older than this many minutes. The default allows 3-hour supplemental feeds while hiding multi-day stale prices. | |
| include_unknown_competition | No | When filtering by `competition`, also return events whose competition is null. On by default because not every bookmaker supplies one and on some sports most of the card is unlabelled — so the filter means 'this competition or unlabelled', not 'this competition'. |