Questions · Updated 2026-09-28
Why did my webhook stop receiving events?
A webhook stops receiving events when your endpoint answered with an error or timed out until it was disabled, when its url or its events list changed, or when your verifier rejected the body. GET /webhooks/{id} shows disabled and last_delivery_status; GET /webhooks/{id}/deliveries shows every attempt and what you answered.
A webhook stops receiving events for one of four reasons, and each has a place to check. The endpoint answered with something other than a success status, or timed out, on enough deliveries in a row that it was disabled. The url on the endpoint changed. The events list on the endpoint does not include the type you are waiting for. Or the delivery arrived and your signature check rejected it because it verified a re-serialised body. GET /webhooks/{id} returns disabled and last_delivery_status; GET /webhooks/{id}/deliveries lists every attempt with what your server answered.
Read the deliveries
The summary of GET /webhooks/{id}/deliveries promises "Every delivery to this endpoint, with each attempt and what the receiver answered". Each row has a status of pending, retrying, delivered or dead_lettered, and an attempts list where each attempt records at, status_code, response_body, duration_ms and error. An attempt with error set and no status_code did not get an HTTP answer. Filter with event_type, status, since and until.
curl -sS -X GET https://api.agentisend.com/webhooks/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/deliveries \
-H "Authorization: Bearer $AGENTISEND_API_KEY"200
{
"data": [],
"has_more": true,
"next_cursor": "string",
"object": "string"
}Retries, then a dead letter
A delivery that is not acknowledged with a success status is retried at 1, 5, 15, 60, 180, 360, 720, 1440, 2880, 4320 minutes, 10 attempts in all. After the last failure it is a dead letter, listed by GET /webhooks/{id}/dead-letters, whose summary is "Deliveries this endpoint exhausted every retry on, with the payload to inspect." Each dead letter has payload, reason, last_status_code, last_response_body and attempts. Fix the handler against that payload, then re-send it: How do I replay webhook events?.
A disabled endpoint
Webhooks says an endpoint that fails persistently is disabled and the account is notified. GET /webhooks/{id} then reads disabled: true, and GET /notifications lists the condition, type webhook_endpoint_disabled. A disabled endpoint holds its queue rather than dropping it, so deliveries that occurred while it was off are still pending. Once the receiver answers with a success status again, call PATCH /webhooks/{id} with {"disabled": false}; its summary is "Update url, subscribed events, or the disabled flag." The backlog is delivered, and the dead letters from before the disable are yours to replay.
Nothing failed, and still no event
Read events on GET /webhooks/{id}. A type that is not in the list is never sent to that endpoint, so an endpoint created for email.delivered hears nothing about email.bounced until PATCH /webhooks/{id} adds it. Read url too: a delivery to the old host is a delivery you will not see. A send to an address at simulator.agentisend.com produces its email.* events with "simulated": true in data, so a handler that drops simulated events sees nothing from a test run. And a verifier that recomputes the signature over parsed-then-serialised JSON fails at random, which looks from your side like deliveries that never arrived; How do I verify a webhook signature? has the check that reads the raw bytes.