---
title: "Final scores by sport"
method: GET
path: "/v1/sports/{sport_key}/results"
tags: ["Sports"]
---

# Final scores by sport

`GET /v1/sports/{sport_key}/results`

## Request

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

Final scores from the league's own record, for the codes we collect.

Cost: 1 credit.

**Covered: AFL, AFLW, NRL, NRLW** — collected from the AFL's and NRL's own public APIs.
Another sport is a free 422 naming these, not an empty 200: an empty list cannot be told
apart from a round with no games.

`event_id` ties a result to the fixture you have prices for. It is null when the league
played a match we were not pricing (most of a backfilled season), and also when two of our
fixtures matched it equally well — in that case nothing is guessed and `match_note` says so.
One real example: our own feed currently holds the same women's World Cup fixture twice,
as 'Papua New Guinea Women' and 'Papua New Guinea Orchids', so that result stays unlinked
rather than attaching to one of them.

Scores are null until the league calls the match final, so an abandoned or scheduled fixture
never reads as a nil-all.

## Path parameters

- `sport_key` string, required

## Query parameters

- `season` integer: Calendar year of the season. Omit for the most recent results first.
- `competition` string: Filter on the league's competition name, case-insensitive substring (e.g. 'AFLW', 'Premiership', 'World Cup').
- `final_only` boolean: Only matches the league has called final. Set false to see scheduled and in-progress fixtures too, which carry null scores.
- `linked_only` boolean: Only results tied to a fixture in the odds feed. Use it when you are settling bets and a result you cannot join is no use to you.
- `limit` integer

## Headers

- `X-API-Key` string
- `X-RapidAPI-Proxy-Secret` string

## Response `200`

Successful Response

- SportResultOut[]
  - `sport_key` string, required
  - `competition` string, nullable: The league's own name for the competition, verbatim ('Telstra Premiership', '2026 NAB AFLW Season').
  - `season` integer, nullable
  - `round_title` string, nullable: The league's round label ('Round 27', 'Grand Final').
  - `home_team` string, required: The LEAGUE's spelling, which is not always a bookmaker's: the NRL publishes nicknames ('Roosters'), and AFLW clubs carry no '(W)' suffix here. Read `event_id` to join to the fixture you have prices for.
  - `away_team` string, required
  - `home_score` integer, nullable: Null until the league calls the match final — never 0 for an unplayed or abandoned fixture. For AFL this is the total (20.12 -> 132); `detail` keeps goals and behinds, which the total cannot express.
  - `away_score` integer, nullable
  - `status` string, required: `final` once the league says so; otherwise the league's own word for the state ('upcoming', 'unconfirmed_teams'), carried through rather than mapped, so a postponed fixture is never read as a result.
  - `start_time` string, nullable: Scheduled kick-off, UTC.
  - `venue` string, nullable
  - `detail` object, nullable: The code's own scoring and state as the league published it. AFL carries {goals, behinds, totalScore, superGoals} per side.
  - `event_id` string, nullable: The fixture in GET /v1/sports/{sport_key}/odds this result belongs to, or null when it could not be tied to one CONFIDENTLY. Null is common and is not a defect: we keep the whole league season, while the odds feed holds only the fixtures we currently price. A null also appears where two of our fixtures matched equally well, in which case nothing is guessed — see `match_note`.
  - `match_note` string, nullable: How the result reached its fixture: `exact` (both team names identical once normalised), `fuzzy` (matched through the same name-matching the odds feed uses to unify bookmakers), `no candidate fixture`, or `ambiguous: N ...` where two fixtures matched and neither was chosen.
  - `source` string, required: Which league published it: `nrl` or `afl`.

## Other responses

- `401`: Missing or invalid API key. Send `X-API-Key`. See https://puntersedge.online/developers/errors
- `402`: Monthly credit allowance exhausted for this plan. Upgrade at https://puntersedge.online/api/pricing
- `422`: Validation Error
- `429`: Rate limit exceeded for this plan. Honour the `Retry-After` header (seconds) before retrying. See https://puntersedge.online/developers/rate-limits
- `500`: Unexpected server error. Safe to retry with backoff.

---

[API](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api.md) · [All operations](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/llms.txt) · [OpenAPI document](https://skmtc.dev/puntersedge/apis/puntersedge-odds-api/revisions/f35b6aab1946?raw)
