> ## Documentation Index
> Fetch the complete documentation index at: https://ahasend.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> AhaSend stores all message data in the EU. See /facts.
> The API base URL is https://api.ahasend.com. Send the API key in the Authorization: Bearer header. See /api-reference/authentication.
> Use send.ahasend.com for SMTP in the EU, or send-us.ahasend.com as a US connection point forwarding to the EU. Ports 25, 587 and 2525 use STARTTLS. Port 465 is not supported. See /smtp.
> For send-only integrations, create an API Key v2 under Credentials → Add and scope it to messages:send:{your-domain}. See /send-api/credentials and /api-reference/scopes.

# Webhook and Route Retry Policy

> Check AhaSend webhook and route retry schedules, attempt limits, five-second timeouts, duplicate deliveries, and how to re-enable a failed endpoint.

AhaSend retries failed webhook and inbound route deliveries: webhooks get 6 attempts over about 16 minutes, and routes get 12 attempts over about 11 hours. Attempt counts include the first attempt.

Signed webhooks and routes are available on Free, Pro and Max. See [plans and features](/docs/facts#plans-and-features).

## What Counts as a Failed Attempt?

Any 2xx response is successful. Any non-2xx response, timeout or connection error is a failure. Each attempt times out after 5 seconds.

## When Does AhaSend Retry?

The delay before each retry is (failures so far)^4 seconds, ±10%. Times in this table exclude that jitter and the time spent making requests.

| Attempt | Delay before attempt (seconds) | Total waiting time (seconds) | Webhooks | Routes |
| - | - | - | - | - |
| 1 | 0 | 0 | Yes | Yes |
| 2 | 1 | 1 | Yes | Yes |
| 3 | 16 | 17 | Yes | Yes |
| 4 | 81 | 98 | Yes | Yes |
| 5 | 256 | 354 | Yes | Yes |
| 6 | 625 | 979 | Yes | Yes |
| 7 | 1,296 | 2,275 | Finished | Yes |
| 8 | 2,401 | 4,676 | Finished | Yes |
| 9 | 4,096 | 8,772 | Finished | Yes |
| 10 | 6,561 | 15,333 | Finished | Yes |
| 11 | 10,000 | 25,333 | Finished | Yes |
| 12 | 14,641 | 39,974 | Finished | Yes |

## How Do I Re-enable a Disabled Endpoint?

After more than 100 consecutive failed attempts, the webhook or route is disabled and account users are emailed. Correct the endpoint, then [update the webhook](/docs/api-reference/webhooks/update-webhook) or [update the route](/docs/api-reference/routes/update-route) with `enabled: true` to turn it back on.

Redirects are followed, but 301, 302 and 303 turn the POST into a GET without a body, so point the endpoint at its final URL.

Verify [signatures](/docs/api-reference/webhooks/security) before processing events. Acknowledge verified unknown event types with a 2xx response so new event types do not cause repeated failures.

## How Do I Handle Duplicate Deliveries?

Verify the signature, then use `webhook-id` to identify a delivery across retries. Commit that ID and the durable work it protects together, so a retry cannot repeat a side effect or lose work. Return 2xx for an already-processed delivery.

## Related Guides

* [API authentication](/docs/api-reference/authentication), [Permission scopes](/docs/api-reference/scopes), [Webhook setup](/docs/integrations/webhooks).

* [Event reference](/docs/api-reference/webhooks), [Webhook CLI](/docs/cli/commands/webhooks), [Local webhook testing](/docs/cli/webhook-testing).

* [Signature verification](/docs/api-reference/webhooks/security), [API errors](/docs/api-reference/errors), [API rate limits](/docs/api-reference/rate-limits).

* For inbound email: [routing setup](/docs/integrations/routing), [route payload](/docs/api-reference/routes/route-message) and [CLI route testing](/docs/cli/route-testing).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.