---
title: "AR-READ-02: Real HTTP status codes | Agent Ready Checklist"
description: "AR-READ-02 (MUST, Read layer): Real HTTP status codes. What it asks, the evidence, the command that verifies it and the fix on 19 platforms."
canonical: https://agentreadychecklist.com/checklist/ar-read-02
site: "Agent Ready Checklist"
last_updated: 2026-11-05
section: "Checklist"
---

# AR-READ-02: Real HTTP status codes | Agent Ready Checklist

> AR-READ-02 (MUST, Read layer): Real HTTP status codes. What it asks, the evidence, the command that verifies it and the fix on 19 platforms.

Source: https://agentreadychecklist.com/checklist/ar-read-02
Site: Agent Ready Checklist
Last reviewed: 2026-11-05
Agent endpoints: https://agentreadychecklist.com/llms.txt (index), https://agentreadychecklist.com/openapi.json (API), https://agentreadychecklist.com/mcp (MCP server), https://agentreadychecklist.com/ask (search)
Access: https://agentreadychecklist.com/auth.md (no key). Pricing: https://agentreadychecklist.com/pricing.md (free).

# AR-READ-02: Real HTTP status codes

AR-READ-02 is a MUST on the read layer: Return accurate HTTP status codes: 404 or a real redirect for missing paths, 429 with Retry-After when throttling; never 200 for a missing page and never a silent challenge page in place of 429. It applies to every site. 19 of 19 platforms have a recipe below, 2 of them workarounds.

## The requirement

Identifier

AR-READ-02

Level

MUST

Layer

Read

Applies to

every site

Checked by

Ora, matched on this site, is-agentic.com agent-friendly-404, Verify Kit status-codes

Ora check

[redirect-hygiene](#ora)

The statement

Return accurate HTTP status codes: 404 or a real redirect for missing paths, 429 with Retry-After when throttling; never 200 for a missing page and never a silent challenge page in place of 429.

## Why

-   The spec cites an observed single-page app that returned 200 for every path, so dead URLs looked valid to agents.primary source: [github.com/agentready-org/standard/blob/main/spec/spec.md](https://github.com/agentready-org/standard/blob/main/spec/spec.md), read 2026-11-04
-   RFC 6585 defines 429 Too Many Requests and allows a Retry-After header telling the client how long to wait.primary source, 2012-04-01: [rfc-editor.org/rfc/rfc6585](https://www.rfc-editor.org/rfc/rfc6585), read 2026-11-04
-   is-agentic reports an agent-friendly-404 check in its essential tier; the example report for vercel.com showed it failed.primary source, 2026-08-28: [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents), read 2026-11-04

## How to verify

### [Real status codes](https://agentreadychecklist.com/kit/status-codes/)

```bash
curl -fsSL https://agentreadychecklist.com/kit/verify.sh | bash -s -- https://example.com --only=status-codes
```

Requests a random missing path and expects 404 or 410; optionally requests a gated path and expects 401 or 403, not 200 with a login form.

**It cannot prove:** Cannot trigger rate limiting safely, so the 429 with Retry-After half of AR-READ-02 is not tested.

### The one-line version

curl -s -o /dev/null -w "%{http\_code}" <origin>/this-path-does-not-exist-$RANDOM must print 404 or 410.

## Verify with Ora

One check in Ora's catalogue (contract 1.38.0, read 2026-11-05) read this row. Each entry says what the check looks at and why this page lists it.

-   `redirect-hygiene` Redirect hygiene Tests that the pages agents land on serve real content, not meta-refresh or JavaScript-only redirect stubs. Access, 1 point, recommended; catalogue applicability domain-only. Listed because: same name, `redirect`.

### Run just these checks

```bash
curl -s -X POST https://ora.ai/api/scan/checks -H 'content-type: application/json' -d '{"url":"https://example.com","checkIds":["redirect-hygiene"]}'
```

This calls the endpoint Ora documents for re-verifying a fix. It sends no cache, returns a result for each id and no total score, and spends one scan from the daily budget. Replace the URL with yours. [How to re-verify one fix](https://agentreadychecklist.com/guides/re-verify-one-fix-with-ora/).

### Or audit the whole site

```bash
npx ax@0.10 audit https://example.com --min-score 70
```

### Related checks

This check reads something near the row but asks for more than the row does. A site that meets the row can score nothing or lose points on it, so it is not counted as a test of the row and is left out of the command above.

-   `agent-friendly-404` Agent-friendly 404s A real 404 or 410 status earns partial credit; full credit also needs a Markdown error body that says what happened and where to go next. The row asks for the real status, not the body, so a site that meets the row stops short of full points here. Usability, 2 points, recommended; catalogue applicability domain-only.

Exit code 1 means the score is below the number you passed, so the same line gates a deploy: [the CI recipe](https://agentreadychecklist.com/guides/gate-deploys-on-agent-readiness-in-ci/). [Why this site recommends Ora, and where it falls short](https://agentreadychecklist.com/verify-with-ora/).

## In the crawl

This row has one crawl rate. Each panel splits the 2026-11-04 crawl into ten bands of 1,000 ranks, on a 0 to 100 percent scale.

A missing path returns 404 or 410

66.5% overall

Reachable sites in the Tranco top 10,000 on which the check ran, 2026-11-04. Left is ranks 1 to 1,000.

Numbers behind the chart

| Rate | 1 to 1,000 | 1,001 to 2,000 | 2,001 to 3,000 | 3,001 to 4,000 | 4,001 to 5,000 | 5,001 to 6,000 | 6,001 to 7,000 | 7,001 to 8,000 | 8,001 to 9,000 | 9,001 to 10,000 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| A missing path returns 404 or 410 | 68% | 65% | 67% | 71% | 67% | 66% | 64% | 69% | 67% | 63% |

## Fix it on your platform

### Next.js (App Router)recipe

Call notFound() from next/navigation when a record is missing; Next.js renders not-found.js with a 404. For throttling, return new Response("Too Many Requests", { status: 429, headers: { "Retry-After": "60" } }) from proxy.ts or a Route Handler.

Next.js 16.x (npm latest 16.4.5, read 2026-11-04); docs at nextjs.org/docs/app. Read 2026-11-04. [nextjs.org/docs/app/api-reference/functions/not-found](https://nextjs.org/docs/app/api-reference/functions/not-found). [All Next.js (App Router) recipes](https://agentreadychecklist.com/platforms/nextjs-app-router/#ar-read-02)

### Astrorecipe

Create src/pages/404.astro (builds to 404.html). In endpoints and on-demand pages return new Response(null, { status: 404 }). For throttling in middleware return new Response("Too Many Requests", { status: 429, headers: { "Retry-After": "60" } }).

Astro 7.x (npm latest astro 7.4.5, @astrojs/sitemap 3.7.4, read 2026-11-04). Read 2026-11-04. [docs.astro.build/en/basics/astro-pages/](https://docs.astro.build/en/basics/astro-pages/). [All Astro recipes](https://agentreadychecklist.com/platforms/astro/#ar-read-02)

### Nuxtrecipe

In pages throw createError({ statusCode: 404, statusMessage: "Not Found" }) when data is missing. In server/middleware return 429 with setResponseHeader(event, "Retry-After", "60") when throttling.

Nuxt 4.x (npm latest nuxt 4.6.4, @nuxtjs/robots 7.0.2, @nuxtjs/sitemap 9.1.0, read 2026-11-04). Read 2026-11-04. [nuxt.com/docs/api/utils/create-error](https://nuxt.com/docs/api/utils/create-error). [All Nuxt recipes](https://agentreadychecklist.com/platforms/nuxt/#ar-read-02)

### SvelteKitrecipe

In load call error(404, "Not found") when data is missing. In handle return new Response("Too Many Requests", { status: 429, headers: { "Retry-After": "60" } }) when throttling. With adapter-static, set fallback only for SPAs; a fallback page answers missing paths with 200 on many hosts.

SvelteKit (npm latest @sveltejs/kit 3.1.1, read 2026-11-04); docs at svelte.dev/docs/kit. Read 2026-11-04. [svelte.dev/docs/kit/errors](https://svelte.dev/docs/kit/errors). [All SvelteKit recipes](https://agentreadychecklist.com/platforms/sveltekit/#ar-read-02)

### Remix and React Router (framework mode)recipe

In a loader throw data("Not Found", { status: 404 }) when the record is missing; add a catch-all route that throws the same so unknown paths return 404. Return 429 with a Retry-After header from middleware when throttling.

React Router framework mode (npm latest react-router 8.5.1; Remix v2 @remix-run/node 2.17.5, read 2026-11-04); docs at reactrouter.com. Read 2026-11-04. [reactrouter.com/how-to/status](https://reactrouter.com/how-to/status). [All Remix and React Router (framework mode) recipes](https://agentreadychecklist.com/platforms/remix-react-router/#ar-read-02)

### Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront)recipe

Ship a top-level 404.html. Netlify, Cloudflare Pages and GitHub Pages serve it with status 404. On Cloudflare Pages a missing 404.html switches on SPA mode (index.html with 200 for every path). On CloudFront set a custom error response with response code 404, not 200. Remove any "/\* /index.html 200" rule from \_redirects.

Host documentation as published on 2026-11-04 (no version numbers; config files \_headers, \_redirects, vercel.json, 404.html). Read 2026-11-04. [developers.cloudflare.com/pages/configuration/serving-pages/](https://developers.cloudflare.com/pages/configuration/serving-pages/). [All Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront) recipes](https://agentreadychecklist.com/platforms/static-hosting/#ar-read-02)

### WordPress and Elementorrecipe

Keep a 404.php template; core sends 404 for unknown URLs. Redirect moved pages with 301. When a rate-limit plugin throttles, make it send `status_header(429); header('Retry-After: 120');` instead of a 200 challenge page.

WordPress 7.1.4 (core release from the version-check API), Elementor 4.3.6 (plugin directory, updated 2026-11-02), Yoast SEO 28.8 noted for llms.txt; docs read 2026-11-04. Read 2026-11-04. [developer.wordpress.org/reference/functions/status\_header/](https://developer.wordpress.org/reference/functions/status_header/). [All WordPress and Elementor recipes](https://agentreadychecklist.com/platforms/wordpress-elementor/#ar-read-02)

### Shopify (Online Store 2.0 themes)recipe

Keep templates/404.json or 404.liquid; Shopify returns 404 for unknown handles. Add 301s under Online Store > Navigation > URL Redirects for retired products. Throttling is platform-controlled.

Hosted SaaS, Online Store 2.0 Liquid themes, docs read 2026-11-04; storefront behaviour probed live on one Shopify store the same day. Read 2026-11-04. [shopify.dev/docs/storefronts/themes/architecture/templates/404](https://shopify.dev/docs/storefronts/themes/architecture/templates/404). [All Shopify (Online Store 2.0 themes) recipes](https://agentreadychecklist.com/platforms/shopify/#ar-read-02)

### Webflowrecipe

Design the 404 Utility page and add 301s in Site settings > Publishing > 301 redirects whenever a slug changes (tick 'Permanently redirect the old URL' in Page settings).

Hosted SaaS, help center articles read 2026-11-04 (updated dates 2024-10-14 to 2026-10-29). Read 2026-11-04. [help.webflow.com/hc/en-us/articles/33961393564435-404-error-page](https://help.webflow.com/hc/en-us/articles/33961393564435-404-error-page). [All Webflow recipes](https://agentreadychecklist.com/platforms/webflow/#ar-read-02)

### Framerrecipe

Add a 404 page (Pages panel > + > New 404 Page) and add 301s in Site Settings > Hosting > Redirects, using wildcards and :1 captures for folders.

Hosted SaaS, help articles read 2026-11-04 (marked updated 2026-09-15). Read 2026-11-04. [framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/](https://www.framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/). [All Framer recipes](https://agentreadychecklist.com/platforms/framer/#ar-read-02)

### Wix (Wix Editor and Wix Studio)recipe

Use the URL Redirect Manager for every renamed page (custom domain required). Probe a missing path with curl and expect 404, not 200.

Hosted SaaS, help center read 2026-11-04. Read 2026-11-04. [support.wix.com/en/article/setting-up-a-301-redirect-for-a-page-on-your-site](https://support.wix.com/en/article/setting-up-a-301-redirect-for-a-page-on-your-site). [All Wix (Wix Editor and Wix Studio) recipes](https://agentreadychecklist.com/platforms/wix/#ar-read-02)

### Squarespace (version 7.1)recipe

Keep the 404 System Page (custom page in Not linked) and add 301s in URL Mappings, for example `/old-pricing -> /pricing 301`.

Hosted SaaS, version 7.1 sites, help center read 2026-11-04 (articles updated 2026-07-17 to 2026-11-03). Read 2026-11-04. [support.squarespace.com/hc/en-us/articles/205815308-URL-mappings](https://support.squarespace.com/hc/en-us/articles/205815308-URL-mappings). [All Squarespace (version 7.1) recipes](https://agentreadychecklist.com/platforms/squarespace/#ar-read-02)

### HubSpot CMS (Content Hub)recipe

Build the 404 system template (Settings > Content > Pages > System Pages) and add 301s in URL Redirects for retired pages. Serverless functions over their limits return 429 on their own.

Hosted SaaS, Content Hub, knowledge base and developer docs read 2026-11-04. Read 2026-11-04. [knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages](https://knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages). [All HubSpot CMS (Content Hub) recipes](https://agentreadychecklist.com/platforms/hubspot-cms/#ar-read-02)

### Docusaurusworkaround

The build writes build/404.html. Use a host that serves it with status 404 (Netlify, Vercel, Cloudflare Pages, GitHub Pages do). 429 with Retry-After is set at the host or CDN, not in Docusaurus.

3.10.2 (npm @docusaurus/core latest, read 2026-11-04). Read 2026-11-04. [docusaurus.io/docs/deployment](https://docusaurus.io/docs/deployment). [All Docusaurus recipes](https://agentreadychecklist.com/platforms/docusaurus/#ar-read-02)

### Mintlifyrecipe

Missing paths return 404; missing .md paths return 404 with a Markdown recovery body. Set redirects for moved pages in docs.json so old URLs do not 404.

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [mintlify.com/docs/ai/markdown-export](https://mintlify.com/docs/ai/markdown-export). [All Mintlify recipes](https://agentreadychecklist.com/platforms/mintlify/#ar-read-02)

### GitBookrecipe

Missing paths return 404. Add site redirects for old URLs after a migration; note automatic moves use 307, not 301.

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [gitbook.com/docs/publish/site-redirects](https://gitbook.com/docs/publish/site-redirects). [All GitBook recipes](https://agentreadychecklist.com/platforms/gitbook/#ar-read-02)

### ReadMerecipe

Keep the default 404 (real 404 status) or pick a custom 404 page in Settings > Errors & Redirects; add regex redirects such as /old(/\\S\*)? -> /new$1 for moved pages.

Hosted SaaS, docs read 2026-11-04. Read 2026-11-04. [docs.readme.com/main/docs/error-pages](https://docs.readme.com/main/docs/error-pages). [All ReadMe recipes](https://agentreadychecklist.com/platforms/readme/#ar-read-02)

### Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront)workaround

Set a real 404 status in the not-found route of the PWA Kit Express app (res.status(404)) and test it with curl; for SFRA check the error page pipeline. 429 handling sits in eCDN rate limiting.

Hosted SaaS (B2C Commerce help release 264.0.0); PWA Kit retail-react-app 10.3.0 and pwa-kit-runtime 3.21.0 on npm, read 2026-11-04. Read 2026-11-04. [developer.salesforce.com/docs/commerce/b2c-commerce/guide/pwa-kit-overview.html](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/pwa-kit-overview.html). [All Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront) recipes](https://agentreadychecklist.com/platforms/salesforce-commerce-cloud/#ar-read-02)

### Adobe Commerce and Magento Open Sourcerecipe

Unknown routes go to the CMS No Route Page with a 404 status; keep that page as a CMS page and do not redirect it to the homepage. Add 301 URL rewrites for retired products.

2.4.9 (GitHub tag published 2026-05-12; 2.4.10-alpha1 tagged 2026-10-13); release notes read 2026-11-04. Read 2026-11-04. [experienceleague.adobe.com/en/docs/commerce-admin/marketing/seo/url-rewrites/url-rewrite](https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/seo/url-rewrites/url-rewrite). [All Adobe Commerce and Magento Open Source recipes](https://agentreadychecklist.com/platforms/adobe-commerce/#ar-read-02)

## What it does not do

-   A correct 404 does not tell the agent where the content moved; add a redirect for that.
-   Does not cover 401 or 403 on gated pages, which are correct when access is really gated.

## Common mistakes

-   SPA hosts rewriting every path to index.html with 200.
-   A login page returned as 200 for a gated URL.
-   Rate limiter answering with a CAPTCHA page.

## Related

-   Guide: [The one-day agent-readiness sprint](https://agentreadychecklist.com/guides/one-day-agent-readiness-sprint/)
-   Guide: [How to read your server logs for agent user agents](https://agentreadychecklist.com/guides/read-server-logs-for-agent-user-agents/)
-   Guide: [How to keep a site agent ready in CI](https://agentreadychecklist.com/guides/keep-a-site-agent-ready-in-ci/)
-   Term: [MUST](https://agentreadychecklist.com/glossary/must/)
-   Term: [Retry-After](https://agentreadychecklist.com/glossary/retry-after/)

## Sources

-   [github.com/agentready-org/standard/blob/main/spec/spec.md](https://github.com/agentready-org/standard/blob/main/spec/spec.md)read 2026-11-04
-   [rfc-editor.org/rfc/rfc6585](https://www.rfc-editor.org/rfc/rfc6585)read 2026-11-04
-   [vercel.com/kb/guide/make-your-site-readable-by-ai-agents](https://vercel.com/kb/guide/make-your-site-readable-by-ai-agents)read 2026-11-04
-   [nextjs.org/docs/app/api-reference/functions/not-found](https://nextjs.org/docs/app/api-reference/functions/not-found)read 2026-11-04
-   [docs.astro.build/en/basics/astro-pages/](https://docs.astro.build/en/basics/astro-pages/)read 2026-11-04
-   [nuxt.com/docs/api/utils/create-error](https://nuxt.com/docs/api/utils/create-error)read 2026-11-04
-   [svelte.dev/docs/kit/errors](https://svelte.dev/docs/kit/errors)read 2026-11-04
-   [reactrouter.com/how-to/status](https://reactrouter.com/how-to/status)read 2026-11-04
-   [developers.cloudflare.com/pages/configuration/serving-pages/](https://developers.cloudflare.com/pages/configuration/serving-pages/)read 2026-11-04
-   [developer.wordpress.org/reference/functions/status\_header/](https://developer.wordpress.org/reference/functions/status_header/)read 2026-11-04
-   [shopify.dev/docs/storefronts/themes/architecture/templates/404](https://shopify.dev/docs/storefronts/themes/architecture/templates/404)read 2026-11-04
-   [help.webflow.com/hc/en-us/articles/33961393564435-404-error-page](https://help.webflow.com/hc/en-us/articles/33961393564435-404-error-page)read 2026-11-04
-   [framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/](https://www.framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/)read 2026-11-04
-   [support.wix.com/en/article/setting-up-a-301-redirect-for-a-page-on-your-site](https://support.wix.com/en/article/setting-up-a-301-redirect-for-a-page-on-your-site)read 2026-11-04
-   [support.squarespace.com/hc/en-us/articles/205815308-URL-mappings](https://support.squarespace.com/hc/en-us/articles/205815308-URL-mappings)read 2026-11-04
-   [knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages](https://knowledge.hubspot.com/design-manager/use-system-templates-to-customize-error-subscription-and-password-prompt-pages)read 2026-11-04
-   [docusaurus.io/docs/deployment](https://docusaurus.io/docs/deployment)read 2026-11-04
-   [mintlify.com/docs/ai/markdown-export](https://mintlify.com/docs/ai/markdown-export)read 2026-11-04
-   [gitbook.com/docs/publish/site-redirects](https://gitbook.com/docs/publish/site-redirects)read 2026-11-04
-   [docs.readme.com/main/docs/error-pages](https://docs.readme.com/main/docs/error-pages)read 2026-11-04
-   [developer.salesforce.com/docs/commerce/b2c-commerce/guide/pwa-kit-overview.html](https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/pwa-kit-overview.html)read 2026-11-04
-   [experienceleague.adobe.com/en/docs/commerce-admin/marketing/seo/url-rewrites/url-rewrite](https://experienceleague.adobe.com/en/docs/commerce-admin/marketing/seo/url-rewrites/url-rewrite)read 2026-11-04
-   [ora.ai/api/checks, contract 1.38.0](https://ora.ai/api/checks?utm_source=agentreadychecklist.com&utm_medium=referral&utm_campaign=requirement)read 2026-11-05
-   [ora.ai/llms-full.txt](https://ora.ai/llms-full.txt?utm_source=agentreadychecklist.com&utm_medium=referral&utm_campaign=requirement)read 2026-11-05
-   [registry.npmjs.org/ax, the ax README](https://registry.npmjs.org/ax)read 2026-11-05

Verify with Ora

The scanner this site recommends for the whole checklist. 132 checks, a score out of 100, no account.

`npx ax@0.10 audit <url> --min-score <n>`

[Why Ora, and its limits](https://agentreadychecklist.com/verify-with-ora/)

Fix it on

-   [Next.js (App Router)recipe](#p-nextjs-app-router)
-   [Astrorecipe](#p-astro)
-   [Nuxtrecipe](#p-nuxt)
-   [SvelteKitrecipe](#p-sveltekit)
-   [Remix and React Router (framework mode)recipe](#p-remix-react-router)
-   [Plain static hosting (Netlify, Vercel static, Cloudflare Pages, GitHub Pages, S3 and CloudFront)recipe](#p-static-hosting)
-   [WordPress and Elementorrecipe](#p-wordpress-elementor)
-   [Shopify (Online Store 2.0 themes)recipe](#p-shopify)
-   [Webflowrecipe](#p-webflow)
-   [Framerrecipe](#p-framer)
-   [Wix (Wix Editor and Wix Studio)recipe](#p-wix)
-   [Squarespace (version 7.1)recipe](#p-squarespace)
-   [HubSpot CMS (Content Hub)recipe](#p-hubspot-cms)
-   [Docusaurusworkaround](#p-docusaurus)
-   [Mintlifyrecipe](#p-mintlify)
-   [GitBookrecipe](#p-gitbook)
-   [ReadMerecipe](#p-readme)
-   [Salesforce B2C Commerce (SFRA and PWA Kit / Composable Storefront)workaround](#p-salesforce-commerce-cloud)
-   [Adobe Commerce and Magento Open Sourcerecipe](#p-adobe-commerce)

Last reviewed 2026-11-05. AgentReady v2.0, read 2026-11-04.
