Skip to content
catchook

Reference

Limits

Every hard limit and timing guarantee in one place.

Sizes and rates

Request body100 KBLarger requests are rejected at receive
Receive rate, per endpoint12,000/min (~200/sec)Abuse guard, not a traffic cap
retry_max_attempts10 maxPer destination
Event retention14 daysEvents and delivery attempts alike

Timing

Config changes reaching the receive pathup to 60 seconds
Config changes reaching the delivery pathup to 60 seconds
An event becoming queryablearound 1 second

Config changes means pausing or resuming an endpoint or destination, rotating a secret, adding or removing a destination. Configuration is cached in front of the database because every single webhook needs it and it almost never changes; 60 seconds is the cost of that.

The one-second figure for queryability is a consequence of batched writes to the event store. It is near-live, not synchronous — an event that was just delivered may not be in a list response yet.

Delivery semantics

At-least-once. Retries mean the same event can reach a destination more than once. Handlers must be idempotent on catchook-event-id.

Unordered. Jobs are independent and retried independently. A retried event can arrive after one received later. Order by a payload field if order matters.

Best-effort recording. The event record is written after the response goes back to the provider, so an outage in the event store can lose the record of a webhook that was received and delivered correctly. Delivery is never blocked by recording.

What a paused thing does

Paused endpointReturns 200, records nothing, queues nothing. Not a buffer
Paused destinationEvents are received and recorded; jobs for this destination are dropped

Pausing an endpoint answers 200 rather than an error on purpose: providers disable subscriptions that keep failing, so a planned pause should not look like a broken endpoint.

To catch up after a pause, replay the window — but only within the 14-day retention, and only for a paused destination. Events not recorded during an endpoint pause cannot be recovered.