Skip to main content
Every request your ingest URL receives is a captured event you can browse, filter, read in full, and tail live. This guide covers finding events and reading their contents; to forward them to your machine, see replay to localhost. Reading events needs an API key with events:read.

List and filter

events.list returns events newest-first, through an opaque keyset cursor. Pass an endpointId for a single endpoint, or omit it to browse your whole org’s events on one page — the same consolidated view the dashboard’s Events page shows. All filters are optional and combine with AND:
  • endpointId — one endpoint, or omit for the whole org.
  • provider — repeatable; matches any of the given providers.
  • verification stateverified, authenticated, failed, or unattempted; repeatable.
  • method — the request’s HTTP method (GET, POST, …); repeatable.
  • event type — the parsed event type (e.g. charge.succeeded); repeatable. Only stripe, github, and shopify populate it today — for every other provider it’s null, so filtering by it returns nothing (not “no events”).
  • dedup strategy — how the event’s dedup key was derived (content_hash, sw_webhook_id, provider_event_id, fields, unique); repeatable.
  • after / before — a received-at range (after is inclusive, before is exclusive). after accepts an RFC 3339 timestamp or a relative duration — 7d, 24h, 30m, or now.
  • search — a case-insensitive substring (minimum 3 characters) across the event’s provider event id and dedup key; an exact match when the term is an event id. Request headers and payload bodies are not searched.
limit caps a page at 200. On the CLI, --all follows the cursor to the end for you.
On the CLI, --provider and --status are repeatable (or comma-separated) for multi-select, and --before bounds the top of the range. Add --output json for a machine-readable stream.

Read one event

events.get returns a single event in full — request headers, its verification result, timing, and a pointer to the raw body.

Get the raw body

events.getPayload returns the exact captured bytes. On the wire the body rides a JSON envelope — contentType, bytes (the decoded length), and the base64-wrapped body — so binary payloads and exact-byte signature fidelity survive intact. The CLI writes the raw bytes verbatim, so redirecting to a file is byte-exact:
TypeScript
Payload retrieval is available on the CLI, API, and SDKs. It isn’t exposed over MCP — an agent reads event metadata with events.get instead.

Tail live

events.tail is a forward, cursor-based tail with a since grammar (now, beginning, a duration, or an RFC 3339 instant) and cursor bookkeeping — headCursor for the current head, caughtUp once a page reaches it, and lag for how far behind you are. It’s the pull form the API and SDKs expose. For a live stream in your terminal, the CLI wraps it as wbhk listen <endpoint-id>, which prints each event as it arrives. Add --forward to re-deliver them to your local server instead — see replay to localhost.