# Get a replay bundle

Source: https://langbot.ai/docs/api/receipts/get-replay-bundle

`GET /v1/events/{event_id}/replay`

Everything an auditor needs for one event, with its manifest, events with receipts, checkpoints, and optionally order books and your attestations.

**Auth.** An API token: `Authorization: Bearer lb_…` ([create one](https://langbot.ai/app/tokens)). Signed-in web sessions work too.

**Limits.** One history query per call (500 a day on Free; unlimited on Builder and Standard). Served at your plan's delay (+60 s Free, +10 s Builder, +2 s Standard).

## Parameters

### Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `event_id` | string | yes | The event id (`ev_…`). |

### Query parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `since_seq` | integer | no | Only events with `seq` at or above this. |
| `source_id` | string | no | One source's chain. |
| `types` | string | no | Comma-separated event types. |
| `books` | integer | no | `1` adds order books with depth, `2` the top of book only. 0 to 2. Default `0`. |
| `mine` | integer | no | `1` adds your attestations. 0 to 1. Default `0`. |
| `format` | string | no | `json` or `jsonl` (one object per line with a `kind` member, as a download). Default `json`. |
| `limit` | integer | no | At most this many events. 1 to 100,000. Default `100000`. |

## Request

**curl**

```bash
curl "https://api.langbot.ai/v1/events/ev_nvda_q3_2026/replay?books=2" \
  -H "Authorization: Bearer $LANGBOT_API_TOKEN"
```

**Python**

```python
from langbot import LangbotClient

async with LangbotClient() as lb:  # reads LANGBOT_API_TOKEN
    bundle = await lb.replay("ev_nvda_q3_2026", books=True)
    print(bundle["manifest"]["sources"])
```

**TypeScript**

```ts
const res = await fetch("https://api.langbot.ai/v1/events/ev_nvda_q3_2026/replay?books=2", {
  headers: { Authorization: `Bearer ${process.env.LANGBOT_API_TOKEN}` },
});
console.log(await res.json());
```

## Response

`200 OK`

```json
{
  "manifest": {
    "v": 1,
    "event_id": "ev_nvda_q3_2026",
    "generated_at": 1760050130000,
    "delay_ms": 0,
    "rights": "licensed",
    "key": { "key_id": "56475aa75463474c", "public_key": "A6EHv/…" },
    "sources": [ { "source_id": "src_nvda_q3_2026_dialin", "source_kind": "sip", "first_chain_seq": 1, "last_chain_seq": 2, "head_hash": "5d0e05c3…", "events": 2 } ],
    "filters": { "since_seq": null, "source_id": null, "types": null }
  },
  "events": [ { "id": "evt_01K7Q…A2", "type": "phrase_detected", "hash": "5d0e05c3…", "chain_seq": 2 } ],
  "checkpoints": [ { "chain_seq": 2, "hash": "5d0e05c3…", "key_id": "56475aa75463474c", "signature": "cEf385IN…" } ],
  "books": [ { "ticker": "KXEARNINGSMENTIONNVDA-26OCT-BLACKWELL", "ts": 1760050123000, "yes_bid": 0.56, "yes_ask": 0.58 } ],
  "attestations": []
}
```

Check a bundle offline with `langbot verify bundle.json` or `receipts.verify_bundle(bundle)`.

## Errors

| Status | `code` | When |
|---|---|---|
| 404 | `not_found` | No recorded event with that id. |
| 401 | `auth_required` | No token was sent. |
| 401 | `token_invalid` | The token was not recognised (mistyped, revoked or expired). |
| 422 | `validation_error` | A parameter failed validation; `detail[].loc` names it. |
| 429 | `quota_exceeded` | Today's history queries are spent; `quota.resets_at` says when they reset. |
| 429 | `rate_limited` | Over your request budget; wait `Retry-After` seconds. |

Every error body is `{"detail": …, "code": "…"}`; branch on `code`. All codes: [Errors](https://langbot.ai/docs/api#errors).
