---
id: live-statistics
title: Live Match Statistics Data Model
description: Description of the Live statistics structure, including attacks, possession, shots, and other match metrics.
version: v1
language: en
---

# Live Match Statistics Data Model

## What `stat_list` Contains

`stat_list` contains actual match statistics: attacks, possession, shots, cards,
corners, and other available data.

`stat_list` provides only the main current statistics for a Live match. It is not a
detailed statistics source for extended analysis of teams, players, and tournaments.

Statistics are not a betting list and do not contain odds. Available bets on
statistical events are provided separately in `game_oc_list` or in submatches from
`sub_games`.

```text
stat_list    → actual match statistics
game_oc_list → betting markets and odds
sub_games    → links to additional matches and markets
```

## Scope of Sport Line API Statistics

Sport Line API provides brief statistics for displaying the main indicators of a match
while it is Live. Depending on data availability, these may include:

- attacks and dangerous attacks;
- possession;
- shots;
- corners;
- cards;
- xG;
- other main statistics actually returned in `stat_list`.

Sport Line API does not provide detailed statistics for advanced analysis through
`stat_list`. It does not include a complete data set covering:

- a detailed match event history;
- extended team analysis;
- player statistics and analysis;
- team head-to-head records (H2H);
- teams' previous match history;
- future matches and team schedules;
- other advanced analytical data.

A separate detailed sports statistics API is being developed for this data. It is not
currently part of Sport Line API.

Use `stat_list` as a brief source of current Live match statistics, not as a source of
complete history or advanced sports analytics.

## Methods That Return Statistics

Statistics are available only for Live matches and only in two cases:

| Method | What it returns |
|---|---|
| [`events`](../api-reference/events.md) with `live` type | Main statistics inside each match in the list |
| [`event`](../api-reference/event.md) with `live` type | Main statistics for a specific match |

Statistics are not provided in Prematch. Do not use other Sport Line API methods to
retrieve them. If a technical object contains an empty `stat_list: []` field, that does
not mean statistics are available.

A Live match is not guaranteed to have statistics. In the saved Live list, statistics
were populated for 16 of 39 matches. This figure applies only to that response snapshot
and is not a permanent coverage rate.

## `stat_list` Structure

`stat_list` is an array of statistic objects:

```text
match
└── stat_list[]
    └── statistic
        ├── id
        ├── name
        ├── opp1
        └── opp2
```

| Field | Type | Description |
|---|---|---|
| `id` | number | Technical statistic ID |
| `name` | string | Statistic name in the requested language |
| `opp1` | string | Value for the first team or participant |
| `opp2` | string | Value for the second team or participant |

No additional fields were found in the verified `stat_list` objects.

## Team Mapping

Statistic values correspond to the two match sides:

| Statistic field | Match team or participant |
|---|---|
| `opp1` | `opp_1_name`; identifier: `opp_1_id` |
| `opp2` | `opp_2_name`; identifier: `opp_2_id` |

Do not infer a side from the team's visual position in the interface. If the teams are
visually swapped, their statistic values must be swapped with them.

## Live Match Statistics Example

Fragment from the saved response for match `746146992`:

```json
{
  "stat_list": [
    {
      "id": 93,
      "name": "xG",
      "opp1": "1.45",
      "opp2": "0.03"
    },
    {
      "id": 45,
      "name": "Attacks",
      "opp1": "61",
      "opp2": "54"
    },
    {
      "id": 58,
      "name": "Dangerous attacks",
      "opp1": "44",
      "opp2": "19"
    },
    {
      "id": 29,
      "name": "Possession %",
      "opp1": "65",
      "opp2": "35"
    }
  ]
}
```

The first team in this match is Arsenal, and the second is Coventry City. Therefore,
the possession value `65` belongs to Arsenal, while `35` belongs to Coventry City.

## `opp1` and `opp2` Value Format

In JSON, `opp1` and `opp2` are strings even when they contain a number:

```json
{
  "name": "Attacks",
  "opp1": "61",
  "opp2": "54"
}
```

A decimal value is also returned as a string:

```json
{
  "name": "xG",
  "opp1": "1.45",
  "opp2": "0.03"
}
```

For percentage statistics, the `%` sign is part of the name, while the values are
returned without it:

```json
{
  "name": "Possession %",
  "opp1": "65",
  "opp2": "35"
}
```

For ordinary display, use the values as strings. Convert them to numbers only for known
statistics when the client needs calculations, comparisons, or charts. Do not
automatically convert every possible value to a number: the available statistics and
their formats depend on the sport and data provider.

## `id` and `name`

Use `id` to match statistics programmatically. `name` is localized according to the
requested language and is intended for display.

For example, statistic `id: 45` is returned as `Attacks` when requesting `lang=en`.

Do not use `name` as a permanent technical identifier or link responses in different
languages by the name text.

## Confirmed Football Match Statistics

The following IDs occurred in saved Russian and English responses for Live football
matches. The table includes only statistics actually found and is not a complete
reference for every sport.

| `id` | English name returned by the API |
|---:|---|
| `26` | Yellow cards |
| `29` | Possession % |
| `45` | Attacks |
| `47` | Saves |
| `58` | Dangerous attacks |
| `59` | Shots on target |
| `60` | Shots off target |
| `70` | Corner |
| `71` | Red card |
| `72` | Penalty |
| `92` | Substitutions |
| `93` | xG |
| `94` | Key Passes |
| `95` | Passing Accuracy % |
| `96` | Crosses |

The statistic set depends on the sport, the specific match, and data availability. Do
not create a mandatory list requiring every Live match to contain all IDs from this
table.

## Empty or Missing Statistics

An empty array means that no statistics were provided in the current response:

```json
{
  "stat_list": []
}
```

It does not mean that every statistic equals zero. Possible reasons include a lack of
statistics coverage, the current stage of the match, or the sports line type.

Distinguish between the following cases:

| State | Meaning |
|---|---|
| Populated `stat_list` | Display the statistics actually returned |
| `stat_list: []` | Statistics are not currently provided |
| Missing `stat_list` field | The selected method or response format does not provide this field |
| A statistic is absent from a populated list | The value of that statistic is unknown; it is not zero |
| `opp1: "0"` or `opp2: "0"` | The API explicitly returned a zero value |

Do not retain an old value as current if a statistic disappears from the next update.

## Statistics in Submatches

In every submatch response, `stat_list` contains statistics for the main match, not
separate statistics for the selected submatch.

For example, this remains true when opening these submatches:

- “Corners”;
- “Corners, 1st Half”;
- “1st Half”;
- cards, fouls, and other additional match sections.

Even when the user opens “Corners, 1st Half,” `stat_list` contains the main statistics
for the entire match: xG, attacks, possession, shots, cards, and other available values.

Do not associate the contents of `stat_list` with `game_dop_name`, and do not filter
statistics based on the submatch type. Use `game_mid` to identify the main match.

## Updating Statistics

Live match statistics change during the game. Each time a new response is received:

1. Match statistics by `id`.
2. Update the `opp1` and `opp2` values.
3. Use the returned `name` for the selected language.
4. Add new statistics that appear in the response.
5. Do not continue displaying a disappeared statistic as current.

The request frequency is determined by the method used to retrieve the match. See
[Data Update Guidelines](../getting-started/update-guidelines.md) for recommended
intervals.

## `stat_list_extra`

`stat_list_extra` is not an extension of `stat_list`. It is currently a reserved test
field that is not used in client integrations.

```json
{
  "stat_list_extra": []
}
```

Do not merge `stat_list_extra` with match statistics or build required logic around its
contents.

## Practical Integration Rules

1. Use `id` as the technical statistic identifier.
2. Display the localized `name` returned by the API.
3. Map `opp1` to the first match side and `opp2` to the second.
4. Support string JSON values.
5. Do not treat an empty list or missing statistic as zero.
6. Do not expect the same statistic set for every sport and match.
7. Replace statistics with current response data on every update.
8. Do not mix `stat_list` with bets from `game_oc_list` or `sub_games`.

## Verification Responses

- [Live match, Russian](../examples/json-responses/event.game-746146992.group.live.ru.json)
- [Live match, English](../examples/json-responses/event.game-746146992.group.live.en.json)
- [Live “Corners” submatch](../examples/json-responses/event.subgame-746147010.corners.group.live.ru.json)

## Related Documents

- [Match Data Model](match.md)
- [Field Reference](field-reference.md)
- [`events` — Match List](../api-reference/events.md)
- [`event` — Specific Match](../api-reference/event.md)
