# GET /v2/fixtures/{id}/at-bats/{atBatId}/pitches

Group: Fixtures

Baseball: the pitches of one at-bat, in order — pitch type (MLB Statcast: four-seam fastball, sinker, cutter, slider, sweeper, curveball, changeup, …), release speed, zone, result, the count and outs after each, the score, the ball in play (trajectory, hardness), and the runners’ and fielders’ parts. Plays between pitches (a stolen-base attempt) are rows of kind steal.

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

Note: Baseball only: other sports return 200 with an empty array. balls / strikes / outs are the count AFTER the pitch; the last pitch’s outcome is the at-bat’s result (endsAtBat true). outcome is a closed set with outcomeCode the source’s own code for anything it names other. zone uses MLB’s Statcast numbering (1–9 the strike zone, 11–14 outside). speedKmh is the release speed in km/h (multiply by 0.6214 for mph). Runners: fromBase 0 = the batter, toBase 4 = a run scored, null when put out. Lists stored before 2026-11-04 have AtBat.id null until refreshed.

## Parameters

| Name | In | Required | Description |
| --- | --- | --- | --- |
| `id` | path | yes | our numeric id (positive integer) |
| `atBatId` | path | yes | an at-bat id: AtBat.id from /v2/fixtures/{id}/points |

## Response

- `data`: `Pitch[]`
- `meta`: atBatId, count
- Objects: Pitch (https://sportsapi.app/markdown/en/reference.md#pitch)

## Errors

- 403 history_not_in_plan — the fixture is older than your plan’s history
- 404 not_found — an id we never issued (fixture or at-bat)

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}/at-bats/{atBatId}/pitches"
```

TypeScript:

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

Python:

```python
res = client.fixtures.pitches(id, at_bat_id)
```

Go:

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

CLI:

```bash
$ sportsapi fixtures pitches <id> <atBatId>
```

## Example response

```json
{ "data": [
    { "kind": "steal", "number": 0, "at": "2026-10-18T00:12:56.000Z", "pitchType": null, "outcome": null, "endsAtBat": false,
      "balls": 0, "strikes": 0, "outs": 2, "runners": [ { "player": { "id": 9311, "name": "Chandler Simpson" }, "fromBase": 1, "toBase": 1, "out": false } ], … },
    { "kind": "pitch", "number": 1, "at": "2026-10-18T00:13:10.000Z",
      "pitcher": { "id": 9301, "name": "Shawn Armstrong", … }, "batter": { "id": 9302, "name": "Junior Caminero", … },
      "pitcherHand": "right", "batterHand": "right", "pitchType": "cutter", "pitchName": "Cutter", "speedKmh": 144.84, "zone": 5,
      "outcome": "fieldersChoice", "outcomeCode": "oFC", "endsAtBat": true, "balls": 0, "strikes": 0, "outs": 3,
      "homeScore": 0, "awayScore": 0, "hit": false, "bunt": false, "wildPitch": false, "passedBall": false,
      "doublePlay": false, "triplePlay": false, "overturned": false,
      "battedBall": { "trajectory": "groundBall", "hardness": "medium" },
      "runners": [ { "player": { "id": 9302, "name": "Junior Caminero" }, "fromBase": 0, "toBase": 1, "out": false },
                   { "player": { "id": 9311, "name": "Chandler Simpson" }, "fromBase": 1, "toBase": null, "out": true } ],
      "fielders": [] } ],
  "meta": { "atBatId": 70412, "count": 2 } }
```

---

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