MMA APIs compared: is there an official UFC API?
There is no official public UFC API.
Developers use the web pages on ufcstats.com (directly or through community scrapers and Kaggle CSVs), or a third-party API. UFCalendar’s MMA Fight Data API is a documented REST API and MCP server for UFC, PFL, OKTAGON, BKFC and RIZIN, with a free plan of 1,000 requests a month and no card.
Data last refreshed November 1, 2026 at 2:46 AM UTC · Comparison checked October 29, 2026
MMA data APIs compared
Our column is read from our own database. Every other cell is what that provider’s public pages said when we checked them on October 29, 2026; a dash means their pages don’t say, not that the feature is missing.
| UFCalendar | FighterAPI | Cito | Sportradar | SportsDataIO | Community scrapers / Kaggle CSVs | |
|---|---|---|---|---|---|---|
| Promotions covered | UFC, PFL, OKTAGON, BKFC, RIZIN | UFC + PFL + Bellator | UFC + Contender Series; BKFC | UFC + Contender Series | UFC only | UFC only |
| History depth | UFC since UFC 1 (1993); PFL 2017, OKTAGON 2016, BKFC 2018, RIZIN 2015 | UFC since 2000; PFL 2012+, Bellator 2009–2024 (results) | UFC: 773 events listed; BKFC since 2018 | — | — | UFC since 1993, as fresh as the last re-run |
| Round-by-round stats | ✓ Yes | ✓ Yes | ✓ Yes | UFC main events; totals for Contender Series | ✓ Yes | ✓ Yes |
| Rankings history | ✓ Point-in-time since 2013 | Own Elo ratings since 2000; rankings not listed | Current rankings only | Current rankings only | — | ✗ No |
| Judges’ scorecards | ✓ Commission record, UFC since 1995 | ✓ Nearly every UFC fight | — | — | — | ✗ No |
| Odds | ✓ Consensus line since 2012 | By sportsbook since June 2020 (UFC); hourly before cards | Moneyline + props by bookmaker | Win probabilities; odds are separate products | ✓ 20+ sportsbooks + consensus line | Varies |
| Update speed (results) | Within minutes of the official decision | Daily, around 10:00 UTC; no live feed | Live card polled every 1–2 s | Live summaries during events | Live data every 10 s (recommended poll) | When the maintainer re-runs it (one repo: daily) |
| Webhooks | ✓ fight.result, card.changed and more (Pro+) | — | Documented for esports only | — | — | ✗ No |
| MCP server | ✓ Yes | ✓ Yes | ✓ Yes | Docs-only MCP (returns no data) | — | ✗ No |
| SDKs | ✓ Python + TypeScript | Python client + CLI | None (REST code samples) | OpenAPI spec + Postman | — | Python / R scripts |
| Free plan | ✓ $0 · 1,000 requests/month, no card | 500 credits/month (1–10 credits per call), no card | 500 calls/month, no card | Free trial (terms not published) | Free trial (terms not published) | Free; licence varies (e.g. GPL-3.0) |
| Paid price | $19/mo · 30,000 requests | $19/mo · 10,000 credits | $15/mo · 10,000 calls (one game) | Not published | Not published | Not sold |
| Last checked | Live from our database | Checked October 29, 2026 | Checked October 29, 2026 | Checked October 29, 2026 | Checked October 29, 2026 | Checked October 29, 2026 |
These are all real options for different jobs. Sportradar and SportsDataIO are licensed data feeds sold under sales contracts. Our odds are one consensus line per bout for display and analysis, not each sportsbook’s own price. If a cell is out of date, tell us at ceo@ufcalendar.com.
Sources
- FighterAPI
- FighterAPI — pricing
- FighterAPI — UFC API sources and alternatives
- Cito — UFC API
- Cito — BKFC API
- Cito — pricing
- Cito — webhooks — the event list names League of Legends and Call of Duty events only
- Cito — SDKs & libraries
- ufcapi.dev — a Cito site (its footer and structured data name Cito API), so it is not counted as a separate provider
- mmaapi.dev — a Cito site (its footer and structured data name Cito API), so it is not counted as a separate provider
- Sportradar — MMA API overview
- Sportradar — MCP Server
- SportsDataIO — MMA / UFC API
- SportsDataIO — MMA coverage
- ufcstats.com
- GitHub — Greco1899/scrape_ufc_stats
- Kaggle — UFC-Fight historical data
Which one should you use?
It depends on the job. Here is where each option fits, ours included.
Side project or prototype
Start free. UFCalendar’s free plan gives 1,000 requests a month across five promotions with no card; FighterAPI (500 credits) and Cito (500 calls) are UFC-focused alternatives. If you only need one static table, a Kaggle CSV is free and enough.
Discord or Telegram bot
A bot needs each result soon after the fight. UFCalendar’s API posts results within minutes of the official decision, and the fight.result webhook (Pro and Business) pushes them to your server, so the bot never polls. An API that refreshes once a day suits a morning-recap bot.
Fantasy app
You need upcoming cards, late card changes and round-by-round stats for scoring. UFCalendar’s API has the card-change feed, the card.changed webhook and round-by-round stats for every promotion it covers; Cito and SportsDataIO also serve round-level UFC stats.
Research and data analysis
For a one-off notebook, a community CSV built from ufcstats.com costs nothing. For data that keeps itself current, or that needs judges’ scorecards since 1995 and point-in-time rankings since 2013, use UFCalendar’s API: it is the one in this table that lists both. FighterAPI adds its own Elo ratings for UFC fighters since 2000.
AI agent or chatbot
Give the agent an MCP server so it calls tools instead of scraping pages. UFCalendar (hosted, 52 tools, five promotions), FighterAPI and Cito run MCP servers that return data; Sportradar’s MCP server answers questions about its documentation and returns no data.
Licensed operation (sportsbook, broadcaster, league partner)
You need an official data licence, contractual service levels and a sales relationship. That is Sportradar’s and SportsDataIO’s business. UFCalendar does not sell licences or service-level contracts; its API is built for indie developers, side projects and small teams.
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.
What is an MMA odds API?
An MMA odds API returns the betting market's prices for fights as data: a moneyline per corner, the implied win probability, and how the line moved from open to close. The UFCalendar MMA API serves one consensus line per bout, averaged across the sportsbooks we track (about 18 on a UFC card), with opening and closing lines back to 2012 for all five promotions. It describes what the market priced; it is information only, not betting advice. Odds in the MMA Fight Data API
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.
| Promotion | Archive opens | Events | Bouts | Rounds with statistics | Bouts with scorecards |
|---|---|---|---|---|---|
| UFC | 1993 | 800 | 9,016 | 41,526 | 3,802 |
| PFL | 2017 | 138 | 1,399 | 3,816 | 423 |
| OKTAGON | 2016 | 151 | 1,253 | 4,435 | 191 |
| BKFC | 2018 | 167 | 1,756 | 9,432 | ✗ No |
| RIZIN | 2015 | 85 | 904 | 1,666 | 157 |
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 & path | What it returns | Plan |
|---|---|---|
GET /v1/events | MMA 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}/changes | The card-change diff log: fight added or removed, opponent swapped, date or order moved. | All plans |
GET /v1/changes | Every card change across every event in one feed, newest first: the webhook's audit trail for callers that poll. | All plans |
GET /v1/events/{slug}/storylines | A card's talking points from the record: title fights, ranked fighters, win streaks and the closest bout on paper. | All plans |
GET /v1/fights/{id} | One bout with corners, result (winner, method, round, time), referee and bonus flags. | All plans |
GET /v1/fights/search | Search completed bouts by title fight, finish method, division, fighter, winner or date range: the last title fight to end by knockout in one call. | All plans |
GET /v1/fights/{id}/stats | Per-fight totals for both corners: strikes by target and position, takedowns, control time · plus UFCalendar fantasy points per corner and data-quality flags. | All plans |
GET /v1/fights/{id}/rounds | One bout with its result, per-fight totals for both corners, and round-by-round statistics. | All plans |
GET /v1/fights/{id}/scorecards | Judges' scorecards for any bout: every official, their score for each round, card totals, decision type and point deductions. | All plans |
GET /v1/judges | Judge directory with career shape: fights worked, rounds scored, 10-8s, split cards and lone dissents. | All plans |
GET /v1/referees | Referee directory: bouts worked, promotions, finish rate, how their fights ended and average fight time · plus every bout each one worked. | All plans |
GET /v1/fights/{id}/odds | One bout's consensus moneyline: American and decimal prices, implied and de-vigged probabilities, the opening and closing line and the movement between them. | All plans |
GET /v1/events/{slug}/odds | The consensus line for every bout on a card in one call, in card order, unpriced bouts included. | 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}/history | Roster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated. | All plans |
GET /v1/compare?a=&b= | The tale of the tape in one call: both bios, career stats, strike mix, recent form, previous meetings and common opponents. | 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/champions | Current champions across every launch org in one call. | All plans |
GET /v1/coverage | What the database holds per promotion and year: events, settled bouts and the share with stats, round stats, judges' scorecards and a consensus odds line. | All plans |
GET /v1/stats/leaders | One Record Book leaderboard per promotion: career, single-fight, round, division and event boards across 48 metrics. | All plans |
GET /v1/predictions/upcoming | UFCalendar Power Index ratings and AI win probabilities for upcoming UFC bouts. | All plans |
GET /v1/calendar/{org}.ics | ICS calendar feeds per organization · subscribe any calendar app to every event, auto-updating as cards change. | All plans |
POST /v1/webhook-endpoints | Signed webhooks for fight results, card changes, event completion and consensus odds moves · no polling needed. | Pro and up |
GET /v1/fights/{id}/odds/history | Every movement point of a bout's consensus line, oldest first, with the number of sportsbooks behind each point. | Pro and up |
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 "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"
}
],
"meta": { "pagination": { "next_cursor": null } }
}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"])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);Pricing
Free plan: 1,000 requests/month, no card, never expires. Paid plans from $19/mo for 30,000 requests, cancel anytime.
Prefer an MCP server?
The same data reaches AI agents through a hosted MCP server with 52 tools, at https://api.ufcalendar.com/mcp
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
- Is there an official UFC API?
- No. The UFC does not offer a public, documented API. Its official statistics are published as web pages on ufcstats.com and ufc.com, so developers scrape those pages, use community datasets, or use a third-party API such as UFCalendar’s MMA Fight Data API, FighterAPI, Cito, Sportradar or SportsDataIO.
- Is there a free UFC API?
- Yes. UFCalendar’s MMA Fight Data API has a free plan: $0, 1,000 requests a month, no card, covering UFC, PFL, OKTAGON, BKFC and RIZIN. FighterAPI gives 500 free credits a month and Cito 500 free calls a month. Community CSVs cost nothing but come without documentation, support or published terms.
- What is the best MMA API?
- It depends on the job. For five promotions in one schema, rankings history since 2013, commission judges’ scorecards, webhooks, an MCP server and Python and TypeScript SDKs, UFCalendar’s MMA Fight Data API. FighterAPI and Cito are UFC-focused alternatives with similar free tiers, and Sportradar and SportsDataIO serve licensed operations that need contracts. The table above compares all of them cell by cell.
- Can I get UFC data in Python?
- Yes. pip install ufcalendar installs the Python client for UFCalendar’s MMA Fight Data API (a TypeScript client is on npm as @ufcalendar/sdk), and plain requests works too: GET https://api.ufcalendar.com/v1/events?org=ufc with your key returns the schedule as JSON. FighterAPI also ships a Python client, and most community scrapers are written in Python.
- Does any UFC API have historical rankings?
- Yes. UFCalendar’s MMA Fight Data API serves the official UFC rankings point-in-time since 2013: add ?date=YYYY-MM-DD to /v1/rankings/ufc and you get the board as it stood that day, with movement against the previous board. The other APIs compared here list current rankings only, or none.
- How fast do UFC APIs get results?
- UFCalendar’s MMA Fight Data API posts each result and the bout’s final stats within minutes of the official decision, measured per promotion on our results-speed page, and the fight.result webhook (Pro and Business) pushes it to your server. FighterAPI updates once a day around 10:00 UTC, SportsDataIO recommends polling live data every 10 seconds, and community datasets update when their maintainers re-run them.
More Fight API pages
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