Sports

Get odds by sport

Cost: 1 credit per requested market. Parameters: sport_key selects the sport (for example afl or nrl); markets is a comma-separated list such as h2h,spreads,totals; bookmakers optionally filters bookmaker keys; oddsFormat accepts decimal or american.

markets is deduplicated and validated before billing, so a repeated market is charged once and an unknown one is a free 422 rather than a paid empty list.

There is no racing sport_key. For horse, harness or greyhound racing use GET /v1/racing/next-to-go (2 credits) or GET /v1/racing/events instead — passing 'horse-racing' here returns 404, because racing is a separate endpoint family.

Pre-match only. There is no in-play feed. An event is listed until its commence_time and leaves this endpoint the moment it starts; no bookmaker connector reads in-play markets, so nothing here updates during a match. The last pre-match prices for an event that has started are kept in GET /v1/sports/{sport_key}/odds/history and the move feed at GET /v1/sports/{sport_key}/odds/movements. (Documented 2026-09-10 after a customer polled a game through kick-off expecting live prices.)

get/v1/sports/{sport_key}/odds

Request

  • Base URL: https://api.puntersedge.online
  • URL: https://api.puntersedge.online/v1/sports/{sport_key}/odds
  • Auth: API key in header X-API-Key

Path parameters

sport_keystring required

Query parameters

marketsstring

Comma-separated: h2h,spreads,totals

bookmakersstring

Comma-separated bookmaker keys, or omit for all. Case-insensitive. An unrecognised key is a free 422 naming the valid keys, so a typo costs nothing.

competitionstring

Filter to one competition, case-insensitive exact match (e.g. NRLW). A value this sport has never carried is a 422 listing the ones it has, not an empty 200 — see include_unknown_competition for why that distinction matters. See the competition field on each event.

include_unknown_competitionboolean

When filtering by competition, ALSO return events whose competition is null — not every bookmaker supplies one, and on some sports most of the card is unlabelled (ncaaf 40 of 47 upcoming events, tennis_atp 21 of 72). Because of this the filter is 'this competition OR unlabelled', so a result set is not proof that the competition matched anything: an unrecognised value is rejected with 422 rather than answering with the unlabelled events alone. Set false for a strict exact match that returns only events explicitly labelled with this competition.

oddsFormatstring

decimal or american

maxAgeMinutesinteger

Exclude bookmaker markets older than this many minutes; default 360 allows 3-hour supplemental feeds while hiding multi-day stale prices.

Headers

X-API-Keystring
X-RapidAPI-Proxy-Secretstring

Response

Successful Response

idstring required
sport_keystring required
sport_titlestring required
commence_timestring required
home_teamstring nullable required
away_teamstring nullable required
competitionstring nullable
bookmakersobject[] required
odds_formatstring nullable
fetched_atstring nullable
data_age_secondsinteger nullable
freshest_age_secondsinteger nullable
staleboolean
stale_bookmakersstring[]
cachedboolean nullable
cache_age_secondsinteger nullable
canonical_event_idstring nullable
data_qualityobject nullable

Example response

[
  {
    "away_team": "Collingwood",
    "bookmakers": [
      {
        "key": "sportsbet",
        "markets": [
          {
            "key": "h2h",
            "outcomes": [
              {
                "name": "Brisbane Lions",
                "price": 1.9
              }
            ]
          }
        ],
        "title": "Sportsbet"
      }
    ],
    "commence_time": "2026-06-07T09:30:00Z",
    "data_age_seconds": 15,
    "fetched_at": "2026-06-07T09:29:45+00:00",
    "home_team": "Brisbane Lions",
    "id": "event_123",
    "sport_key": "afl",
    "sport_title": "AFL",
    "stale": false
  }
]

Changes

No recorded changes to this operation across all 1 revision of this API.