Developers · API Reference
API v1

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_api

Reference 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

ParameterTypeRequiredDescription
id integer Required Match ID Minimum 1.

Query parameters

ParameterTypeRequiredDescription
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

AttributeTypeDescription
matchIdintegerMatch ID.
metaobjectDocument metadata. Always present.
meta.generatedAtstringWhen this document was computed (ISO 8601).
meta.definitionsVersionintegerVersion 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.lastMarkerIdinteger|nullID of the last tagging marker included in the calculation.
meta.markerCountintegerNumber of tagging markers the document was computed from.
meta.etagstringEntity 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.resolutionSecondsintegerMomentum sampling step in seconds. Always 60.
meta.bucketMinutesintegerDynamics bucket length in minutes. Always 15.
meta.sectionsarraySections this document actually carries, after include was applied.
meta.sections[]stringSection name.
matchobjectMatch context. Always present.
match.datestring|nullMatch date (ISO 8601).
match.seasonobject|nullSeason the match belongs to.
match.season.idintegerSeason ID.
match.season.titlestring|nullSeason title.
statusobjectWhere the match stands right now. Always present.
status.phasestringMatch phase, published as a source value: not_started, first_half, half_time, second_half, extra_time, penalties or finished.
status.isLivebooleanWhether 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.analyseStatusintegerTagging state: 1 no markers yet, 2 tagging in progress, 3 the match-end marker has been tagged.
status.currentHalfinteger|nullHalf the clock is in: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout. Null before the first period starts.
status.clockobject|nullCurrent match clock. Null before the first period starts.
status.clock.halfintegerCurrent half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout.
status.clock.secondnumberCurrent second inside that half.
status.clock.displaystringCurrent 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.regulationMinutenumber|nullCurrent minute on the regulation clock.
status.clock.timelineMinuteinteger|nullCurrent minute on the continuous timeline momentum uses.
status.minutesByHalfobjectMinutes played in each half, keyed by half number, stoppage included, for example 1: 50 and 2: 53.
status.minuteBucketsByHalfobjectHow many momentum minutes each half contributes to the continuous timeline, keyed by half number.
status.playedMinutesintegerMinutes played so far across all halves, stoppage included.
status.periodsarrayOne entry per half the match has reached.
status.periods[].halfintegerHalf number.
status.periods[].startedbooleanWhether the period-start marker was tagged.
status.periods[].endedbooleanWhether the period-end marker was tagged.
status.periods[].startMarkerIdinteger|nullMarker that opened the half.
status.periods[].lastSecondnumberLast second tagged inside the half.
status.periods[].stoppageSecondsnumberSeconds played beyond the regulation length of the half.
status.scoreobjectScore from halves 1 to 4. A shootout is never counted here.
status.score.homeintegerHome goals.
status.score.awayintegerAway goals.
status.shootoutobject|nullPenalty shootout, or null when the match had none.
status.shootout.scoreobjectShootout score.
status.shootout.score.homeintegerHome kicks scored.
status.shootout.score.awayintegerAway kicks scored.
status.shootout.kicksarrayKicks in the order they were taken.
status.shootout.kicks[].teamstringhome or away.
status.shootout.kicks[].scoredbooleanWhether the kick was scored.
status.shootout.kicks[].playerobject|nullTaker, as the player reference described under timeline[].player.
status.shootout.kicks[].markerIdintegerMarker the kick came from.
status.dataQualityobjectWhat 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.goalsWithoutShotintegerGoals that carry no shot marker, so the shot counts are lower than the goal counts by this much.
status.dataQuality.orphanPossessionEndsintegerPossession end markers with no matching start; the same markers are itemised in possession.anomalies.
teamsobjectBoth teams. Always present. Sides are always home and away, never team IDs.
teams.homeobjectHome-team identity.
teams.home.teamIdintegerHome team ID, the same ID the other Data API endpoints use.
teams.home.squadIdintegerHome squad ID for this match.
teams.home.namestringHome team name.
teams.home.shortNamestring|nullHome team short name.
teams.home.logostring|nullHome team logo path at the source.
teams.home.logoUrlstring|nullHome team logo as an absolute URL.
teams.home.colorstring|nullHome team shirt colour as a hex string.
teams.home.colorNumberstring|nullHome team shirt-number colour as a hex string.
teams.awayobjectAway-team identity.
teams.away.teamIdintegerAway team ID, the same ID the other Data API endpoints use.
teams.away.squadIdintegerAway squad ID for this match.
teams.away.namestringAway team name.
teams.away.shortNamestring|nullAway team short name.
teams.away.logostring|nullAway team logo path at the source.
teams.away.logoUrlstring|nullAway team logo as an absolute URL.
teams.away.colorstring|nullAway team shirt colour as a hex string.
teams.away.colorNumberstring|nullAway team shirt-number colour as a hex string.
momentumobjectPer-minute attack index for both teams, one point per played minute. Optional section.
momentum.resolutionSecondsintegerSeconds per point. Always 60.
momentum.modelobjectHow the index is computed, published so a client can label the chart honestly.
momentum.model.methodstringAlways 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.ewmaAlphanumberSmoothing factor of the moving average.
momentum.model.tanhScalenumberDivisor applied before tanh.
momentum.model.resetOnNewHalfbooleanWhether the smoothing restarts at the start of each half. Always true.
momentum.model.rangearrayLower and upper bound of net, home and away. Always -100 and 100.
momentum.model.netstringAlways home_minus_away: points[].net is points[].home minus points[].away and nothing else.
momentum.weightsobjectWeight each counted event carries in the index.
momentum.weights.possessionSecondsnumberWeight applied to seconds of possession.
momentum.weights.passesnumberWeight applied to passes.
momentum.weights.shotsOnTargetnumberWeight applied to shots on target.
momentum.weights.shotsBlockedPostnumberWeight applied to shots blocked or off the woodwork.
momentum.weights.shotsWidenumberWeight applied to shots wide.
momentum.weights.goalsnumberWeight applied to goals.
momentum.weights.penaltiesMissednumberWeight applied to penalties missed.
momentum.weights.cornersnumberWeight applied to corners.
momentum.weights.duelsWonnumberWeight applied to duels won.
momentum.weights.interceptionsnumberWeight applied to interceptions.
momentum.pointsarrayOne point per minute of the continuous timeline, in order.
momentum.points[].timelineMinuteintegerMinute on the continuous timeline, counting stoppage time of earlier halves.
momentum.points[].halfintegerHalf this minute belongs to.
momentum.points[].minuteInHalfintegerMinute inside that half.
momentum.points[].displaystringMinute as it should be printed, for example 36' or 45+5'.
momentum.points[].netnumberhome 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[].homenumberHome index for the minute, between 0 and 100.
momentum.points[].awaynumberAway index for the minute, between 0 and 100.
momentum.points[].partialbooleanTrue while the minute is still being played, so the point can still move on the next poll.
momentum.points[].componentsobjectThe raw counts the two indexes were computed from, so a client can explain a spike.
momentum.points[].components.homeobjectHome counts for the minute.
momentum.points[].components.home.possessionSecondsnumberHome seconds of possession.
momentum.points[].components.home.passesnumberHome passes.
momentum.points[].components.home.shotsOnTargetnumberHome shots on target.
momentum.points[].components.home.shotsBlockedPostnumberHome shots blocked or off the woodwork.
momentum.points[].components.home.shotsWidenumberHome shots wide.
momentum.points[].components.home.goalsnumberHome goals.
momentum.points[].components.home.penaltiesMissednumberHome penalties missed.
momentum.points[].components.home.cornersnumberHome corners.
momentum.points[].components.home.duelsWonnumberHome duels won.
momentum.points[].components.home.interceptionsnumberHome interceptions.
momentum.points[].components.awayobjectAway counts for the minute; the same ten fields as points[].components.home.
timelinearrayMatch 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[].markerIdintegerTagging marker the event came from.
timeline[].typestringEvent type, published as a source value: goal, own_goal, penalty_missed, yellow_card, second_yellow, red_card, substitution or period.
timeline[].subtypestring|nullOn 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[].teamstring|nullhome or away. Null on period markers.
timeline[].halfintegerEvent half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout.
timeline[].secondnumberEvent second inside that half.
timeline[].displaystringEvent 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[].regulationMinutenumber|nullEvent minute on the regulation clock.
timeline[].timelineMinuteinteger|nullEvent minute on the continuous timeline momentum uses.
timeline[].playerobject|nullScorer on a goal, taker on a missed penalty, the booked or dismissed player on a card.
timeline[].player.playerInSquadIdintegerPlayer squad-entry ID for this match.
timeline[].player.playerIdintegerPlayer player ID, the same ID the other Data API endpoints use.
timeline[].player.namestring|nullPlayer first name.
timeline[].player.surnamestring|nullPlayer surname.
timeline[].player.displayNamestringPlayer name as it should be printed.
timeline[].player.shortNamestring|nullPlayer 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.numberinteger|nullPlayer shirt number.
timeline[].player.sidestring|nullSide the scorer belongs to; on an own goal this is the other side from team.
timeline[].assistobject|nullAssisting 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[].assistMarkerIdinteger|nullMarker the assist came from.
timeline[].playerInobject|nullSubstitution only: the player coming on, as the same reference shape as player.
timeline[].playerOutobject|nullSubstitution only: the player going off, as the same reference shape as player.
timeline[].scoreAfterobjectGoals only: the score once this goal is counted.
timeline[].scoreAfter.homeintegerHome goals after the event.
timeline[].scoreAfter.awayintegerAway goals after the event.
dynamicsobjectThe same team metrics cut two ways: into 15-minute buckets and into period totals. Optional section.
dynamics.bucketMinutesintegerBucket length in minutes. Always 15.
dynamics.bucketsarrayOne entry per 15-minute bucket the match has reached.
dynamics.buckets[].keystringBucket 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[].halfintegerHalf the bucket belongs to.
dynamics.buckets[].fromMinuteintegerFirst minute of the bucket.
dynamics.buckets[].toMinuteintegerLast minute of the bucket.
dynamics.buckets[].includesStoppagebooleanWhether the bucket also carries the stoppage time of its half.
dynamics.buckets[].isCurrentbooleanTrue for the bucket being played, whose numbers are still moving.
dynamics.buckets[].homeobjectHome metrics inside the bucket.
dynamics.buckets[].home.goalsintegerHome goals.
dynamics.buckets[].home.shotsintegerHome shots, blocked ones included.
dynamics.buckets[].home.shotsUnblockedintegerHome shots that were not blocked.
dynamics.buckets[].home.shotsOnTargetintegerHome shots on target.
dynamics.buckets[].home.shotsOnTargetPctnumberHome shots on target as a percentage of unblocked shots.
dynamics.buckets[].home.shotsWideintegerHome shots wide.
dynamics.buckets[].home.shotsBlockedintegerHome shots blocked.
dynamics.buckets[].home.shotsPostintegerHome shots off the woodwork.
dynamics.buckets[].home.passesintegerHome passes. The tagging stream records the pass, not who received it, so there is no passing network anywhere in this document.
dynamics.buckets[].home.possessionSecondsnumberHome seconds in possession.
dynamics.buckets[].home.possessionPctnumberHome share of possession as a percentage.
dynamics.buckets[].home.possessionsintegerHome number of separate possessions.
dynamics.buckets[].home.passesPerPossessionnumberHome 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.cornersintegerHome corners.
dynamics.buckets[].home.foulsintegerHome fouls committed.
dynamics.buckets[].home.foulsWonintegerHome fouls won.
dynamics.buckets[].home.duelsWonintegerHome duels won.
dynamics.buckets[].home.duelsLostintegerHome duels lost.
dynamics.buckets[].home.duelWinPctnumberHome duels won as a percentage of duels contested.
dynamics.buckets[].home.interceptionsintegerHome interceptions.
dynamics.buckets[].home.offsidesintegerHome offsides.
dynamics.buckets[].home.yellowCardsintegerHome yellow cards.
dynamics.buckets[].home.redCardsintegerHome red cards, second yellows included.
dynamics.buckets[].home.savesintegerHome goalkeeper saves.
dynamics.buckets[].home.penaltiesintegerHome penalties taken: penaltiesScored plus penaltiesMissed.
dynamics.buckets[].home.penaltiesScoredintegerHome penalties scored.
dynamics.buckets[].home.penaltiesMissedintegerHome penalties missed.
dynamics.buckets[].home.ownGoalsintegerHome own goals, counted for the team that scored them.
dynamics.buckets[].awayobjectAway metrics inside the bucket; the same 28 metrics as dynamics.buckets[].home.
dynamics.splitsobjectPeriod totals of the same metrics.
dynamics.splits.firstHalfobjectFirst-half totals.
dynamics.splits.firstHalf.homeobjectHome metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.firstHalf.awayobjectAway metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.secondHalfobjectSecond-half totals.
dynamics.splits.secondHalf.homeobjectHome metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.secondHalf.awayobjectAway metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.extraTimeobject|nullExtra-time totals, or null when the match had no extra time.
dynamics.splits.extraTime.homeobjectHome metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.extraTime.awayobjectAway metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.fullTimeobjectTotals for the whole match so far. These are the numbers a scoreboard shows.
dynamics.splits.fullTime.homeobjectHome metrics; the same 28 metrics as dynamics.buckets[].home.
dynamics.splits.fullTime.awayobjectAway metrics; the same 28 metrics as dynamics.buckets[].home.
possessionobjectHow each team held the ball. Optional section.
possession.homeobjectHome possession summary.
possession.home.countintegerNumber of separate possessions.
possession.home.totalSecondsnumberSeconds in possession.
possession.home.pctnumberShare of possession as a percentage.
possession.home.avgSecondsnumberAverage possession length in seconds.
possession.home.maxSecondsnumberLongest possession in seconds.
possession.home.withShotintegerPossessions that ended with a shot.
possession.home.withShotPctnumberPossessions that ended with a shot, as a percentage.
possession.home.passesPerPossessionnumberAverage number of passes per possession.
possession.home.durationBucketsobjectHow 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.awayobjectAway possession summary; the same fields as possession.home.
possession.sourcestringWhere 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.durationSourcestring|nullHow each possession was timed, as a source value: possession_time, clock or mixed.
possession.anomaliesarrayPossession markers that did not pair up. They are reported rather than silently dropped, because they move the possession totals.
possession.anomalies[].markerIdintegerMarker at fault.
possession.anomalies[].kindstringduplicate_end, orphan_end or orphan_start.
possession.segmentsarrayEvery possession as its own segment. Returned only with segments=1.
possession.segments[].teamstringhome or away.
possession.segments[].halfintegerHalf the segment belongs to.
possession.segments[].startnumberSecond the possession started, inside that half.
possession.segments[].endnumberSecond the possession ended.
possession.segments[].durationnumberLength in seconds.
possession.segments[].startMarkerIdinteger|nullMarker that opened the possession.
possession.segments[].endMarkerIdinteger|nullMarker that closed it.
possession.segments[].orphanbooleanWhether the segment is one of the unpaired markers listed in possession.anomalies.
possession.segments[].openbooleanWhether the possession is still running right now.
lineupsobjectBoth 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.pitchobjectThe frame the slot coordinates live in.
lineups.pitch.lengthMnumberPitch length in metres. Always 105.
lineups.pitch.widthMnumberPitch width in metres. Always 68.
lineups.pitch.framestringAlways 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.positionsArestringAlways registrator_slots, said plainly: the positions are the tagged formation slots, not tracked or averaged positions.
lineups.homeobjectHome lineup.
lineups.home.formationobjectFormation at kick-off and right now.
lineups.home.formation.startobject|nullFormation the team started with.
lineups.home.formation.start.actionIdintegerFormation ID at the source.
lineups.home.formation.start.namestring|nullFormation name, for example 3-4-3.
lineups.home.formation.currentobject|nullFormation the team is in now, as the same object.
lineups.home.startarrayThe eleven slots the team started with.
lineups.home.start[].slotobject|nullSlot on the pitch.
lineups.home.start[].slot.actionIdintegerSlot ID at the source.
lineups.home.start[].slot.codestringSlot code, for example GK, LCD or RW.
lineups.home.start[].slot.columnintegerSlot column, -1 for the goalkeeper up to 4 for the front line.
lineups.home.start[].slot.rowintegerSlot row across the pitch, 0 to 4.
lineups.home.start[].slot.xMnumberSlot position along the pitch in metres, in the frame described by lineups.pitch.
lineups.home.start[].slot.yMnumberSlot position across the pitch in metres.
lineups.home.start[].playerobject|nullPlayer in the slot.
lineups.home.start[].player.playerInSquadIdintegerPlayer squad-entry ID for this match.
lineups.home.start[].player.playerIdintegerPlayer player ID, the same ID the other Data API endpoints use.
lineups.home.start[].player.namestring|nullPlayer first name.
lineups.home.start[].player.surnamestring|nullPlayer surname.
lineups.home.start[].player.displayNamestringPlayer name as it should be printed.
lineups.home.start[].player.shortNamestring|nullPlayer 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.numberinteger|nullPlayer shirt number.
lineups.home.start[].slotSourcestring|nullWhere 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[].minutesnumberMinutes the player has spent on the pitch.
lineups.home.start[].onPitchbooleanWhether the player is on the pitch right now.
lineups.home.start[].sinceobject|nullClock at which the player took the slot, as the clock object described under status.clock.
lineups.home.start[].untilobject|nullClock at which the player left it, as the same clock object.
lineups.home.start[].goalsintegerGoals scored by the player.
lineups.home.start[].assistsintegerAssists by the player.
lineups.home.start[].cardsobjectCards shown to the player.
lineups.home.start[].cards.yellowintegerYellow cards.
lineups.home.start[].cards.redintegerRed cards.
lineups.home.start[].vacatedobject|nullSet 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.playerobject|nullPlayer who was dismissed, as the same player reference.
lineups.home.start[].vacated.reasonstringred_card or second_yellow.
lineups.home.start[].vacated.clockobject|nullClock at which the slot was vacated, as the same clock object.
lineups.home.currentarrayThe slots as they stand now, with the same entries as start[]. Substitutions inherit the slot of the player they replaced.
lineups.home.offPitcharrayPlayers who started or came on and are no longer on the pitch.
lineups.home.offPitch[].playerobject|nullThe player, as the same player reference.
lineups.home.offPitch[].reasonstringsubstituted, red_card or second_yellow.
lineups.home.offPitch[].clockobject|nullClock at which the player left, as the same clock object.
lineups.home.offPitch[].minutesnumberMinutes the player played.
lineups.home.bencharraySubstitutes 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[].playerobject|nullThe player, as the same player reference.
lineups.home.bench[].usedbooleanWhether the substitute has come on.
lineups.home.benchSourcestringWhere 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.playersOnPitchintegerHow many players the team currently has on the pitch; fewer than 11 after a dismissal.
lineups.awayobjectAway lineup, with the same shape as lineups.home. Its coordinates are already mirrored into the same frame.
playersobjectPer-player metrics for both teams. Optional section.
players.homearrayHome 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[].playerobjectThe player.
players.home[].player.playerInSquadIdintegerPlayer squad-entry ID for this match.
players.home[].player.playerIdintegerPlayer player ID, the same ID the other Data API endpoints use.
players.home[].player.namestring|nullPlayer first name.
players.home[].player.surnamestring|nullPlayer surname.
players.home[].player.displayNamestringPlayer name as it should be printed.
players.home[].player.shortNamestring|nullPlayer 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.numberinteger|nullPlayer shirt number.
players.home[].rolestringstarter, substitute or bench; bench means named in an event without coming on.
players.home[].slotobject|nullSlot the player occupies, when the team has a lineup: actionId, code, column and row, as described under lineups.
players.home[].slot.actionIdintegerSlot ID at the source.
players.home[].slot.codestringSlot code, for example GK, LCD or RW.
players.home[].slot.columnintegerSlot column.
players.home[].slot.rowintegerSlot row.
players.home[].onPitchbooleanWhether the player is on the pitch right now.
players.home[].minutesnumberMinutes played.
players.home[].rawobjectWhat was actually tagged for this player. Every axis below is computed from these numbers and nothing else.
players.home[].raw.minutesnumberMinutes played.
players.home[].raw.goalsintegerGoals.
players.home[].raw.ownGoalsintegerOwn goals.
players.home[].raw.assistsintegerEvery 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.yellowCardsintegerYellow cards.
players.home[].raw.redCardsintegerRed cards.
players.home[].raw.shotsintegerShots, blocked ones included.
players.home[].raw.shotsUnblockedintegerShots that were not blocked.
players.home[].raw.shotsOnTargetintegerShots on target.
players.home[].raw.shotsOnTargetPctnumberShots on target as a percentage of unblocked shots.
players.home[].raw.shotsWideintegerShots wide.
players.home[].raw.shotsBlockedintegerShots blocked.
players.home[].raw.shotsPostintegerShots off the woodwork.
players.home[].raw.offsidesintegerOffsides.
players.home[].raw.foulsintegerFouls committed.
players.home[].raw.foulsWonintegerFouls won.
players.home[].raw.penaltiesintegerPenalties taken.
players.home[].raw.penaltiesScoredintegerPenalties scored.
players.home[].raw.penaltiesMissedintegerPenalties missed.
players.home[].raw.savesintegerGoalkeeper saves.
players.home[].raw.duelsWonintegerDuels won.
players.home[].raw.duelsLostintegerDuels lost.
players.home[].raw.interceptionsintegerInterceptions.
players.home[].raw.eventsintegerTotal tagged events the player appears in; the base of the involvement axis.
players.home[].axesobjectSix 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.finishingnumberFinishing axis, 0 to 100.
players.home[].axes.creationnumberCreation axis, 0 to 100.
players.home[].axes.duelsnumberDuels axis, 0 to 100.
players.home[].axes.defendingnumberDefending axis, 0 to 100.
players.home[].axes.disciplinenumberDiscipline axis, 0 to 100.
players.home[].axes.involvementnumberInvolvement axis, 0 to 100.
players.awayarrayAway players, with the same entries as players.home[].
players.axesDefinitionsobjectThe formula behind each axis, as a printable string, so a client can show what a number means.
players.axesDefinitions.finishingstringFormula behind axes.finishing.
players.axesDefinitions.creationstringFormula behind axes.creation.
players.axesDefinitions.duelsstringFormula behind axes.duels.
players.axesDefinitions.defendingstringFormula behind axes.defending.
players.axesDefinitions.disciplinestringFormula behind axes.discipline.
players.axesDefinitions.involvementstringFormula behind axes.involvement.
goalsobjectEvery goal in full, and how the goals are distributed. Optional section.
goals.homearrayGoals credited to the home team, in order.
goals.home[].markerIdintegerMarker the goal came from.
goals.home[].typestringopen_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[].setPieceIdinteger|nullSet-piece ID when the goal came from one.
goals.home[].precededByCornerbooleanWhether a corner was tagged immediately before the goal.
goals.home[].halfintegerGoal half: 1 and 2 regulation, 3 and 4 extra time, 5 the shootout.
goals.home[].secondnumberGoal second inside that half.
goals.home[].displaystringGoal 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[].regulationMinutenumber|nullGoal minute on the regulation clock.
goals.home[].timelineMinuteinteger|nullGoal minute on the continuous timeline momentum uses.
goals.home[].bucketstringDynamics bucket the goal falls into, for example 30-45+.
goals.home[].scorerobject|nullScorer, as the player reference described under timeline[].player, plus side.
goals.home[].scorer.sidestring|nullSide the scorer belongs to; on an own goal this is the other side from the team credited with the goal.
goals.home[].assistobject|nullAssisting player, as the same player reference, linked as described under timeline[].assist.
goals.home[].scoreAfterobjectScore once this goal is counted.
goals.home[].scoreAfter.homeintegerHome goals after this goal.
goals.home[].scoreAfter.awayintegerAway goals after this goal.
goals.awayarrayGoals credited to the away team, with the same entries as goals.home[].
goals.distributionobjectHow each team's goals are spread.
goals.distribution.homeobjectHome distribution.
goals.distribution.home.totalintegerGoals scored.
goals.distribution.home.byTypeobjectGoals keyed by type: open_play, penalty, set_piece and own_goal.
goals.distribution.home.byHalfobjectGoals keyed by half number.
goals.distribution.home.byBucketobjectGoals keyed by dynamics bucket, using the same keys as dynamics.buckets[].key.
goals.distribution.home.assistedintegerGoals that carry an assist.
goals.distribution.home.penaltiesMissedintegerPenalties missed.
goals.distribution.awayobjectAway distribution, with the same fields as goals.distribution.home.
disciplineobjectThe 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.
attackingobjectThe 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.homeobjectHome attacking parameters.
attacking.home.teamIdintegerHome team ID, the same ID the other Data API endpoints use.
attacking.home.rawobjectThe counts the metrics are divided from.
attacking.home.raw.goalsnumberGoals, own goals of the opponent included.
attacking.home.raw.totalShotsnumberShots, every attempt: on target, wide, blocked and off the woodwork.
attacking.home.raw.shotsOnTargetnumberShots on target.
attacking.home.raw.ballPossessionPctnumberShare of possession time as a percentage.
attacking.home.raw.totalPossessionsnumberPossession 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.attacksTotalnumberThe same number as raw.totalPossessions, under the second name the legacy endpoint publishes it with.
attacking.home.raw.attacksWithShotnumberPossession markers of the team followed by a shot of the team before the next possession marker.
attacking.home.raw.possessionsWithShotPctnumberraw.attacksWithShot as a percentage of raw.totalPossessions.
attacking.home.metricsobjectEleven ratios, each published with the numerator and the denominator it was divided from.
attacking.home.metrics.shotAccuracyobjectComputed as shots on target / shots (all attempts).
attacking.home.metrics.shotAccuracy.numeratornumberNumerator of the formula.
attacking.home.metrics.shotAccuracy.denominatornumberDenominator of the formula.
attacking.home.metrics.shotAccuracy.rationumbernumerator / 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.shotConversionRateobjectComputed as goals / shots.
attacking.home.metrics.shotConversionRate.numeratornumberNumerator of the formula.
attacking.home.metrics.shotConversionRate.denominatornumberDenominator of the formula.
attacking.home.metrics.shotConversionRate.rationumbernumerator / 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.onTargetConversionobjectComputed as goals / shots on target.
attacking.home.metrics.onTargetConversion.numeratornumberNumerator of the formula.
attacking.home.metrics.onTargetConversion.denominatornumberDenominator of the formula.
attacking.home.metrics.onTargetConversion.rationumbernumerator / 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.possessionEffectivenessobjectComputed as share of possessions with a shot (%) / ball possession (%). The numerator is raw.possessionsWithShotPct and the denominator raw.ballPossessionPct.
attacking.home.metrics.possessionEffectiveness.numeratornumberNumerator of the formula.
attacking.home.metrics.possessionEffectiveness.denominatornumberDenominator of the formula.
attacking.home.metrics.possessionEffectiveness.rationumbernumerator / 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.shotsPerPossessionobjectComputed as shots / possession markers (a possession is tagged at its start and at its end).
attacking.home.metrics.shotsPerPossession.numeratornumberNumerator of the formula.
attacking.home.metrics.shotsPerPossession.denominatornumberDenominator of the formula.
attacking.home.metrics.shotsPerPossession.rationumbernumerator / 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.teamIntensityIndexobjectComputed as (shots + fouls + offsides) / minutes played. Minutes played add up the last tagged second of every half.
attacking.home.metrics.teamIntensityIndex.numeratornumberNumerator of the formula.
attacking.home.metrics.teamIntensityIndex.denominatornumberDenominator of the formula.
attacking.home.metrics.teamIntensityIndex.rationumbernumerator / 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.controlIndexobjectComputed as ball possession share x passes per possession. The numerator is the product itself and the denominator is always 1.
attacking.home.metrics.controlIndex.numeratornumberNumerator of the formula.
attacking.home.metrics.controlIndex.denominatornumberDenominator of the formula.
attacking.home.metrics.controlIndex.rationumbernumerator / 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.chaosIndexobjectComputed 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.numeratornumberNumerator of the formula.
attacking.home.metrics.chaosIndex.denominatornumberDenominator of the formula.
attacking.home.metrics.chaosIndex.rationumbernumerator / 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.passIntensityobjectComputed as passes / ball possession (%).
attacking.home.metrics.passIntensity.numeratornumberNumerator of the formula.
attacking.home.metrics.passIntensity.denominatornumberDenominator of the formula.
attacking.home.metrics.passIntensity.rationumbernumerator / 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.tempoIndexobjectComputed as passes / possession markers.
attacking.home.metrics.tempoIndex.numeratornumberNumerator of the formula.
attacking.home.metrics.tempoIndex.denominatornumberDenominator of the formula.
attacking.home.metrics.tempoIndex.rationumbernumerator / 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.directnessIndexobjectComputed as shots / passes.
attacking.home.metrics.directnessIndex.numeratornumberNumerator of the formula.
attacking.home.metrics.directnessIndex.denominatornumberDenominator of the formula.
attacking.home.metrics.directnessIndex.rationumbernumerator / 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.awayobjectAway attacking parameters, with the same shape as attacking.home.
attacking.definitionsobjectThe 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.shotAccuracystringFormula behind metrics.shotAccuracy.
attacking.definitions.shotConversionRatestringFormula behind metrics.shotConversionRate.
attacking.definitions.onTargetConversionstringFormula behind metrics.onTargetConversion.
attacking.definitions.possessionEffectivenessstringFormula behind metrics.possessionEffectiveness.
attacking.definitions.shotsPerPossessionstringFormula behind metrics.shotsPerPossession.
attacking.definitions.teamIntensityIndexstringFormula behind metrics.teamIntensityIndex.
attacking.definitions.controlIndexstringFormula behind metrics.controlIndex.
attacking.definitions.chaosIndexstringFormula behind metrics.chaosIndex.
attacking.definitions.passIntensitystringFormula behind metrics.passIntensity.
attacking.definitions.tempoIndexstringFormula behind metrics.tempoIndex.
attacking.definitions.directnessIndexstringFormula behind metrics.directnessIndex.