The UFCalendar Fight API: UFC, PFL, OKTAGON, BKFC & RIZIN events, results, stats and rankings
The UFCalendar Fight API is an MMA API and fight data API in one: a REST service that serves MMA event, fight-card, result, per-round statistic, fighter-career, judges’ scorecard, rankings and consensus odds data for UFC, PFL, OKTAGON, BKFC and RIZIN, from the same database that powers ufcalendar.com, delivered as clean JSON from $19 a month. It includes official UFC rankings history back to 2013, round-by-round judges’ scorecards back to 1995, one consensus betting line per bout with opening and closing odds back to 2012, AI win probabilities, signed webhooks and a hosted MCP server.
Free 1-day trial · 100 requests · no credit card. Paid plans from $19/mo for 30,000 requests, cancel anytime.
Start free: 1-day trial, 100 requests, no card
Sign in, click Start free trial, and a working key is minted on the spot. Every endpoint is open to the trial, so you can evaluate the real data before choosing a plan.
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 "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"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]])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);One request, ten years back
$ curl "https://api.ufcalendar.com/v1/rankings/ufc?date=2016-11-14" \
-H "Authorization: Bearer ufcalendar_..."
{
"data": {
"org": "ufc",
"board": "official",
"snapshot_date": "2016-11-07",
"divisions": [
{
"division": "lightweight",
"entries": [
{ "rank": 0, "is_champion": true,
"name": "Eddie Alvarez", "fighter_slug": "eddie-alvarez" },
...The rankings time machine: every official UFC board since 2013, valid until superseded. Rank 0 is the champion.
MMA Fight Data API guides by use case
One page per job: schedules, results, per-round statistics, rankings history, judges' scorecards, the live feed and consensus odds, each with its own endpoints, sample responses and code.
UFC schedule
The UFC schedule in the MMA Fight Data API: upcoming cards, start times and ICS feeds
Read the guide →UFC fight results
UFC fight results in the MMA Fight Data API: winner, method, round and time within minutes
Read the guide →UFC fight stats
UFC fight stats in the MMA Fight Data API: per-fight and round-by-round statistics as JSON
Read the guide →UFC rankings history
UFC rankings history in the MMA Fight Data API: official boards, point-in-time since 2013
Read the guide →UFC scorecards
UFC scorecards in the MMA Fight Data API: judges, round-by-round scores, deductions
Read the guide →UFC odds
UFC odds in the MMA Fight Data API: consensus lines, line movement and closing odds
Read the guide →MMA API
The whole database as one MMA API: five promotions, per-promotion coverage numbers, the full endpoint table and an honest comparison of the alternatives.
Read the guide →MCP server for UFC data
Connect Claude, ChatGPT, Cursor or Codex to UFC cards, results, stats, scorecards and rankings in about a minute.
Read the guide →MMA MCP Server
Five promotions, one MCP endpoint: UFC, PFL, OKTAGON, BKFC and RIZIN for your agent, with one auth and one tool set.
Read the guide →AI agents & MCP
Hosted MCP server, OAuth or API-key sign-in, and an installable agent skill.
Read the guide →What no other API has
Five orgs, one schema
UFC, PFL, OKTAGON, BKFC and RIZIN under one key · every alternative is UFC-only. More orgs join as they clear our reliability bar; /v1/orgs carries per-org capability flags so your client discovers coverage.
Judges' scorecards
The official commission record, round by round: 107,430 scored rounds across 4,419 bouts and 550 officials, UFC back to 1995. No other MMA API serves them. Point deductions and decision type come with the card.
Consensus odds since 2012
One consensus moneyline per bout, the mean across about 18 sportsbooks on a UFC card, with implied and de-vigged probabilities, a closing line for 9,400+ completed fights since 2012 and the full move from open to close on 2,700+ of them. Movement history on Pro. Book identities are never exposed; information only, not betting advice.
Rankings time machine
Official UFC rankings point-in-time back to 2013 (543 snapshots), plus PFL, OKTAGON and BKFC boards. "What was he ranked that night?" is one query parameter.
Card-change log
Fight added, opponent swapped, card reshuffled · the diff log behind our "card updated" badge is an endpoint, so your app can react to late changes.
Per-round statistics
Strikes by target and position, takedowns, control time · per fight and per round. 10,674 fights carry full stat lines (91% of the catalog).
Complete careers
Fighter timelines span every promotion they ever fought in · not just the launch orgs. 121,078 career rows, merged and deduplicated.
Built for AI agents
A hosted MCP server at api.ufcalendar.com/mcp, OpenAPI 3.1, llms.txt and stable snake_case JSON. Connect Claude, ChatGPT, Cursor or Codex in a minute — or point any agent at the spec.
Results in seconds
UFC results are in the API a median 28 seconds after the official announcement. The timings for every promotion are public.
See the timings →Coverage: UFC, PFL, OKTAGON, BKFC & RIZIN
Each organization ships with full depth · schedules, cards, results, stats, rankings and consensus odds. Dedicated coverage pages:
UFC
800 events back to UFC 1 in 1993 · per-round stats, complete careers, and point-in-time UFC rankings history no other API serves.
Explore UFC data in the API →PFL
The league era from its 2017 debut · full cards, results, per-fight SmartCage stat lines and crossover careers.
Explore PFL data in the API →OKTAGON
Europe's fastest-growing promotion, absent from every mainstream sports API · full cards, results and per-round stats.
Explore OKTAGON data in the API →BKFC
Bare-knuckle boxing's biggest promotion · every BKFC event back to 2018, results, and per-round punch stats no other API serves.
Explore BKFC data in the API →RIZIN
Japan's biggest promotion, invisible to Western sports APIs · every RIZIN card since 2015, MMA and kickboxing bouts, results within minutes and per-round stats from 2023.
Explore RIZIN data in the API →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.
Pricing
Hard caps, no overage bills, cancel anytime. Annual billing gives 2 months free. Quotas raised in September 2026: up to 6× more requests on every plan and up to 600 requests a minute.
What's inside
Counts grow every fight night · the same data pipeline that runs this site feeds the API within minutes of each result.
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. | 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/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/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 |
How it compares to Cito API
For developers choosing an MMA data API. Competitor cells come from their public pages on 2026-09-03 — tell us if one is out of date.
| UFCalendar | Cito API | |
|---|---|---|
| Self-serve signup | Yes | Yes |
| Price from | $19/mo (free 1-day trial) | Free tier, paid plans |
| Requests on the entry plan | 30,000/mo for $19 | 10,000/mo for $15 |
| Promotions covered | UFC, PFL, OKTAGON, BKFC, RIZIN | UFC only |
| Per-round statistics | Yes | Yes |
| UFC rankings history since 2013 | Yes, 543 snapshots | No |
| Judges' scorecards | Yes | No |
| Card-change & result webhooks | Yes | No |
| ICS calendar feeds | Yes | No |
| Betting odds | Consensus line, since 2012 | Yes |
Our odds are one consensus line per bout for display and analysis, not a trading feed.
Questions
- Is there a free tier or a trial?
- Yes — a free 1-day trial: 100 requests, no credit card, one per account. Sign in, click Start free trial, and your key is minted on the spot. There is no permanent free tier; for a longer evaluation email api@ufcalendar.com with a line about what you are building.
- Is there an MCP server for MMA data?
- Yes — UFCalendar runs a hosted MCP server at https://api.ufcalendar.com/mcp. Add it as a custom connector in Claude.ai or ChatGPT, or register it in Claude Code, Cursor or Codex with an API key. One tool call counts as one request against your plan, and three discovery tools answer with no sign-in. Full setup on the AI agents page.
- Does UFC offer an official API?
- No. UFC does not offer a public developer API, and UFCalendar is independent — not affiliated with UFC, Zuffa or TKO. The Fight API reconciles public sources (results, statistics, rankings, schedules) into one clean, documented schema and serves it as JSON.
- Is there a free MMA API?
- UFCalendar has a free 1-day trial: 100 requests, every endpoint, no credit card. There is no permanent free tier — paid plans start at $19 a month for 30,000 requests with hard caps and no overage bills. Open-source scrapers on GitHub are free but unhosted and break when a source changes its markup.
- Can I use it from Python, JavaScript or a spreadsheet?
- Yes. It is a plain REST API over HTTPS with bearer-key auth, so requests in Python, fetch in JavaScript, curl, Postman or a Google Sheets script all work unchanged — the quickstart above is complete code. The OpenAPI 3.1 spec generates a typed client in any language. A typed Python client is one `pip install ufcalendar` away (open source on GitHub). A typed TypeScript client is one `npm i @ufcalendar/sdk` away as well.
- Can I get UFC fight results as JSON?
- Yes. Every completed fight returns a result object with winner, method (for example KO/TKO, Submission, Decision - Unanimous), round, time, referee and bonus flags, on GET /v1/fights/{id} and inside each event's card. Live results land within about 2 minutes of the official verdict.
- Why only UFC, PFL, OKTAGON, BKFC and RIZIN?
- Those are the orgs where our data is deepest: per-fight statistics, own live results pipelines, official rankings boards. ONE, KSW, Cage Warriors and ACA are tracked and join the moment they clear our reliability bar · each addition is announced in the changelog.
- How much historical MMA data is in the API?
- UFC back to UFC 1 in 1993, PFL to 2017, OKTAGON to 2016: 1,089 events and 11,673 fights with results, statistics, and fighter careers spanning every promotion they fought in. Judges' scorecards go back to 1995, official UFC rankings are point-in-time from 2013, and consensus odds with opening and closing lines go back to 2012.
- Does the API have judges' scorecards?
- Yes — the official commission record, and no other MMA API sells it. Every bout that went to a decision carries each judge's score for every round, their card total, the decision type (unanimous, split, majority and the draw variants) and any point deductions: 107,430 scored rounds across 4,419 bouts and 550 officials, UFC back to 1995, PFL from 2018, OKTAGON from 2025. Judges are first-class too — /v1/judges gives you each official's career shape, including how often they scored a round 10-8 and how often they were the lone dissenter on a three-judge panel. Media-member scorecards and fan scoring are not part of the API.
- Does the API include betting odds?
- Yes, as one consensus line per bout. Every priced fight carries the mean moneyline across the sportsbooks we track (about 18 on a UFC card; prediction markets and exchanges are excluded), with American and decimal prices, implied probability, a de-vigged fair probability and the opening and closing line, on every plan. Line movement history is Pro and up. Book identities are not exposed, and odds are information only, not betting advice.
- Is there a calendar (ICS) feed?
- Yes · every plan includes per-org ICS feeds (e.g. /v1/calendar/ufc.ics) that any calendar app can subscribe to. Times and cards update automatically as events change.
- Which plans include webhooks?
- Webhooks are Pro and up · a Hobby key gets a 403 on the webhook endpoints. Pro and Business each allow up to 3 signed endpoints receiving event.announced, fight.result, card.changed, event.completed and odds.moved. Subscribe to event.announced and you never have to poll for new cards: it fires once per event, within a minute of a card first landing in our data. odds.moved fires when a bout's consensus line moves 5 points of implied probability or the favourite flips. Deliveries never count against your monthly request quota; only the calls you make to register or list endpoints do.
- Can I use the fighter images?
- Yes · every image the API returns is Creative-Commons or public-domain licensed from Wikimedia Commons, with artist and license fields included. Displaying that credit is required by the license.
- How fresh are results?
- Live results land within 5 minutes for every launch org (2 minutes for UFC). Pre-fight card changes refresh every 2 hours, rankings twice a day, model probabilities every 30 minutes, and consensus odds every 30 minutes in the 48 hours before a card (every 2 hours otherwise).
- What are the usage rules?
- Paid tiers cover commercial display and analysis. No resale or redistribution of the raw dataset on any plan, no use as an official-data feed for regulated sportsbooks, and no resale of the odds as a standalone odds feed or use of them as a price source for setting or settling wagers. Trial keys are for evaluation only.
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