API reference · Receipts
Get a 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.
On this page
Auth. An API token: Authorization: Bearer lb_… (create one). 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 "https://api.langbot.ai/v1/events/ev_nvda_q3_2026/replay?books=2" \
-H "Authorization: Bearer $LANGBOT_API_TOKEN"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"])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
{
"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.