| Endpoint | Use when |
|---|---|
GET /api/v1/events | List events with filters and cursor pagination. |
GET /api/v1/events/{id} | Inspect one event including full attempt history. |
POST /api/v1/events/{id}/replay | Re-fire a previously-recorded event. |
GET /api/v1/events/stream | Server-Sent Events feed of new events. |
GET /api/v1/dev-inbox | Pull events when you have not yet wired up a webhook. |
x-chert-tenant + signature/bearer auth.
List events
| Query | Type | Description |
|---|---|---|
type | string | Exact event type, e.g. message.received. |
status | enum | pending, delivered, failed, or dev_inbox. |
lead_id | string | Only events tied to this lead. |
since | ISO 8601 | Events with created_at > since. |
limit | int | 1–200, default 50. |
cursor | string | Opaque cursor from a prior next_cursor. |
Response
next_cursor back as cursor to read the next page. When next_cursor is null, you have reached the end.
Get one event
delivery.attempts array. Each attempt records the HTTP status, duration, and any error string.
Replay an event
delivery.status. Use this after fixing a bug in your webhook handler.
To replay to one subscription, add ?subscription_id=<subscription_id>.
200 OK
502 Bad Gateway
{ ok, error, downstream_status } shape and adds the canonical numeric code, a message, a retryable boolean, and a trace_id. A 404 (code 2011 — event not found) and a 400 (code 1002 — no delivery destination configured, or a dev-inbox tenant) are both retryable: false; a 502 delivery failure (code 3004) is retryable: true. See Errors.
Stream events
stripe listen.
- Connection lives 60 seconds, then closes with
event: close. Clients should reconnect. - Heartbeat comments arrive every 15 seconds to keep middleboxes from idling out the socket.
- Pass
?since=<iso>to resume from a known cursor after a reconnect.
Dev inbox
When you create a subscription withurl: "https://dev-inbox" (the short sentinel), deliveries are recorded but no outbound POST is attempted. Pull them with:

