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

How do I get a UFC fighter's record and career stats?

Request the fighter by slug from the MMA Fight Data API, api.fighter(slug) in Python. records holds each record keyed by scope, so pro_mma is the whole professional career and ufc counts UFC bouts only. stats is one career panel: significant strikes landed and absorbed per minute, striking accuracy and defence, takedown average, accuracy and defence, and submission average, with basis naming the bouts it covers.

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}Fighter bio, records, career statistics per scope, Power Index and CC-licensed images.All plans
GET /v1/fighters?q=Roster search, bios, records · and complete multi-promotion career timelines, merged and deduplicated.All plans
GET /v1/fighters/{slug}/statsCareer statistics per scope: strike and takedown rates, accuracy, defense, submission average.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

The code

The Python block finds the fighter by name, then prints both records, the career panel and the last fight. The JavaScript block prints every record scope and the panel as numbers.

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" \
  -H "Authorization: Bearer $UFCAL_API_KEY"
Python
# pip install ufcalendar
from ufcalendar import FightAPI

api = FightAPI()  # reads UFCAL_API_KEY from the environment

slug = next(api.fighters("dvalishvili", limit=1))["slug"]  # name search -> stable slug
f = api.fighter(slug)

print(f["name"], "| pro MMA:", f["records"]["pro_mma"]["value"], "| UFC:", f["records"]["ufc"]["value"])

s = f["stats"]
print(f"sig. strikes landed/min {s['slpm']}, accuracy {s['str_acc']}, "
      f"takedowns/15 min {s['td_avg']}, takedown defence {s['td_def']}")
print("based on", s["basis"]["bouts"], "bouts in", ", ".join(s["basis"]["orgs"]))

last = f["last_fight"]
print("last fight:", last["result"], "vs", last["opponent_name"], "-", last["method"], last["date"])
JavaScript
// npm install @ufcalendar/sdk
import { FightAPI } from "@ufcalendar/sdk";

const api = new FightAPI(); // reads UFCAL_API_KEY from the environment
const f = await api.fighter("merab-dvalishvili");

// Every record the fighter has, keyed by scope
for (const [scope, r] of Object.entries(f.records)) console.log(scope.padEnd(26), r.value);

// The same career panel as numbers (percentages as fractions)
console.log(f.stats.values, "over", f.stats.basis.bouts, "bouts");

Sample response

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

GET /v1/fighters/merab-dvalishvili
{
  "data": {
    "id": 194,
    "slug": "merab-dvalishvili",
    "name": "Merab Dvalishvili",
    "nickname": "The Machine",
    "nationality": "Georgia",
    "country_code": "GE",
    "stance": "Orthodox",
    "records": {
      "pro_mma": {
        "value": "21-6-0",
        "wins": 21,
        "losses": 6,
        "draws": 0,
        "no_contests": 0,
        "scope": "pro-mma"
      },
      "ufc": {
        "value": "14-4-0",
        "wins": 14,
        "losses": 4,
        "draws": 0,
        "no_contests": 0,
        "scope": "ufc-only"
      },
      …
    },
    "stats": {
      "values": {
        "slpm": 4.48,
        "str_acc": 0.41,
        "sapm": 2.98,
        "str_def": 0.53,
        "td_avg": 5.74,
        "td_acc": 0.31,
        "td_def": 0.76,
        "sub_avg": 0.3
      },
      "slpm": "4.48",
      "str_acc": "41%",
      "td_def": "76%",
      …,
      "basis": {
        "bouts": 18,
        "orgs": ["ufc"],
        "scope": "pro-mma"
      }
    },
    "career_stats": […],
    "next_fight": null,
    "last_fight": {
      "fight_id": 83680,
      "event_title": "UFC 333: Volkanovski vs Evloev",
      "event_slug": "ufc-333-2026-10-24",
      "org_slug": "ufc",
      "date": "2026-10-24",
      "opponent_name": "Petr Yan",
      "opponent_slug": "petr-yan",
      "result": "loss",
      "method": "Decision - Unanimous",
      "round": 5,
      "time": "5:00",
      "is_title": true
    },
    …
  }
}

Notes and pitfalls

  • Read the scope you mean: pro_mma counts every promotion, ufc counts UFC bouts only, and amateur or other-sport records (pro_sambo, pro_wrestling) appear when the fighter has them.
  • stats carries display strings such as 41% and stats.values the same numbers as fractions such as 0.41 for calculation. career_stats keeps the raw rows per scope.
  • Look fighters up by name with GET /v1/fighters?q= and keep the slug. Slugs are stable, and namesakes get a numeric suffix instead of sharing a page.
  • next_fight and last_fight come with every profile. Add include=bonuses for the UFC bonus ledger or include=credentials for grappling pedigree, gyms and coaches; GET /v1/compare puts two fighters side by side.

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 UFC fighter's record and career stats? | UFCalendar