---
title: "Per-fight totals"
method: GET
path: "/v1/fights/{id}/stats"
tags: ["Fights"]
---

# Per-fight totals

`GET /v1/fights/{id}/stats`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/fights/{id}/stats`
- Auth: HTTP bearer

Both corners: knockdowns, significant/total strikes, takedowns, submission attempts, reversals, control time, and target/position splits (head/body/leg, distance/clinch/ground) where the source provides them. Each line carries `corner` (`a` = the bout's `fighter_a`, `b` = `fighter_b`) beside the stored `fighter_position` (1/2). `distance_time_sec`, `clinch_time_sec`, `ground_time_sec` (integers, nullable) are seconds spent at distance / in the clinch / on the ground, and can appear alongside official strike counts on any org (position time is filled in even where the rest of the row comes from the official stats).

## Path parameters

- `id` integer, required

## Response `200`

Stat lines

- FightStatsResponse: One line per corner (`corner` a then b). Empty when the source has no totals.
  - `data` FightStatLine[], required
    - `fighter_id` integer, required
    - `fighter_position` integer, required: Stored corner encoding: 1 = `fighter_a`, 2 = `fighter_b`. Prefer `corner`.
    - `corner` 'a' | 'b' | 'null', nullable, required: `a` = the bout's `fighter_a`, `b` = `fighter_b` (2026-09-24).
    - `knockdowns` integer, nullable, required
    - `sig_strikes_landed` integer, nullable, required
    - `sig_strikes_attempted` integer, nullable, required
    - `total_strikes_landed` integer, nullable, required
    - `total_strikes_attempted` integer, nullable, required
    - `takedowns_landed` integer, nullable, required
    - `takedowns_attempted` integer, nullable, required
    - `submission_attempts` integer, nullable, required
    - `reversals` integer, nullable, required
    - `control_time_sec` integer, nullable, required: Seconds of control time.
    - `distance_time_sec` integer, nullable, required: Seconds spent at distance; null where the bout has no position-time data.
    - `clinch_time_sec` integer, nullable, required: Seconds spent in the clinch; null where the bout has no position-time data.
    - `ground_time_sec` integer, nullable, required: Seconds spent on the ground; null where the bout has no position-time data.
    - `head_landed` integer, nullable, required
    - `head_attempted` integer, nullable, required
    - `body_landed` integer, nullable, required
    - `body_attempted` integer, nullable, required
    - `leg_landed` integer, nullable, required
    - `leg_attempted` integer, nullable, required
    - `distance_landed` integer, nullable, required
    - `distance_attempted` integer, nullable, required
    - `clinch_landed` integer, nullable, required
    - `clinch_attempted` integer, nullable, required
    - `ground_landed` integer, nullable, required
    - `ground_attempted` integer, nullable, required
  - `meta` object, required
    - `fight_id` integer, required
    - `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.
- `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)
