Off the Hook delivers webhooks as HTTP POST requests with JSON bodies to the destination URL you configure on a subscription. Your endpoint must be publicly reachable over HTTPS — Off the Hook validates the URL at subscription creation time and rejects any address that resolves to a private IP range.Documentation Index
Fetch the complete documentation index at: https://docs.offthehook.dev/llms.txt
Use this file to discover all available pages before exploring further.
Responding correctly
Return an HTTP2xx status code within the timeout window. If your endpoint returns 5xx, 408, 429, or the connection fails entirely, Off the Hook treats the delivery as failed and queues a retry.
Retry schedule
Off the Hook retries a failed delivery up to 7 times with the following delays between attempts:| Attempt | Delay after previous |
|---|---|
| 1 | 200 ms |
| 2 | 1 s |
| 3 | 5 s |
| 4 | 1 min |
| 5 | 5 min |
| 6 | 30 min |
| 7 | 2 h |
failed. You can manually re-queue it using the retry endpoint.
Deduplication
Because retried deliveries re-send the samewebhook-id header, you should treat that value as an idempotency key. Store the IDs of events you have already processed and skip any delivery that arrives with a duplicate ID.
2xx even for duplicates — returning an error causes another retry.
SSRF protection
Off the Hook validates your destination URL when you create or update a subscription. URLs that resolve to private IP ranges — including10.x.x.x, 172.16.x.x–172.31.x.x, 192.168.x.x, and 127.x.x.x — are rejected with an ssrf_blocked error. The same check runs at delivery time to defend against DNS rebinding.