← All articles

IndexNow on Cloudflare: the 5-minute free win indie devs skip

IndexNow is a single POST that tells Bing, Yandex, Naver, Seznam, and a growing list of engines that your URLs changed. Cloudflare has a one-click integration. Almost nobody enables it. Here's the setup and what it's worth.

RankPropel ·

IndexNow is a protocol Microsoft and Yandex created in 2021. It's stupid-simple: when content changes on your site, you POST the changed URL(s) to a single endpoint, and the endpoint fans out to every participating search engine. As of 2026 that's Bing, Yandex, Naver, Seznam, and a handful of smaller indexes — notably not Google, but yes including the engines that feed ChatGPT Search (Bing) and a meaningful chunk of non-Google AI workflows.

For indie sites the value proposition is: instead of waiting for Bingbot to come crawl your new article on its own schedule (which for low-PA domains can be days to weeks), you get same-hour indexing. That has compounded value for any site where freshness matters — news, time-sensitive how-to, comparison content, anything where being first is part of the win.

Setup is trivial. I keep finding indie devs who haven't done it.

The protocol in two paragraphs

You generate a key (any 32-char hex string is fine). You host that key as a file at the root of your domain: https://your-domain.com/<key>.txt whose contents are the key itself. That's the verification — when IndexNow receives a ping claiming to be from your domain, it fetches your key file to confirm.

You POST your changed URLs to https://api.indexnow.org/IndexNow with a body like:

{
  "host": "your-domain.com",
  "key": "<your-32-char-key>",
  "keyLocation": "https://your-domain.com/<your-32-char-key>.txt",
  "urlList": [
    "https://your-domain.com/new-article",
    "https://your-domain.com/updated-page"
  ]
}

That's it. Bing, Yandex, Naver, Seznam all get notified in under a minute. There's a single-URL GET variant too if you only have one URL to ping.

Two ways to set this up on Cloudflare

Option A: Cloudflare Crawler Hints (one click, fully automatic). Cloudflare has built-in IndexNow support called "Crawler Hints". Enable it under:

Cloudflare Dashboard → [zone] → Caching → Configuration → Crawler Hints

Toggle on. Cloudflare watches your origin's Cache-Control and Last-Modified headers and sends IndexNow pings whenever content actually changes. Zero code, zero key management — Cloudflare handles the key on your behalf via a special endpoint they control.

Downside: you don't control timing or which URLs get pinged. If your site emits frequent cache-busting changes, Cloudflare may ping more than you'd like.

Option B: Roll your own (more control). Ship your own key file at site root, then ping the IndexNow API directly from your deploy pipeline or content-management hook. Useful when you want pings only on real content publishes, not on every cache invalidation.

For a Next.js site on Cloudflare Pages, the simplest "Option B" pattern:

  1. Generate a key, ship a public/<key>.txt file with the key as contents. Commit it.
  2. In your npm run cf:deploy script, after the wrangler upload completes, run a curl:
curl -X POST "https://api.indexnow.org/IndexNow" \
  -H "Content-Type: application/json" \
  -d '{
    "host": "your-domain.com",
    "key": "YOUR_KEY",
    "keyLocation": "https://your-domain.com/YOUR_KEY.txt",
    "urlList": ["https://your-domain.com/sitemap.xml"]
  }'

Yes, you can pass the sitemap URL itself; participating engines will crawl it and pick up the children. That's the cheapest possible setup — one ping per deploy, lets the sitemap do the rest.

For a content site where you want per-URL pings on publish:

# After every cf:deploy, ping IndexNow with the URLs that changed
NEW_URLS=$(git diff --name-only HEAD~1 HEAD content/articles/*.mdx | \
  sed 's|content/articles/|https://your-domain.com/articles/|; s|\.mdx$||')

curl -X POST "https://api.indexnow.org/IndexNow" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --argjson urls "$(printf '%s\n' $NEW_URLS | jq -R . | jq -s .)" \
    '{host: "your-domain.com", key: "YOUR_KEY", keyLocation: "https://your-domain.com/YOUR_KEY.txt", urlList: $urls}')"

There's a per-day URL limit (10,000 per host) which no indie site will ever hit.

What's it actually worth

I've been running IndexNow on a few sites for ~9 months. The pattern I see:

  • New article published → Bing has it indexed within the hour on every site I've tested. Without IndexNow, the same content took 1–7 days to appear in site:domain.com Bing queries on the same domains.
  • ChatGPT Search starts citing the new content within 24 hours instead of weeks, because ChatGPT pulls from Bing's index.
  • Yandex picks up content where without IndexNow it might never have crawled at all (Yandex is aggressive only in CIS regions; passive elsewhere).
  • Naver picks up English content selectively, but the floor is "appears at all" instead of "doesn't appear".

Cumulative effect on a fresh site that publishes weekly: probably worth a couple hundred extra impressions per month per article over the first year. On 25 articles that's 50K+ extra impressions/year from a single one-click setup.

The reason I think most indie devs skip this: it sounds too small to matter. The ROI is dispersed and not directly attributable. But it costs literally nothing to set up. There's no excuse.

What it does not do

IndexNow doesn't ping Google. Google publicly stated they're "monitoring" the protocol but haven't joined. So Google indexing is on its own track — you still need Google Search Console + a verified sitemap + patience for new pages, or the Google Indexing API for job-posting/livestream pages where it's actually allowed.

IndexNow also doesn't guarantee indexing. It's a notification, not a command. Participating engines decide on their own whether to actually index. In practice, for sites with non-spam content, they do — but a brand-new domain with no track record may see the ping accepted and then nothing happen.

My actual setup as of May 2026

Across my 25 sites, I'm rolling out:

  • IndexNow key file deployed at every site root.
  • Crawler Hints enabled in Cloudflare for each zone (Option A) for the simple case.
  • A small scripts/ping-indexnow.sh in each repo that runs on cf:deploy for the content-heavy sites where I want explicit per-URL pings (Option B).

Total time to set up across the whole portfolio: about 90 minutes. Most of that was clicking through Cloudflare zones one by one.

If you've got a portfolio of small sites, this is the cheapest hour of GEO/SEO work you'll do this quarter.