Ultimate Fighting Calendar
UFCalendar Fight API

The UFC API: results, stats & rankings history

Every UFC event back to UFC 1 in 1993 · full fight cards, results within minutes of the final bell, round-by-round statistics, complete fighter careers, and the only UFC rankings API with point-in-time history back to 2013.

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

What's inside

800
events since 1993
9,016
fights
8,819
fights with full stat lines
41,526
rounds of round-by-round stats
2,852
fighters with bios & records
102,945
official ranking rows

17 upcoming events already on the schedule · cards, venues and broadcasts included.

Historical UFC rankings, point-in-time

Ask what any fighter was ranked on any date since February 2013 · one ?date= query parameter. 102,945 ranking rows across 543 official snapshots, champion at rank 0, valid until superseded. No other UFC API serves rankings history.

Results in minutes, webhooks included

During live UFC events the pipeline polls every 5 minutes and results typically land within 2 minutes of the verdict. Pro plans add signed webhooks for fight results and card changes · no polling loop required.

Sample request

$ curl "https://api.ufcalendar.com/v1/events?org=ufc&status=completed&limit=1" \
    -H "Authorization: Bearer ufcalendar_..."

{
  "data": [
    {
      "slug": "ufc-330-2026-08-15",
      "title": "UFC 330: Makhachev vs Machado Garry",
      "org": "ufc",
      "starts_at": "2026-08-15T21:30:00Z",
      "status": "completed",
      "fights": [
        {
          "weight_class": "Welterweight",
          "is_title": true,
          "fighter_a": { "name": "Islam Makhachev", "slug": "islam-makhachev" },
          "fighter_b": { "name": "Ian Machado Garry", "slug": "ian-machado-garry" },
          "result": { "method": "Decision - Unanimous", "round": 5, "time": "5:00" }
        },
        ...

Quickstart in curl, Python and JavaScript

Complete requests against the live API. Any HTTP client works — there is no SDK to install, and every response is plain JSON in a {"data": ..., "meta": ...} envelope.

curl
$ curl "https://api.ufcalendar.com/v1/events?org=ufc" -H "Authorization: Bearer $UFCAL_KEY"
$ curl "https://api.ufcalendar.com/v1/rankings/ufc?date=2016-11-14" -H "Authorization: Bearer $UFCAL_KEY"
$ curl "https://api.ufcalendar.com/v1/fighters/islam-makhachev/history" -H "Authorization: Bearer $UFCAL_KEY"
Python
import requests

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

upcoming = requests.get(f"{API}/events", params={"org": "ufc"}, headers=H).json()["data"]
print(upcoming[0]["title"], upcoming[0]["starts_at"])

board = requests.get(f"{API}/rankings/ufc", params={"date": "2016-11-14"}, headers=H).json()["data"]
print([e["name"] for e in board["divisions"][0]["entries"][:5]])
JavaScript
const API = "https://api.ufcalendar.com/v1";
const headers = { Authorization: `Bearer ${process.env.UFCAL_KEY}` };

const { data: upcoming } = await fetch(`${API}/events?org=ufc`, { headers }).then((r) => r.json());
console.log(upcoming[0].title, upcoming[0].starts_at);

const { data: fighter } = await fetch(`${API}/fighters/islam-makhachev`, { headers }).then((r) => r.json());
console.log(fighter.name, fighter.career_stats.find((s) => s.scope === "pro-mma")?.record);

Endpoints for UFC data

Every list endpoint filters with ?org=ufc. The full reference lives in the docs.

  • GET /v1/events?org=ufc

    MMA schedule + results API: full fight cards, venues, broadcasts, and a card-change diff log for late reshuffles.

  • GET /v1/fights/{id}/rounds

    One bout with its result, per-fight totals for both corners, and round-by-round statistics.

  • GET /v1/fighters?org=ufc

    Roster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated.

  • GET /v1/rankings/ufc

    Official ranking boards, point-in-time back to 2013 for the UFC. Champions across every launch org.

  • GET /v1/predictions/upcoming

    UFCalendar Power Index ratings and AI win probabilities for upcoming UFC bouts.

  • GET /v1/calendar/ufc.ics

    ICS calendar feeds per organization · subscribe any calendar app to every event, auto-updating as cards change.

  • POST /v1/webhook-endpoints

    Signed webhooks for fight results, card changes and event completion · no polling needed.

  • GET /v1/bulk/events.json.gz

    Gzipped full-dataset snapshots of events, fights and fighters for warehouse loads.

Questions

Does the UFC API include historical rankings?
Yes · official UFC rankings point-in-time back to February 2013: 543 snapshots, champion as rank 0, one ?date= parameter away. No other UFC data API offers rankings history.
How far back does the UFC fight data go?
To UFC 1 in November 1993. All 800 events carry full cards and results; 8,819 fights (98%) carry per-fight stat lines and 41,526 rounds carry round-by-round statistics.
Is this an official UFC API?
No. UFCalendar is an independent publication, not affiliated with UFC/Zuffa/TKO. Public-source data is reconciled and normalized into one clean schema.
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. Webhooks (Pro and up) push results to your endpoint.

One key, three organizations

Every plan covers UFC, PFL and OKTAGON in the same schema, under the same key. Also see:

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