Data API · Events
Live match analysis
GET/api/v1/datas/live-analysis/{id}
Returns the whole live analysis of one match as a single document: status and clock, teams, per-minute momentum, timeline, fifteen-minute dynamics, possession, lineups, per-player metrics, goals, discipline and attacking. The discipline section holds the referee indices of the match, each side's fouls, fouls won, cards and offsides with its aggression and discipline ratios, and every foul in order with its clock, the players involved and the card it drew. The attacking section holds each side's advanced attacking parameters - shot accuracy and conversion, possession effectiveness, intensity, control, chaos, tempo and directness - each as numerator, denominator and ratio. The numbers equal the advanced parameters of the legacy live endpoint, with the same raw and metrics fields as the advanced-parameters endpoint, and that parity is kept on purpose: the possession count follows the legacy convention and counts every possession marker, the one tagged where a possession starts and the one tagged where it ends, so it is roughly twice the possession count of the possession section. Every section is computed from the live tagging stream of this match, so the document is there while the match is still being tagged, and it is only ever as complete as the tagging is. Two things follow, and a broadcast client should plan around them rather than discover them: the pitch positions in lineups are the tagged starting slots replayed through substitutions and dismissals, not tracked or averaged positions; and the stream carries no event coordinates and no pass recipients, so there is no shot map, no heat map and no passing network here, and no body part or pitch zone behind a goal. The body is the document api-v1 GET /api/online/analysis/{matchId} computes, passed through field for field, so the two can never disagree. It is snake_case at the source: ask for case=snake_case to get it exactly as api-v1 published it, because the default camelCase also rewrites the data keys of the maps inside it (the dynamics bucket keys 0-15 and 30-45+ become 015 and 3045+, the possession duration buckets 0_10 and over_45 become 010 and over45). Poll it like this: keep the ETag of the last 200, send it back in If-None-Match, and expect 304 with an empty body for as long as nothing has changed. Cache-Control says how long the document is good for, five seconds while the match is live and three hundred seconds once it is not, and this endpoint allows 240 requests a minute for the token instead of the 60 the other Data API routes share - room for one match every five seconds, or several matches every fifteen. The published ETag is weak and is qualified by the representation that was asked for - the case and format, and the section selection of include and segments - for example W/"json.camelCase~la:v3:719279:1f902ecd821e", so a tag taken with one representation never matches a request made with another. The source API tags the match rather than the selection, so without that qualification a client holding the whole bundle would be answered 304 for a narrower include. Treat the tag as an opaque string and send it back exactly as it was received.
Bearer authentication required · service: data_apiReference only — this page never sends API requests or exposes token controls.
Response formats
When format is listed below, use json for the response documented here, or csv and xml for downloads. JSON uses camelCase by default; set case=snake_case when supported for legacy key names. Nested response fields use dot notation; [] denotes an array item and {key} a dynamic object key.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | integer | Required | Match ID Minimum 1. |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| format | string | Required | Response format. Allowed: json, csv, xml. |
| include | string | Optional | Comma-separated list of sections to return. status, teams and match are always present; every other section is returned only when it is named here. meta.sections repeats what the document actually carries, so a client can render whatever came back without guessing. Comma-separated list; allowed values: status, teams, match, momentum, timeline, dynamics, possession, lineups, players, goals, discipline, attacking. |
| segments | boolean | Optional | Add the raw possession segments to the possession section. Off by default because the segment list is the largest part of the document. Default: false. |
| case | string | Optional | JSON response key style. Default: camelCase. Allowed: camelCase, snake_case. |
Response attributes
| Attribute | Type | Description |
|---|---|---|
| matchId | integer | Match ID. |
| meta | object | Document metadata. Always present. |
| meta.generatedAt | string | When this document was computed (ISO 8601). |
| meta.definitionsVersion | integer | Version of the calculation definitions. It changes only when a formula or a field changes, so a client can cache derived work against it. Version 2 links assists tagged late after their goal, adds shortName to every player reference and limits lineups bench to the players the tagging places at the match (benchSource). Version 3 makes momentum points[].net exactly points[].home minus points[].away, so the three numbers of a minute always add up, where before it was squashed from the difference of the two smoothed sums and often did not; adds passesPerPossession and penalties to every dynamics team block; and adds the attacking section. |
| meta.lastMarkerId | integer|null | ID of the last tagging marker included in the calculation. |
| meta.markerCount | integer | Number of tagging markers the document was computed from. |
| meta.etag | string | Entity tag of the upstream document. The endpoint publishes its own weak tag in the ETag response header; poll against that header, not against this field. |
| meta.resolutionSeconds | integer | Momentum sampling step in seconds. Always 60. |
| meta.bucketMinutes | integer | Dynamics bucket length in minutes. Always 15. |
| meta.sections | array | Sections this document actually carries, after include was applied. |
| meta.sections[] | string | Section name. |
| match | object | Match context. Always present. |
| match.date | string|null | Match date (ISO 8601). |
| match.season | object|null | Season the match belongs to. |
| match.season.id | integer | Season ID. |
| match.season.title | string|null | Season title. |
| status | object | Where the match stands right now. Always present. |
| status.phase | string | Match phase, published as a source value: not_started, first_half, half_time, second_half, extra_time, penalties or finished. |
| status.isLive | boolean | Whether the match is being tagged right now. This is what decides the Cache-Control window: 5 seconds while it is true, 300 seconds once it is not. |
| status.analyseStatus | integer | Tagging state: 1 no markers yet, 2 tagging in progress, 3 the match-end marker has been tagged. |
| status.currentHalf | integer|null | Half the clock is in: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout. Null before the first period starts. |
| status.clock | object|null | Current match clock. Null before the first period starts. |
| status.clock.half | integer | Current half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout. |
| status.clock.second | number | Current second inside that half. |
| status.clock.display | string | Current minute as it should be printed, for example 36', 45+5' or 90+7'. Printed by the source so the API and the screen can never disagree. |
| status.clock.regulationMinute | number|null | Current minute on the regulation clock. |
| status.clock.timelineMinute | integer|null | Current minute on the continuous timeline momentum uses. |
| status.minutesByHalf | object | Minutes played in each half, keyed by half number, stoppage included, for example 1: 50 and 2: 53. |
| status.minuteBucketsByHalf | object | How many momentum minutes each half contributes to the continuous timeline, keyed by half number. |
| status.playedMinutes | integer | Minutes played so far across all halves, stoppage included. |
| status.periods | array | One entry per half the match has reached. |
| status.periods[].half | integer | Half number. |
| status.periods[].started | boolean | Whether the period-start marker was tagged. |
| status.periods[].ended | boolean | Whether the period-end marker was tagged. |
| status.periods[].startMarkerId | integer|null | Marker that opened the half. |
| status.periods[].lastSecond | number | Last second tagged inside the half. |
| status.periods[].stoppageSeconds | number | Seconds played beyond the regulation length of the half. |
| status.score | object | Score from halves 1 to 4. A shootout is never counted here. |
| status.score.home | integer | Home goals. |
| status.score.away | integer | Away goals. |
| status.shootout | object|null | Penalty shootout, or null when the match had none. |
| status.shootout.score | object | Shootout score. |
| status.shootout.score.home | integer | Home kicks scored. |
| status.shootout.score.away | integer | Away kicks scored. |
| status.shootout.kicks | array | Kicks in the order they were taken. |
| status.shootout.kicks[].team | string | home or away. |
| status.shootout.kicks[].scored | boolean | Whether the kick was scored. |
| status.shootout.kicks[].player | object|null | Taker, as the player reference described under timeline[].player. |
| status.shootout.kicks[].markerId | integer | Marker the kick came from. |
| status.dataQuality | object | What the tagging stream itself was missing. Both counters are published so a client can tell a genuine zero from a gap in the tagging. |
| status.dataQuality.goalsWithoutShot | integer | Goals that carry no shot marker, so the shot counts are lower than the goal counts by this much. |
| status.dataQuality.orphanPossessionEnds | integer | Possession end markers with no matching start; the same markers are itemised in possession.anomalies. |
| teams | object | Both teams. Always present. Sides are always home and away, never team IDs. |
| teams.home | object | Home-team identity. |
| teams.home.teamId | integer | Home team ID, the same ID the other Data API endpoints use. |
| teams.home.squadId | integer | Home squad ID for this match. |
| teams.home.name | string | Home team name. |
| teams.home.shortName | string|null | Home team short name. |
| teams.home.logo | string|null | Home team logo path at the source. |
| teams.home.logoUrl | string|null | Home team logo as an absolute URL. |
| teams.home.color | string|null | Home team shirt colour as a hex string. |
| teams.home.colorNumber | string|null | Home team shirt-number colour as a hex string. |
| teams.away | object | Away-team identity. |
| teams.away.teamId | integer | Away team ID, the same ID the other Data API endpoints use. |
| teams.away.squadId | integer | Away squad ID for this match. |
| teams.away.name | string | Away team name. |
| teams.away.shortName | string|null | Away team short name. |
| teams.away.logo | string|null | Away team logo path at the source. |
| teams.away.logoUrl | string|null | Away team logo as an absolute URL. |
| teams.away.color | string|null | Away team shirt colour as a hex string. |
| teams.away.colorNumber | string|null | Away team shirt-number colour as a hex string. |
| momentum | object | Per-minute attack index for both teams, one point per played minute. Optional section. |
| momentum.resolutionSeconds | integer | Seconds per point. Always 60. |
| momentum.model | object | How the index is computed, published so a client can label the chart honestly. |
| momentum.model.method | string | Always ewma_tanh: each side's weighted event sum, smoothed with an exponentially weighted moving average and squashed with tanh into home and away. |
| momentum.model.ewmaAlpha | number | Smoothing factor of the moving average. |
| momentum.model.tanhScale | number | Divisor applied before tanh. |
| momentum.model.resetOnNewHalf | boolean | Whether the smoothing restarts at the start of each half. Always true. |
| momentum.model.range | array | Lower and upper bound of net, home and away. Always -100 and 100. |
| momentum.model.net | string | Always home_minus_away: points[].net is points[].home minus points[].away and nothing else. |
| momentum.weights | object | Weight each counted event carries in the index. |
| momentum.weights.possessionSeconds | number | Weight applied to seconds of possession. |
| momentum.weights.passes | number | Weight applied to passes. |
| momentum.weights.shotsOnTarget | number | Weight applied to shots on target. |
| momentum.weights.shotsBlockedPost | number | Weight applied to shots blocked or off the woodwork. |
| momentum.weights.shotsWide | number | Weight applied to shots wide. |
| momentum.weights.goals | number | Weight applied to goals. |
| momentum.weights.penaltiesMissed | number | Weight applied to penalties missed. |
| momentum.weights.corners | number | Weight applied to corners. |
| momentum.weights.duelsWon | number | Weight applied to duels won. |
| momentum.weights.interceptions | number | Weight applied to interceptions. |
| momentum.points | array | One point per minute of the continuous timeline, in order. |
| momentum.points[].timelineMinute | integer | Minute on the continuous timeline, counting stoppage time of earlier halves. |
| momentum.points[].half | integer | Half this minute belongs to. |
| momentum.points[].minuteInHalf | integer | Minute inside that half. |
| momentum.points[].display | string | Minute as it should be printed, for example 36' or 45+5'. |
| momentum.points[].net | number | home minus away: points[].home - points[].away exactly, so the three numbers of a minute always add up. Between -100 and 100; positive means the home team was on top in that minute. |
| momentum.points[].home | number | Home index for the minute, between 0 and 100. |
| momentum.points[].away | number | Away index for the minute, between 0 and 100. |
| momentum.points[].partial | boolean | True while the minute is still being played, so the point can still move on the next poll. |
| momentum.points[].components | object | The raw counts the two indexes were computed from, so a client can explain a spike. |
| momentum.points[].components.home | object | Home counts for the minute. |
| momentum.points[].components.home.possessionSeconds | number | Home seconds of possession. |
| momentum.points[].components.home.passes | number | Home passes. |
| momentum.points[].components.home.shotsOnTarget | number | Home shots on target. |
| momentum.points[].components.home.shotsBlockedPost | number | Home shots blocked or off the woodwork. |
| momentum.points[].components.home.shotsWide | number | Home shots wide. |
| momentum.points[].components.home.goals | number | Home goals. |
| momentum.points[].components.home.penaltiesMissed | number | Home penalties missed. |
| momentum.points[].components.home.corners | number | Home corners. |
| momentum.points[].components.home.duelsWon | number | Home duels won. |
| momentum.points[].components.home.interceptions | number | Home interceptions. |
| momentum.points[].components.away | object | Away counts for the minute; the same ten fields as points[].components.home. |
| timeline | array | Match events in the order they happened: goals, cards, substitutions and period markers. Optional section. The entries share the fields below; which of them are filled depends on type. |
| timeline[].markerId | integer | Tagging marker the event came from. |
| timeline[].type | string | Event type, published as a source value: goal, own_goal, penalty_missed, yellow_card, second_yellow, red_card, substitution or period. |
| timeline[].subtype | string|null | On a goal: open_play, penalty or set_piece. On a period marker: first_half_start, half_time, second_half_start, extra_time_1_start, extra_time_2_start, shootout_start or match_end. Null on cards and substitutions. |
| timeline[].team | string|null | home or away. Null on period markers. |
| timeline[].half | integer | Event half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout. |
| timeline[].second | number | Event second inside that half. |
| timeline[].display | string | Event minute as it should be printed, for example 36', 45+5' or 90+7'. Printed by the source so the API and the screen can never disagree. |
| timeline[].regulationMinute | number|null | Event minute on the regulation clock. |
| timeline[].timelineMinute | integer|null | Event minute on the continuous timeline momentum uses. |
| timeline[].player | object|null | Scorer on a goal, taker on a missed penalty, the booked or dismissed player on a card. |
| timeline[].player.playerInSquadId | integer | Player squad-entry ID for this match. |
| timeline[].player.playerId | integer | Player player ID, the same ID the other Data API endpoints use. |
| timeline[].player.name | string|null | Player first name. |
| timeline[].player.surname | string|null | Player surname. |
| timeline[].player.displayName | string | Player name as it should be printed. |
| timeline[].player.shortName | string|null | Player one-word football name for a pitch graphic, for example Adison or Noguera: the known name when the platform keeps one, otherwise the surname read with the naming conventions of the league. Null when there is no usable word; print displayName then. |
| timeline[].player.number | integer|null | Player shirt number. |
| timeline[].player.side | string|null | Side the scorer belongs to; on an own goal this is the other side from team. |
| timeline[].assist | object|null | Assisting player on a goal, as the same reference shape as player. The assist is tagged when the tagger gets to it, often after the restart, so it is linked to the goal of the same team and half that it follows by at most six minutes, and never across another goal of either team. |
| timeline[].assistMarkerId | integer|null | Marker the assist came from. |
| timeline[].playerIn | object|null | Substitution only: the player coming on, as the same reference shape as player. |
| timeline[].playerOut | object|null | Substitution only: the player going off, as the same reference shape as player. |
| timeline[].scoreAfter | object | Goals only: the score once this goal is counted. |
| timeline[].scoreAfter.home | integer | Home goals after the event. |
| timeline[].scoreAfter.away | integer | Away goals after the event. |
| dynamics | object | The same team metrics cut two ways: into 15-minute buckets and into period totals. Optional section. |
| dynamics.bucketMinutes | integer | Bucket length in minutes. Always 15. |
| dynamics.buckets | array | One entry per 15-minute bucket the match has reached. |
| dynamics.buckets[].key | string | Bucket label, published as a data key: 0-15, 15-30, 30-45+, 45-60, 60-75, 75-90+, 90-105+ or 105-120+. Under the default case=camelCase these keys are rewritten to 015, 1530, 3045+ and so on; ask for case=snake_case to keep them readable. |
| dynamics.buckets[].half | integer | Half the bucket belongs to. |
| dynamics.buckets[].fromMinute | integer | First minute of the bucket. |
| dynamics.buckets[].toMinute | integer | Last minute of the bucket. |
| dynamics.buckets[].includesStoppage | boolean | Whether the bucket also carries the stoppage time of its half. |
| dynamics.buckets[].isCurrent | boolean | True for the bucket being played, whose numbers are still moving. |
| dynamics.buckets[].home | object | Home metrics inside the bucket. |
| dynamics.buckets[].home.goals | integer | Home goals. |
| dynamics.buckets[].home.shots | integer | Home shots, blocked ones included. |
| dynamics.buckets[].home.shotsUnblocked | integer | Home shots that were not blocked. |
| dynamics.buckets[].home.shotsOnTarget | integer | Home shots on target. |
| dynamics.buckets[].home.shotsOnTargetPct | number | Home shots on target as a percentage of unblocked shots. |
| dynamics.buckets[].home.shotsWide | integer | Home shots wide. |
| dynamics.buckets[].home.shotsBlocked | integer | Home shots blocked. |
| dynamics.buckets[].home.shotsPost | integer | Home shots off the woodwork. |
| dynamics.buckets[].home.passes | integer | Home passes. The tagging stream records the pass, not who received it, so there is no passing network anywhere in this document. |
| dynamics.buckets[].home.possessionSeconds | number | Home seconds in possession. |
| dynamics.buckets[].home.possessionPct | number | Home share of possession as a percentage. |
| dynamics.buckets[].home.possessions | integer | Home number of separate possessions. |
| dynamics.buckets[].home.passesPerPossession | number | Home passes per possession: passes divided by possessions, to two decimals, and 0 when there were no possessions. Each possession counts once, so in dynamics.splits.fullTime this is the same number as possession.home.passesPerPossession, and about twice the tempoIndex of the attacking section, which divides by possession markers. |
| dynamics.buckets[].home.corners | integer | Home corners. |
| dynamics.buckets[].home.fouls | integer | Home fouls committed. |
| dynamics.buckets[].home.foulsWon | integer | Home fouls won. |
| dynamics.buckets[].home.duelsWon | integer | Home duels won. |
| dynamics.buckets[].home.duelsLost | integer | Home duels lost. |
| dynamics.buckets[].home.duelWinPct | number | Home duels won as a percentage of duels contested. |
| dynamics.buckets[].home.interceptions | integer | Home interceptions. |
| dynamics.buckets[].home.offsides | integer | Home offsides. |
| dynamics.buckets[].home.yellowCards | integer | Home yellow cards. |
| dynamics.buckets[].home.redCards | integer | Home red cards, second yellows included. |
| dynamics.buckets[].home.saves | integer | Home goalkeeper saves. |
| dynamics.buckets[].home.penalties | integer | Home penalties taken: penaltiesScored plus penaltiesMissed. |
| dynamics.buckets[].home.penaltiesScored | integer | Home penalties scored. |
| dynamics.buckets[].home.penaltiesMissed | integer | Home penalties missed. |
| dynamics.buckets[].home.ownGoals | integer | Home own goals, counted for the team that scored them. |
| dynamics.buckets[].away | object | Away metrics inside the bucket; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits | object | Period totals of the same metrics. |
| dynamics.splits.firstHalf | object | First-half totals. |
| dynamics.splits.firstHalf.home | object | Home metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.firstHalf.away | object | Away metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.secondHalf | object | Second-half totals. |
| dynamics.splits.secondHalf.home | object | Home metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.secondHalf.away | object | Away metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.extraTime | object|null | Extra-time totals, or null when the match had no extra time. |
| dynamics.splits.extraTime.home | object | Home metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.extraTime.away | object | Away metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.fullTime | object | Totals for the whole match so far. These are the numbers a scoreboard shows. |
| dynamics.splits.fullTime.home | object | Home metrics; the same 28 metrics as dynamics.buckets[].home. |
| dynamics.splits.fullTime.away | object | Away metrics; the same 28 metrics as dynamics.buckets[].home. |
| possession | object | How each team held the ball. Optional section. |
| possession.home | object | Home possession summary. |
| possession.home.count | integer | Number of separate possessions. |
| possession.home.totalSeconds | number | Seconds in possession. |
| possession.home.pct | number | Share of possession as a percentage. |
| possession.home.avgSeconds | number | Average possession length in seconds. |
| possession.home.maxSeconds | number | Longest possession in seconds. |
| possession.home.withShot | integer | Possessions that ended with a shot. |
| possession.home.withShotPct | number | Possessions that ended with a shot, as a percentage. |
| possession.home.passesPerPossession | number | Average number of passes per possession. |
| possession.home.durationBuckets | object | How many possessions fell into each duration band, keyed by band: 0_10, 10_20, 20_45 and over_45 seconds. Under the default case=camelCase these keys are rewritten to 010, 1020, 2045 and over45. |
| possession.away | object | Away possession summary; the same fields as possession.home. |
| possession.source | string | Where the possessions came from, as a source value: markers_193 when possession markers were tagged, inferred_phases when they were derived, none when there was nothing to derive them from. |
| possession.durationSource | string|null | How each possession was timed, as a source value: possession_time, clock or mixed. |
| possession.anomalies | array | Possession markers that did not pair up. They are reported rather than silently dropped, because they move the possession totals. |
| possession.anomalies[].markerId | integer | Marker at fault. |
| possession.anomalies[].kind | string | duplicate_end, orphan_end or orphan_start. |
| possession.segments | array | Every possession as its own segment. Returned only with segments=1. |
| possession.segments[].team | string | home or away. |
| possession.segments[].half | integer | Half the segment belongs to. |
| possession.segments[].start | number | Second the possession started, inside that half. |
| possession.segments[].end | number | Second the possession ended. |
| possession.segments[].duration | number | Length in seconds. |
| possession.segments[].startMarkerId | integer|null | Marker that opened the possession. |
| possession.segments[].endMarkerId | integer|null | Marker that closed it. |
| possession.segments[].orphan | boolean | Whether the segment is one of the unpaired markers listed in possession.anomalies. |
| possession.segments[].open | boolean | Whether the possession is still running right now. |
| lineups | object | Both teams placed on one pitch frame. Optional section. These are the slots the tagger drew, replayed through substitutions and dismissals; they are not tracked average positions, and they do not move with play. |
| lineups.pitch | object | The frame the slot coordinates live in. |
| lineups.pitch.lengthM | number | Pitch length in metres. Always 105. |
| lineups.pitch.widthM | number | Pitch width in metres. Always 68. |
| lineups.pitch.frame | string | Always origin_bottom_left_home_attacks_positive_x_away_mirrored_y_up: metres, origin bottom left, y upwards, the home team attacking towards larger x and the away team already mirrored into the same frame, so both teams can be drawn on one pitch without further arithmetic. |
| lineups.pitch.positionsAre | string | Always registrator_slots, said plainly: the positions are the tagged formation slots, not tracked or averaged positions. |
| lineups.home | object | Home lineup. |
| lineups.home.formation | object | Formation at kick-off and right now. |
| lineups.home.formation.start | object|null | Formation the team started with. |
| lineups.home.formation.start.actionId | integer | Formation ID at the source. |
| lineups.home.formation.start.name | string|null | Formation name, for example 3-4-3. |
| lineups.home.formation.current | object|null | Formation the team is in now, as the same object. |
| lineups.home.start | array | The eleven slots the team started with. |
| lineups.home.start[].slot | object|null | Slot on the pitch. |
| lineups.home.start[].slot.actionId | integer | Slot ID at the source. |
| lineups.home.start[].slot.code | string | Slot code, for example GK, LCD or RW. |
| lineups.home.start[].slot.column | integer | Slot column, -1 for the goalkeeper up to 4 for the front line. |
| lineups.home.start[].slot.row | integer | Slot row across the pitch, 0 to 4. |
| lineups.home.start[].slot.xM | number | Slot position along the pitch in metres, in the frame described by lineups.pitch. |
| lineups.home.start[].slot.yM | number | Slot position across the pitch in metres. |
| lineups.home.start[].player | object|null | Player in the slot. |
| lineups.home.start[].player.playerInSquadId | integer | Player squad-entry ID for this match. |
| lineups.home.start[].player.playerId | integer | Player player ID, the same ID the other Data API endpoints use. |
| lineups.home.start[].player.name | string|null | Player first name. |
| lineups.home.start[].player.surname | string|null | Player surname. |
| lineups.home.start[].player.displayName | string | Player name as it should be printed. |
| lineups.home.start[].player.shortName | string|null | Player one-word football name for a pitch graphic, for example Adison or Noguera: the known name when the platform keeps one, otherwise the surname read with the naming conventions of the league. Null when there is no usable word; print displayName then. |
| lineups.home.start[].player.number | integer|null | Player shirt number. |
| lineups.home.start[].slotSource | string|null | Where the slot came from: draft (the lineup drawn before kick-off), placement (a slot tagged during the match) or inherited (the slot of the player who was replaced). |
| lineups.home.start[].minutes | number | Minutes the player has spent on the pitch. |
| lineups.home.start[].onPitch | boolean | Whether the player is on the pitch right now. |
| lineups.home.start[].since | object|null | Clock at which the player took the slot, as the clock object described under status.clock. |
| lineups.home.start[].until | object|null | Clock at which the player left it, as the same clock object. |
| lineups.home.start[].goals | integer | Goals scored by the player. |
| lineups.home.start[].assists | integer | Assists by the player. |
| lineups.home.start[].cards | object | Cards shown to the player. |
| lineups.home.start[].cards.yellow | integer | Yellow cards. |
| lineups.home.start[].cards.red | integer | Red cards. |
| lineups.home.start[].vacated | object|null | Set when the slot was emptied by a dismissal and left empty, so a client can draw the hole in the formation. |
| lineups.home.start[].vacated.player | object|null | Player who was dismissed, as the same player reference. |
| lineups.home.start[].vacated.reason | string | red_card or second_yellow. |
| lineups.home.start[].vacated.clock | object|null | Clock at which the slot was vacated, as the same clock object. |
| lineups.home.current | array | The slots as they stand now, with the same entries as start[]. Substitutions inherit the slot of the player they replaced. |
| lineups.home.offPitch | array | Players who started or came on and are no longer on the pitch. |
| lineups.home.offPitch[].player | object|null | The player, as the same player reference. |
| lineups.home.offPitch[].reason | string | substituted, red_card or second_yellow. |
| lineups.home.offPitch[].clock | object|null | Clock at which the player left, as the same clock object. |
| lineups.home.offPitch[].minutes | number | Minutes the player played. |
| lineups.home.bench | array | Substitutes the tagging places at the match: everyone who came on, in the order they came on, then anyone named in an event who never came on, such as a player booked on the bench. It is not the full matchday bench, which the source does not record; see benchSource. |
| lineups.home.bench[].player | object|null | The player, as the same player reference. |
| lineups.home.bench[].used | boolean | Whether the substitute has come on. |
| lineups.home.benchSource | string | Where bench comes from, published as a source value: markers, meaning only the players the tagging places at the match as described under bench. matchday_squad is reserved for a full matchday bench once the source records one. |
| lineups.home.playersOnPitch | integer | How many players the team currently has on the pitch; fewer than 11 after a dismissal. |
| lineups.away | object | Away lineup, with the same shape as lineups.home. Its coordinates are already mirrored into the same frame. |
| players | object | Per-player metrics for both teams. Optional section. |
| players.home | array | Home players who have taken part, and players named in an event without coming on, such as a player booked on the bench. The rest of the registered squad is not listed. |
| players.home[].player | object | The player. |
| players.home[].player.playerInSquadId | integer | Player squad-entry ID for this match. |
| players.home[].player.playerId | integer | Player player ID, the same ID the other Data API endpoints use. |
| players.home[].player.name | string|null | Player first name. |
| players.home[].player.surname | string|null | Player surname. |
| players.home[].player.displayName | string | Player name as it should be printed. |
| players.home[].player.shortName | string|null | Player one-word football name for a pitch graphic, for example Adison or Noguera: the known name when the platform keeps one, otherwise the surname read with the naming conventions of the league. Null when there is no usable word; print displayName then. |
| players.home[].player.number | integer|null | Player shirt number. |
| players.home[].role | string | starter, substitute or bench; bench means named in an event without coming on. |
| players.home[].slot | object|null | Slot the player occupies, when the team has a lineup: actionId, code, column and row, as described under lineups. |
| players.home[].slot.actionId | integer | Slot ID at the source. |
| players.home[].slot.code | string | Slot code, for example GK, LCD or RW. |
| players.home[].slot.column | integer | Slot column. |
| players.home[].slot.row | integer | Slot row. |
| players.home[].onPitch | boolean | Whether the player is on the pitch right now. |
| players.home[].minutes | number | Minutes played. |
| players.home[].raw | object | What was actually tagged for this player. Every axis below is computed from these numbers and nothing else. |
| players.home[].raw.minutes | number | Minutes played. |
| players.home[].raw.goals | integer | Goals. |
| players.home[].raw.ownGoals | integer | Own goals. |
| players.home[].raw.assists | integer | Every assist tagged for the player. It can exceed the assists linked to goals under timeline[].assist when an assist was tagged without a goal of that team. |
| players.home[].raw.yellowCards | integer | Yellow cards. |
| players.home[].raw.redCards | integer | Red cards. |
| players.home[].raw.shots | integer | Shots, blocked ones included. |
| players.home[].raw.shotsUnblocked | integer | Shots that were not blocked. |
| players.home[].raw.shotsOnTarget | integer | Shots on target. |
| players.home[].raw.shotsOnTargetPct | number | Shots on target as a percentage of unblocked shots. |
| players.home[].raw.shotsWide | integer | Shots wide. |
| players.home[].raw.shotsBlocked | integer | Shots blocked. |
| players.home[].raw.shotsPost | integer | Shots off the woodwork. |
| players.home[].raw.offsides | integer | Offsides. |
| players.home[].raw.fouls | integer | Fouls committed. |
| players.home[].raw.foulsWon | integer | Fouls won. |
| players.home[].raw.penalties | integer | Penalties taken. |
| players.home[].raw.penaltiesScored | integer | Penalties scored. |
| players.home[].raw.penaltiesMissed | integer | Penalties missed. |
| players.home[].raw.saves | integer | Goalkeeper saves. |
| players.home[].raw.duelsWon | integer | Duels won. |
| players.home[].raw.duelsLost | integer | Duels lost. |
| players.home[].raw.interceptions | integer | Interceptions. |
| players.home[].raw.events | integer | Total tagged events the player appears in; the base of the involvement axis. |
| players.home[].axes | object | Six 0-100 axes for a player card. They are built from the tagged counts above, so they are not passing, dribbling or physical ratings, and nothing about ball carrying or distance run is measurable from this stream. |
| players.home[].axes.finishing | number | Finishing axis, 0 to 100. |
| players.home[].axes.creation | number | Creation axis, 0 to 100. |
| players.home[].axes.duels | number | Duels axis, 0 to 100. |
| players.home[].axes.defending | number | Defending axis, 0 to 100. |
| players.home[].axes.discipline | number | Discipline axis, 0 to 100. |
| players.home[].axes.involvement | number | Involvement axis, 0 to 100. |
| players.away | array | Away players, with the same entries as players.home[]. |
| players.axesDefinitions | object | The formula behind each axis, as a printable string, so a client can show what a number means. |
| players.axesDefinitions.finishing | string | Formula behind axes.finishing. |
| players.axesDefinitions.creation | string | Formula behind axes.creation. |
| players.axesDefinitions.duels | string | Formula behind axes.duels. |
| players.axesDefinitions.defending | string | Formula behind axes.defending. |
| players.axesDefinitions.discipline | string | Formula behind axes.discipline. |
| players.axesDefinitions.involvement | string | Formula behind axes.involvement. |
| goals | object | Every goal in full, and how the goals are distributed. Optional section. |
| goals.home | array | Goals credited to the home team, in order. |
| goals.home[].markerId | integer | Marker the goal came from. |
| goals.home[].type | string | open_play, penalty, set_piece or own_goal. There is no body part and no pitch zone in the tagging stream, so headers and inside-the-box splits are not available. |
| goals.home[].setPieceId | integer|null | Set-piece ID when the goal came from one. |
| goals.home[].precededByCorner | boolean | Whether a corner was tagged immediately before the goal. |
| goals.home[].half | integer | Goal half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout. |
| goals.home[].second | number | Goal second inside that half. |
| goals.home[].display | string | Goal minute as it should be printed, for example 36', 45+5' or 90+7'. Printed by the source so the API and the screen can never disagree. |
| goals.home[].regulationMinute | number|null | Goal minute on the regulation clock. |
| goals.home[].timelineMinute | integer|null | Goal minute on the continuous timeline momentum uses. |
| goals.home[].bucket | string | Dynamics bucket the goal falls into, for example 30-45+. |
| goals.home[].scorer | object|null | Scorer, as the player reference described under timeline[].player, plus side. |
| goals.home[].scorer.side | string|null | Side the scorer belongs to; on an own goal this is the other side from the team credited with the goal. |
| goals.home[].assist | object|null | Assisting player, as the same player reference, linked as described under timeline[].assist. |
| goals.home[].scoreAfter | object | Score once this goal is counted. |
| goals.home[].scoreAfter.home | integer | Home goals after this goal. |
| goals.home[].scoreAfter.away | integer | Away goals after this goal. |
| goals.away | array | Goals credited to the away team, with the same entries as goals.home[]. |
| goals.distribution | object | How each team's goals are spread. |
| goals.distribution.home | object | Home distribution. |
| goals.distribution.home.total | integer | Goals scored. |
| goals.distribution.home.byType | object | Goals keyed by type: open_play, penalty, set_piece and own_goal. |
| goals.distribution.home.byHalf | object | Goals keyed by half number. |
| goals.distribution.home.byBucket | object | Goals keyed by dynamics bucket, using the same keys as dynamics.buckets[].key. |
| goals.distribution.home.assisted | integer | Goals that carry an assist. |
| goals.distribution.home.penaltiesMissed | integer | Penalties missed. |
| goals.distribution.away | object | Away distribution, with the same fields as goals.distribution.home. |
| discipline | object | The referee indices of the match, each side's fouls, fouls won, cards and offsides with its aggression and discipline ratios, and every foul in order with its clock, the players involved and the card it drew. Optional section. |
| attacking | object | The attacking section holds each side's advanced attacking parameters - shot accuracy and conversion, possession effectiveness, intensity, control, chaos, tempo and directness - each as numerator, denominator and ratio. The numbers equal the advanced parameters of the legacy live endpoint, with the same raw and metrics fields as the advanced-parameters endpoint, and that parity is kept on purpose: the possession count follows the legacy convention and counts every possession marker, the one tagged where a possession starts and the one tagged where it ends, so it is roughly twice the possession count of the possession section. Optional section. |
| attacking.home | object | Home attacking parameters. |
| attacking.home.teamId | integer | Home team ID, the same ID the other Data API endpoints use. |
| attacking.home.raw | object | The counts the metrics are divided from. |
| attacking.home.raw.goals | number | Goals, own goals of the opponent included. |
| attacking.home.raw.totalShots | number | Shots, every attempt: on target, wide, blocked and off the woodwork. |
| attacking.home.raw.shotsOnTarget | number | Shots on target. |
| attacking.home.raw.ballPossessionPct | number | Share of possession time as a percentage. |
| attacking.home.raw.totalPossessions | number | Possession markers of the team, following the legacy convention on purpose: a possession is tagged where it starts and again where it ends and both markers count, so this is roughly twice possession.home.count. |
| attacking.home.raw.attacksTotal | number | The same number as raw.totalPossessions, under the second name the legacy endpoint publishes it with. |
| attacking.home.raw.attacksWithShot | number | Possession markers of the team followed by a shot of the team before the next possession marker. |
| attacking.home.raw.possessionsWithShotPct | number | raw.attacksWithShot as a percentage of raw.totalPossessions. |
| attacking.home.metrics | object | Eleven ratios, each published with the numerator and the denominator it was divided from. |
| attacking.home.metrics.shotAccuracy | object | Computed as shots on target / shots (all attempts). |
| attacking.home.metrics.shotAccuracy.numerator | number | Numerator of the formula. |
| attacking.home.metrics.shotAccuracy.denominator | number | Denominator of the formula. |
| attacking.home.metrics.shotAccuracy.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.shotConversionRate | object | Computed as goals / shots. |
| attacking.home.metrics.shotConversionRate.numerator | number | Numerator of the formula. |
| attacking.home.metrics.shotConversionRate.denominator | number | Denominator of the formula. |
| attacking.home.metrics.shotConversionRate.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.onTargetConversion | object | Computed as goals / shots on target. |
| attacking.home.metrics.onTargetConversion.numerator | number | Numerator of the formula. |
| attacking.home.metrics.onTargetConversion.denominator | number | Denominator of the formula. |
| attacking.home.metrics.onTargetConversion.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.possessionEffectiveness | object | Computed as share of possessions with a shot (%) / ball possession (%). The numerator is raw.possessionsWithShotPct and the denominator raw.ballPossessionPct. |
| attacking.home.metrics.possessionEffectiveness.numerator | number | Numerator of the formula. |
| attacking.home.metrics.possessionEffectiveness.denominator | number | Denominator of the formula. |
| attacking.home.metrics.possessionEffectiveness.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.shotsPerPossession | object | Computed as shots / possession markers (a possession is tagged at its start and at its end). |
| attacking.home.metrics.shotsPerPossession.numerator | number | Numerator of the formula. |
| attacking.home.metrics.shotsPerPossession.denominator | number | Denominator of the formula. |
| attacking.home.metrics.shotsPerPossession.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.teamIntensityIndex | object | Computed as (shots + fouls + offsides) / minutes played. Minutes played add up the last tagged second of every half. |
| attacking.home.metrics.teamIntensityIndex.numerator | number | Numerator of the formula. |
| attacking.home.metrics.teamIntensityIndex.denominator | number | Denominator of the formula. |
| attacking.home.metrics.teamIntensityIndex.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.controlIndex | object | Computed as ball possession share x passes per possession. The numerator is the product itself and the denominator is always 1. |
| attacking.home.metrics.controlIndex.numerator | number | Numerator of the formula. |
| attacking.home.metrics.controlIndex.denominator | number | Denominator of the formula. |
| attacking.home.metrics.controlIndex.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.chaosIndex | object | Computed as (shots + fouls + cards + offsides) / (minutes played / 10). Cards are yellow cards, second yellows and red cards together; minutes played add up the last tagged second of every half. |
| attacking.home.metrics.chaosIndex.numerator | number | Numerator of the formula. |
| attacking.home.metrics.chaosIndex.denominator | number | Denominator of the formula. |
| attacking.home.metrics.chaosIndex.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.passIntensity | object | Computed as passes / ball possession (%). |
| attacking.home.metrics.passIntensity.numerator | number | Numerator of the formula. |
| attacking.home.metrics.passIntensity.denominator | number | Denominator of the formula. |
| attacking.home.metrics.passIntensity.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.tempoIndex | object | Computed as passes / possession markers. |
| attacking.home.metrics.tempoIndex.numerator | number | Numerator of the formula. |
| attacking.home.metrics.tempoIndex.denominator | number | Denominator of the formula. |
| attacking.home.metrics.tempoIndex.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.home.metrics.directnessIndex | object | Computed as shots / passes. |
| attacking.home.metrics.directnessIndex.numerator | number | Numerator of the formula. |
| attacking.home.metrics.directnessIndex.denominator | number | Denominator of the formula. |
| attacking.home.metrics.directnessIndex.ratio | number | numerator / denominator, rounded to four decimals, and 0 when the denominator is 0. Printed to two decimals it is the number the legacy live viewer shows. |
| attacking.away | object | Away attacking parameters, with the same shape as attacking.home. |
| attacking.definitions | object | The formula behind each metric as a printable string, keyed like attacking.home.metrics, so a client can show what a number means. Under the default case=camelCase the keys are rewritten too, shot_accuracy becoming shotAccuracy. |
| attacking.definitions.shotAccuracy | string | Formula behind metrics.shotAccuracy. |
| attacking.definitions.shotConversionRate | string | Formula behind metrics.shotConversionRate. |
| attacking.definitions.onTargetConversion | string | Formula behind metrics.onTargetConversion. |
| attacking.definitions.possessionEffectiveness | string | Formula behind metrics.possessionEffectiveness. |
| attacking.definitions.shotsPerPossession | string | Formula behind metrics.shotsPerPossession. |
| attacking.definitions.teamIntensityIndex | string | Formula behind metrics.teamIntensityIndex. |
| attacking.definitions.controlIndex | string | Formula behind metrics.controlIndex. |
| attacking.definitions.chaosIndex | string | Formula behind metrics.chaosIndex. |
| attacking.definitions.passIntensity | string | Formula behind metrics.passIntensity. |
| attacking.definitions.tempoIndex | string | Formula behind metrics.tempoIndex. |
| attacking.definitions.directnessIndex | string | Formula behind metrics.directnessIndex. |