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.
X-API-Key
1 credit per requested market
curl 'https://api.puntersedge.online/v1/sports/afl/odds' \
-H 'X-API-Key: YOUR_KEY'
| Name | In | Type | Required | Description |
|---|---|---|---|---|
sport_key |
path | string | yes | |
markets |
query | string | no | Comma-separated: h2h,spreads,totals |
bookmakers |
query | string | no | Comma-separated bookmaker keys, or omit for all |
competition |
query | string | no | 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_competition |
query | boolean | no | 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. |
oddsFormat |
query | string | no | decimal or american |
maxAgeMinutes |
query | integer | no | Exclude bookmaker markets older than this many minutes; default 360 allows 3-hour supplemental feeds while hiding multi-day stale prices. |
Status codes: 200, 401, 402, 422, 429, 500. Response bodies are JSON; the full schema is in /openapi.json.
GET /v1/sports — List available sportsGET /v1/sports/{sport_key}/odds/history — Historical odds snapshotsGET /v1/sports/{sport_key}/odds/movements — Price movement feedThe free tier needs no credit card, and the sandbox endpoints need no key at all.
Get a free API key Quickstart