410 Gone means the resource used to exist at this URL, was removed on purpose, and won't be back. It's a deliberate, permanent statement, stronger than 404 Not Found, which only says nothing is there right now. Clients, crawlers and webhook senders can take a 410 as permission to stop asking.
HTTP/1.1 410 Gone
Content-Type: application/json
{"error": "gone", "message": "This endpoint was removed when the integration was uninstalled"}
410 vs 404
404 Not Found | 410 Gone | |
|---|---|---|
| Meaning | Nothing here now | It was here, it was removed, it won't return |
| Permanent? | Unknown | Yes |
| Search engines | Drop the URL after recrawls | Drop the URL, possibly a little faster |
| Webhook senders | Usually retry, then give up | Often stop and disable the endpoint |
If the content moved rather than disappeared, neither is right. Use a 301 or 308 redirect to the new location.
Common reasons you see a 410
- Deleted content. A product, post or account was removed and the site says so explicitly.
- Retired API versions. Some APIs answer 410 on endpoints from a sunset version, often with a link to the migration guide.
- Expired links. One-time download links, invite links and signed URLs past their expiry.
- Removed webhook receivers. An integration was uninstalled and its endpoint now tells senders to stop.
How to fix a 410
As a visitor: the page was intentionally removed. Search the site for the new location, or check the Wayback Machine for the old content.
As a developer calling an API: read the response body and headers for a pointer to the replacement (a Link header or a docs URL), then migrate. Retrying a 410 won't change the answer.
As a site owner: make sure you meant it. A misconfigured rewrite rule that returns 410 for live pages will get them dropped from search results. Check with curl -I https://example.com/path/.
410 on a webhook endpoint
For webhooks, 410 carries a specific meaning: "stop sending to this URL." Many senders treat it differently from every other error. Rather than retrying with backoff, they fail the delivery immediately and disable or unsubscribe the endpoint.
That makes 410 useful, and dangerous:
- Useful: when a customer uninstalls your app or deletes an integration, answering 410 cleans up the subscription on the sender's side without anyone touching a dashboard.
- Dangerous: a catch-all route that returns 410 for unknown paths, or a framework default during a deploy, can silently unsubscribe a live integration. Use
503for temporary downtime, and200for event types you choose to ignore.
If you send webhooks to your own customers, you need a policy for this. Webhook Relay outbound webhooks handle it as follows:
- A
410 Goneresponse fails that delivery for good and disables the endpoint. Other errors and timeouts are retried on a backoff schedule. - After 5 failed attempts in a row, an endpoint is marked
failing. Withauto_disableon, it's disabled after 100 failed attempts in a row spanning at least 12 hours. - Resuming a disabled endpoint reactivates it. Messages skipped while it was disabled aren't sent automatically; you replay them once the endpoint is ready.
See retries and endpoint states for the full table.
When to return 410 from your own API
Return 410 when you have deliberately and permanently removed a resource and want clients to stop requesting it: a deleted record you keep a tombstone for, a sunset API version, an uninstalled integration's webhook URL. If you don't know whether something ever existed, return 404. If it moved, redirect.
