---
title: "Missing page returns HTTP 200 (soft 404) (seo/soft-404)"
description: "seo/soft-404: Unknown URLs that answer 200 get crawled and indexed as thin duplicates, and AI crawlers already waste about a third of fetches on 404s."
canonical: https://void-design.vercel.app/rules/seo/soft-404
lastModified: 2026-09-16
---

# Missing page returns HTTP 200 (soft 404)

`seo/soft-404` · severity **error** · category SEO · detected by `void seo` and `void audit`

## Why it matters

Unknown URLs that answer 200 get crawled and indexed as thin duplicates, and AI crawlers already waste about a third of fetches on 404s. In Next.js 16, notFound() inside a Suspense boundary streams a 200 with noindex.

## How to fix it

Return 404/410 for unknown URLs. In Next.js, resolve existence at the top of page.tsx or in generateMetadata (before any <Suspense>), or set dynamicParams = false for prerendered slugs.

## Example

```tsx
// app/blog/[slug]/page.tsx
export const dynamicParams = false // unknown slugs → real 404

export default async function Post({ params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params
  const post = await getPost(slug)
  if (!post) notFound() // before any <Suspense>, so the status is still 404
  return <Article post={post} />
}
```

## References

- https://developers.google.com/crawling/docs/troubleshooting/http-status-codes
- https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
- https://nextjs.org/docs/app/api-reference/functions/not-found

## More seo rules

`void seo` reports 60 rules in this category. What search engines need from the raw response: status codes, titles and descriptions in <head>, self-referencing canonicals, one h1, crawlable links, Open Graph, icons, robots.txt and a sitemap with real dates.

- `redirect-temporary` Temporary redirect (302/303/307) used — [seo/redirect-temporary](https://void-design.vercel.app/rules/seo/redirect-temporary)
- `client-redirect` Redirect done with meta refresh or JavaScript — [seo/client-redirect](https://void-design.vercel.app/rules/seo/client-redirect)
- `noindex` Indexable page carries noindex — [seo/noindex](https://void-design.vercel.app/rules/seo/noindex)
- `robots-snippet-restricted` nosnippet or a very low max-snippet limits previews — [seo/robots-snippet-restricted](https://void-design.vercel.app/rules/seo/robots-snippet-restricted)
- `html-too-large` Uncompressed HTML is over Googlebot's 2 MB fetch limit — [seo/html-too-large](https://void-design.vercel.app/rules/seo/html-too-large)
- `rsc-payload-ratio` Inline RSC flight payload dominates the HTML — [seo/rsc-payload-ratio](https://void-design.vercel.app/rules/seo/rsc-payload-ratio)
- `not-https` Page served over plain HTTP — [seo/not-https](https://void-design.vercel.app/rules/seo/not-https)
- `origin-redirects` http:// or www/apex variant doesn't redirect to the canonical origin in one hop — [seo/origin-redirects](https://void-design.vercel.app/rules/seo/origin-redirects)

Detected by `void seo` and `void audit`. Explain it in a terminal: `void rules seo/soft-404`
