---
title: "Judges' scorecards for a bout"
method: GET
path: "/v1/fights/{id}/scorecards"
tags: ["Scorecards"]
---

# Judges' scorecards for a bout

`GET /v1/fights/{id}/scorecards`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/fights/{id}/scorecards`
- Auth: HTTP bearer

The official athletic-commission record: every judge, their score for each round, their card total, the decision type and any point deductions. UFC back to 1995, PFL to 2018, OKTAGON to 2025, RIZIN from March 2026 (Japan has no athletic commission — the record is the one published by the officials body that judges RIZIN). UFC cards are cross-checked against the official scorecards ufc.com publishes (Dana White's Contender Series and Road to UFC included, from March 2022), which also fill bouts the commission record does not cover. `source` says who published the cards: `commission-record`, `ufc-official-cards`, or a promotion's own slug (`oktagon-official`, `pfl-official`, `aca-official`).

`total_a`/`total_b` and every round are oriented to the bout's `fighter_a_id`/`fighter_b_id`, which are repeated on the payload so you never have to fetch the fight to read a card. `winner_fighter_id` is who THAT judge gave it to.

**Check `scores_known` before charting totals.** When it is false the commission published only the outcome, and `total_a`/`total_b` are a 1-0 / 1-1 / 0-0 placeholder rather than a score (66 fights, nearly all pre-2005); `rounds` is empty on those cards.

**A bout with no commission record answers 200, not 404** (2026-09-24): `cards: []`, `decision_type: null`, and `meta.note` says why (a finish, or cards not yet published). 404 is reserved for an unknown fight, so a client can tell the two apart.

**Some cards carry no judge identity.** PFL's US events have no published commission scorecard, so those bouts are served from PFL's own results post: three cards with `judge_id`/`judge_name` null, `total_a`/`total_b` set and `rounds` empty. `scores_known` is still true — the totals are real. Europe/UAE PFL cards and every other org carry the named, round-by-round record.

Media-member and fan scorecards are not part of this dataset.

## Path parameters

- `id` integer, required

## Response `200`

Scorecards

- FightScorecardsResponse: `cards` is empty (and `meta.note` explains) when no commission record exists; 404 only for an unknown fight.
  - `data` Scorecards, required: The official athletic-commission record for one bout.
    - `fight_id` integer, required
    - `fighter_a_id` integer, nullable, required
    - `fighter_b_id` integer, nullable, required
    - `decision_type` string, nullable, required: `unanimous`, `split`, `majority`, … as the commission record states; null when no record exists.
    - `deductions` Deduction[], required
      - `side` 'a' | 'b' | 'null', nullable, required
      - `fighter_id` integer, nullable, required: `side` resolved to the fighter id.
      - `points` integer, nullable, required
      - `round` integer, nullable, required
      - `reason` string, nullable, required: Null when the commission published no reason.
    - `cards` JudgeCard[], required: Empty when no commission record exists for the bout (a finish, or cards not yet published).
      - `judge_id` integer, nullable, required: Null on PFL's US results-post cards (no judge identity published).
      - `judge_name` string, nullable, required
      - `total_a` integer, nullable, required: Oriented to the bout's `fighter_a_id`.
      - `total_b` integer, nullable, required: Oriented to the bout's `fighter_b_id`.
      - `winner_fighter_id` integer, nullable, required: Who THIS judge gave it to.
      - `is_draw` boolean, required
      - `scores_known` boolean, required: false ⇒ the commission published the outcome only; totals are a 1-0 / 1-1 / 0-0 placeholder and `rounds` is empty.
      - `rounds` ScoreRound[], required
        - `round` integer, required
        - `a` integer, nullable, required
        - `b` integer, nullable, required
    - `source` string, nullable, required: Who published the cards: a promotion's own slug when it publishes the record itself (`oktagon-official`, `pfl-official`, `aca-official`), `ufc-official-cards` for the scorecards ufc.com publishes, else `commission-record` (the athletic-commission / officials-body record). Null on the empty record.
  - `meta` object, required
    - `fight_id` integer, required
    - `note` string
    - `ignored_params` string[]: Present only when the request carried query parameters this endpoint does not take — they were ignored. Same list as the `X-UFCalendar-Ignored-Params` header. Sorted, unique.

## Other responses

- `304`: Not Modified — `If-None-Match` matched the current weak `ETag`. Empty body.
- `401`: Missing/invalid API key (`unauthorized`).
- `403`: No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api.
- `404`: Not found (`not_found`; staged-org data 404s until the org is promoted).
- `429`: Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`.
- `500`: Something broke on our side (`internal_error`). It has been logged under the `request_id`.

---

[API](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api.md) · [All operations](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/revisions/9623cc8fb70b?raw)
