# GET /v2/fixtures/{id}/tracking/events

Group: Tracking data

Tracked events with their positions, in play order: football passes (start and end), shots, set pieces, fouls, cards, substitutions and the attack flow; tennis ball and player positions, serves, faults and points with the game score; basketball shots with their spot, rebounds, fouls, turnovers. 1,000 a page, optionally one type and after an instant. Enterprise plan only.

Plans: Enterprise (other plans get 403 endpoint_not_in_plan).

Note: key is stable: the same event has the same key here and in trackedEvent frames. minute and second are football’s match clock; set and game tennis’s; period basketball’s. player, assist, playerIn and playerOut are null when the source names nobody or the squad does not list him. Clock bookkeeping is left out. Football while live: flowAttack / flowDangerousAttack / flowBallSafe (side = the team with the ball, position = where; together the current situation), possessionChange (no side), throwIn, freeKick, corner, goalKick, attemptAtGoal, goal, yellowCard, redCard, substitution, possibleGoal / possibleCorner …, about 18 a minute; passes come with the post-match read. Empty for ice hockey (read the timeline) and before the post-match read for most basketball matches.

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `id` | path | yes | our numeric id (positive integer) |
| `type` | query | no | only this type, camelCase (pass, attemptAtGoal, goal, serve, point, ballSituation, threePointer, …) |
| `since` | query | no | only events after this instant (ISO-8601, any offset; exclusive) |
| `page` | query | no | page 0–999 of the filtered list (default 0) |

## Response

- `data`: `TrackedEvent[]`
- `meta`: page, count, total (after the filters), hasNextPage
- Objects: TrackedEvent (https://sportsapi.app/markdown/en/reference.md#trackedevent)

## Errors

- 400 bad_request — type, since or page malformed
- 403 endpoint_not_in_plan — every plan but Enterprise
- 404 not_found — an id we never issued

Plus the common errors (https://sportsapi.app/markdown/en/docs.md#errors).

## Request

cURL:

```bash
curl -H "Authorization: Bearer sk_live_…" \
    "https://api.sportsapi.app/v2/fixtures/{id}/tracking/events"
```

TypeScript:

```ts
const { data, meta } = await client.tracking.events(id);
for await (const page of client.tracking.eventsPages(id)) { … }
```

Python:

```python
res = client.tracking.events(id)
for page in client.tracking.events_pages(id): ...
```

Go:

```go
res, err := client.Tracking.Events(ctx, id, &sportsapi.TrackingEventsParams{})
for page, err := range client.Tracking.EventsPages(ctx, id, &sportsapi.TrackingEventsParams{}) { … }
```

CLI:

```bash
$ sportsapi tracking events <id>
$ sportsapi tracking events <id> --all -o csv
```

## Example response

```json
{ "data": [
    { "key": "5f0c2a9e41d7b3c8", "type": "pass", "at": "2026-11-11T21:04:09.568Z", "side": "home", "minute": 79, "second": 4785,
      "period": null, "set": null, "game": null, "position": { "x": 42, "y": 2, "z": null }, "endPosition": { "x": 58, "y": 15, "z": null },
      "player": { "name": "John Doe", "shirtNumber": 8, "side": "home" }, "assist": null, "playerIn": null, "playerOut": null,
      "outcome": "complete", "goalType": null, "serving": null, "gameScore": null, "pointOutcome": null, "shots": null }, … ],
  "meta": { "page": 0, "count": 1000, "total": 2215, "hasNextPage": true } }
```

---

Base URL: https://api.sportsapi.app. Send your API key as `Authorization: Bearer <key>` on every /v2 request; keys are created in the dashboard (https://sportsapi.app/dashboard).
HTML: https://sportsapi.app/docs/tracking/events · All docs: https://sportsapi.app/markdown/en/docs.md
