The MMA API for fight data
UFC, PFL, OKTAGON, BKFC & RIZIN events, results, stats and rankings.
The UFCalendar Fight API is an MMA API and fight data API with a free plan: 1,000 requests a month, no card, never expires, and paid plans from $19 a month. One REST service 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 as clean JSON, from the same database that powers ufcalendar.com. 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 plan: 1,000 requests/month, no card, never expires. Paid plans from $19/mo for 30,000 requests, cancel anytime.
Start free: 1,000 requests a month, no card
Sign in, click Get a free key, and a working key is minted on the spot. The free plan never expires and opens every endpoint Hobby does, so you can build on the real data before you pay anything.
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);Try it now, no key
One endpoint answers without a key: the plans, prices and quotas as JSON. Paste it into a terminal to see the response envelope before you sign up.
$ curl https://api.ufcalendar.com/v1/plansOne 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 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 data within minutes: winner, method, round and time, pushed by webhook, in the MMA Fight Data API
Read the guide →UFC fight stats
Per-round UFC fight statistics as JSON, in the MMA Fight Data API
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 comparison
Is there an official UFC API? No. A dated, side-by-side comparison of the APIs and free sources developers actually use: coverage, history, scorecards, speed and price.
Read the guide →Build an MMA app
Screen by screen: the endpoints a UFC or MMA app needs for schedules, fight cards, results, fighter profiles, rankings and push alerts, with working code.
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 →Code guides
Question-shaped guides with working code and a real response from the live API.
- How do I get the upcoming UFC schedule in Python?
- How do I get UFC fight results the moment a fight ends?
- How do I get UFC fight stats round by round?
- How do I get a UFC fighter's record and career stats?
- How do I get historical UFC rankings for any date?
- How do I get the judges' scorecards for a UFC decision?
- How do I get UFC closing odds and line movement?
- How do I get RIZIN results and schedule from an API?
- How do I get PFL, OKTAGON and BKFC fight data?
- How do I add UFC data to Claude or ChatGPT with MCP?
- How do I build a UFC fight-night Discord bot?
- How do I get a fighter's full MMA career, including fights outside the UFC?
- How do I get UFC data into Google Sheets?
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.
UFC API →PFL
The league era from its 2017 debut · full cards, results, per-fight SmartCage stat lines and crossover careers.
PFL API →OKTAGON
Europe's fastest-growing promotion, absent from every mainstream sports API · full cards, results and per-round stats.
OKTAGON API →BKFC
Bare-knuckle boxing's biggest promotion · every BKFC event back to 2018, results, and per-round punch stats no other API serves.
BKFC 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.
RIZIN 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.
- 200,000 requests/month
- 300 requests/minute
- Signed webhooks, odds movement history, priority support
What a real job costs
Request counts for common jobs, worked out from our real 2026 numbers and the API's paging: up to 100 results per list page, one call per event card, one call per bout's stats.
| Job | Requests | Cheapest plan that fits |
|---|---|---|
| Every UFC event of 2026 with full cards1 × event list page + 53 × event card | 54, one-off | Free · $0/mo |
| Fight stats for every UFC bout of 20261 × event list page + 48 × event card + 526 × bout stats | 575, one-off | Free · $0/mo |
| Daily schedule polling for a yearOne upcoming-events call a day; every promotion fits on one page | 365 / year (≤ 31 / month) | Free · $0/mo |
| A fighter-profile app with 500 fighters500 fighters × profile, fight history and career stats, refreshed weekly (1,505 requests per refresh) | 6,522 / month | Hobby · $19/mo |
Counts as of Oct 31, 2026. Rate limits set the pace, not the bill: the 575-request stats job takes ≈ 58 min on Free (10 requests a minute) and ≈ 10 min on Hobby.
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 · 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 |
How it compares to Sportradar, SportsDataIO and Cito API
For developers choosing an MMA data API. Competitor cells come from their public pages on 2026-10-15 — tell us if one is out of date.
| UFCalendar | Sportradar | SportsDataIO | Cito API | |
|---|---|---|---|---|
| Self-serve signup | Yes | Contact sales | Contact sales | Yes |
| Price from | Free plan, then $19/mo | Contact sales | Contact sales | Free tier, paid plans |
| Requests on the entry plan | 1,000/mo free, no card; then 30,000/mo for $19 | — | — | 10,000/mo for $15 |
| Promotions covered | UFC, PFL, OKTAGON, BKFC, RIZIN | UFC + Contender Series | UFC only | UFC + Contender Series |
| Per-round statistics | Yes | Main events; totals elsewhere | Yes | Yes |
| UFC rankings history since 2013 | Yes, 543 snapshots | Current board only | — | Current board only |
| Judges' scorecards | Yes | — | — | — |
| Card-change & result webhooks | Yes | — | — | — |
| ICS calendar feeds | Yes | — | — | — |
| Betting odds | Consensus line, since 2012 | — | Yes | Yes |
Sportradar and SportsDataIO are licensed enterprise feeds and the right choice for regulated sportsbooks. Our odds are one consensus line per bout for display and analysis, not a trading feed; if you need each book's price separately, one of the others is the right tool.
Questions
- Is there a free plan?
- Yes — a permanent free plan: 1,000 requests a month at 10 a minute, one key, no credit card, and it never expires. It opens every endpoint Hobby does; webhooks and odds history are Pro. Sign in, click Get a free key and your key is minted on the spot.
- 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.
- Is there a free MMA API?
- Yes. UFCalendar has a permanent free plan: 1,000 requests a month, every endpoint Hobby has, no credit card, never expires. 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 ufcalendaraway (open source on GitHub). A typed TypeScript client is onenpm i @ufcalendar/sdkaway 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).
- Can I build a real-time MMA results app with the API?
- Yes. Results and final fight stats reach the API within minutes of the official decision for every promotion we cover (the measured timings are public on /results-speed), and the fight.result webhook on Pro and Business pushes each one to your server, so your app updates without polling. event.announced and card.changed keep new cards and late changes in sync.
- What are the usage rules?
- Every plan, the free one included, carries the same rights: commercial use, display in your own products, training your own models and selling their outputs, unlimited storage, and keeping the data after you cancel. Plans differ only in volume and features. On no plan may you redistribute the data as data (an API, dataset, dump or feed), use it as an official-data feed for licensed sportsbooks, or use the odds as a price source for setting or settling wagers. The terms open with a plain-English summary.
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