Ultimate Fighting Calendar
UFCalendar Fight API

UFC Schedule API: upcoming cards, start times and ICS feeds

The UFCalendar UFC Schedule API serves every announced UFC event with its full fight card, venue, UTC start times with the venue's IANA time zone, per-country broadcasters and a card-change log — plus a subscribable ICS calendar feed. Dana White's Contender Series and Road to UFC are included.

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

2h
refresh cadence for announced cards and start times
110+
countries with standing broadcaster rights
ICS
calendar feed for Google, Apple and Outlook calendars

The upcoming calendar in one call

GET /v1/events?org=ufc with no filters returns the upcoming schedule, soonest first: title, numbering, main-card and prelim start times, time zone, is_ppv and is_title_card flags. Add from= and to= for a date window, or status=completed for the archive.

Card changes as data, and as a feed

GET /v1/events/{slug}/changes is the diff log behind our card-updated badge — fight added, opponent swapped, date moved. The same schedule ships as GET /v1/calendar/ufc.ics for any calendar app, and event.announced webhooks fire the minute a new card lands.

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=ufcMMA schedule + results API: full fight cards, venues, broadcasts, and a card-change diff log for late reshuffles.
GET /v1/events/{slug}/changesThe card-change diff log: fight added or removed, opponent swapped, date or order moved.
GET /v1/broadcast-rights/ufc?country=XXWho airs the promotion in a given country: broadcaster, kind (TV, streaming, PPV) and link.
GET /v1/calendar/ufc.icsICS calendar feeds per organization · subscribe any calendar app to every event, auto-updating as cards change.

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" \
    -H "Authorization: Bearer $UFCAL_KEY"

{
  "data": [
    {
      "slug": "ufc-fight-night-2026-09-05",
      "title": "UFC Fight Night: Hooker vs Parnasse",
      "org": "ufc",
      "starts_at": "2026-09-05T16:00:00Z",
      "main_card_at": "2026-09-05T19:00:00Z",
      "tz": "Europe/Paris",
      "status": "scheduled",
      "is_ppv": false,
      "is_title_card": false
    },
    ...
  ],
  "meta": { "pagination": { "next_cursor": "eyJpZCI6ODEyfQ", "has_more": true } }
}
Python
import requests
from datetime import datetime
from zoneinfo import ZoneInfo

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

# Upcoming UFC schedule, soonest first, rendered in the viewer's zone
for ev in requests.get(f"{API}/events", params={"org": "ufc"}, headers=H).json()["data"]:
    start = datetime.fromisoformat(ev["starts_at"].replace("Z", "+00:00"))
    local = start.astimezone(ZoneInfo("America/New_York"))
    print(local.strftime("%a %b %d %H:%M"), ev["title"], "· PPV" if ev["is_ppv"] else "")

# Anything change on the next card since we last looked?
changes = requests.get(f"{API}/events/ufc-fight-night-2026-09-05/changes", headers=H).json()["data"]
print(len(changes), "card changes, latest:", changes[0]["kind"] if changes else None)
JavaScript
const API = "https://api.ufcalendar.com/v1";
const headers = { Authorization: `Bearer ${process.env.UFCAL_KEY}` };

// Next 30 days of UFC cards + who airs each one in the UK
const to = new Date(Date.now() + 30 * 864e5).toISOString().slice(0, 10);
const { data: events } = await fetch(`${API}/events?org=ufc&to=${to}`, { headers }).then((r) => r.json());
const { data: rights } = await fetch(`${API}/broadcast-rights/ufc?country=GB`, { headers }).then((r) => r.json());

for (const ev of events) console.log(ev.starts_at, ev.title, "→", rights.map((r) => r.provider).join(", "));
// Or hand the whole thing to a calendar app: https://api.ufcalendar.com/v1/calendar/ufc.ics?key=…

Questions

Does the schedule include start times?
Yes. Each event carries starts_at, main_card_at, prelims_at and early_prelims_at as UTC ISO-8601 timestamps plus the venue's IANA tz, so you can render local time for any viewer. Times are separate wherever the promotion publishes them.
Is there a UFC calendar feed I can subscribe to?
Yes. GET /v1/calendar/ufc.ics?key=… is an ICS feed for Google Calendar, Apple Calendar and Outlook; times and cards update automatically as events change. Every plan includes it.
How current is the schedule?
Announced cards refresh from the official ufc.com listing every 2 hours; late changes reach the change log and the card.changed webhook in the same pass. Events are never deleted — a cancelled card keeps its status.
Which countries' broadcasters are included?
GET /v1/broadcast-rights/ufc?country=XX returns the standing broadcaster per country (about 110 countries), and each event carries its confirmed event-level broadcasts. No betting odds are served.

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