# Gamma by strike

> The newest book's dealer gamma strike by strike, for one symbol, in the volume or the open-interest book.

Source: https://firmtape.com/docs/developers/live/gamma

The newest book's dealer gamma strike by strike, for one symbol, in the volume or the open-interest book.

`GET /api/v1/gamma`

Plan LIVE · Key scope live · Limit 120 a minute per key; a 304 is free · Version 1.0.0 · Since 2026-09-30

**This endpoint serves:** [LIVE: Levels API](https://firmtape.com/docs/live#levels-api), [LIVE: Ladder columns](https://firmtape.com/docs/live#ladder-columns), [LIVE: Platform integrations](https://firmtape.com/docs/live#integrations). **Plan:** [LIVE](https://firmtape.com/features/live). LIVE: today's session every second, alerts, ASK, the levels API and the platform integrations, and 5 LAB credits a month. Every finished session is free in REPLAY.

## Parameters

| Name | What it does | Default | Error |
| --- | --- | --- | --- |
| `sym` (required) query, string | One symbol: SPX, ES, NQ, RTY (or MES, MNQ, M2K), a dated contract such as `ESH27`, or a ticker from `/api/v1/symbols`. |  | missing_sym |
| `book` query, vol \| oi | `vol` or `oi`. | vol | bad_book |
| `contract` query, string | Futures: a dated contract in the two weeks before a roll, e.g. `ESH27`. The levels move by that contract's own basis. | the front quarterly | contract_not_live |
| `errors` query, 200 | `200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status. |  |  |
| `key` query, string | Legacy: the key in the address, for platforms that cannot send headers. Prefer the header. |  |  |

## Response

Strikes and gamma, index-aligned.

| Field | Meaning | Unit |
| --- | --- | --- |
| `sym` (string) | The symbol answered. |  |
| `name` (string) | Futures: the future's name. |  |
| `book` (volume \| open_interest) | `volume` or `open_interest`. |  |
| `session` (open \| closed \| stale) | `open`, `closed` or `stale`. |  |
| `as_of` (string) | When the book was built, ISO 8601 in New York time. |  |
| `as_of_unix` (integer) | The same instant, Unix seconds. |  |
| `age_s` (integer) | Seconds since the book was built. | seconds |
| `day` (string) | The ET trading day. |  |
| `unit` (string) | `usd_m_per_point` or `usd_per_1pct`. |  |
| `unit_text` (string) | The unit in words. |  |
| `strike_step` (number \| null) | The usual distance between strikes. | index points |
| `strikes` (array) | The strikes, rising. | index points |
| `gamma` (array) | Dealer gamma at each strike, in `unit`. |  |
| `contract` (string \| null) | Futures: the contract. |  |
| `basis` (object) | Futures: the basis that moved the strikes. |  |
| `basis.value` (number \| null) | Future minus index. | index points |
| `basis.index` (string) | The index. |  |
| `basis.rule` (string) | How the basis is made. |  |
| `basis.note` (string) | The strikes in words. |  |

## Errors

| Status | Code | What to do |
| --- | --- | --- |
| 400 | `missing_sym`, `bad_book` | A parameter is wrong. Pass `sym`, one symbol or a comma list. |
| 401 | `no_key`, `bad_key` | No key, or an unknown or revoked one. Send `Authorization: Bearer <key>` with a key of the product's scope. |
| 403 | `live_required` | No LIVE plan. Start or renew LIVE; `pricing` names the page. |
| 404 | `unknown_symbol`, `no_data`, `no_basis`, `contract_not_live` | No such symbol, or no book yet. Pick one from `GET /api/v1/symbols`. |
| 429 | `rate_limited`, `too_many_places` | Over a limit. Wait `Retry-After` seconds; poll with `If-None-Match`, a 304 is free. |

## Caching

Answers carry an `ETag`: send it back as `If-None-Match` and an unchanged reading answers 304 with no body, not counted against the limit.

## Request

```sh
curl \
  -H "Authorization: Bearer $FIRMTAPE_LIVE_KEY" \
  "https://firmtape.com/api/v1/gamma?sym=SPX"
```

```python
import os, requests

H = {"Authorization": f"Bearer {os.environ['FIRMTAPE_LIVE_KEY']}"}
r = requests.get("https://firmtape.com/api/v1/gamma?sym=SPX", headers=H)
print(r.status_code, r.text[:500])
```

```js
const r = await fetch("https://firmtape.com/api/v1/gamma?sym=SPX", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.FIRMTAPE_LIVE_KEY}` },
});
console.log(r.status, await r.text());
```

## Example response

```json
{
  "sym": "SPX",
  "book": "volume",
  "session": "open",
  "as_of": "2026-09-30T14:00:00-04:00",
  "as_of_unix": 1790791200,
  "age_s": 5,
  "day": "2026-09-30",
  "unit": "usd_m_per_point",
  "unit_text": "millions of USD of dealer gamma per 1 index point",
  "strike_step": 5,
  "strikes": [
    6700,
    6705,
    6710
  ],
  "gamma": [
    -5.5,
    1.25,
    9.75
  ]
}
```

## Changes

- 2026-09-30: Added.
