Soft 404 & Indexability Auditor avatar

Soft 404 & Indexability Auditor

Pricing

Pay per usage

Go to Apify Store
Soft 404 & Indexability Auditor

Soft 404 & Indexability Auditor

Finds pages that answer HTTP 200 while showing 'not found', probes every route family with impossible URLs, and audits sitemap URLs for errors, redirects, noindex and canonical mismatches — with cache-header evidence for Next.js, Vercel, Netlify and Cloudflare.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Ricardo Faya

Ricardo Faya

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Find the pages that answer HTTP 200 while showing "page not found" — and the route families where any invented URL becomes an indexable page.

Why this exists

On a production Next.js site we found that every dynamic route answered 200 on its not-found page. The ISR cache had stored the notFound() render and served it as a valid page (x-nextjs-prerender: 1). Uptime monitors were green, nothing logged an error, and search engines could index an unlimited number of empty pages. Adding a root not-found.tsx did not fix it.

Classic crawlers only check the URLs that exist. The defect lives in the URLs that don't.

What it does

  1. Discovers your sitemaps from robots.txt (or takes a sitemap/page URL), follows sitemap indexes.
  2. Audits every URL and flags:
    • soft-404 — HTTP 200 whose title or H1 says "not found" (EN, PT, ES, FR, DE built in; add your own phrases);
    • possible-soft-404 — thin 200 page containing a not-found phrase;
    • error-status — 4xx/5xx listed in the sitemap;
    • redirect — sitemap URL that redirects (with the full chain);
    • noindex — sitemap URL that is noindex (meta or X-Robots-Tag);
    • canonical-elsewhere — canonical pointing to another URL;
    • missing-title.
  3. Probes each route family (/blog/, /pt-BR/course/, /products/…) with a URL that cannot exist. A SOFT-404 ROUTE verdict comes with the cache headers as evidencex-nextjs-prerender, x-nextjs-cache, x-vercel-cache, cf-cache-status, netlify-cdn-cache-control, age — and a plain-English explanation.

Output

Dataset rows of two types:

{
"type": "route-probe",
"url": "https://example.com/pt-BR/curso/soft404-probe-x7k2m9qa",
"routePrefix": "/pt-BR/curso/",
"statusCode": 200,
"verdict": "SOFT-404 ROUTE",
"title": "Página não encontrada | Example",
"evidenceHeaders": { "x-nextjs-prerender": "1", "cache-control": "public, max-age=0, must-revalidate" },
"explanation": "A URL that cannot exist answered HTTP 200. Any mistyped, deleted or invented URL under /pt-BR/curso/ can be crawled and indexed as a real page. Next.js cache headers are present: ..."
}
{
"type": "page",
"url": "https://example.com/old-offer",
"statusCode": 200,
"worstSeverity": "critical",
"issues": [{ "code": "soft-404", "severity": "critical", "detail": "HTTP 200 but the page says \"page not found\"." }]
}

The key-value store OUTPUT has totals per issue code and per site.

Good to know

  • Audit your own sites or sites you are authorized to test. Keep concurrency low on small servers.
  • Compressed .xml.gz sitemaps are skipped with a warning — pass the uncompressed URL.
  • Pages rendered only in the browser (client-side "not found") are judged by the HTML the server returns, which is what crawlers see first.