Overview
A single MMA broadcast typically contains multiple fights back-to-back — preliminary card + main card, a full 10-fight promotion event, and everything in between. Narrative Sports automatically delineates these fights as they stream, and every highlight from the stream is tagged with three metadata fields so your client can group, filter, and render per-fight views. This page is only relevant whensport is "mma". Soccer streams do not populate these fields.
The Three Fields
All three live inside each highlight’sevent_metadata object (see List Highlights).
Example
How Fights Are Delineated
The worker tracks fight boundaries using structural events as it processes the stream:- A new fight starts when a
fighter_walkoutorfight_introis detected after the previous fight has finished (or at the start of the stream). - A fight is considered finished when any of
knockout,tko,submission,decision, orfight_endis detected. - Inter-fight filler (commercials, commentator recaps, arena shots) is attached to the previous fight as
otherevents withround_number: null— it does not trigger a new fight.
round_start events within each fight:
- The first
round_startsetsround_number: 1for all subsequent events in that fight. - Each additional
round_startincrements the counter. - When a new fight starts, the round counter resets.
Round Numbering by Event Type
Eventual Consistency of fight_name
The first event of a new fight (usually the first walkout) may arrive before the second walkout is detected — at that moment, the API only knows one fighter. Early events for that fight are stamped with the partial name ("Morales"); later events, once both walkouts are known, are stamped with the full name ("Morales vs Rodríguez").
This means your database may hold a mix of names for the same fight_number. Clients should resolve the display name per fight using this preference:
- Any candidate containing
" vs "— use as-is. - Otherwise, any non-fallback candidate (not matching
/^Fight \d+$/i). - Otherwise, synthesize
"Fight N".
"Fight N" as its name (no walkouts detected), that’s a signal that walkouts were missed — worth surfacing as a warning in your UI but not a failure.
Detecting Multi-Fight Streams
A highlight is part of a multi-fight stream if itsevent_metadata.fight_number is a number. No stream-level flag is needed; your client can decide to switch UIs (flat grid vs per-fight grouping) based on whether any highlight has fight_number set:
fight_number: 1), so multi-fight UIs render correctly for one-fight streams too.
Championship Rounds
Five-round fights (title bouts, main events) are supported with no configuration changes —round_number simply increments to 5 in the affected fight. Non-title fights with 3 rounds keep the counter at 3. The delineator has no hardcoded cap.
Failure Modes and Tolerances
- Missed
round_start: if Narrative misses a bell cue, subsequent in-fight events stay tagged with the previous round number until the nextround_startis detected. Visible as lopsided round counts in your data; not catastrophic. - Fight with no walkouts: the fight still gets a
fight_number, butfight_namefalls back to"Fight N". Surface this in your UI as a data-quality warning. - Stream starts mid-fight: the first events are attached to an “orphaned” fight 1. A warning is logged server-side. Round numbers default to 1 until a
round_startis observed. - Multiple finish events emitted for one fight: the worker is prompt-guarded against this, but if it slips through, extra finishes may be attributed to a phantom fight. Treat
fight_name: "Fight N"single-event fights as suspect.
Creating Recaps from Selected Fights
To recap one fight from a multi-fight event, retrieve project highlight options, find the chosenfight_number, and pass its highlight_ids to Create Recap as selected_edit_ids. For multiple fights, combine their IDs and remove duplicates. Submit only after verifying the list is nonempty.
POST /v1/recaps ignores fight_filter and selected_fights; those fields are supported by highlight-package creation. A recap name is a display label, so naming a recap after a fight does not scope its content. See the single-fight recap example.
Related
- Event Types — MMA tab for the full category list
- List Highlights for the full response schema including
event_metadata - Dashboard Integration for how rendered MMA clips appear in the dashboard

