Game Status Workflow
Every UFL game travels through a lifecycle of statuses, and the game status field is the signal that tells your integration which feed to read and how often. Status appears in every schedule feed and every game feed, so you can branch on it wherever you already are.
Coverage
Every UFL game is covered at the same level: full play-by-play. Coverage tiers never factor into the workflow on this page; UFL Fundamentals covers the coverage model.
Game Status Definitions
scheduled: the game is scheduled to occur.created: game data (rosters, officials, and similar) are being pre-loaded in preparation for the game.inprogress: the game is in progress.halftime: the game is currently at halftime.complete: the game is over, but stat validation is not complete.closed: the game is over and the stats have been validated.cancelled: the game has been cancelled, with no makeup game to follow.postponed: the game has been postponed. Once the makeup game is announced, a new game ID is created and scheduled on the announced date; request the schedule feeds regularly to identify makeup games.delayed: the scheduled game, or a game in progress, is delayed.suspended: the game has been suspended and will resume in the future, continuing where it left off under the same game ID.flex-schedule: the game is scheduled for a specific date and time but is likely to move for broadcast purposes.time-tbd: the game has been scheduled, but a time has yet to be announced.
How a Game Progresses
The walkthrough below follows one game through its full lifecycle, reading the game header and team summaries that the game feeds share. Each state is the same game, minutes apart.
Replay a lifecycle on demandSimulations replay past UFL games as if they were live, over both REST and Push, so you can follow a game through the statuses below from
createdtoclosedat any time of year.
1. Pregame: created
createdIn the hours before kickoff the game moves from scheduled to created while rosters and officials are loaded. The clock sits at 15:00 in quarter 1 and the team summaries carry no points yet. Player rows in the Game Roster are all marked dnp at this point; they adjust to started and played at the conclusion of the game.
{
"id": "c5cce400-a716-49d0-bbbe-1a84fb200fa3",
"status": "created",
"scheduled": "2026-03-28T16:00:00+00:00",
"entry_mode": "LDE",
"quarter": 1,
"clock": "15:00",
"sr_id": "sr:match:68165532",
"summary": {
"home": {
"id": "d4799bc0-c045-11ee-ad92-cf16c0a8aa31",
"name": "Battlehawks",
"market": "St. Louis",
"alias": "STL",
"used_timeouts": 0,
"remaining_timeouts": 3
},
"away": {
"id": "a3407150-c045-11ee-b66f-5d382d09dbaf",
"name": "Defenders",
"market": "DC",
"alias": "DC",
"used_timeouts": 0,
"remaining_timeouts": 3
}
}
}2. Kickoff: inprogress
inprogressAt kickoff the status flips to inprogress, points populate as zeros, and the clock starts moving:
{
"id": "c5cce400-a716-49d0-bbbe-1a84fb200fa3",
"status": "inprogress",
"scheduled": "2026-03-28T16:00:00+00:00",
"entry_mode": "LDE",
"quarter": 1,
"clock": "14:55",
"sr_id": "sr:match:68165532",
"summary": {
"home": {
"id": "d4799bc0-c045-11ee-ad92-cf16c0a8aa31",
"name": "Battlehawks",
"market": "St. Louis",
"alias": "STL",
"used_timeouts": 0,
"remaining_timeouts": 3,
"points": 0
},
"away": {
"id": "a3407150-c045-11ee-b66f-5d382d09dbaf",
"name": "Defenders",
"market": "DC",
"alias": "DC",
"used_timeouts": 0,
"remaining_timeouts": 3,
"points": 0
}
}
}3. The break: halftime
halftimeHalftime is its own status: quarter 2 with the clock at 00:00. Timeouts replenish for the second half, and the game returns to inprogress at the third-quarter kickoff:
{
"id": "c5cce400-a716-49d0-bbbe-1a84fb200fa3",
"status": "halftime",
"scheduled": "2026-03-28T16:00:00+00:00",
"entry_mode": "LDE",
"quarter": 2,
"clock": "00:00",
"sr_id": "sr:match:68165532",
"summary": {
"home": {
"id": "d4799bc0-c045-11ee-ad92-cf16c0a8aa31",
"name": "Battlehawks",
"market": "St. Louis",
"alias": "STL",
"used_timeouts": 3,
"remaining_timeouts": 0,
"points": 6
},
"away": {
"id": "a3407150-c045-11ee-b66f-5d382d09dbaf",
"name": "Defenders",
"market": "DC",
"alias": "DC",
"used_timeouts": 2,
"remaining_timeouts": 1,
"points": 10
}
}
}4. Final whistle: complete
completeAt the final whistle the game reaches complete: the score is final, and game and period scores now appear in the schedule feeds, but stat validation is still underway:
{
"id": "c5cce400-a716-49d0-bbbe-1a84fb200fa3",
"status": "complete",
"scheduled": "2026-03-28T16:00:00+00:00",
"entry_mode": "LDE",
"quarter": 4,
"clock": "00:00",
"sr_id": "sr:match:68165532",
"summary": {
"home": {
"id": "d4799bc0-c045-11ee-ad92-cf16c0a8aa31",
"name": "Battlehawks",
"market": "St. Louis",
"alias": "STL",
"used_timeouts": 1,
"remaining_timeouts": 2,
"points": 16
},
"away": {
"id": "a3407150-c045-11ee-b66f-5d382d09dbaf",
"name": "Defenders",
"market": "DC",
"alias": "DC",
"used_timeouts": 3,
"remaining_timeouts": 0,
"points": 10
}
}
}5. Validated: closed
closedOnce stats are validated the game settles at closed, the terminal state for a played game. This is the trigger for final ingestion of boxscores, statistics, and standings:
{
"id": "c5cce400-a716-49d0-bbbe-1a84fb200fa3",
"status": "closed",
"scheduled": "2026-03-28T16:00:00+00:00",
"entry_mode": "LDE",
"quarter": 4,
"clock": "00:00",
"sr_id": "sr:match:68165532",
"summary": {
"home": {
"id": "d4799bc0-c045-11ee-ad92-cf16c0a8aa31",
"name": "Battlehawks",
"market": "St. Louis",
"alias": "STL",
"used_timeouts": 1,
"remaining_timeouts": 2,
"points": 16
},
"away": {
"id": "a3407150-c045-11ee-b66f-5d382d09dbaf",
"name": "Defenders",
"market": "DC",
"alias": "DC",
"used_timeouts": 3,
"remaining_timeouts": 0,
"points": 10
}
}
}Where Status Drives Behavior
- Scores in schedules: game and period scores are added to the schedule feeds when the status changes to
complete. Before that, read live scores from the Game Boxscore. - Stat validation: treat
closedas the trigger for final ingestion of boxscores, statistics, and standings;completepayloads can still be adjusted. - Player game statuses: at
created, every player in the Game Roster isdnp; finalstarted/playedvalues land with the game's conclusion. - Reschedules:
postponedproduces a makeup game under a new ID;suspendedresumes under the same ID;cancelledis terminal with no makeup. - Kickoff timing:
time-tbdandflex-schedulegames firm up intoscheduledonce times are fixed; keep re-pulling schedules to catch the change.
Best Practices
- Branch on
status, not on the presence of scores: ascheduledentry with noscoringobject is normal, and scores arriving is a side effect ofcomplete - Only
closedandcancelledare terminal; every other status can still change - During a game window, drive polling from the Tracking Live Games workflow, and wind down once the game is
closed - Between seasons, statuses rest: every game of a finished season reads
closed, and new-season schedules arrive inscheduled(ortime-tbd) states
Updated about 2 hours ago
