Replay events from a cursor (gap-fill on reconnect)
Walk your organization’s durable event log forward, oldest first. This is how a subscriber that was offline recovers: every event is logged when it is emitted, before any delivery is attempted, so an outage — yours or ours — leaves a record you can replay rather than a silent gap.
The loop is: persist the cursor of the last event you durably processed; on reconnect call this endpoint with ?after=<cursor>; process the page; repeat with the last cursor of that page until it comes back short. The walk is gap-free and duplicate-free even when two events share a timestamp, because the cursor is a keyset over (occurred_at, id) rather than a timestamp.
envelope is byte-identical to what a live delivery would have POSTed at that version, so replayed events need no special casing in your handler. event_id is stable across the live delivery and every replay — deduplicate on it.
Authorizations
Query Parameters
Resume strictly after this cursor. Pass the cursor of the last event you durably processed — not the last one you received. Omit to start from the oldest retained event. An unrecognised cursor is a 422: silently restarting from the beginning would flood you, and silently starting from now would hide the very gap you are reconnecting to close.
Restrict to these event types. Repeat the parameter for multiple values. Omit for everything.
Every subscribable event type (C-4296).
Mirrors :class:apps.integrations.webhooks.catalog.WebhookEventType. The
two are asserted value-identical by
test_webhook_catalog.py::TestCatalogIntegrity — this is the mirror the
apps/CLAUDE.md API-empathy rule asks for, and typing the API's
event-type fields as this enum is what puts the catalog in the published
OpenAPI spec as enum: [...] instead of "any string".
Members are named after the wire value with dots and hyphens replaced, but the value is the wire string and is what everything round-trips on.
recall.opened, recall.amended, recall.expanded, recall.closed, signal.received, adverse_report.received, adverse_report.threshold_alert, serial_verification.flagged, test.ping, offer.updated, product.recalled, retailer.created Shorthand for the whole recall domain. Prefer this over listing the four recall.* values, because it keeps covering you when a fifth recall event ships.
Render each envelope at this version. Defaults to the version pinned on your endpoints, so a replayed event goes through the same handler as a live delivery.
v1, 2026-07-01 Events per page. Clamped to 200.
1 <= x <= 200Page number (1-indexed).
x >= 1Number of items per page (max 100).
1 <= x <= 100Response
OK