Skip to content
MMA Calendar
MMA Fight Data API · Code guide

How do I get a fighter's full MMA career, including fights outside the UFC?

Request the fighter's history from the MMA Fight Data API, api.fighter_history(slug) in Python. It returns one merged timeline, newest first: every UFC bout plus the regional, amateur and other-promotion fights before it, and other combat sports such as sambo or grappling, each row with the date, event, opponent, result, method, round and time.

Free plan: 1,000 requests a month, no card. Paid plans from $19/mo.

Endpoints used

Endpoints used
Method & pathWhat it returnsPlan
GET /v1/fighters/{slug}/historyRoster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated.All plans
GET /v1/fighters/{slug}Fighter bio, records, career statistics per scope, Power Index and CC-licensed images.All plans
GET /v1/fighters/{slug}/statsCareer statistics per scope: strike and takedown rates, accuracy, defense, submission average.All plans

The code

curl fetches Merab Dvalishvili's 46-row timeline. The Python block recounts his 21-6 pro MMA record from it and lists the fights outside the UFC; the JavaScript block groups the record by promotion.

Every block runs as shown with your API key in the UFCAL_API_KEY environment variable. Python uses pip install ufcalendar and JavaScript or TypeScript uses npm install @ufcalendar/sdk; any HTTP client works too.

curl
curl "https://api.ufcalendar.com/v1/fighters/merab-dvalishvili/history" \
  -H "Authorization: Bearer $UFCAL_API_KEY"
Python
# pip install ufcalendar
from collections import Counter

from ufcalendar import FightAPI

api = FightAPI()  # reads UFCAL_API_KEY from the environment

history = api.fighter_history("merab-dvalishvili")  # every bout, every promotion, newest first

pro_mma = [b for b in history
           if b["sport"] == "mma" and b["competition_level"] == "pro" and b["result"] != "cancelled"]
print("pro MMA bouts:", len(pro_mma), dict(Counter(b["result"] for b in pro_mma)))

for b in pro_mma:
    if b["org_slug"] != "ufc":  # the fights outside the UFC
        print(b["date"], b["event_title"], "|", b["result"], "vs", b["opponent_name"], "-", b["method"])

# Other combat sports on the same timeline
print(dict(Counter(b["sport"] for b in history if b["sport"] != "mma")))
JavaScript
// npm install @ufcalendar/sdk
import { FightAPI } from "@ufcalendar/sdk";

const api = new FightAPI(); // reads UFCAL_API_KEY from the environment

const history = await api.fighterHistory("merab-dvalishvili");
const fought = history.filter((b) => b.sport === "mma" && b.result !== "cancelled");

// Group the MMA career by promotion (null org_slug = an event outside our covered promotions)
const byOrg = {};
for (const b of fought) {
  const key = b.org_slug ?? `other (${b.competition_level})`;
  byOrg[key] ??= {};
  byOrg[key][b.result] = (byOrg[key][b.result] ?? 0) + 1;
}
console.table(byOrg);

Sample response

A real response from the live API, trimmed for length. … marks removed fields.

GET /v1/fighters/merab-dvalishvili/history
{
  "data": [
    {
      "date": "2026-10-24",
      "event_title": "UFC 333: Volkanovski vs Evloev",
      "org_slug": "ufc",
      "sport": "mma",
      "competition_level": "pro",
      "opponent_name": "Petr Yan",
      "result": "loss",
      "method": "Decision - Unanimous",
      "round": 5,
      "time": "5:00"
    },
    …,
    {
      "date": "2017-06-02",
      "event_title": "Ring of Combat 59",
      "org_slug": null,
      "sport": "mma",
      "competition_level": "pro",
      "opponent_name": "Raufeon Stots",
      "result": "win",
      "method": "TKO",
      "round": 1,
      "time": "0:15"
    },
    …
  ],
  "meta": { "truncated": false }
}

Notes and pitfalls

  • Filter before you count: sport (mma, sambo, wrestling and so on) and competition_level (pro or amateur) separate the record you mean, and a result of cancelled marks a booked bout that never happened.
  • org_slug is set for bouts in a promotion the API covers and null for regional events; event_title names the event either way.
  • Rows outside the covered promotions can carry fewer fields: round and time may be null, and opponent.id is null when the opponent has no profile.
  • The recount matches records.pro_mma on the fighter endpoint, which is the quick way to show a record without walking the timeline.

Related pages

More code guides

All code guides →

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

How do I get a fighter's full MMA career, including fights outside the UFC? | UFCalendar