Overview
IndexNow is an open protocol that lets a site push URL changes to participating search engines instead of waiting for them to crawl. A POST to one endpoint reaches Bing, Yandex, Seznam, Naver, and Yep at once. Google does not participate. Ship IndexNow on any site that publishes or updates content faster than once a week.
IndexNow is push, not pull
Traditional indexing is poll-based: the engine decides when to recrawl. IndexNow inverts that.
- Site publishes or updates a URL.
- Site POSTs the URL list to an IndexNow endpoint.
- Participating engines receive the change within seconds and queue a recrawl within minutes.
- Submitted URLs still go through normal quality and ranking pipelines; submission is not a guarantee of indexing.
IndexNow does not replace a sitemap. Sitemaps remain the authoritative full inventory; IndexNow is the delta channel on top. Both belong on the same site, alongside the canonical and URL hygiene rules in technical.
Bing and Yandex participate; Google does not
The current participant list, in rough order of search-market relevance:
- Bing (and any engine that licenses Bing’s index, including DuckDuckGo and Ecosia).
- Yandex.
- Seznam (Czech Republic).
- Naver (South Korea).
- Yep (Brave’s index).
Google has publicly declined to join. For Google, rely on Search Console’s URL Inspection and on the sitemap’s <lastmod> plus normal crawl. Do not skip IndexNow because Google is absent; Bing-derived traffic alone justifies the integration, and AI search products (Bing Chat, Perplexity, Copilot) lean on Bing’s index.
Host the key file at the site root
Authentication is by a shared secret served as a static file.
- Generate a random hex string at least 8 and at most 128 characters. UUID without hyphens works.
- Host it at
https://<your-domain>/<key>.txtwith the file contents equal to the key. - Serve with
Content-Type: text/plainand a 200 status.
The engine verifies ownership by fetching the key file before honoring submissions. Rotate the key only when it leaks; rotation invalidates pending submissions.
POST URL lists to the endpoint
Two shapes. The single-URL form is a GET; the batch form is a POST with JSON.
Batch form, up to 10,000 URLs per request:
curl -X POST "https://api.indexnow.org/IndexNow" \
-H "Content-Type: application/json" \
-d '{
"host": "example.com",
"key": "<your-key>",
"keyLocation": "https://example.com/<your-key>.txt",
"urlList": [
"https://example.com/seo/technical",
"https://example.com/seo/content"
]
}'Response codes worth wiring into alerting:
- 200 or 202: accepted.
- 400: malformed request. Fix the payload.
- 403: key file missing, wrong contents, or wrong URL.
- 422: URLs do not match the declared host. Filter the list.
- 429: rate-limited. Back off.
Submit only on real changes
Submitting unchanged URLs trains engines to ignore the channel and risks throttling.
- Submit on publish, on material update, and on delete (so the engine drops the URL).
- Do not submit on every build. Compare against the last-deployed manifest and submit only the diff.
- Pair the trigger with the
last_updatedrule in content: if the page is not re-dated, it should not be submitted.
Rate limits are not publicly fixed; the practical ceiling is in the low thousands of unique URLs per day per site.
CMS plugins cover the common case; custom integration covers the rest
For WordPress, Wix, Duda, and Cloudflare-fronted sites, an official plugin or one-click integration ships submissions automatically. For custom stacks (Next.js, Astro, Quartz), wire submission into the deploy step.
- Generate the key once, commit the key file to the repo (or to
static/). - After the deploy succeeds, compute the URL diff against the previous build manifest.
- POST the diff to
api.indexnow.org/IndexNowfrom CI. - Log responses; alert on non-2xx for two builds in a row.