---
title: "Storylines of one card"
method: GET
path: "/v1/events/{idOrSlug}/storylines"
tags: ["Events"]
---

# Storylines of one card

`GET /v1/events/{idOrSlug}/storylines`

## Request

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

The talking points of one card, computed from the record — the pre-fight read, as of the card's start (a completed card reads as it did walking in). `summary`: `title_fights`, `ranked_fighters`, `champions` and `closest_bout` (the bout nearest 50/50). `fights[]`: each non-cancelled bout with both corners (`id`, `slug`, `name`, `rank` on the promotion's official board on the event date — 0 = champion, null = unranked — and `streak`, signed: positive = consecutive wins, negative = consecutive losses), `win_probability_a` with `probability_source` (`model` = UFCalendar model output, UFC bouts only, corner-guarded; `power_index` = the UFCalendar Power Index curve; null when neither exists) and `tags[]`: `title`, `eliminator` (both corners ranked #1–#4), `coin_flip` (within 6 points of 50/50), `both_streaking` (`a`, `b` ≥ 2), `finishers` (`pct`, average recent finish rate ≥ 60%), `rematch` (`a_wins`, `b_wins`) or `trilogy_decider` (`wins`, level after two or more meetings). `card`: `avg_age` (4+ known ages), `tallest`, `longest_reach`, `nations` (`country`, `count`), `streak_leaders` (3+ wins, top 3), `debuts` (first bout in this promotion), `returns` (365+ days out, `months`, top 3) and `fastest_finish` (the quickest career round-1 KO/TKO/submission among the fighters). No fan picks, no combined record. Win probabilities are not betting advice.

## Path parameters

- `idOrSlug` string, required

## Response `200`

Storylines

- EventStorylinesResponse
  - `data` EventStorylines, required
    - `event` StorylineEvent, required
      - `id` integer, required
      - `slug` string, required
      - `title` string, required
      - `org` string, required
      - `starts_at` string, date-time, required
      - `status` 'announced' | 'scheduled' | 'live' | 'completed' | 'cancelled' | 'postponed', required: Event lifecycle. `postponed` is stored and filterable.
    - `summary` object, required
      - `title_fights` integer, required
      - `ranked_fighters` integer, required
      - `champions` integer, required
      - `closest_bout` object, nullable, required
        - `fight_id` integer, required
        - `win_probability_a` number, nullable, required
        - `probability_source` 'model' | 'power_index', required: `model` = UFCalendar model output (UFC bouts, corner-guarded); `power_index` = the Power Index curve.
    - `fights` StorylineFight[], required: Non-cancelled bouts in card order.
      - `fight_id` integer, required
      - `ordering` integer, nullable, required
      - `card_section` 'main' | 'prelims' | 'early_prelims', required: Which part of the card the bout sits on.
      - `weight_class` string, nullable, required
      - `is_title` boolean, required
      - `is_main` boolean, required
      - `fighter_a` StorylineCorner, required
        - `id` integer, required
        - `slug` string, required
        - `name` string, required
        - `rank` integer, nullable, required: On the promotion's official board on the event date; 0 = champion, null = unranked.
        - `streak` integer, required: Signed: positive = consecutive wins, negative = consecutive losses.
      - `fighter_b` StorylineCorner, required
        - `id` integer, required
        - `slug` string, required
        - `name` string, required
        - `rank` integer, nullable, required: On the promotion's official board on the event date; 0 = champion, null = unranked.
        - `streak` integer, required: Signed: positive = consecutive wins, negative = consecutive losses.
      - `win_probability_a` number, nullable, required
      - `probability_source` 'model' | 'power_index', required: `model` = UFCalendar model output (UFC bouts, corner-guarded); `power_index` = the Power Index curve.
      - `tags` StorylineTag[], required
        - `kind` 'title' | 'eliminator' | 'coin_flip' | 'both_streaking' | 'finishers' | 'trilogy_decider' | 'rematch', required: Tag vocabulary.
        - `a` integer: `both_streaking`.
        - `b` integer: `both_streaking`.
        - `pct` integer: `finishers`: whole percent.
        - `wins` integer: `trilogy_decider`: wins each.
        - `a_wins` integer: `rematch`.
        - `b_wins` integer: `rematch`.
    - `card` object, required
      - `avg_age` number, nullable, required: Needs 4+ known ages.
      - `tallest` object, nullable, required
        - `fighter` object, required
          - `id` integer, required
          - `slug` string, required
          - `name` string, required
        - `height_inches` number, required
      - `longest_reach` object, nullable, required
        - `fighter` object, required
          - `id` integer, required
          - `slug` string, required
          - `name` string, required
        - `reach_inches` number, required
      - `nations` object[], required
        - `country` string, required
        - `count` integer, required
      - `streak_leaders` object[], required: 3+ wins, top 3.
        - `fighter` object, required
          - `id` integer, required
          - `slug` string, required
          - `name` string, required
        - `streak` integer, required
      - `debuts` object[], required: First bout in this promotion.
        - `id` integer, required
        - `slug` string, required
        - `name` string, required
      - `returns` object[], required: 365+ days out, top 3.
        - `fighter` object, required
          - `id` integer, required
          - `slug` string, required
          - `name` string, required
        - `months` integer, required
      - `fastest_finish` object, nullable, required
        - `fighter` object, required
          - `id` integer, required
          - `slug` string, required
          - `name` string, required
        - `time` string, required: `m:ss` into round 1.
  - `meta` object, required
    - `note` string, required: Always present — the model-output disclaimer (prefixed with "No bouts on this card yet." on an empty card).
    - `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.
- `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)
