Keep resource URLs stable, and redirect the ones that move
Mantén estables las URLs de tus recursos y redirige las que se mueven
Treat every URL an agent might store as a promise: keep it working, answer with a permanent redirect when the resource moves, and say 410 Gone when it is retired.
Why
Agents keep URLs: in memory files, in llms.txt indexes, in task history, in links quoted back to users, and in the training data of models that will still run years from now. A reorganized docs tree or a renamed endpoint turns all of those into 404s, and a 404 does not tell the agent whether it mistyped, lacks access, or should look elsewhere. Tim Berners-Lee's W3C note "Cool URIs don't change" (1998) states the rule: a cool URI is one that does not change, a broken link costs the server owner the reader's confidence, and the webmaster's job is to allocate URIs that can be kept for 2, 20 or 200 years. HTTP has signals for when a change cannot be avoided. RFC 9110's 308 Permanent Redirect says the resource has a new permanent URI and future references ought to use it, and unlike 301 it keeps the request method, which matters for an agent sending a POST. 410 Gone says access is no longer available and the condition is likely permanent, with the stated purpose of getting remote links removed, so the agent can drop the link instead of retrying. AX-SYS-09 maps your resources; this principle keeps the addresses on that map valid over time.
Do
Build URLs around stable IDs, answer moved URLs with 308 and a Location, and retired ones with 410 and a pointer to what replaced them.
Don't
Rename paths in a redesign and let old links fall to 404, or redirect every dead URL to the homepage.
Artifact
GET /docs/refund-api HTTP/1.1
-> 308 Permanent Redirect
Location: /docs/refunds
POST /v1/refunds/legacy_export HTTP/1.1
-> 410 Gone
Content-Type: application/problem+json
{ "title": "Retired on 2026-07-01", "replacement": "/v1/exports?type=refunds" }
The agent updates its stored link after the 308 and stops retrying after the 410.
Citations
- [01]W3C: Cool URIs don't change (Tim Berners-Lee, 1998) ↗
A cool URI is one which does not change; when someone follows a link and it breaks, they generally lose confidence in the owner of the server; it is the duty of a Webmaster to allocate URIs which you will be able to stand by in 2 years, in 20 years, in 200 years
- [02]RFC 9110: HTTP Semantics (15.4.9, 308 Permanent Redirect) ↗
308 indicates that the target resource has been assigned a new permanent URI and any future references to this resource ought to use one of the enclosed URIs; 307 and 308 were added to unambiguously indicate method-preserving redirects, while 301 and 302 allow a POST to be redirected as GET
- [03]RFC 9110: HTTP Semantics (15.5.11, 410 Gone) ↗
410 indicates that access to the target resource is no longer available at the origin server and that this condition is likely to be permanent; it notifies the recipient that the resource is intentionally unavailable and that the server owners desire that remote links to it be removed