When I did Edgeio, we did what you describe. While we had human readable slugs, there was an item id at the start of every url, and if you stripped off or changed the rest, you just got the same page but with a &lt;link ...&gt; back to the canonical version.<p>We also built the entire thing basically as an API that just happened to by default pass through a processing step to render HTML. If you gave the right argument, you&#x27;d get the page back as our own XML markup [1], RSS or ATOM instead. We didn&#x27;t go full HATEOAS [1] (didn&#x27;t exist yet), but we there was a decent amount of descriptive links etc. pointing the way in the XML&#x2F;RSS&#x2F;ATOM versions.<p>[1] That was actually what the web app generated; it was converted server side using XSL, but if you &quot;flipped the right switch&quot; it&#x27;d serve up the XML with an XSL stylesheet and it mostly worked fine that way in most browsers, though we never invested the resources in making it flawless (but it was a great debugging tool to get the raw XML served up straight to the browser... everyone came out hating XSL though, for good reasons)<p>[2] <a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;HATEOAS" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;HATEOAS</a>