Ultimate Fighting Calendar
UFCalendar Fight API

UFC Scorecards API: judges, round-by-round scores, deductions

The UFCalendar UFC Scorecards API returns the official judges' scorecards for any UFC bout that went to a decision — every official, their score for each round, the card totals, the decision type and any point deductions — back to 1995. 3,802 scored UFC bouts and 485 officials, plus PFL and OKTAGON on the same endpoint. No other MMA API serves scorecards.

Free 1-day trial · 100 requests · no credit card. Paid plans from $19/mo, cancel anytime.

3,802
UFC bouts with official scorecards
485
officials in the directory
1995
cards go back to this year

One call, the whole panel

GET /v1/fights/{id}/scorecards returns all three cards with per-round numbers, each judge's totals and winner_fighter_id — who that official gave it to. Scores are oriented to the bout's fighter_a_id and fighter_b_id, both repeated on the payload, so you never fetch the fight just to read a card. Robbery meters, round-win charts and scorecard graphics are all one request.

Judges are first-class

Every official has an id, a profile and a full history: GET /v1/judges gives you fights worked, rounds scored, rounds scored 10-8 or wider, three-judge cards that came back split, and lone dissents — cards where that judge alone picked the other corner. GET /v1/judges/{id}/scorecards walks their entire career, newest first.

Endpoints for this job

Method and path, linked to the reference. The same key covers every endpoint in the API.

Method & pathWhat it returns
GET /v1/fights/{id}/scorecardsJudges' scorecards for any bout: every official, their score for each round, card totals, decision type and point deductions.
GET /v1/judgesJudge directory with career shape: fights worked, rounds scored, 10-8s, split cards and lone dissents.
GET /v1/judges/{id}/scorecardsEvery card a single official has turned in, newest first, with the bout and event attached.
GET /v1/events/{slug}One event with its full fight card (both corners, results when completed), venue and event-level broadcasts.

Quickstart in curl, Python and JavaScript

Complete requests against the live API. Any HTTP client works, or `pip install ufcalendar` for a typed Python client (source on GitHub); every response is plain JSON in a {"data": ..., "meta": ...} envelope.

curl
$ curl "https://api.ufcalendar.com/v1/fights/83379/scorecards" \
    -H "Authorization: Bearer $UFCAL_KEY"

{
  "data": {
    "fight_id": 83379,
    "fighter_a_id": 213,
    "fighter_b_id": 1120,
    "decision_type": "split",
    "deductions": [],
    "cards": [
      {
        "judge_id": 36,
        "judge_name": "Vito Paolillo",
        "total_a": 28,
        "total_b": 29,
        "winner_fighter_id": 1120,
        "is_draw": false,
        "scores_known": true,
        "rounds": [
          { "round": 1, "a": 9,  "b": 10 },
          { "round": 2, "a": 10, "b": 9  },
          { "round": 3, "a": 9,  "b": 10 }
        ]
      }
      // … two more cards
    ]
  },
  "meta": { "fight_id": 83379 }
}
Python
from ufcalendar import FightAPI

api = FightAPI()  # UFCAL_KEY in the environment

card = api.fight_scorecards(83379)
print(card["decision_type"])          # "split"

for c in card["cards"]:
    if not c["scores_known"]:         # pre-2005: outcome only, no numbers
        continue
    print(c["judge_name"], f"{c['total_a']}-{c['total_b']}")

# Every card a judge has ever turned in, newest first:
for row in api.judge_scorecards(36, limit=50):
    print(row["event"]["title"], row["card"]["total_a"], row["card"]["total_b"])
JavaScript
const h = { Authorization: `Bearer ${process.env.UFCAL_KEY}` };

// Who scores the most 10-8 rounds?
const res = await fetch(
  "https://api.ufcalendar.com/v1/judges?org=ufc&min_fights=50&limit=100",
  { headers: h },
);
const { data } = await res.json();

const byWideRate = data
  .map((j) => ({ name: j.name, rate: j.wide_rounds / j.rounds_scored }))
  .sort((a, b) => b.rate - a.rate);

console.table(byWideRate.slice(0, 10));

Questions

Does the API include UFC judges' scorecards?
Yes. Every UFC bout that went to a decision since 1995 — 3,802 of them — with each judge's score for every round, their card total, the decision type (unanimous, split, majority, and the draw variants) and any point deductions. PFL from 2018 and OKTAGON from 2025 use the same endpoint. Call GET /v1/fights/{id}/scorecards.
Where does the scorecard data come from?
It is the official athletic-commission record for the bout — the same numbers the commission releases and the promotion publishes after the event. Media-member scorecards and fan scoring are not part of the API.
Why do some old cards have no round scores?
Commissions before roughly 2005 often released only the outcome, not the numbers. Those cards carry scores_known: false, an empty rounds array, and a placeholder total (1-0, 1-1 or 0-0) that encodes who the judge picked rather than a score. Filter on scores_known before charting totals — 66 bouts in the archive are like this.
Can I build a robbery or bad-judging tracker with this?
That is exactly what it is for. Per-round scores plus judge ids let you compute disagreement between officials, 10-8 frequency per judge, and how often a judge stood alone against the other two. The judge directory ships those aggregates precomputed so you do not have to walk the archive yourself.

UFC API guides by use case

One page per job — schedules, results, per-round statistics and rankings history — each with its own endpoints, sample responses and code.

UFCalendar is an independent publication, not affiliated with UFC/Zuffa/TKO, PFL, OKTAGON MMA, BKFC, RIZIN FF or any promotion. Organization names are used to describe the data. Terms of service · Refund Policy