# GET /v2/fixtures/{id}/shotmap

Group: Fixtures

Every shot with its outcome and expected goals, oldest first: football (expectedGoals / expectedGoalsOnTarget, situation, body part, pitch and goal-mouth coordinates), ice hockey (technique, strength, rink coordinates) and basketball (every field-goal attempt: made / missed / blocked and where on the court).

Plans: Pro + Business only (other plans get 403 endpoint_not_in_plan).

Note: Football, ice hockey and basketball, covered leagues; an empty array otherwise. outcome is goal | save | miss | block | post in football and ice hockey; basketball uses goal (made), miss and block, its position is in tenths of a foot from the basket, player and time are null, and home shots come before away shots; goalType is regular | ownGoal | penalty; technique (wrist, snap, slap, …) and strength are ice hockey only. Shoot-out kicks come last: shootoutSequence is the kick order across both sides (as on the events), shootoutRound the taker’s side’s 1st, 2nd, … kick. Football period (since 2026-10-24; null before) follows the minute: period1, period2, extra1, extra2, penalties for shoot-out kicks. Refreshed about every 30 seconds while the match is live; on a fixture:{id} WebSocket channel (Business) the whole list is pushed as a shotmap frame when it changes.

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `id` | path | yes | our numeric id (positive integer) |

## Response

- `data`: `Shot[]`
- `meta`: count
- Objects: Shot (https://sportsapi.app/markdown/en/reference.md#shot)

## Request

cURL:

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

TypeScript:

```ts
const { data, meta } = await client.fixtures.shotmap(id);
```

Python:

```python
res = client.fixtures.shotmap(id)
```

Go:

```go
res, err := client.Fixtures.Shotmap(ctx, id)
```

CLI:

```bash
$ sportsapi fixtures shotmap <id>
```

## Example response

```json
{ "data": [ …, { "side": "away", "outcome": "goal", "technique": null, "goalType": "regular",
    "situation": "assisted", "bodyPart": "rightFoot", "strength": null, "expectedGoals": 0.028, "expectedGoalsOnTarget": 0.165,
    "minute": 80, "addedMinute": null, "second": 4770, "period": "period2",
    "player": { "id": 3759, "name": "Bukayo Saka", … }, "goalkeeper": { "id": 4101, "name": "Matz Sels", … },
    "position": { "x": 13.4, "y": 27.5, "z": 0 }, "goalMouth": { "x": 0, "y": 48.4, "z": 24.1 },
    "goalMouthLocation": "highCentre", "blockPosition": null, "shootoutSequence": null, "shootoutRound": null } ],
  "meta": { "count": 23 } }

// Ice hockey:
{ "data": [ { "side": "home", "outcome": "save", "technique": "wrist", "strength": "powerPlay", "expectedGoals": 0.036,
    "minute": 1, "second": 46, "period": "period1", "position": { "x": 50, "y": 22, "z": null }, … }, … ],
  "meta": { "count": 61 } }

// Basketball:
{ "data": [ { "side": "home", "outcome": "goal", "player": null, "minute": null, "second": null,
    "position": { "x": -132, "y": 168, "z": null }, … }, … ],
  "meta": { "count": 171 } }
```

---

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/fixtures/shotmap · All docs: https://sportsapi.app/markdown/en/docs.md
