Skip to content
MMA Calendar
UFCalendar Fight API

UFC fight results data within minutes: winner, method, round and time, pushed by webhook, in the MMA Fight Data API

The MMA Fight Data 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 for 30,000 requests, cancel anytime.

Want the market's view of a bout too? One consensus line per fight, with the opening and closing odds, is on every plan. Odds in the MMA Fight Data API

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

Results in about two minutes

During a UFC event a result typically lands within about 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, event.completed and odds.moved 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.

Endpoints for this job
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.
GET /v1/fights/search?org=ufc&title_only=trueSearch completed bouts by title fight, finish method, division, fighter, winner or date range: the last title fight to end by knockout in one call.
POST /v1/webhook-endpointsSigned webhooks for fight results, card changes, event completion and consensus odds moves · 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/ufc-330-2026-08-15" \
    -H "Authorization: Bearer $UFCAL_KEY"

{
  "data": {
    "slug": "ufc-330-2026-08-15",
    "title": "UFC 330: Makhachev vs Machado Garry",
    "status": "completed",
    "card": [
      {
        "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"]["card"]
for f in card:
    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" },
//   "revision": 1, "corrected": false } }
// A correction within 72 h re-sends it as revision 2+ with "corrected": true and the "previous" result —
// upsert on fight_id. Signed with the endpoint secret (X-UFCalendar-Signature). Deliveries never count against your quota.

Pricing

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

Pricing & plans →

Who it's for

Built for indie developers, side projects and small teams. Whether you're building a fantasy app, a stats site, a Discord bot or an analytics project, our plans are priced for you. We don't sell enterprise contracts, and we don't plan to.

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?
A result typically appears in the API within about 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?
Yes, as a separate call. GET /v1/fights/{id}/scorecards returns every judge's per-round scores, card totals, decision type and point deductions for UFC decisions back to 1995, and the same scorecards for PFL, OKTAGON and RIZIN. The result object itself carries the decision type, round and time. Media and fan scores are not served.
Can I build a real-time UFC results app with it?
Yes. Each result and the bout’s final stats land in the API within minutes of the official decision, and on Pro and Business plans the fight.result webhook pushes them to your server, so your app updates without polling. card.changed and event.announced keep late swaps and new cards in sync.

MMA Fight Data API guides by use case

One page per job: schedules, results, per-round statistics, rankings history, judges' scorecards and consensus odds, 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