# Site check and "Verified"

SuperDuperSEO fetches your live site the way a search engine does: no JavaScript, first response only. It compares what it gets with what was published. It runs every hour, and on demand with the MCP tool `check_site` (run it after every deploy).

A site is **Verified** when:
- its pages match what was published;
- the site-level checks pass;
- Search Console is connected (`connect_search_console`).

Only verified sites get IndexNow pings, and a site moves onto SuperDuperSEO as its CMS only once it is verified.

| Issue | What it means | Fix |
|---|---|---|
| `http_error` | The page does not load | Serve every post at its exact path (post.path) with status 200. |
| `redirected` | The page redirects elsewhere | Serve the post at post.path itself; only our redirects (redirects.json) should redirect. |
| `noindex` | The page tells search engines not to index it | Remove noindex from the page's robots meta tag or X-Robots-Tag header. |
| `canonical_mismatch` | Wrong canonical URL | Use post.seo.canonical (or post.head_html) for <link rel="canonical">. |
| `title_mismatch` | Wrong or missing <title> | Use post.seo.title as the page title (a " - Site name" suffix is fine). |
| `description_mismatch` | Wrong or missing meta description | Use post.seo.description (or post.head_html). |
| `missing_article_schema` | No article structured data | Add post.json_ld in a <script type="application/ld+json"> (or inject post.head_html). |
| `duplicate_article_schema` | Two article schemas on the page | Remove your own Article/BlogPosting JSON-LD on blog pages: ours is the one. |
| `wrong_author` | Article schema names another author | Use post.json_ld as is; it names the site's author. |
| `h1_count` | Not exactly one <h1> | Render the post title as the only <h1>; post.html never contains one. |
| `missing_lang` | No language on the page | Set <html lang="..."> (site.language). |
| `client_rendered` | The article is loaded in the browser | Render post.html on the server: search engines read the first HTML. See the Cloudflare or Next.js starter. |
| `robots_blocks_blog` | robots.txt blocks the blog | Allow crawling of the blog path in robots.txt. |
| `robots_no_sitemap` | robots.txt does not name the sitemap | Add "Sitemap: https://your-site/sitemap.xml" to robots.txt. |
| `sitemap_unreachable` | No sitemap at /sitemap.xml | Serve cms.sitemapXml() at /sitemap.xml (or merge it into yours). |
| `indexnow_key_unreachable` | IndexNow key file missing | Serve the key from cms.indexNowKey() at /{key}.txt. |
| `soft_404` | Unknown blog URLs answer 200 | Return a real 404 when cms.resolve(path) is null. |
| `search_console_missing` | Search Console not connected | Verify the site in Search Console (Domains, your site, Search Console) so we can watch its rankings. |
| `not_fetching` | Your site is not reading from SuperDuperSEO yet | Set SUPERDUPERSEO_CONTENT_KEY in your site's server environment and deploy. |
