XML sitemap validator
Check a sitemap or sitemap index against the sitemaps.org protocol, and confirm robots.txt declares it.
Give a bare domain and the tool tries /sitemap.xml, /sitemap_index.xml and /sitemap-index.xml in that order. Free, no sign-up, full result shown.
What this checks
The validator fetches your sitemap, parses it, and reports every rule it breaks. It also reads your /robots.txt to check whether the sitemap is declared there. Findings are reported as errors and warnings with the offending value quoted — there is no score, because the rules below are pass or fail and averaging them into a number would hide which one you actually broke.
An error means a crawler will reject or ignore something. A warning means it will work but you are leaving a signal on the table.
The rules, in full
| Rule | Source | Detail |
|---|---|---|
| Root element is <urlset> or <sitemapindex> | sitemaps.org 0.9 | Anything else is not a sitemap. An HTML page returned with a 200 status is the usual cause. |
| Root carries the sitemaps.org 0.9 namespace | sitemaps.org 0.9 | Without xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" a strict parser rejects the file. |
| At most 50,000 URLs per sitemap file | sitemaps.org 0.9 | Past that, split into child sitemaps and list them in a sitemap index. |
| At most 50 MB uncompressed per file | sitemaps.org 0.9 | Measured on the response body as fetched. |
| At most 50,000 sitemaps per index | sitemaps.org 0.9 | Indexes may not nest — an index may not list another index. |
| Every <loc> is a fully-qualified absolute URL | sitemaps.org 0.9 | Relative paths are silently dropped by crawlers. |
| Every <loc> is on the same host as the sitemap | sitemaps.org 0.9 | A sitemap at example.com may only list example.com URLs unless cross-submission is set up in Search Console. |
| <lastmod> is a W3C Datetime | sitemaps.org 0.9 | 2026-09-03 and 2026-09-03T10:00:00+02:00 are both valid; 03/09/2026 is not and is ignored. |
| <changefreq> is one of the seven allowed values | sitemaps.org 0.9 | always, hourly, daily, weekly, monthly, yearly, never. |
| <priority> is a number between 0.0 and 1.0 | sitemaps.org 0.9 | It is a hint about relative priority within your own site, nothing more. |
| No duplicate <loc> entries | Crawl efficiency | Duplicates waste crawl budget and signal a generation bug. |
| robots.txt declares this sitemap | sitemaps.org 0.9 | A Sitemap: line in robots.txt is how a crawler that was never told about the file finds it. |
Limits and formats come from the sitemaps.org 0.9 protocol at sitemaps.org/protocol.html.
Why a sitemap still matters when AI systems are the reader
A sitemap does not make a page rank and never did. What it does is tell a crawler that a URL exists and when it last changed, which decides how often the page is refetched. That matters more for AI answers than it used to: assistants preferentially use recent sources, and a page whose update a crawler never noticed is answered from a stale copy.
Three things a sitemap is genuinely load-bearing for:
- Discovery of pages with few internal links. A page nothing links to is found through the sitemap or not at all.
- Freshness. An honest
lastmodis the cheapest way to get a substantially rewritten page recrawled. - Catching your own bugs. A sitemap listing URLs that 404, redirect, or are blocked in robots.txt is a generation bug you can only see by comparing the two. It is the most common real finding this tool surfaces.
That last one is worth pairing with a crawler check: a URL you have submitted in your sitemap and simultaneously blocked from GPTBot in robots.txt is a page you have asked to be indexed and refused to serve. Both files have to agree.
How to fix the common failures
- The response is HTML, not XML. Your framework is serving a page at that path. Check that the sitemap route actually returns
application/xml, and that a catch-all route is not intercepting it. - Unescaped ampersands. A raw
&in a URL breaks XML parsing for the whole file. It must be&. This is the single most common way a hand-assembled sitemap dies. lastmodthat always says today. Emitting the build timestamp for every URL makes the field meaningless and crawlers learn to ignore it. Emit the real last-content-change date, or omit the field.- Over 50,000 URLs. Shard into child sitemaps and publish a sitemap index. Keep each child under both the URL and the byte limit.
- URLs on another host. Move them to a sitemap on that host and declare it in that host's robots.txt.
- No Sitemap: line in robots.txt. One line, absolute URL, anywhere in the file. It costs nothing and is honoured by every major crawler.
Questions people ask about sitemaps
Does the tool follow a sitemap index into its children?
For validation, no — it reports the index itself: entry count, limits, formats and whether each child URL is well-formed. Run the tool again on a child sitemap URL to validate that file. Keeping it to one file per run means the result you share is about a specific file rather than an aggregate that hides where the problem is.
Should I set priority and changefreq?
They are optional and widely ignored. Google has said publicly it does not use them. If they are present they must be valid, which is why this tool checks them — but the honest advice is to omit both and spend the effort on an accurate lastmod.
Can a gzipped sitemap be checked here?
Only if your server sends it with Content-Encoding: gzip, in which case the fetch decompresses it transparently. A .xml.gz file served as a binary download will not parse, and the tool will say so rather than pretending to have read it.
How many URLs should be in my sitemap?
Every URL you want indexed, and none you do not. Pages that are noindex, canonicalised elsewhere, or blocked in robots.txt should not be listed — including them sends contradictory instructions and is a common cause of coverage warnings.
Do you store the sitemaps I check?
No. The file is fetched and parsed inside the request and the result goes straight back to your browser. There is no email field and no saved history; the shareable link re-runs the check.
Where to go next
- Generate robots.txt rules for the AI crawlersThe other half of the pair: a URL in your sitemap that robots.txt blocks to GPTBot is a contradiction worth finding.
- Validate the structured data on a page in the sitemapDiscovery gets a crawler to the page. Markup decides what it can state about it.
- Check heading hierarchy on a listed pageOnce a page is being recrawled, its heading structure decides which passage gets quoted.
- See which AI crawlers actually fetched your pagesA sitemap says what you offered. Crawler logs say what was taken.
- Browse the free SEO and AI search toolsThe rest of the free checks, all of them free and ungated.
- Definitions for the terms used on this pageCrawl budget, lastmod, canonical, sitemap index and the rest, defined.
Related reading: generate an llms.txt from the same sitemap.