Skip to content
Instant · runs in your browser

Sitemap Generator for Valid, Spec-Compliant XML

Paste URLs, get a valid sitemap - auto-split past 50,000 URLs or 50 MB.

Sitemap generator output has to satisfy 2 readers at once: an XML parser that will reject the entire file over a single unescaped ampersand, and a crawler that treats everything inside it as a hint rather than an instruction. This tool takes the first part seriously and is honest about the second. Paste a list of URLs, pick the handful of options Google still reads, and download a file that validates.

Everything runs in your browser. Nothing you paste is uploaded anywhere.

One link per line is all you need. To set a date or priority for a specific page, add it after a vertical bar on that line - we work out which is which, so the order does not matter.

Resolves relative lines like /pricing and gives the sitemap index absolute file URLs.

Do not stamp today's date on every page. Google stops trusting a sitemap that claims the whole site changed this morning.

What a valid urlset actually contains - and where sitemap index generator fits

A sitemap is a <urlset> in the sitemaps.org 0.9 namespace holding one <url> per page. Only <loc> is required. <lastmod>, <changefreq> and <priority> are optional, and two of those 3 are dead weight (more on that below).

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.example.com/pricing</loc>
    <lastmod>2026-08-01</lastmod>
  </url>
  <url>
    <loc>https://www.example.com/blog/seo-guide</loc>
    <lastmod>2026-07-14</lastmod>
  </url>
</urlset>

3 rules the format enforces and most hand-built sitemaps break:

  • Every URL must be absolute and fully qualified. /pricing is invalid inside a <loc>. Set a Base URL here and relative lines get resolved for you.
  • A sitemap may only list URLs on the host that serves it. A file at example.com/sitemap.xml listing shop.example.com URLs is a cross-submission problem, not a normal sitemap. The generator warns when your paste spans more than one hostname.
  • Reserved characters have to be entity-escaped. An & inside a query string becomes &amp;. That single character is the most common cause of "couldn't fetch" in Search Console when the file clearly exists.

Fragments are stripped, since #section never identifies a distinct URL. Duplicate <loc> values are removed, because repeating one is a validation error rather than a ranking signal.

The fields on this page and what each one changes

  • URLs is the only required field. One URL per line. Blank lines and lines starting with # are skipped, so you can leave comments in a paste you keep reusing.
  • Sitemap type switches the output format. Standard XML is the default here; the same engine also produces HTML, image, news, video, WordPress and visual variants.
  • Base URL does 2 jobs: it resolves relative lines like /pricing, and it gives the sitemap index absolute file locations when your list is large enough to split. Fill it in whenever either applies.
  • Last modified controls where <lastmod> comes from. "Omit unless supplied" is the safe default, "today" stamps every URL with the current date, and "per line" trusts only the column you provide.
  • Change frequency and Priority both default to omit. Priority also has an auto mode that derives a value from URL depth: root gets 1.0, one level down 0.8, then 0.6, 0.5 and 0.4.

Extra columns are matched by shape, not by position

Anything after a | on a line is an extra column, and the parser identifies each one by what it looks like rather than where it sits. A value containing a parseable date becomes lastmod. One of the seven spec keywords (always, hourly, daily, weekly, monthly, yearly, never) becomes changefreq. A number between 0 and 1 becomes priority.

That means these 2 lines produce identical output:

https://www.example.com/pricing | 2026-08-01 | weekly | 0.8
https://www.example.com/pricing | 0.8 | 2026-08-01 | weekly

Tabs are treated exactly like pipes, so a column copied straight out of a spreadsheet or a CSV export works without reformatting. A per-line column always beats the dropdown setting above it, which is what you want when most pages share a default and a few need something specific.

When the 50,000-URL cap bites

The specification caps a single sitemap file at 50,000 URLs and 50 MB uncompressed, whichever you hit first. Both matter. Long URLs with tracking parameters and a full set of optional tags will push a file past 50 MB well before 50,000 entries, which is why this tool packs against both limits at once rather than counting rows and hoping.

When your list exceeds either limit, the output is split into numbered parts and a sitemap_index.xml is generated alongside them:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://www.example.com/sitemap1.xml</loc>
    <lastmod>2026-08-28</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://www.example.com/sitemap2.xml</loc>
    <lastmod>2026-08-28</lastmod>
  </sitemap>
</sitemapindex>

Submit the index, never the parts individually. The index needs absolute locations for each part file, so this is the case where leaving Base URL blank produces an invalid file. Gzip is allowed and does not change the limits: the 50 MB ceiling is measured uncompressed.

Why changefreq and priority default to omit

Google has stated plainly that it ignores both. changefreq was never a scheduling instruction, and priority is relative within your own file, so setting every page to 1.0 is arithmetically the same as setting every page to 0.5. Neither tag has moved a ranking in a decade.

They are not harmful, they are just bytes. On a large site those bytes are the difference between one file and 2. The options are here because some internal tooling and a few older CMS validators still expect them, not because you need them.

The lastmod rule that ruins sitemaps

lastmod is the one optional tag Google actually uses, and only while it stays credible. A sitemap regenerated nightly that stamps every URL with today's date is telling the crawler that 10 thousand pages changed overnight. After a few cycles of finding nothing changed, that signal gets discounted for the whole file, including the pages that genuinely did change.

Emit lastmod from your real content-modified timestamp or leave it out. The "today for every URL" option here exists for a first publish or a genuine site-wide migration, not for a cron job.

Getting it crawled once it is live

Upload the file to your web root, then do 2 things:

  1. Add a line to robots.txt: Sitemap: https://www.example.com/sitemap.xml. This is the discovery path every crawler honors, not just Google.
  2. Submit the URL in Search Console under Sitemaps, which is also where you read back the parse errors.

Google retired the sitemap ping endpoint in 2023. Any script or plugin still hitting google.com/ping?sitemap= is making a request that does nothing. Bing removed its equivalent as well. Discovery is now robots.txt plus the search console interfaces, full stop.

One last thing worth checking after upload: every URL in the file should return 200 and be self-canonical. A sitemap full of redirect hops and pages canonicalized elsewhere sends conflicting signals, and it is a much more common problem than a malformed tag. BlazeHive automates the SEO content side of this end to end, but the sitemap itself should always reflect what your server really serves.

Frequently Asked Questions

Do I need a sitemap if my site is small and well linked?

Not strictly. A crawler that can reach every page through internal links will find them without one. A sitemap earns its place when pages are new, orphaned, deep in the hierarchy, or added faster than crawlers rediscover them. It is a discovery aid, not an indexing guarantee.

Will a sitemap get my pages indexed?

No. It tells Google the URLs exist. Indexing is a separate decision based on quality, duplication and crawl budget. Pages that get submitted and then sit in "Discovered, currently not indexed" are a content problem, not a sitemap problem.

Should I include noindex or canonicalized URLs?

No. List only canonical, indexable URLs that return 200. Including a page you have told Google to ignore is a contradiction it has to resolve, and it resolves it by trusting the file slightly less.

How often should I regenerate the file?

Whenever the URL set changes. For most sites that is on publish. Regenerating on a fixed schedule is fine as long as lastmod still reflects real edits rather than the time of the run.

What is the difference between a sitemap and a sitemap index?

A sitemap lists pages. A sitemap index lists sitemaps. You need the index once you cross 50,000 URLs or 50 MB, or once you split by content type for your own convenience. An index can point at up to 50,000 sitemaps, and indexes cannot nest.

Can one sitemap cover several subdomains?

Only through cross-submission: prove ownership of every host in Search Console, or reference the sitemap from each host's robots.txt. The simpler path, and the one this tool nudges you toward, is one sitemap per host.

Related free tools

All tools →