Skip to content
MMA Calendar
UFCalendar Fight API

The UFC schedule in the MMA Fight Data API: upcoming cards, start times and ICS feeds

The MMA Fight Data 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 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

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.

Endpoints for this job
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/changes?org=ufcEvery card change across every event in one feed, newest first: the webhook's audit trail for callers that poll.
GET /v1/events/{slug}/storylinesA card's talking points from the record: title fights, ranked fighters, win streaks and the closest bout on paper.
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=…

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

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. The consensus odds for the same card are one call away on GET /v1/events/{slug}/odds.

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