Sitemap to IndexNow

Turn a sitemap into ready-to-send IndexNow requests. Submit every URL, only the ones changed since a date, or the difference between an old and a new sitemap, split into batches of 10,000 per host, with cURL, PowerShell, Python, PHP and Node scripts.

Generator Web & Dev Updated Oct 4, 2026
Learn how this works
How to Use
  1. Choose a mode: All URLs, Changed since a date, or Compare two sitemaps (old and new).
  2. Paste sitemap XML, a list of URLs or a robots.txt, or drop files: .xml, .xml.gz and .txt all work, several at once. A sitemap index or robots.txt lists the sitemaps to add next.
  3. Type your host, such as www.example.com, and set any path filters. URLs on another host get their own batch and a warning.
  4. Enter your IndexNow key or press Generate key, then Download key file and upload it to the root of your site.
  5. Pick an output (JSON, cURL, PowerShell, Python, PHP, Node or GET links), copy it or download the script, and run it from a terminal or server. New to IndexNow? Follow How to Set Up IndexNow.
Sitemap
paste, or drop files below
↥
Drop .xml, .xml.gz or .txt files (several at once)
optional
8–128 of a–z A–Z 0–9 -
curl -i https://{host}/{key}.txt
Upload the key file to the root of each host, then run this: it must return 200 with only the key.
optional
shared with all
One submission to any endpoint reaches every participating engine. Google does not take part. New to IndexNow? Read How to Set Up IndexNow.
Presets
IndexNow Requests
Waiting for a sitemap

This page cannot send the requests itself (IndexNow’s API does not accept calls from web pages), so it builds them for you to run from a terminal or server.

URLs found
—
To submit
—
Batches
—
Hosts
—

Worked Example

A site on www.example.com deploys a new build. The old sitemap had 7 URLs; the new one has 8. Compared URL by URL:

  • Added (2): /blog/new-post and /features are only in the new sitemap.
  • Removed (1): /blog/old-post is only in the old one. It should now return 404 or 410, or redirect, and submitting it tells search engines to drop or update it.
  • Changed (1): /pricing is in both, but its lastmod moved from 2026-09-01 to 2026-09-30.
  • Unchanged (5): the other pages have the same lastmod in both, so they are not sent again.

That is 2 + 1 + 1 = 4 URLs, all on one host, so ⌈4 ÷ 10,000⌉ = 1 request, with a 305-byte body:

POST https://api.indexnow.org/indexnow
Content-Type: application/json; charset=utf-8

{"host":"www.example.com","key":"3f9c1a7e5b2d48f0a6c4e8b1d7f2a905",
 "keyLocation":"https://www.example.com/3f9c1a7e5b2d48f0a6c4e8b1d7f2a905.txt",
 "urlList":["https://www.example.com/blog/new-post","https://www.example.com/features",
            "https://www.example.com/pricing","https://www.example.com/blog/old-post"]}

With Changed since instead, time zones matter: a lastmod of 2026-09-19T23:30:00-02:00 is 2026-09-20 01:30 UTC, so it passes a cutoff of 2026-09-20 00:00 UTC even though the date written in it is the 19th.

The common mistake: sending everything in one request with "host": "www.example.com" when some URLs are on example.com. IndexNow treats www and non-www as different hosts, so the request fails with 422. The “www + non-www list” preset shows the fix: 4 www.example.com URLs and 2 example.com URLs become 2 batches, and example.com needs its own key file. The other habit to avoid is resubmitting the whole sitemap on every deploy; send only what changed.

Show Work

Paste a sitemap or drop files above to see each file parsed, filtered, grouped by host and split into requests.

IndexNow Request Reference

Request
POST /indexnow · Content-Type: application/json; charset=utf-8
Body: {"host", "key", "keyLocation", "urlList": […]}
Per request
≤ 10,000 URLs, all on one host
www.example.com and example.com are different hosts
Batches
requests = ⌈URLs ÷ 10,000⌉ per host
25,000 URLs → 10,000 + 10,000 + 5,000 = 3 requests
Key
8–128 characters: a–z, A–Z, 0–9, -
A 32-character hexadecimal key is the safest choice
Key file
https://{host}/{key}.txt
Contains only the key, UTF-8 without a BOM. Elsewhere, keyLocation covers only that folder
Single URL
GET /indexnow?url={encoded URL}&key={key}
The URL must be percent-encoded
Responses
200 OK · 202 Accepted
202: received, key not validated yet. Neither means the pages will be indexed
Errors
400 · 403 · 422 · 429
Malformed request · key file missing or wrong · URL not on the host, or bad key · too many requests

From Sitemaps to IndexNow

Google introduced Sitemaps in 2005 so site owners could list pages its crawler might miss. In 2006 Yahoo and Microsoft adopted the same format, and the three published it as a shared protocol at sitemaps.org. A sitemap is a pull model: it lists every URL you want indexed, and crawlers read it on their own schedule, so a change can take days to be noticed.

IndexNow, launched in 2021 by Microsoft Bing and Yandex, is the push model. The site sends a short list of URLs that just changed, with a key that proves it controls the host, and the participating engines can crawl them straight away. Submissions are shared, so one request reaches Bing, Yandex, Seznam.cz, Naver, Yep, Amazon and the Internet Archive. The two work together: the sitemap is the complete list, IndexNow announces the changes, and this tool turns the first into the second.

About This Tool

This tool reads sitemaps (including gzipped files and sitemap indexes), plain URL lists and robots.txt files, and turns them into IndexNow submissions. It can submit every URL, only those whose lastmod is on or after a date (time zones converted to UTC), or the added, removed and changed URLs between two versions of a sitemap. URLs are checked, normalised with the browser’s URL standard, filtered by path and de-duplicated, then grouped by host and split into batches of up to 10,000.

The output is the exact JSON body for each batch and ready-to-run cURL, PowerShell, Python, PHP and Node.js code that prints each response and stops on an error with the reason. It also generates and validates your key and saves the key file. Everything runs in your browser; nothing you paste or drop is uploaded, and no request is sent to IndexNow from this page. For the full setup, including automation and troubleshooting, read How to Set Up IndexNow.

Related tools: XML Sitemap Generator, robots.txt Generator, and cURL Converter.

Frequently Asked Questions

Why can’t the page submit for me?

Browsers only let a web page call another site’s API when that API sends CORS headers, and api.indexnow.org sends none (it answers the browser’s preflight check with 405). This site’s security policy also lets pages connect only to itself. So the tool builds the exact requests and scripts, and you run them from a terminal, a deploy job or your server, where those limits do not apply.

Does this work for Google?

No. Google does not take part in IndexNow. A submission reaches Bing, Yandex, Seznam.cz, Naver, Yep, Amazon and the Internet Archive. For Google, keep your sitemap submitted in Search Console and use its URL Inspection tool for urgent pages.

Should I submit my whole sitemap every time I deploy?

No. Submit only URLs that were added, changed or removed. The IndexNow FAQ asks you not to resubmit unchanged pages and to wait at least 5 minutes between submissions of the same URL. Use Compare two sitemaps with the previous build’s sitemap, or Changed since with the time of your last submission.

Why does my submission return 403 or 422?

403 means the key file was not found at keyLocation, or it does not contain exactly the key: open https://your-host/{key}.txt and compare. 422 usually means a URL is on a different host from the one in the request, most often www.example.com against example.com. This tool puts each host in its own batch for that reason.

How many URLs can I send in one request?

Up to 10,000, all on the same host. More than that is split into batches: 25,000 changed URLs on one host become 3 requests of 10,000, 10,000 and 5,000. Two hosts always need at least 2 requests, however few URLs each has.

How do I use the Sitemap to IndexNow?

Just pick your options. The answer shows up right away — there is no button to press. Change anything and it updates by itself.

Do I need to install or sign up for anything?

Not at all — it runs in the browser with nothing to install and no account. After it loads once, it even works without an internet connection.

Is my information private?

Yes. Everything happens in your browser. Nothing you type is sent to a server or saved anywhere.

Common Use Cases

Static site deploy

Compare the last build’s sitemap with the new one: 2 added, 1 removed and 1 changed page become 4 URLs in a single request, instead of resending all 8.

Weekly content update

Changed since 2026-09-20 00:00 UTC keeps 3 of 8 URLs, including one dated 2026-09-19T23:30:00-02:00, which is 01:30 UTC on the 20th.

Large catalogue

25,000 changed product URLs on one host are split into batch-1 and batch-2 with 10,000 each and batch-3 with 5,000, each a separate POST.

www and non-www check

A list with 4 www.example.com and 2 example.com URLs becomes 2 batches with a warning, instead of one request that would fail with 422.

Gzipped and split sitemaps

Drop sitemap-posts.xml.gz as it is; it is unpacked in the browser. Paste a sitemap index of 3 files and you get the curl commands to download all 3.

First-time key setup

Generate a 32-character key, download {key}.txt, upload it to the root, and copy the curl -i line to confirm it returns 200 before the first submission.

Last updated: