[{"data":1,"prerenderedAt":564},["ShallowReactive",2],{"content-query-tmhS9iZewX":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"layout":10,"crumb":11,"summary":12,"group":13,"order":14,"code":14,"updated":15,"cta":16,"related":24,"faq":43,"body":59,"_type":557,"_id":558,"_source":559,"_file":560,"_stem":561,"_extension":562,"sitemap":563},"/http-errors/410-gone","http-errors",false,"","410 Gone: what it means, 410 vs 404, and webhooks","HTTP 410 Gone means a resource was removed on purpose and won't return. 410 vs 404, SEO effects, and why webhook senders disable 410 endpoints.","reference","410 Gone","Removed on purpose, permanently. Senders often stop calling.","4xx client errors",410,"2026-10-28",{"eyebrow":17,"title":18,"text":19,"to":20,"label":21,"secondaryTo":22,"secondaryLabel":23},"Webhook Relay Outbound Webhooks","Sending webhooks? Handle dead endpoints automatically","Webhook Relay outbound webhooks stop retrying and disable an endpoint that answers 410 Gone. Endpoints are marked failing after repeated errors, and can be disabled automatically after a long outage. Resume one and replay what it missed.","/outbound-webhooks/","See outbound webhooks","/docs/outbound/receiving/","Retry and endpoint states",[25,28,31,34,37,40],{"title":26,"to":27},"409 Conflict","/http-errors/409-conflict/",{"title":29,"to":30},"503 Service Unavailable","/http-errors/503-service-unavailable/",{"title":32,"to":33},"Webhook endpoint","/glossary/webhook-endpoint/",{"title":35,"to":36},"Webhook retries","/glossary/webhook-retries/",{"title":38,"to":39},"Dead letter queue","/glossary/dead-letter-queue/",{"title":41,"to":42},"Webhook replay","/glossary/webhook-replay/",[44,47,50,53,56],{"q":45,"a":46},"What does 410 Gone mean?","HTTP 410 Gone means the resource used to exist at this URL, was removed deliberately, and isn't coming back. There is no forwarding address. It's a stronger, more specific statement than 404 Not Found, which only says nothing is there right now.",{"q":48,"a":49},"What is the difference between 404 and 410?","404 Not Found means the server can't find the resource and makes no promise about whether it existed or will return. 410 Gone means it existed and was removed permanently. Clients and crawlers can stop requesting a 410 URL; a 404 might be worth checking again.",{"q":51,"a":52},"Is 410 better than 404 for SEO?","Google treats both as signals to drop a URL from the index, and has said a 410 may be processed slightly faster. The difference is small. If the content has moved, use a 301 or 308 redirect to the new URL instead of either one.",{"q":54,"a":55},"What happens when a webhook endpoint returns 410?","Many webhook senders treat 410 Gone as an instruction to stop. Instead of retrying, they mark the delivery failed and disable or unsubscribe the endpoint. Webhook Relay outbound webhooks do this: a 410 stops retries for that delivery and disables the endpoint until someone resumes it.",{"q":57,"a":58},"Should I return 410 from my webhook endpoint?","Only when you want the sender to stop sending to that URL permanently, for example after a customer uninstalls your integration. Don't return 410 during maintenance or for unknown event types. Use 503 for temporary downtime and 200 for events you simply ignore.",{"type":60,"children":61,"toc":550},"root",[62,82,131,138,248,269,275,320,326,336,354,372,378,390,395,438,457,505,517,523,544],{"type":63,"tag":64,"props":65,"children":66},"element","p",{},[67,80],{"type":63,"tag":68,"props":69,"children":70},"strong",{},[71,78],{"type":63,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":77,"value":11},"text",{"type":77,"value":79}," means the resource used to exist at this URL, was removed on purpose, and won't be back.",{"type":77,"value":81}," 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.",{"type":63,"tag":83,"props":84,"children":88},"pre",{"className":85,"code":86,"language":87,"meta":7,"style":7},"language-http shiki shiki-themes github-dark","HTTP/1.1 410 Gone\nContent-Type: application/json\n\n{\"error\": \"gone\", \"message\": \"This endpoint was removed when the integration was uninstalled\"}\n","http",[89],{"type":63,"tag":72,"props":90,"children":91},{"__ignoreMap":7},[92,103,112,122],{"type":63,"tag":93,"props":94,"children":97},"span",{"class":95,"line":96},"line",1,[98],{"type":63,"tag":93,"props":99,"children":100},{},[101],{"type":77,"value":102},"HTTP/1.1 410 Gone\n",{"type":63,"tag":93,"props":104,"children":106},{"class":95,"line":105},2,[107],{"type":63,"tag":93,"props":108,"children":109},{},[110],{"type":77,"value":111},"Content-Type: application/json\n",{"type":63,"tag":93,"props":113,"children":115},{"class":95,"line":114},3,[116],{"type":63,"tag":93,"props":117,"children":119},{"emptyLinePlaceholder":118},true,[120],{"type":77,"value":121},"\n",{"type":63,"tag":93,"props":123,"children":125},{"class":95,"line":124},4,[126],{"type":63,"tag":93,"props":127,"children":128},{},[129],{"type":77,"value":130},"{\"error\": \"gone\", \"message\": \"This endpoint was removed when the integration was uninstalled\"}\n",{"type":63,"tag":132,"props":133,"children":135},"h2",{"id":134},"_410-vs-404",[136],{"type":77,"value":137},"410 vs 404",{"type":63,"tag":139,"props":140,"children":141},"table",{},[142,171],{"type":63,"tag":143,"props":144,"children":145},"thead",{},[146],{"type":63,"tag":147,"props":148,"children":149},"tr",{},[150,154,163],{"type":63,"tag":151,"props":152,"children":153},"th",{},[],{"type":63,"tag":151,"props":155,"children":156},{},[157],{"type":63,"tag":72,"props":158,"children":160},{"className":159},[],[161],{"type":77,"value":162},"404 Not Found",{"type":63,"tag":151,"props":164,"children":165},{},[166],{"type":63,"tag":72,"props":167,"children":169},{"className":168},[],[170],{"type":77,"value":11},{"type":63,"tag":172,"props":173,"children":174},"tbody",{},[175,194,212,230],{"type":63,"tag":147,"props":176,"children":177},{},[178,184,189],{"type":63,"tag":179,"props":180,"children":181},"td",{},[182],{"type":77,"value":183},"Meaning",{"type":63,"tag":179,"props":185,"children":186},{},[187],{"type":77,"value":188},"Nothing here now",{"type":63,"tag":179,"props":190,"children":191},{},[192],{"type":77,"value":193},"It was here, it was removed, it won't return",{"type":63,"tag":147,"props":195,"children":196},{},[197,202,207],{"type":63,"tag":179,"props":198,"children":199},{},[200],{"type":77,"value":201},"Permanent?",{"type":63,"tag":179,"props":203,"children":204},{},[205],{"type":77,"value":206},"Unknown",{"type":63,"tag":179,"props":208,"children":209},{},[210],{"type":77,"value":211},"Yes",{"type":63,"tag":147,"props":213,"children":214},{},[215,220,225],{"type":63,"tag":179,"props":216,"children":217},{},[218],{"type":77,"value":219},"Search engines",{"type":63,"tag":179,"props":221,"children":222},{},[223],{"type":77,"value":224},"Drop the URL after recrawls",{"type":63,"tag":179,"props":226,"children":227},{},[228],{"type":77,"value":229},"Drop the URL, possibly a little faster",{"type":63,"tag":147,"props":231,"children":232},{},[233,238,243],{"type":63,"tag":179,"props":234,"children":235},{},[236],{"type":77,"value":237},"Webhook senders",{"type":63,"tag":179,"props":239,"children":240},{},[241],{"type":77,"value":242},"Usually retry, then give up",{"type":63,"tag":179,"props":244,"children":245},{},[246],{"type":77,"value":247},"Often stop and disable the endpoint",{"type":63,"tag":64,"props":249,"children":250},{},[251,253,259,261,267],{"type":77,"value":252},"If the content moved rather than disappeared, neither is right. Use a ",{"type":63,"tag":72,"props":254,"children":256},{"className":255},[],[257],{"type":77,"value":258},"301",{"type":77,"value":260}," or ",{"type":63,"tag":72,"props":262,"children":264},{"className":263},[],[265],{"type":77,"value":266},"308",{"type":77,"value":268}," redirect to the new location.",{"type":63,"tag":132,"props":270,"children":272},{"id":271},"common-reasons-you-see-a-410",[273],{"type":77,"value":274},"Common reasons you see a 410",{"type":63,"tag":276,"props":277,"children":278},"ul",{},[279,290,300,310],{"type":63,"tag":280,"props":281,"children":282},"li",{},[283,288],{"type":63,"tag":68,"props":284,"children":285},{},[286],{"type":77,"value":287},"Deleted content.",{"type":77,"value":289}," A product, post or account was removed and the site says so explicitly.",{"type":63,"tag":280,"props":291,"children":292},{},[293,298],{"type":63,"tag":68,"props":294,"children":295},{},[296],{"type":77,"value":297},"Retired API versions.",{"type":77,"value":299}," Some APIs answer 410 on endpoints from a sunset version, often with a link to the migration guide.",{"type":63,"tag":280,"props":301,"children":302},{},[303,308],{"type":63,"tag":68,"props":304,"children":305},{},[306],{"type":77,"value":307},"Expired links.",{"type":77,"value":309}," One-time download links, invite links and signed URLs past their expiry.",{"type":63,"tag":280,"props":311,"children":312},{},[313,318],{"type":63,"tag":68,"props":314,"children":315},{},[316],{"type":77,"value":317},"Removed webhook receivers.",{"type":77,"value":319}," An integration was uninstalled and its endpoint now tells senders to stop.",{"type":63,"tag":132,"props":321,"children":323},{"id":322},"how-to-fix-a-410",[324],{"type":77,"value":325},"How to fix a 410",{"type":63,"tag":64,"props":327,"children":328},{},[329,334],{"type":63,"tag":68,"props":330,"children":331},{},[332],{"type":77,"value":333},"As a visitor:",{"type":77,"value":335}," the page was intentionally removed. Search the site for the new location, or check the Wayback Machine for the old content.",{"type":63,"tag":64,"props":337,"children":338},{},[339,344,346,352],{"type":63,"tag":68,"props":340,"children":341},{},[342],{"type":77,"value":343},"As a developer calling an API:",{"type":77,"value":345}," read the response body and headers for a pointer to the replacement (a ",{"type":63,"tag":72,"props":347,"children":349},{"className":348},[],[350],{"type":77,"value":351},"Link",{"type":77,"value":353}," header or a docs URL), then migrate. Retrying a 410 won't change the answer.",{"type":63,"tag":64,"props":355,"children":356},{},[357,362,364,370],{"type":63,"tag":68,"props":358,"children":359},{},[360],{"type":77,"value":361},"As a site owner:",{"type":77,"value":363}," make sure you meant it. A misconfigured rewrite rule that returns 410 for live pages will get them dropped from search results. Check with ",{"type":63,"tag":72,"props":365,"children":367},{"className":366},[],[368],{"type":77,"value":369},"curl -I https://example.com/path/",{"type":77,"value":371},".",{"type":63,"tag":132,"props":373,"children":375},{"id":374},"_410-on-a-webhook-endpoint",[376],{"type":77,"value":377},"410 on a webhook endpoint",{"type":63,"tag":64,"props":379,"children":380},{},[381,383,388],{"type":77,"value":382},"For webhooks, 410 carries a specific meaning: ",{"type":63,"tag":68,"props":384,"children":385},{},[386],{"type":77,"value":387},"\"stop sending to this URL.\"",{"type":77,"value":389}," 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.",{"type":63,"tag":64,"props":391,"children":392},{},[393],{"type":77,"value":394},"That makes 410 useful, and dangerous:",{"type":63,"tag":276,"props":396,"children":397},{},[398,408],{"type":63,"tag":280,"props":399,"children":400},{},[401,406],{"type":63,"tag":68,"props":402,"children":403},{},[404],{"type":77,"value":405},"Useful:",{"type":77,"value":407}," 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.",{"type":63,"tag":280,"props":409,"children":410},{},[411,416,418,428,430,436],{"type":63,"tag":68,"props":412,"children":413},{},[414],{"type":77,"value":415},"Dangerous:",{"type":77,"value":417}," a catch-all route that returns 410 for unknown paths, or a framework default during a deploy, can silently unsubscribe a live integration. Use ",{"type":63,"tag":419,"props":420,"children":421},"a",{"href":30},[422],{"type":63,"tag":72,"props":423,"children":425},{"className":424},[],[426],{"type":77,"value":427},"503",{"type":77,"value":429}," for temporary downtime, and ",{"type":63,"tag":72,"props":431,"children":433},{"className":432},[],[434],{"type":77,"value":435},"200",{"type":77,"value":437}," for event types you choose to ignore.",{"type":63,"tag":64,"props":439,"children":440},{},[441,443,448,450,455],{"type":77,"value":442},"If you ",{"type":63,"tag":68,"props":444,"children":445},{},[446],{"type":77,"value":447},"send",{"type":77,"value":449}," webhooks to your own customers, you need a policy for this. Webhook Relay ",{"type":63,"tag":419,"props":451,"children":452},{"href":20},[453],{"type":77,"value":454},"outbound webhooks",{"type":77,"value":456}," handle it as follows:",{"type":63,"tag":276,"props":458,"children":459},{},[460,479,500],{"type":63,"tag":280,"props":461,"children":462},{},[463,465,470,472,477],{"type":77,"value":464},"A ",{"type":63,"tag":72,"props":466,"children":468},{"className":467},[],[469],{"type":77,"value":11},{"type":77,"value":471}," response fails that delivery for good and ",{"type":63,"tag":68,"props":473,"children":474},{},[475],{"type":77,"value":476},"disables the endpoint",{"type":77,"value":478},". Other errors and timeouts are retried on a backoff schedule.",{"type":63,"tag":280,"props":480,"children":481},{},[482,484,490,492,498],{"type":77,"value":483},"After 5 failed attempts in a row, an endpoint is marked ",{"type":63,"tag":72,"props":485,"children":487},{"className":486},[],[488],{"type":77,"value":489},"failing",{"type":77,"value":491},". With ",{"type":63,"tag":72,"props":493,"children":495},{"className":494},[],[496],{"type":77,"value":497},"auto_disable",{"type":77,"value":499}," on, it's disabled after 100 failed attempts in a row spanning at least 12 hours.",{"type":63,"tag":280,"props":501,"children":502},{},[503],{"type":77,"value":504},"Resuming a disabled endpoint reactivates it. Messages skipped while it was disabled aren't sent automatically; you replay them once the endpoint is ready.",{"type":63,"tag":64,"props":506,"children":507},{},[508,510,515],{"type":77,"value":509},"See ",{"type":63,"tag":419,"props":511,"children":512},{"href":22},[513],{"type":77,"value":514},"retries and endpoint states",{"type":77,"value":516}," for the full table.",{"type":63,"tag":132,"props":518,"children":520},{"id":519},"when-to-return-410-from-your-own-api",[521],{"type":77,"value":522},"When to return 410 from your own API",{"type":63,"tag":64,"props":524,"children":525},{},[526,528,534,536,542],{"type":77,"value":527},"Return ",{"type":63,"tag":72,"props":529,"children":531},{"className":530},[],[532],{"type":77,"value":533},"410",{"type":77,"value":535}," 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 ",{"type":63,"tag":72,"props":537,"children":539},{"className":538},[],[540],{"type":77,"value":541},"404",{"type":77,"value":543},". If it moved, redirect.",{"type":63,"tag":545,"props":546,"children":547},"style",{},[548],{"type":77,"value":549},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":114,"depth":114,"links":551},[552,553,554,555,556],{"id":134,"depth":105,"text":137},{"id":271,"depth":105,"text":274},{"id":322,"depth":105,"text":325},{"id":374,"depth":105,"text":377},{"id":519,"depth":105,"text":522},"markdown","content:http-errors:410-gone.md","content","http-errors/410-gone.md","http-errors/410-gone","md",{"loc":4},1793199802037]