---
title: "Fighter profile"
method: GET
path: "/v1/fighters/{idOrSlug}"
tags: ["Fighters"]
---

# Fighter profile

`GET /v1/fighters/{idOrSlug}`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/fighters/{idOrSlug}`
- Auth: HTTP bearer

Bio, records, stats, UFCalendar Power Index summary, and CC-licensed images with attribution metadata (displaying the credit is a license requirement). **Read `records` and `stats`** (added 2026-09-24): `records` is a map keyed by a clean name — `pro_mma` (the career MMA record), `amateur_mma`, `pro_kickboxing`, …, and the org slug for a record INSIDE one promotion (`ufc`, `one`, `bkfc`) — each `{ value, source, scope }`; `stats` is ONE per-minute panel (SLpM, striking accuracy/defense, SApM, takedown average/accuracy/defense, submission average), always ONE sport (the fighter's headline sport: the `pro-mma` panel over MMA bouts in every promotion; `pro-knuckle` for a bare-knuckle fighter, `pro-muay-thai` / `pro-kickboxing` for a ONE striker; sports are never averaged together), with `basis: { bouts, orgs, source, scope }` stating exactly which bouts it averages over (e.g. 7 UFC bouts, or 18 MMA bouts across UFC + Oktagon); `null` when no real panel exists. `career_stats` is the raw per-source row list these are built from and stays unchanged for existing integrations.

`next_fight` is the fighter's next booked bout (not completed or cancelled, on an event that has not been cancelled and started no more than ~6h ago; `result` is always null) and `last_fight` their most recent completed or no-contest bout — both in the same shape as a `source: "native"` row of `/history`, or `null`.

`?include=bonuses` adds `bonuses`: the UFC post-fight bonus ledger — `counts` of Fight / Performance / KO / Submission of the Night (`fotn`, `potn`, `kotn`, `sotn`), their `total`, and the `fights` that earned them, newest first. Fight of the Night is credited to both corners, the other awards to the winner only. Award counts only, no dollar amounts.

`?include=credentials` adds `credentials`: the fighter's combat-sports background, researched by UFCalendar from public sources — `credentials[]` (`kind`: belt-rank, competition-result, professional-title, national-team, base-style, training-started, athletic-education, sports-club, award, sport-rank, record; `discipline`, `competition`, `placement`, `rank`, `year`, `detail` (kind-specific extras), `note`) and `affiliations[]` (`kind`: gym, coach, training-partner, manager; `name`, `role`, `status` current/former, `is_primary`, `location`, `gym`, `discipline`, `relationship`, `as_of`, `period`, `note`). EVERY row carries `sources` (the public reference URLs behind the claim — Wikipedia, the promotion's own pages, official bodies; may be empty, since only public references are listed) and `confidence` (`confirmed` = an official body or 2+ independent sources, `reported` = one credible outlet); unverified claims are never served. `meta.note` asks you to verify before republishing. Both lists may be empty.

Comma-separate to combine (`include=bonuses,credentials`). An unknown `include` value is 400 `invalid_include`.

## Path parameters

- `idOrSlug` string, required

## Query parameters

- `include` 'bonuses' | 'credentials'

## Response `200`

Fighter detail

- FighterResponse: `meta.note` is present only with `?include=credentials` (verify before republishing).
  - `data` Fighter, required: `bonuses` / `credentials` are present only when asked for with `?include=`.
    - `id` integer, required
    - `slug` string, required
    - `name` string, required
    - `nickname` string, nullable, required
    - `nationality` string, nullable, required: Country NAME as the source spells it (e.g. `United States`).
    - `country_code` string, nullable, required: ISO 3166-1 alpha-2 derived from `nationality`; null when the name is unknown to our table.
    - `second_nationality` string, nullable, required
    - `height_inches` number, nullable, required
    - `weight_lbs` number, nullable, required
    - `reach_inches` number, nullable, required
    - `stance` string, nullable, required
    - `dob` string, date, nullable, required
    - `team` string, nullable, required
    - `birthplace` string, nullable, required
    - `records` object, required: Keyed `pro_mma`, `amateur_mma`, `pro_kickboxing`, … and the org slug (`ufc`, `one`, `bkfc`) for in-promotion records.
    - `stats` StatsPanel, required: ONE per-minute panel: the widest sample UFCalendar holds for the fighter.
      - `slpm` string, nullable, required: Significant strikes landed per minute. Display string (`"1.34"`, `"42%"`).
      - `str_acc` string, nullable, required: Significant-strike accuracy. Display string (`"1.34"`, `"42%"`).
      - `sapm` string, nullable, required: Significant strikes absorbed per minute. Display string (`"1.34"`, `"42%"`).
      - `str_def` string, nullable, required: Significant-strike defence. Display string (`"1.34"`, `"42%"`).
      - `td_avg` string, nullable, required: Takedowns landed per 15 minutes. Display string (`"1.34"`, `"42%"`).
      - `td_acc` string, nullable, required: Takedown accuracy. Display string (`"1.34"`, `"42%"`).
      - `td_def` string, nullable, required: Takedown defence. Display string (`"1.34"`, `"42%"`).
      - `sub_avg` string, nullable, required: Submission attempts per 15 minutes. Display string (`"1.34"`, `"42%"`).
      - `values` object, required: Numeric twins of the strings; percentages as 0–1.
        - `slpm` number, nullable, required: Significant strikes landed per minute. Percentages as a 0–1 fraction.
        - `str_acc` number, nullable, required: Significant-strike accuracy. Percentages as a 0–1 fraction.
        - `sapm` number, nullable, required: Significant strikes absorbed per minute. Percentages as a 0–1 fraction.
        - `str_def` number, nullable, required: Significant-strike defence. Percentages as a 0–1 fraction.
        - `td_avg` number, nullable, required: Takedowns landed per 15 minutes. Percentages as a 0–1 fraction.
        - `td_acc` number, nullable, required: Takedown accuracy. Percentages as a 0–1 fraction.
        - `td_def` number, nullable, required: Takedown defence. Percentages as a 0–1 fraction.
        - `sub_avg` number, nullable, required: Submission attempts per 15 minutes. Percentages as a 0–1 fraction.
      - `basis` StatsBasis, required
        - `bouts` integer, required: How many settled bouts the panel averages over.
        - `orgs` string[], required: Org slugs those bouts span.
        - `source` string, required: `ufcalendar` for the every-promotion panel, else the `ufc-only` row's source. Both are computed by UFCalendar from per-fight totals.
        - `scope` string, required: `pro-mma` (every settled bout with per-fight totals, any promotion) or `ufc-only` (UFC bouts only, Contender Series excluded).
    - `career_stats` CareerStatRow[], required
      - `scope` string, required: `pro-mma`, `amateur-mma`, `pro-kickboxing`, …, or `ufc-only` / `bkfc-only` / `one-only`.
      - `source` string, required: Who published the record: `ufc-stats` (ufcstats.com), a promotion's own site (`ufc-official`, `bkfc-official`, `one-official`, `oktagon-official`, …), `ufcalendar` (derived by UFCalendar), or `public-records` (the complete multi-promotion career record compiled from public records).
      - `record` string, nullable, required
      - `slpm` string, nullable, required: Significant strikes landed per minute. Display string (`"1.34"`, `"42%"`).
      - `str_acc` string, nullable, required: Significant-strike accuracy. Display string (`"1.34"`, `"42%"`).
      - `sapm` string, nullable, required: Significant strikes absorbed per minute. Display string (`"1.34"`, `"42%"`).
      - `str_def` string, nullable, required: Significant-strike defence. Display string (`"1.34"`, `"42%"`).
      - `td_avg` string, nullable, required: Takedowns landed per 15 minutes. Display string (`"1.34"`, `"42%"`).
      - `td_acc` string, nullable, required: Takedown accuracy. Display string (`"1.34"`, `"42%"`).
      - `td_def` string, nullable, required: Takedown defence. Display string (`"1.34"`, `"42%"`).
      - `sub_avg` string, nullable, required: Submission attempts per 15 minutes. Display string (`"1.34"`, `"42%"`).
      - `updated_at` string, date-time, nullable: Present on `GET /v1/fighters/{idOrSlug}/stats` rows and `/v1/compare` `career_stats` only.
    - `power_index` PowerIndexSummary, required
      - `rating` number, required
      - `peak` number, required
      - `peak_at` string, date-time, nullable, required
      - `peak_date` string, date, nullable, required: `peak_at` as YYYY-MM-DD (the board endpoint speaks dates).
      - `fights_rated` integer, required
      - `last_fought_at` string, date-time, nullable, required
      - `last_fought_date` string, date, nullable, required
    - `images` FighterImage[], required: Wikimedia Commons / CC images only. Credit is mandatory.
      - `url` string, required
      - `width` integer, nullable, required
      - `height` integer, nullable, required
      - `license` string, nullable, required: Short licence name (`CC BY-SA 4.0`, `Public domain`). Displaying it with `artist` is a licence requirement.
      - `license_url` string, nullable, required
      - `artist` string, nullable, required
      - `source_page` string, nullable, required: Wikimedia Commons file page.
    - `next_fight` NativeBout, required: A tracked bout from the fighter's side — the `source: "native"` row shape of `/history` (`next_fight` / `last_fight`).
      - `fight_id` integer, required
      - `event_id` integer, required
      - `event_title` string, required
      - `event_slug` string, required
      - `org_slug` string, required
      - `date` string, date, nullable, required: The UTC calendar day of the event's `starts_at` (first bell). An evening card in the Americas starts after midnight UTC, so it can read one day after the venue's local date; use the event's `starts_at` + `tz` for a local label.
      - `opponent_id` integer, nullable, required
      - `opponent_name` string, nullable, required
      - `opponent_slug` string, nullable, required
      - `result` 'win' | 'loss' | 'draw' | 'nc' | 'null', nullable, required: Always null on `next_fight`.
      - `method` string, nullable, required
      - `round` integer, nullable, required
      - `time` string, nullable, required
      - `weight_class` string, nullable, required
      - `is_title` boolean, required
      - `sport` string, required: Sport slug — `mma`, `bare-knuckle-boxing`. Open: a new sport lands as a new value.
      - `source` 'native', required
    - `last_fight` NativeBout, required: A tracked bout from the fighter's side — the `source: "native"` row shape of `/history` (`next_fight` / `last_fight`).
      - `fight_id` integer, required
      - `event_id` integer, required
      - `event_title` string, required
      - `event_slug` string, required
      - `org_slug` string, required
      - `date` string, date, nullable, required: The UTC calendar day of the event's `starts_at` (first bell). An evening card in the Americas starts after midnight UTC, so it can read one day after the venue's local date; use the event's `starts_at` + `tz` for a local label.
      - `opponent_id` integer, nullable, required
      - `opponent_name` string, nullable, required
      - `opponent_slug` string, nullable, required
      - `result` 'win' | 'loss' | 'draw' | 'nc' | 'null', nullable, required: Always null on `next_fight`.
      - `method` string, nullable, required
      - `round` integer, nullable, required
      - `time` string, nullable, required
      - `weight_class` string, nullable, required
      - `is_title` boolean, required
      - `sport` string, required: Sport slug — `mma`, `bare-knuckle-boxing`. Open: a new sport lands as a new value.
      - `source` 'native', required
    - `bonuses` BonusLedger: The UFC post-fight bonus ledger (`?include=bonuses`). Award counts only, no dollar amounts.
      - `org` 'ufc', required
      - `total` integer, required
      - `counts` object, required
        - `fotn` integer, required
        - `potn` integer, required
        - `kotn` integer, required
        - `sotn` integer, required
      - `fights` object[], required: Newest first. Fight of the Night is credited to both corners, the rest to the winner only.
        - `fight_id` integer, required
        - `event_slug` string, required
        - `date` string, date, nullable, required
        - `awards` BonusAward[], required
    - `credentials` FighterCredentials: Combat-sports background researched by UFCalendar (`?include=credentials`). Both lists may be empty.
      - `credentials` Credential[], required
        - `kind` string, required: `belt-rank`, `competition-result`, `professional-title`, `national-team`, `base-style`, `training-started`, `athletic-education`, `sports-club`, `award`, `sport-rank`, `record`.
        - `discipline` string, nullable, required
        - `competition` string, nullable, required
        - `placement` string, nullable, required
        - `rank` string, nullable, required
        - `year` integer, nullable, required
        - `detail` unknown, required
        - `note` string, nullable, required
        - `sources` string[], required: Public reference URLs behind the claim (Wikipedia, the promotion's own pages, official bodies). May be empty: every served row was sourced and confidence-graded by UFCalendar, but only public references are listed.
        - `confidence` 'confirmed' | 'reported', required: `confirmed` = an official body or 2+ independent sources; `reported` = one credible outlet. Unverified claims are never served.
      - `affiliations` Affiliation[], required
        - `kind` string, required: `gym`, `coach`, `training-partner`, `manager`.
        - `name` string, required
        - `role` string, nullable, required
        - `status` string, nullable, required: `current` / `former`.
        - `is_primary` boolean, required
        - `location` string, nullable, required
        - `gym` string, nullable, required
        - `discipline` string, nullable, required
        - `relationship` string, nullable, required
        - `as_of` string, nullable, required
        - `period` string, nullable, required
        - `note` string, nullable, required
        - `sources` string[], required: Public reference URLs behind the claim; may be empty (see `Credential.sources`).
        - `confidence` 'confirmed' | 'reported', required: `confirmed` = an official body or 2+ independent sources; `reported` = one credible outlet. Unverified claims are never served.
  - `meta` object, required
    - `note` string
    - `ignored_params` string[]: Present only when the request carried query parameters this endpoint does not take — they were ignored. Same list as the `X-UFCalendar-Ignored-Params` header. Sorted, unique.

## Other responses

- `304`: Not Modified — `If-None-Match` matched the current weak `ETag`. Empty body.
- `308`: The slug is a retired alias (the event or fighter was renamed). Follow `Location` to the canonical URL; the numeric-id form never redirects.
- `400`: Invalid input (`invalid_include`).
- `401`: Missing/invalid API key (`unauthorized`).
- `403`: No active plan on the key's account (`subscription_required`) — choose a plan or start the free 1-day trial at https://www.ufcalendar.com/account/api.
- `404`: Not found (`not_found`; staged-org data 404s until the org is promoted).
- `429`: Rate limited (`rate_limited`) or monthly quota reached (`quota_exceeded`). Honor `Retry-After`.
- `500`: Something broke on our side (`internal_error`). It has been logged under the `request_id`.

---

[API](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api.md) · [All operations](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ufcalendar/apis/ufcalendar-fight-api/revisions/9623cc8fb70b?raw)
