Ultimate Fighting Calendar
UFCalendar Fight API

UFC Results API: winner, method, round and time within minutes

The UFCalendar UFC Results API serves the result of every UFC fight since UFC 1 in 1993 — winner, method, round, time, referee and performance bonuses — with live results landing within about 2 minutes of the official verdict, and signed fight.result webhooks on Pro plans so you never poll.

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

800
UFC events with full results, back to UFC 1
~2 min
from official verdict to the API, during live events
4
webhook event types: announced, result, card change, completed

Results in about two minutes

During a UFC event the pipeline polls the official statistics feed every 5 minutes and typically lands a result within 2 minutes of the verdict. Query GET /v1/events?org=ufc&status=completed for the newest cards, or GET /v1/fights/{id} for one bout.

Webhooks for results and card changes

Register up to 3 endpoints (Pro and up) and receive fight.result, card.changed, event.announced and event.completed as signed JSON deliveries. Deliveries never count against your request quota.

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/events?org=ufc&status=completedCompleted cards newest-first, each with the full card and every result.
GET /v1/events/{slug}One event with its full fight card (both corners, results when completed), venue and event-level broadcasts.
GET /v1/fights/{id}One bout with corners, result (winner, method, round, time), referee and bonus flags.
POST /v1/webhook-endpointsSigned webhooks for fight results, card changes and event completion · no polling needed.

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/events?org=ufc&status=completed&limit=1" \
    -H "Authorization: Bearer $UFCAL_KEY"

{
  "data": [
    {
      "slug": "ufc-330-2026-08-15",
      "title": "UFC 330: Makhachev vs Machado Garry",
      "status": "completed",
      "fights": [
        {
          "id": 61204,
          "weight_class": "Welterweight",
          "is_title": true,
          "fighter_a": { "id": 1187, "name": "Islam Makhachev", "slug": "islam-makhachev" },
          "fighter_b": { "id": 3402, "name": "Ian Machado Garry", "slug": "ian-machado-garry" },
          "result": { "winner_fighter_id": 1187,
                      "method": "Decision - Unanimous", "round": 5, "time": "5:00" },
          "referee": "Herb Dean", "bonus": null
        },
        ...
Python
import requests

API = "https://api.ufcalendar.com/v1"
H = {"Authorization": f"Bearer {UFCAL_KEY}"}

# Every result from the newest completed UFC card
event = requests.get(f"{API}/events", params={"org": "ufc", "status": "completed", "limit": 1}, headers=H).json()["data"][0]
card = requests.get(f"{API}/events/{event['slug']}", headers=H).json()["data"]
for f in card["fights"]:
    r = f.get("result")
    if not r:
        continue
    corners = {c["id"]: c["name"] for c in (f["fighter_a"], f["fighter_b"]) if c}
    winner = corners.get(r["winner_fighter_id"], "draw / no contest")
    print(f"{f['fighter_a']['name']} vs {f['fighter_b']['name']}: {winner} by {r['method']} R{r['round']} {r['time']}")
JavaScript
// Pro plans: stop polling — register a signed webhook for fight results
const API = "https://api.ufcalendar.com/v1";
const headers = { Authorization: `Bearer ${process.env.UFCAL_KEY}`, "Content-Type": "application/json" };

await fetch(`${API}/webhook-endpoints`, {
  method: "POST",
  headers,
  body: JSON.stringify({ url: "https://example.com/hooks/ufcal", events: ["fight.result", "card.changed"] }),
});
// Each delivery: { "type": "fight.result", "sent_at": "...", "data": { "fight_id": 61204,
//   "event": { "slug": "ufc-330-2026-08-15", ... }, "fighters": { "a": "...", "b": "..." },
//   "result": { "winner": "Islam Makhachev", "winner_fighter_id": 1187, "method": "...", "round": 5, "time": "5:00" } } }
// signed with the endpoint secret (X-UFCalendar-Signature). Deliveries never count against your quota.

Questions

Can I get UFC fight results as JSON?
Yes. Every completed UFC fight returns a result object with winner_fighter_id, method (for example KO/TKO, Submission, Decision - Unanimous), round, time and details, plus referee and bonus flags, on GET /v1/fights/{id} and inside each event's card on GET /v1/events/{slug}.
How fast are UFC results available?
Live events are polled every 5 minutes; a result typically appears in the API within 2 minutes of the official verdict. Pro plans get a fight.result webhook within a minute of the write.
How far back do results go?
To UFC 1 in November 1993. All 800 UFC events carry full cards and results, and 98% of fights also carry per-fight statistics.
Do results include judges' scorecards?
No. Scorecards are not served by the API today. Results carry the decision type, round and time; per-judge scores are a planned addition once redistribution permission is settled.

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 or any promotion. Organization names are used to describe the data. Terms of service · Refund Policy