---
title: "Events at a venue"
method: GET
path: "/v1/venues/{id}/events"
tags: ["Events"]
---

# Events at a venue

`GET /v1/venues/{id}/events`

## Request

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

Every launch-org event held (or booked) at one venue, newest first — upcoming cards on top, then the history. Same filters and row shape as `/v1/events` (`status`, `from`, `to`, `order`, cursor pagination); `order=asc` reverses it. `meta.venue` names the venue. An unknown venue, or one with no covered event at this venue (a staged-org-only arena), 404s `not_found`.

## Path parameters

- `id` integer, required

## Query parameters

- `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'
- `cursor` string
- `limit` integer

## Response `200`

Events at the venue

- VenueEventsResponse: Newest first unless `order=asc`.
  - `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).
    - `venue` VenueListItem, required: Search-row venue (no coordinates, no `country_code` — those are on `GET /v1/venues/{id}`).
      - `id` integer, required
      - `slug` string, nullable, required
      - `name` string, required
      - `city` string, nullable, required
      - `region` string, nullable, required
      - `country` string, nullable, required
      - `tz` string, nullable, required
      - `capacity` integer, nullable, 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.
- `400`: Invalid input (`invalid_status`, `invalid_date`, `invalid_order`, `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)
