UFC fight results data within minutes: winner, method, round and time, pushed by webhook, in the MMA Fight Data API
The MMA Fight Data API serves the result of every UFC fight since UFC 1 in 1993 — winner, method, round, time, referee and performance bonuses — with live results landing within about 2 minutes of the official verdict, and signed fight.result webhooks on Pro plans so you never poll.
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
Results in about two minutes
During a UFC event a result typically lands within about 2 minutes of the verdict. Query GET /v1/events?org=ufc&status=completed for the newest cards, or GET /v1/fights/{id} for one bout.
Webhooks for results and card changes
Register up to 3 endpoints (Pro and up) and receive fight.result, card.changed, event.announced, event.completed and odds.moved as signed JSON deliveries. Deliveries never count against your request quota.
Endpoints for this job
Method and path, linked to the reference. The same key covers every endpoint in the API.
| Method & path | What it returns |
|---|---|
GET /v1/events?org=ufc&status=completed | Completed cards newest-first, each with the full card and every result. |
GET /v1/events/{slug} | One event with its full fight card (both corners, results when completed), venue and event-level broadcasts. |
GET /v1/fights/{id} | One bout with corners, result (winner, method, round, time), referee and bonus flags. |
GET /v1/fights/search?org=ufc&title_only=true | 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. |
POST /v1/webhook-endpoints | Signed webhooks for fight results, card changes, event completion and consensus odds moves · no polling needed. |
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/ufc-330-2026-08-15" \
-H "Authorization: Bearer $UFCAL_KEY"
{
"data": {
"slug": "ufc-330-2026-08-15",
"title": "UFC 330: Makhachev vs Machado Garry",
"status": "completed",
"card": [
{
"id": 61204,
"weight_class": "Welterweight",
"is_title": true,
"fighter_a": { "id": 1187, "name": "Islam Makhachev", "slug": "islam-makhachev" },
"fighter_b": { "id": 3402, "name": "Ian Machado Garry", "slug": "ian-machado-garry" },
"result": { "winner_fighter_id": 1187,
"method": "Decision - Unanimous", "round": 5, "time": "5:00" },
"referee": "Herb Dean", "bonus": null
},
...import requests
API = "https://api.ufcalendar.com/v1"
H = {"Authorization": f"Bearer {UFCAL_KEY}"}
# Every result from the newest completed UFC card
event = requests.get(f"{API}/events", params={"org": "ufc", "status": "completed", "limit": 1}, headers=H).json()["data"][0]
card = requests.get(f"{API}/events/{event['slug']}", headers=H).json()["data"]["card"]
for f in card:
r = f.get("result")
if not r:
continue
corners = {c["id"]: c["name"] for c in (f["fighter_a"], f["fighter_b"]) if c}
winner = corners.get(r["winner_fighter_id"], "draw / no contest")
print(f"{f['fighter_a']['name']} vs {f['fighter_b']['name']}: {winner} by {r['method']} R{r['round']} {r['time']}")// Pro plans: stop polling — register a signed webhook for fight results
const API = "https://api.ufcalendar.com/v1";
const headers = { Authorization: `Bearer ${process.env.UFCAL_KEY}`, "Content-Type": "application/json" };
await fetch(`${API}/webhook-endpoints`, {
method: "POST",
headers,
body: JSON.stringify({ url: "https://example.com/hooks/ufcal", events: ["fight.result", "card.changed"] }),
});
// Each delivery: { "type": "fight.result", "sent_at": "...", "data": { "fight_id": 61204,
// "event": { "slug": "ufc-330-2026-08-15", ... }, "fighters": { "a": "...", "b": "..." },
// "result": { "winner": "Islam Makhachev", "winner_fighter_id": 1187, "method": "...", "round": 5, "time": "5:00" },
// "revision": 1, "corrected": false } }
// A correction within 72 h re-sends it as revision 2+ with "corrected": true and the "previous" result —
// upsert on fight_id. Signed with the endpoint secret (X-UFCalendar-Signature). Deliveries never count against your quota.Pricing
Free 1-day trial · 100 requests · no credit card. Paid plans from $19/mo for 30,000 requests, cancel anytime.
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
- Can I get UFC fight results as JSON?
- Yes. Every completed UFC fight returns a result object with winner_fighter_id, method (for example KO/TKO, Submission, Decision - Unanimous), round, time and details, plus referee and bonus flags, on GET /v1/fights/{id} and inside each event's card on GET /v1/events/{slug}.
- How fast are UFC results available?
- A result typically appears in the API within about 2 minutes of the official verdict. Pro plans get a fight.result webhook within a minute of the write.
- How far back do results go?
- To UFC 1 in November 1993. All 800 UFC events carry full cards and results, and 98% of fights also carry per-fight statistics.
- Do results include judges' scorecards?
- Yes, as a separate call. GET /v1/fights/{id}/scorecards returns every judge's per-round scores, card totals, decision type and point deductions for UFC decisions back to 1995, and the same scorecards for PFL, OKTAGON and RIZIN. The result object itself carries the decision type, round and time. Media and fan scores are not served.
- Can I build a real-time UFC results app with it?
- Yes. Each result and the bout’s final stats land in the API within minutes of the official decision, and on Pro and Business plans the fight.result webhook pushes them to your server, so your app updates without polling. card.changed and event.announced keep late swaps and new cards in sync.
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