Ultimate Fighting Calendar
UFCalendar Fight API

MMA API

The UFCalendar MMA API is a fight data API for five promotions — UFC, PFL, OKTAGON, BKFC and RIZIN — delivered as clean JSON over REST. One MMA data API gives you events and full cards, results within about two minutes of the final horn, per-round statistics, fighter careers, official UFC rankings history since 2013 and judges’ scorecards since 1995. Self-serve sign-up, a free 1-day trial, plans from $19 a month, and no betting odds on any tier.

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

Last updated September 2026

What is an MMA API?

An MMA API is a web service that returns mixed martial arts data — schedules, fight cards, results, statistics and fighter records — as structured JSON your code can read, instead of as a web page you would have to scrape. You authenticate with a key, request the slice you need, and get a stable schema back.

What is an MMA data API?

“MMA data API” and “fight data API” usually mean the same thing as an MMA API, with the emphasis on depth rather than on the schedule: per-round striking and grappling lines, career aggregates, rankings history and official scorecards. That is the half most feeds stop short of, and the half this API is built around.

Coverage by promotion

What is actually in the database today, per promotion. Every number is a prod count, not a projection — and a promotion with no commission coverage shows no scorecards rather than a padded figure.

PromotionArchive opensEventsBoutsRounds with statisticsBouts with scorecards
UFC19938009,01641,5263,802
PFL20171381,3993,816423
OKTAGON20161511,2534,435191
BKFC20181671,7569,432✗ No
RIZIN2015859041,66643

Every promotion is served through the same endpoints and the same schema; ask GET /v1/orgs which capabilities each one has rather than assuming.

Endpoints

Twenty-plus REST endpoints under one bearer key. Cursor pagination, snake_case JSON, a stable envelope. Full reference in the docs.

Method & pathWhat it returnsPlan
GET /v1/eventsMMA schedule + results API: full fight cards, venues, broadcasts, and a card-change diff log for late reshuffles.All plans
GET /v1/events/{slug}One event with its full fight card (both corners, results when completed), venue and event-level broadcasts.All plans
GET /v1/events/{slug}/changesThe card-change diff log: fight added or removed, opponent swapped, date or order moved.All plans
GET /v1/fights/{id}One bout with corners, result (winner, method, round, time), referee and bonus flags.All plans
GET /v1/fights/{id}/statsPer-fight totals for both corners: strikes by target and position, takedowns, control time.All plans
GET /v1/fights/{id}/roundsOne bout with its result, per-fight totals for both corners, and round-by-round statistics.All plans
GET /v1/fights/{id}/scorecardsJudges' scorecards for any bout: every official, their score for each round, card totals, decision type and point deductions.All plans
GET /v1/judgesJudge directory with career shape: fights worked, rounds scored, 10-8s, split cards and lone dissents.All plans
GET /v1/fighters/{slug}Fighter bio, records, career statistics per scope, Power Index and CC-licensed images.All plans
GET /v1/fighters/{id}/historyRoster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated.All plans
GET /v1/rankings/{org}?date=Official ranking boards, point-in-time back to 2013 for the UFC. Champions across every launch org.All plans
GET /v1/championsCurrent champions across every launch org in one call.All plans
GET /v1/predictions/upcomingUFCalendar Power Index ratings and AI win probabilities for upcoming UFC bouts.All plans
GET /v1/calendar/{org}.icsICS calendar feeds per organization · subscribe any calendar app to every event, auto-updating as cards change.All plans
POST /v1/webhook-endpointsSigned webhooks for fight results, card changes and event completion · no polling needed.Pro and up
GET /v1/bulk/events.json.gzGzipped full-dataset snapshots of events, fights and fighters for warehouse loads.Enterprise only

Quickstart in curl, Python and JavaScript

curl, Python and TypeScript, all in the page. The same three calls work against every promotion — change one parameter.

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

{
  "data": [
    {
      "slug": "pfl-2026-08-07",
      "title": "PFL Charlotte: Battle vs. Rosta",
      "org": "pfl",
      "starts_at": "2026-08-07T23:00:00Z",
      "tz": "America/New_York",
      "status": "completed",
      "fights": [ ... ]
    }
  ],
  "meta": { "pagination": { "next_cursor": null } }
}
Python
import requests

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

# One loop, five promotions — the same schema for every one of them
for org in ("ufc", "pfl", "oktagon", "bkfc", "rizin"):
    events = requests.get(f"{API}/events", params={"org": org}, headers=H).json()["data"]
    if not events:
        continue
    nxt = events[0]
    print(f"{org.upper():8} {nxt['starts_at']}  {nxt['title']}")

# Which promotions expose which capabilities? Ask, don't assume.
for o in requests.get(f"{API}/orgs", headers=H).json()["data"]:
    print(o["slug"], o["capabilities"])
JavaScript
const API = "https://api.ufcalendar.com/v1";
const headers = { Authorization: `Bearer ${process.env.UFCAL_KEY}` };

// Last completed card in every promotion we cover, newest first
const orgs = ["ufc", "pfl", "oktagon", "bkfc", "rizin"];
const cards = await Promise.all(
  orgs.map((org) =>
    fetch(`${API}/events?org=${org}&status=completed&order=desc&limit=1`, { headers })
      .then((r) => r.json())
      .then((j) => j.data[0]),
  ),
);
for (const c of cards.filter(Boolean)) console.log(c.org, c.starts_at, c.title);

Prefer an MCP server?

The same data reaches AI agents through a hosted MCP server with 23 tools, at https://api.ufcalendar.com/mcp

MMA MCP Server

MMA API providers compared (September 2026)

Every cell outside our own column is what that vendor’s public page stated on the date above. A dash means their page says nothing about it — not that the feature is missing. Our own honest negative is in there too: we serve no odds.

UFCalendarSportradarSportsDataIOAPI-SportsCito API
Self-serve sign-up✓ Yes✗ No✗ No✓ Yes✓ Yes
Free evaluation1-day, 100-request trial, no card30-day marketplace trialFree trial, terms not published100 requests/day free500 calls/month free
Entry price$19/mo · 30,000 requestsContact salesContact sales$25/mo · 50,000 calls
Promotions coveredUFC, PFL, OKTAGON, BKFC, RIZINUFC + Contender SeriesUFC + Contender Series
Round-by-round statistics✓ YesMain events; totals elsewhere✓ Yes
Rankings historyPoint-in-time since 2013Current board onlyCurrent board only
Judges’ scorecards✓ Yes
Webhooks✓ Yes✓ Yes
MCP server✓ Yes✓ Yes✓ Yes
Calendar (ICS) feeds✓ Yes
Betting odds✗ No✓ Yes✓ Yes

These are all real options for different jobs. Sportradar and SportsDataIO are licensed enterprise feeds and the right answer for a regulated sportsbook; if you need betting odds, one of them or Cito is the right tool and we are not.

Sources

  1. Sportradar — MMA API overview
  2. Sportradar — MCP Server
  3. SportsDataIO — MMA / UFC API
  4. API-Sports — MMAthe free plan and daily limit are from the MMA product page; the endpoint documentation was behind a bot challenge when we checked, so the rest of that column is left blank
  5. Cito API — UFC API
  6. mmaapi.devoperated by Cito API — the page’s own structured data names Cito API and citoapi.com, so it is not counted as a separate provider

Questions

What is an MMA API?
An MMA API returns mixed martial arts data as JSON: schedules, fight cards, results, statistics and fighter records. The UFCalendar MMA API covers UFC, PFL, OKTAGON, BKFC and RIZIN through one schema, so the same request shape works for all five.
Is there a free MMA API?
We have no free tier. Evaluation is a free 1-day, 100-request trial that needs no card and is available once per account. After that, plans start at $19 a month for 30,000 requests at 60 per minute, with hard caps and no overage billing.
Which promotions does it cover?
UFC, PFL, OKTAGON, BKFC and RIZIN — with Dana White's Contender Series and Road to UFC served under the UFC. UFC goes back to UFC 1 in 1993. GET /v1/orgs lists every promotion with per-promotion capability flags, so you can check rather than assume.
How fresh is the data?
Results land about two minutes after the final horn during live cards; upcoming cards are re-read every two hours. Instead of polling you can register a signed webhook and receive fight results, card changes and event completions as they happen.
Is there an MCP server for this MMA API?
Yes — a hosted MCP server at api.ufcalendar.com/mcp over Streamable HTTP, with the same endpoints as tools. Add it as a custom connector in Claude.ai or ChatGPT, or register it in Claude Code, Cursor or Codex. One tool call counts as one request.
Is there a Tapology or FightCenter API?
Tapology publishes no public API, so developers who need its kind of data end up scraping the site. The UFCalendar MMA API returns the same kind of material — fighter records, full careers, upcoming and past cards — as licensed JSON with a documented schema and a self-serve trial, so there is nothing to scrape and no terms to work around.
Does the MMA API include betting odds?
No. That is a deliberate product decision rather than a gap, and it will not change; if you need odds, another provider is the right tool. We do serve the official commission record for decisions: judge names, per-round points, card totals and deductions.

More Fight API pages

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