---
title: "Sitemap isn't valid sitemap XML or exceeds protocol limits (seo/sitemap-invalid)"
description: "seo/sitemap-invalid: Malformed XML, HTML served at /sitemap.xml, or files over 50,000 URLs / 50 MB are rejected."
canonical: https://void-design.vercel.app/rules/seo/sitemap-invalid
lastModified: 2026-09-16
---

# Sitemap isn't valid sitemap XML or exceeds protocol limits

`seo/sitemap-invalid` · severity **error** · category SEO · detected by `void seo` and `void audit`

## Why it matters

Malformed XML, HTML served at /sitemap.xml, or files over 50,000 URLs / 50 MB are rejected.

## How to fix it

Generate sitemaps with app/sitemap.ts; split large sites with generateSitemaps and add a sitemap index route.

## Example

```ts
// app/sitemap-index.xml/route.ts — Next doesn't emit an index for generateSitemaps
export const dynamic = 'force-static'
export async function GET() {
  const ids = await generateSitemaps()
  const locs = ['https://acme.example/sitemap.xml', ...ids.map(({ id }) => 'https://acme.example/products/sitemap/' + id + '.xml')]
  const xml = '<?xml version="1.0" encoding="UTF-8"?>\n<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n' +
    locs.map((loc) => '  <sitemap><loc>' + loc + '</loc></sitemap>').join('\n') + '\n</sitemapindex>\n'
  return new Response(xml, { headers: { 'Content-Type': 'application/xml; charset=utf-8' } })
}
```

## References

- https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps
- https://www.sitemaps.org/protocol.html

## 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.

- `robots-blocks-all` robots.txt disallows the site for * / Googlebot / Bingbot — [seo/robots-blocks-all](https://void-design.vercel.app/rules/seo/robots-blocks-all)
- `robots-blocks-resources` robots.txt blocks JS/CSS needed to render — [seo/robots-blocks-resources](https://void-design.vercel.app/rules/seo/robots-blocks-resources)
- `robots-sitemap-directive` robots.txt has no absolute Sitemap: line — [seo/robots-sitemap-directive](https://void-design.vercel.app/rules/seo/robots-sitemap-directive)
- `sitemap-missing` No reachable sitemap — [seo/sitemap-missing](https://void-design.vercel.app/rules/seo/sitemap-missing)
- `sitemap-url-invalid` Sitemap <loc> is relative or on another host — [seo/sitemap-url-invalid](https://void-design.vercel.app/rules/seo/sitemap-url-invalid)
- `sitemap-lastmod` <lastmod> invalid, in the future, or identical across entries — [seo/sitemap-lastmod](https://void-design.vercel.app/rules/seo/sitemap-lastmod)
- `sitemap-url-status` Sitemap lists URLs that don't return 200 directly — [seo/sitemap-url-status](https://void-design.vercel.app/rules/seo/sitemap-url-status)
- `sitemap-url-not-indexable` Sitemap lists noindex, robots-blocked or non-canonical URLs — [seo/sitemap-url-not-indexable](https://void-design.vercel.app/rules/seo/sitemap-url-not-indexable)

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