Agent Ready HTML

How to return real status codes on a single-page app

In short

A client-routed app usually answers 200 for every path and shows an error in the browser. Agents read the status first, so a missing page must return 404 from the server. List the real routes, let everything else fall through to a 404 file, and return 429 with Retry-After when throttling.

Single-page apps are built to answer every path with the same shell. That is the cause of soft 404s, and the fix lives in the host configuration, not in the application code.

What the evidence says

  • Return 404 for a missing path or a valid redirect to a replacement, never 200 with suggestions in the body. [primary source] source, read 4 November 2026.
  • When throttling, return 429 Too Many Requests with Retry-After instead of a silent challenge page. [primary source] source, read 4 November 2026.
  • Google suggests a JavaScript redirect to a URL where the server answers 404, or a noindex tag, to avoid soft 404s in single-page apps. [primary source] source, read 4 November 2026.
  • In Next.js, notFound() renders the 404 page and must be called in the render path; a call in an un-awaited promise renders no not-found UI. [primary source] source, read 4 November 2026.
  • In the crawl, 8,743 home pages that answered 200 were also asked for a made-up path, and 1,475 of them (16.9 percent) returned 200 (edition 2026-11-04). [primary source] source, read 4 November 2026.
  • is-agentic.com flagged an agent-friendly 404 issue on vercel.com in the sample report shown in the guide. [primary source] source, read 4 November 2026.

Steps

  1. Request a made-up path and read the status. If it is 200, the host is rewriting every path to the app shell.
  2. Replace the catch-all rewrite with explicit rewrites for the routes the app really has, or prerender each route to its own file.
  3. Ship a 404 file and let the host serve it with status 404 for anything unmatched.
  4. For routes decided by data (a product that no longer exists), have the server return 404 at render time; in Next.js that is notFound(), called in the render path rather than inside an un-awaited promise.
  5. If you cannot change the server, follow Google's fallback: redirect with JavaScript to a URL where the server answers 404, or add a noindex tag to the error view.
  6. When throttling agents, answer 429 with a Retry-After header instead of a challenge page that returns 200.

Test the status of a missing path

curl -s -o /dev/null -w '%{http_code}\n' https://example.com/agent-ready-html-missing-path-check
# 404 is correct, 200 is a soft 404

Check the result

The viewer flag "Status of a made-up path" turns found when the server returns 404 or 410. Open the viewer to run it on your own URL.

Related: all guides, initial HTML, llms.txt.

Sources

  1. Vercel and Ora: Make your site readable by AI agents https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents, read 4 November 2026
  2. Google: JavaScript SEO basics https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics, read 4 November 2026
  3. Next.js: notFound https://nextjs.org/docs/app/api-reference/functions/not-found, read 4 November 2026
  4. The crawl dataset (this site) https://agentreadyhtml.com/data/, read 4 November 2026

Last reviewed 4 November 2026