---
title: "List events (schedule + results)"
method: GET
path: "/v1/events"
tags: ["Events"]
---

# List events (schedule + results)

`GET /v1/events`

## Request

- Base URL: `https://api.ufcalendar.com`
- URL: `https://api.ufcalendar.com/v1/events`
- Auth: HTTP bearer

A bare listing is the upcoming calendar: events from the last ~6h onward, soonest first. Ordering defaults: explicit `order` always wins; else `from=` or a forward status (`announced|scheduled|live|upcoming`) → `asc`; else (`completed|cancelled|postponed|to=`) → `desc`, newest first. `order=desc` with no filters browses the full archive newest-first. Live results land within ≤5 minutes (UFC ≤2). Rows are the list shape (no card) — `short_title`, `numbering` and the three section clocks (`main_card_at`, `prelims_at`, `early_prelims_at`, null when the org publishes no split) ride along.

## Query parameters

- `org` 'ufc' | 'pfl' | 'oktagon' | 'bkfc' | 'rizin'
- `status` 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled' | 'postponed' | 'upcoming': What `?status=` accepts on the event lists: every `EventStatus`, plus `upcoming` = announced, scheduled or live cards that have not finished (the site's upcoming-or-live window: started under 6 h ago, or under 14 h ago with a bout still to fight). `upcoming` is a filter only — it never appears on an event.
- `from` string, date
- `to` string, date
- `order` 'asc' | 'desc'
- `is_title_card` boolean
- `is_ppv` boolean
- `include` 'headline'
- `cursor` string
- `limit` integer

## Response `200`

Events page

- EventsPageResponse
  - `data` Event[], required
    - `id` integer, required
    - `slug` string, required: Frozen once published; renamed events keep an alias that 308-redirects.
    - `title` string, required
    - `short_title` string, nullable, required: Short display title (`DWCS 93`); null when the title is already short.
    - `numbering` string, nullable, required: `UFC 320`, `DWCS 93`, … null for un-numbered cards.
    - `org` string, required: Org slug (`ufc`, `pfl`, `oktagon`, `bkfc`, `rizin`).
    - `sport` string, required: Sport slug — `mma`, `bare-knuckle-boxing`. Open: a new sport lands as a new value.
    - `starts_at` string, date-time, required: First bell (UTC).
    - `main_card_at` string, date-time, nullable, required
    - `prelims_at` string, date-time, nullable, required
    - `early_prelims_at` string, date-time, nullable, required
    - `tz` string, nullable, required: IANA zone of the venue.
    - `status` 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled' | 'postponed', required: Event lifecycle. `postponed` is stored and filterable.
    - `is_ppv` boolean, required
    - `is_title_card` boolean, required
    - `headline` EventHeadline: The main event of a list-shape event (`?include=headline`). A replaced main event is skipped in favour of the active one.
      - `fight_id` integer, required
      - `fighter_a` HeadlineCorner, required
        - `id` integer, required
        - `slug` string, nullable, required
        - `name` string, nullable, required
      - `fighter_b` HeadlineCorner, required
        - `id` integer, required
        - `slug` string, nullable, required
        - `name` string, nullable, required
      - `weight_class` string, nullable, required
      - `is_title` boolean, required
      - `winner_fighter_id` integer, nullable, required
      - `method` string, nullable, required: Source spelling; null until the bout is settled.
      - `round` integer, nullable, required
      - `time` string, nullable, required
  - `meta` object, required
    - `pagination` Pagination, required
      - `next_cursor` string, nullable, required: Opaque; pass as `?cursor=`. Null on the last page.
      - `has_more` boolean, required
      - `limit` integer, required: The page size actually applied (out-of-range `limit` values are clamped).
    - `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.
- `400`: Invalid input (`invalid_org`, `invalid_status`, `invalid_date`, `invalid_order`, `invalid_boolean`, `invalid_include`, `invalid_cursor`). Dates must be real calendar days (`2026-02-30` is `invalid_date`).
- `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)
