Game Detail is the deepest part of V1. Every endpoint below takes the same game ID and shares the standard envelope.
Endpoint family
| Endpoint | Returns |
|---|
GET /api/v1/game/{id} | Full game object: teams, score, statuses, flag fields, denormalized lookups. |
GET /api/v1/game/{id}/events | Goals, cards, substitutions, VAR, penalty events. |
GET /api/v1/game/{id}/lineups | Starting XI + bench with positions and formation. |
GET /api/v1/game/{id}/stats | Per-player and per-team statistics for the match. |
GET /api/v1/game/{id}/venue | Stadium ID, name, capacity, attendance. |
GET /api/v1/game/{id}/officials | Referees with country. |
GET /api/v1/game/{id}/members | Full match-day squad for both teams. |
GET /api/v1/game/{id}/stages | Period scores (HT, FT, ET, PENS). |
GET /api/v1/game/{id}/chartevents | xG / xGoT shot map data. |
GET /api/v1/game/{id}/playbyplay | Minute-by-minute commentary feed. |
GET /api/v1/game/{id}/predictions | Community 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
| ID | Name |
|---|
| 1 | Goal |
| 2 | Yellow Card |
| 3 | Red Card |
| 5 | Substitution (legacy code) |
| 7 | Penalty Missed |
| 8 | Own Goal |
| 11 | VAR |
| 1000 | Substitution (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
- Tennis —
stages[] represents sets. gameTime is the set number; per-game points live in events[].
- Basketball / Hockey / A. Football —
stages[] lists quarters/periods; gameTime advances per period and resets on the period change.
- Baseball —
stages[] lists innings; refer to V2 baseball innings logic for status code 21-29 semantics (V1 keeps the inning in statusText).