410 - Gone
HTTP 410 Gone means the target resource is no longer available at this URI and is expected to be permanently removed.
Last reviewed: February 12, 2026|Editorial standard: source-backed technical guidance
What Does Gone Mean?
This URI has been intentionally retired, so repeated calls waste client retries and keep users on dead links until integrations switch to the replacement path.
Common Causes
- -Resource was intentionally removed and old URI retired.
- -API version or endpoint path was permanently deprecated.
- -Consumers still call stale bookmarks or legacy integrations.
How to Fix Gone
- 1Stop retrying this URI because 410 indicates permanent resource removal.
- 2Remove or replace stale links and client integrations targeting the retired path.
- 3Migrate callers to replacement endpoints or archival content guidance.
Step-by-Step Diagnosis for Gone
- 1Capture the exact URI and deprecation metadata returned with Gone (410).
- 2Confirm retirement intent in product/change logs, including replacement endpoint decisions.
- 3Differentiate permanent removal (410) from transient missing resource states better modeled as 404.
- 4Trace inbound traffic sources still calling retired URIs and prioritize migration of high-volume callers.
Retirement Intent and Lifecycle Validation
- -Audit decommission records and API lifecycle notes (example: endpoint retired after v1 sunset date in release policy).
- -Verify the response intentionally communicates permanence, not temporary outage (example: 410 with migration note versus accidental route removal).
Migration and Traffic Cutover Checks
- -Trace referrers, SDK versions, and client apps still using old URI (example: legacy mobile build pinned to deprecated route).
- -Validate redirects or replacement documentation where applicable (example: retire `/v1/invoices/*`, migrate to `/v2/billing/invoices/*`).
Implementation Examples
curl -i -X GET https://api.example.com/v1/articles/deleted-slug
# Response:
# HTTP/1.1 410 Gone
# {"error":"Gone","code":"410"}const response = await fetch('https://api.example.com/v1/articles/deleted-slug', {
method: 'GET',
headers: { 'Accept': 'application/json' }
});
if (response.status === 410) {
console.error('Handle 410 Gone');
}import requests
response = requests.get(
'https://api.example.com/v1/articles/deleted-slug',
headers={'Accept': 'application/json'}
)
if response.status_code == 410:
print('Handle 410 Gone')How to Verify the Fix
- -Confirm clients use the replacement endpoint and no longer rely on retired URIs.
- -Validate migration docs/redirects drive users to supported resources without broken journeys.
- -Measure residual 410 traffic to ensure legacy callers are steadily burned down.
How to Prevent Recurrence
- -Use canonical resource identifiers and route generation helpers across clients.
- -Add broken-link and stale-route checks to CI and post-deploy validation.
- -Automate cleanup and migration playbooks for moved or retired resources.
Pro Tip
- -ship deprecation headers and sunset timelines ahead of removal, then gate final retirement on observed caller migration completion.
Decision Support
Compare Guide
404 Not Found vs 410 Gone: Missing vs Permanent Removal
Learn when to return 404 (missing or temporary absence) versus 410 (intentional permanent removal), including redirect and cache implications.
Compare Guide
403 Forbidden vs 404 Not Found: When to Hide Resources
Use 403 for explicit access denial, or 404 to conceal resource existence when security policy requires reducing endpoint and object enumeration risk.
Playbook
Resource State Playbook (404 / 410 / ResourceNotFound)
Use this playbook to separate temporary missing-resource lookups from permanent removals, then fix scope, lifecycle, and identifier drift safely.
Official References
Provider Context
This guidance is specific to HTTP services. Always validate implementation details against official provider documentation before deploying to production.