Soft 404 & Indexability Auditor
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
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
- Discovers your sitemaps from
robots.txt(or takes a sitemap/page URL), follows sitemap indexes. - 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 orX-Robots-Tag);canonical-elsewhere— canonical pointing to another URL;missing-title.
- Probes each route family (
/blog/,/pt-BR/course/,/products/…) with a URL that cannot exist. ASOFT-404 ROUTEverdict comes with the cache headers as evidence —x-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.gzsitemaps 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.