---
updatedAt: 2026-07-28T08:18:39.000Z
agentTools:
  siteIndex: https://developer.sportradar.com/llms.txt
  projectIndex: https://developer.sportradar.com/tennis/llms.txt
---

# Match Status Workflow

> 🚧 Live Coverage Requirement
>
> The live workflows on this page apply only to matches with **live coverage**. Always check the coverage level before applying event-based logic. See [Data Coverage and Tiers](https://developer.sportradar.com/tennis/docs/tennis-ig-data-coverage-tiers) for how to read a match's coverage.

Every tennis match progresses through a series of statuses during its lifecycle. Use the `status` and `match_status` fields to determine the state of a match, drive your polling cadence, and decide which feeds to call at each stage.

<Callout icon="🎾" theme="default">
  ### Difference Between `status` and `match_status`

  The `status` field indicates the overall state of the match: before it starts, during live play, and after it ends.

  Once a match is live, `match_status` adds the finer phase of play (for example `1st_set`, `2nd_set`, `3rd_set`), and after unusual endings it records how the match ended (for example `retired` or `walkover`).
</Callout>

<br />

***

## Where Status Lives

Both fields sit in the `sport_event_status` object, which appears in every match-shaped feed: <Anchor label="Sport Event Summary" target="_blank" href="ref:sport-event-summary">Sport Event Summary</Anchor>, <Anchor label="Daily Summaries" target="_blank" href="ref:daily-summaries">Daily Summaries</Anchor>, <Anchor label="Season Summaries" target="_blank" href="ref:season-summaries">Season Summaries</Anchor>, <Anchor label="Competitor Summaries" target="_blank" href="ref:competitor-summaries">Competitor Summaries</Anchor>, and the three live feeds. During live play the same object also carries the set-by-set `period_scores` and the serving/point `game_state` shown below.

<br />

***

## Status Definitions

### `status`

| Value                  | Meaning                                                    |
| ---------------------- | ---------------------------------------------------------- |
| `not_started`          | The match is scheduled to be played                        |
| `match_about_to_start` | The scheduled time has passed; play is about to begin      |
| `started`              | The match has begun                                        |
| `live`                 | The match is currently in progress                         |
| `interrupted`          | Play has stopped for a short time (for example, rain)      |
| `suspended`            | The match has begun but has been postponed to a later time |
| `delayed`              | The start is temporarily delayed; the match will continue  |
| `ended`                | The match is over                                          |
| `closed`               | Results have been confirmed                                |
| `cancelled`            | The match will not be played                               |
| `abandoned`            | The match has been abandoned                               |

Only `closed`, `cancelled`, and `abandoned` are terminal. A match at `ended` has finished play but its result is still subject to confirmation; treat `closed` as the signal that the result is official.

### `match_status`

`match_status` shares the lifecycle values above and adds the live phases and special outcomes:

| Value                       | Meaning                                        |
| --------------------------- | ---------------------------------------------- |
| `1st_set` through `5th_set` | The respective set is in progress              |
| `start_delayed`             | The start is temporarily delayed               |
| `walkover`                  | The match ended in a walkover (no play)        |
| `retired`                   | The match ended early because a player retired |
| `defaulted`                 | The match ended by player disqualification     |

<br />

***

## Status Lifecycle

<div style={{border: "1px solid #C5CAE9", borderRadius: "12px", overflow: "hidden", margin: "4px 0 8px"}}>
  <div style={{background: "linear-gradient(90deg, #1A237E 0%, #283593 60%, #3949AB 100%)", color: "#FFFFFF", padding: "10px 18px", display: "flex", alignItems: "baseline", justifyContent: "space-between", flexWrap: "wrap", gap: "4px 12px"}}>
    <span style={{fontWeight: 700, fontSize: "14px", letterSpacing: "0.02em"}}>Match Status Lifecycle</span>
    <span style={{fontSize: "12px", opacity: 0.8}}>Main path, pauses, special endings, and terminal states</span>
  </div>
  <div style={{padding: "12px 18px", background: "#FFFFFF", display: "flex", flexDirection: "column", gap: "10px"}}>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Main path</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>not_started</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>match_about_to_start</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>live</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>ended</span>
      <span style={{color: "#9FA8DA", fontWeight: 700, fontSize: "14px"}}>→</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", background: "#1A237E", color: "#FFFFFF", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>closed</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>During live</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "2px solid #2962FF", background: "#FFFFFF", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>1st_set … 5th_set</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}>match_status tracks the current set</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Pauses</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "2px solid #2962FF", background: "#FFFFFF", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>interrupted</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "2px solid #2962FF", background: "#FFFFFF", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>suspended</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "2px solid #2962FF", background: "#FFFFFF", color: "#1A237E", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>delayed</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}>play resumes or resumes later; scores kept</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Early endings</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E"}>retired</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E"}>walkover</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", border: "1px solid #C5CAE9", background: "#F3F6FA", color: "#1A237E"}>defaulted</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", border: "1px solid #E8EAF6", background: "#FAFAFA", color: "#6B7280", fontSize: "12px", whiteSpace: "nowrap"}>match_status records how it ended</span>
    </div>
    <div style={{display: "flex", flexWrap: "wrap", gap: "8px", alignItems: "center"}}>
      <span style={{minWidth: "112px", fontSize: "12px", color: "#6B7280", fontWeight: 700}}>Not played</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", background: "#B71C1C", color: "#FFFFFF", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>cancelled</span>
      <span style={display: "inline-block", padding: "4px 10px", borderRadius: "999px", fontSize: "12.5px", fontWeight: 600, whiteSpace: "nowrap", background: "#B71C1C", color: "#FFFFFF", fontFamily: "SFMono-Regular, Menlo, Consolas, monospace"}>abandoned</span>
    </div>
  </div>
  <div style={{padding: "8px 14px", borderTop: "1px solid #E8EAF6", fontSize: "12px", color: "#6B7280", background: "#FAFAFA"}}>Only closed, cancelled, and abandoned are terminal. ended means finished but not yet confirmed.</div>
</div>

<br />

***

## How a Match Progresses

The walkthrough below follows real responses through a match day.

<br />

### 1. Scheduled

Before play, a match sits at `not_started`. The `sport_event_status` is minimal:

```json Daily Summaries entry: not_started (json)
{
  "sport_event": {
    "id": "sr:sport_event:73165832",
    "start_time": "2026-07-27T20:10:00+00:00",
    "start_time_confirmed": true
  },
  "sport_event_status": {
    "status": "not_started",
    "match_status": "not_started",
    "period_scores": [
      {
        "home_score": 0,
        "away_score": 0,
        "type": "set"
      }
    ]
  }
}
```

<br />

### 2. Live, with set and game state

During play, `status` moves to `live` and `match_status` tracks the current set. `period_scores` carries games won per set, and `game_state` carries the point score, the server, and any advantage. Here a first set stands at 5-5 with the receiver holding advantage at 50-40:

```json Sport Event Summary: live (json)
{
  "sport_event": {
    "id": "sr:sport_event:73163852",
    "start_time": "2026-07-27T21:00:00+00:00"
  },
  "sport_event_status": {
    "status": "live",
    "match_status": "1st_set",
    "home_score": 0,
    "away_score": 0,
    "period_scores": [
      {
        "home_score": 5,
        "away_score": 5,
        "type": "set",
        "number": 1
      }
    ],
    "game_state": {
      "home_score": 50,
      "away_score": 40,
      "serving": "away",
      "advantage": "home",
      "last_point_result": "receiver_winner",
      "tie_break": false
    }
  }
}
```

Read `game_state` fields together: `serving` names the side serving (`home`/`away`), `home_score`/`away_score` inside `game_state` are the point scores (0, 15, 30, 40, 50), `advantage` appears at deuce, and `tie_break` flags a tiebreak game. `last_point_result` describes how the previous point ended.

<br />

### 3. Ended, then closed

When play finishes, `status` moves to `ended` and then settles at `closed` once the result is confirmed. The final `sport_event_status` carries `winner_id`, the sets total in `home_score`/`away_score`, and per-set `period_scores` including tiebreak points where applicable:

```json Sport Event Summary: closed final (json)
{
  "sport_event": {
    "id": "sr:sport_event:72318992",
    "start_time": "2026-07-12T15:05:00+00:00"
  },
  "sport_event_status": {
    "status": "closed",
    "match_status": "ended",
    "home_score": 3,
    "away_score": 1,
    "period_scores": [
      {
        "home_score": 6,
        "away_score": 7,
        "type": "set",
        "number": 1,
        "home_tiebreak_score": 7,
        "away_tiebreak_score": 9
      },
      {
        "home_score": 7,
        "away_score": 6,
        "type": "set",
        "number": 2,
        "home_tiebreak_score": 7,
        "away_tiebreak_score": 2
      },
      {
        "home_score": 6,
        "away_score": 3,
        "type": "set",
        "number": 3
      },
      {
        "home_score": 6,
        "away_score": 4,
        "type": "set",
        "number": 4
      }
    ],
    "winner_id": "sr:competitor:225050"
  }
}
```

Note the tiebreak sets: `home_tiebreak_score` and `away_tiebreak_score` record the tiebreak points alongside the 7-6 games score.

<br />

***

## Interruptions and Delays

Weather and darkness stop play regularly. An interrupted match keeps its scores and returns to `live` when play resumes:

```json Live Summaries entry: interrupted (json)
{
  "sport_event": {
    "id": "sr:sport_event:73148798",
    "start_time": "2026-07-27T15:00:00+00:00"
  },
  "sport_event_status": {
    "status": "interrupted",
    "match_status": "interrupted",
    "home_score": 1,
    "away_score": 1,
    "period_scores": [
      {
        "home_score": 7,
        "away_score": 5,
        "type": "set",
        "number": 1
      },
      {
        "home_score": 2,
        "away_score": 6,
        "type": "set",
        "number": 2
      },
      {
        "home_score": 2,
        "away_score": 4,
        "type": "set",
        "number": 3
      }
    ]
  }
}
```

* `interrupted` means play stopped for a short time; expect it to resume.
* `suspended` means the match has been postponed to a later time (commonly the next day); the match keeps its ID and its scores.
* `delayed` and `start_delayed` cover matches that have not yet begun on time.

Poll the match at its live cadence through an interruption: the transition back to `live` is your signal that scoring has resumed.

<br />

***

## Special Match Outcomes

Tennis matches can end without a completed final set. The `match_status` records how, and `winning_reason` adds detail where relevant.

A **retirement** ends the match mid-play; completed and partial set scores are preserved:

```json Retired (json)
{
  "sport_event": {
    "id": "sr:sport_event:72287384",
    "competitors": [
      {
        "id": "sr:competitor:287541",
        "name": "Sweeny, Dane",
        "qualifier": "home"
      },
      {
        "id": "sr:competitor:873695",
        "name": "Blanch, Darwin",
        "qualifier": "away"
      }
    ]
  },
  "sport_event_status": {
    "status": "ended",
    "match_status": "retired",
    "period_scores": [
      {
        "home_score": 2,
        "away_score": 6,
        "type": "set",
        "number": 1
      },
      {
        "home_score": 7,
        "away_score": 6,
        "type": "set",
        "number": 2,
        "home_tiebreak_score": 9,
        "away_tiebreak_score": 7
      },
      {
        "home_score": 4,
        "away_score": 0,
        "type": "set",
        "number": 3
      }
    ],
    "winner_id": "sr:competitor:287541"
  }
}
```

A **walkover** ends the match before any play; there are no `period_scores`, and `winning_reason` states the walkover:

```json Walkover (json)
{
  "sport_event": {
    "id": "sr:sport_event:73169922",
    "competitors": [
      {
        "id": "sr:competitor:284801",
        "name": "Boyer, Tristan",
        "qualifier": "home"
      },
      {
        "id": "sr:competitor:17080",
        "name": "Tomic, Bernard",
        "qualifier": "away"
      }
    ]
  },
  "sport_event_status": {
    "status": "ended",
    "match_status": "walkover",
    "winner_id": "sr:competitor:284801",
    "winning_reason": "walkover"
  }
}
```

A **default** (`defaulted`) ends the match by disqualification and follows the same shape as a retirement.

Build result displays against `winner_id` plus `match_status` rather than assuming a full scoreline: a decided match does not always carry complete sets.

<br />

***

## Cancelled

<a name="cancelled"></a>

A `cancelled` match will not be played. Cancelled matches may report `detailed_serve_outcomes` and `play_by_play` as `false` regardless of the competition's normal coverage; see [Data Coverage and Tiers](https://developer.sportradar.com/tennis/docs/tennis-ig-data-coverage-tiers). If a fixture is replaced rather than simply dropped, reconcile with the change feeds described in [Monitoring Data Changes](https://developer.sportradar.com/tennis/docs/tennis-ig-monitoring-data-changes).

<br />

***

## Status-Driven Polling

Let the status drive your request cadence:

* `not_started`: poll the schedule feeds at their standard cadence and watch for `match_about_to_start`.
* `live` (and `interrupted`): poll <Anchor label="Live Summaries" target="_blank" href="ref:live-summaries">Live Summaries</Anchor> and the match's <Anchor label="Sport Event Summary" target="_blank" href="ref:sport-event-summary">Sport Event Summary</Anchor> at the live cadence; layer in <Anchor label="Live Timelines" target="_blank" href="ref:live-timelines">Live Timelines</Anchor> for point-by-point.
* `ended`: keep polling until `closed`; statistics and results can still be corrected in this window.
* `closed`: stop live polling. Pull the final <Anchor label="Sport Event Summary" target="_blank" href="ref:sport-event-summary">Sport Event Summary</Anchor> and <Anchor label="Sport Event Timeline" target="_blank" href="ref:sport-event-timeline">Sport Event Timeline</Anchor> once for your archive.

Per-feed cadences are in [Update Frequencies](https://developer.sportradar.com/tennis/docs/tennis-ig-update-frequencies).