Skip to main content
Game Detail is the deepest part of V1. Every endpoint below takes the same game ID and shares the standard envelope.

Endpoint family

EndpointReturns
GET /api/v1/game/{id}Full game object: teams, score, statuses, flag fields, denormalized lookups.
GET /api/v1/game/{id}/eventsGoals, cards, substitutions, VAR, penalty events.
GET /api/v1/game/{id}/lineupsStarting XI + bench with positions and formation.
GET /api/v1/game/{id}/statsPer-player and per-team statistics for the match.
GET /api/v1/game/{id}/venueStadium ID, name, capacity, attendance.
GET /api/v1/game/{id}/officialsReferees with country.
GET /api/v1/game/{id}/membersFull match-day squad for both teams.
GET /api/v1/game/{id}/stagesPeriod scores (HT, FT, ET, PENS).
GET /api/v1/game/{id}/charteventsxG / xGoT shot map data.
GET /api/v1/game/{id}/playbyplayMinute-by-minute commentary feed.
GET /api/v1/game/{id}/predictionsCommunity polls and prop predictions.
The game object exposes hasStats, hasLineups, hasStandings, hasBrackets, hasPreviousMeetings so you can hide child tabs that will return empty.
Coaches and stadiums. GET /api/v1/game/{id} returns a full venue (id, name, capacity, live attendance). The head coach appears in GET /api/v1/game/{id}/lineups as the last entry in each team’s members[], identified by formation.name === "Coach" (status: 4, statusText: "Management"). V1 returns only the coach’s athlete id — no name field. For the coach’s full name and country, use V2’s /api/teams/{teamId}. See the World Cup managers & venues guide for the full pattern.

Sample: /game/{id}/events

curl -H "x-api-key: YOUR_API_KEY" \
  https://v1.football.sportsapipro.com/api/v1/game/4697696/events
{
  "success": true,
  "type": "events",
  "data": {
    "events": [
      {
        "competitorId": 5040,
        "statusId": 8,
        "stageId": 9,
        "order": 1,
        "num": 1,
        "gameTime": 59,
        "addedTime": 0,
        "gameTimeDisplay": "59'",
        "playerId": 209814,
        "extraPlayers": [258327],
        "isMajor": true,
        "eventType": { "id": 1, "name": "Goal", "subTypeId": 1, "subTypeName": "Field Goal" }
      },
      {
        "competitorId": 2383,
        "gameTime": 62,
        "gameTimeDisplay": "62'",
        "playerId": 938102,
        "extraPlayers": [525630],
        "isMajor": false,
        "eventType": { "id": 1000, "name": "Substitution", "subTypeId": -1 }
      }
    ]
  }
}

Common eventType.id values

IDName
1Goal
2Yellow Card
3Red Card
5Substitution (legacy code)
7Penalty Missed
8Own Goal
11VAR
1000Substitution (current)

Sample: /game/{id}/venue

{
  "id": 8248,
  "name": "Estadio AKRON (Guadalajara)",
  "shortName": "estadio-akron-(guadalajara)",
  "capacity": 49850,
  "attendance": 44985
}

Sample: /game/{id}/officials

[
  { "id": 23653730, "name": "Amin Omar (Egypt)", "athleteId": -1, "countryId": -1, "status": 0 }
]

Sample: /game/{id}/stages

[
  { "id": 7, "name": "Halftime", "shortName": "HT", "homeCompetitorScore": 0, "awayCompetitorScore": 0, "isEnded": true },
  { "id": 9, "name": "End of 90 Minutes", "shortName": "90 Min.", "homeCompetitorScore": 2, "awayCompetitorScore": 1, "isEnded": true },
  { "id": 1, "name": "Current", "shortName": "Current", "homeCompetitorScore": 2, "awayCompetitorScore": 1, "isCurrent": true, "isEnded": true }
]

Sample: /game/{id}/chartevents

Each entry is a shot, mapped to pitch coordinates with xG/xGoT.
{
  "xg": "0.05",
  "xgot": "0.00",
  "bodyPart": "Left foot",
  "goalDescription": "Low Centre",
  "competitorNum": 1,
  "time": "12'",
  "playerId": 116097,
  "line": 58.8,
  "side": 85.6,
  "outcome": { "x": 98, "y": 52.5, "id": 4, "name": "Blocked" }
}

Sample: /game/{id}/playbyplay

{
  "Messages": [
    {
      "Id": 108,
      "Timeline": "90",
      "Type": 45,
      "TypeName": "end 2",
      "Title": "End of 90 Minutes 2-1",
      "IsMajor": true,
      "Period": "2",
      "LastModified": "2026-06-12T03:56:11Z",
      "TimeLineSecondaryText": "+7'"
    }
  ],
  "UpdateURL": "...",
  "TTL": 30
}

Sample: /game/{id}/predictions

Community polls — useful for engagement widgets.
{
  "predictions": [
    {
      "id": -726145187,
      "type": 1,
      "title": "Who Will Win?",
      "totalVotes": 142584,
      "options": [
        { "num": 1, "name": "South Korea", "vote": { "count": 97040, "percentage": 68 } },
        { "num": 2, "name": "Draw",         "vote": { "count": 19097, "percentage": 13 } },
        { "num": 3, "name": "Czechia",      "vote": { "count": 26447, "percentage": 19 } }
      ]
    }
  ]
}

Sport-scoped variants

Every game endpoint also works under the sport slug, which lets you front it with a single-sport CDN rule:
GET /api/v1/{sport}/game/{id}
GET /api/v1/{sport}/game/{id}/events

Per-sport callouts

  • Tennisstages[] represents sets. gameTime is the set number; per-game points live in events[].
  • Basketball / Hockey / A. Footballstages[] lists quarters/periods; gameTime advances per period and resets on the period change.
  • Baseballstages[] lists innings; refer to V2 baseball innings logic for status code 21-29 semantics (V1 keeps the inning in statusText).
Last modified on June 12, 2026