When you publish a new page or update existing content, search engine crawlers need to discover those changes before they can be indexed. For established sites with high crawl budgets, this can happen within hours. For newer sites or infrequently crawled pages, it can take days or weeks.
IndexNow is an open protocol that inverts this relationship: instead of waiting for crawlers, you push a notification directly to search engines the moment content changes. The engine receives your URL immediately and moves it to the front of its crawl queue.
This guide explains exactly how IndexNow works and implements it from scratch — no plugins, no third-party tools, just a key file and an HTTP request.
How IndexNow Works
IndexNow has three components:
1. An API key — a random string you generate once. It’s your site’s identifier in the IndexNow ecosystem.
2. A key verification file — a plain text file hosted at https://yourdomain.com/{key}.txt, containing the key. This proves to IndexNow that you control the domain you’re submitting URLs for.
3. A submission request — an HTTP GET or POST request sent to an IndexNow endpoint each time you publish or update content. The request includes your URL(s) and key.
Browser/Deploy Script
│
│ POST https://api.indexnow.org/indexnow
│ { host, key, urlList: [...] }
▼
IndexNow API
│
│ Distributes to all participating engines
▼
┌─────────────────────────────────────────┐
│ Bing │ Yandex │ Seznam │ Naver │
└─────────────────────────────────────────┘
│
▼
Each engine verifies your key file exists at
https://yourdomain.com/{key}.txt
then queues the submitted URL for crawling
The key file verification step is what prevents abuse — anyone can submit any URL to IndexNow, but the engine only processes it if the key matches the file hosted on that domain. You can’t submit someone else’s site.
Which Search Engines Support IndexNow?
| Search Engine | IndexNow Support | Also Powers |
|---|---|---|
| Bing | Yes | DuckDuckGo, Yahoo, Ecosia, AOL |
| Yandex | Yes | — |
| Seznam.cz | Yes | — |
| Naver | Yes | — |
| No | Google, Google Images, Discover |
Submitting to any one IndexNow endpoint (e.g., api.indexnow.org or www.bing.com/indexnow) notifies all participating engines simultaneously. You don’t need separate requests per engine.
For Google: Use the Search Console URL Inspection tool to request indexing for priority pages. Google operates its own crawl infrastructure independently. For bulk submissions, Google Search Console’s sitemap submission is the best available mechanism.
Step 1: Generate an API Key
Your key must be:
- Between 8 and 128 characters
- Alphanumeric characters only (a–z, A–Z, 0–9, hyphens, underscores)
- Unique to your domain (generate a fresh key; don’t reuse one from another site)
Python:
import uuid
print(uuid.uuid4().hex)
# Example output: fde7eef9e3874cc8b53f84b54b6a21d9
Node.js:
const crypto = require('crypto');
console.log(crypto.randomBytes(16).toString('hex'));
Command line (Linux/Mac):
cat /proc/sys/kernel/random/uuid | tr -d '-'
Save this key — you’ll use it in every IndexNow request.
Step 2: Create the Key Verification File
Create a plain text file named {your-key}.txt containing only the key on a single line:
fde7eef9e3874cc8b53f84b54b6a21d9
No spaces, no newline characters beyond the one ending the line, no other content.
Upload this file to your webroot so it’s accessible at:
https://yourdomain.com/fde7eef9e3874cc8b53f84b54b6a21d9.txt
For Astro sites, place the file in the public/ directory — it gets copied to dist/ on build and served at the root.
For WordPress, upload via FTP/SFTP to public_html/.
For cPanel File Manager, navigate to your webroot and create the file there.
Verify it’s accessible:
curl https://yourdomain.com/fde7eef9e3874cc8b53f84b54b6a21d9.txt
# Should output: fde7eef9e3874cc8b53f84b54b6a21d9
Step 3: Submit URLs to IndexNow
Single URL (GET request)
For a single page update, a GET request is the simplest approach:
GET https://api.indexnow.org/indexnow
?url=https://yourdomain.com/new-page
&key=fde7eef9e3874cc8b53f84b54b6a21d9
Curl:
curl "https://api.indexnow.org/indexnow?url=https://yourdomain.com/new-page&key=fde7eef9e3874cc8b53f84b54b6a21d9"
Response 200 OK means the URL was accepted. Response 202 Accepted also means it was accepted (different engines use both).
Multiple URLs (POST request)
For bulk submission (new site launch, batch publish, post-deploy notification), use a POST with JSON:
curl -X POST "https://api.indexnow.org/indexnow" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{
"host": "yourdomain.com",
"key": "fde7eef9e3874cc8b53f84b54b6a21d9",
"keyLocation": "https://yourdomain.com/fde7eef9e3874cc8b53f84b54b6a21d9.txt",
"urlList": [
"https://yourdomain.com/",
"https://yourdomain.com/blog/new-article",
"https://yourdomain.com/services/new-service"
]
}'
Limits:
- Maximum 10,000 URLs per POST request
- All URLs must be on the same host as specified in
"host" - Only submit URLs that were added or changed — not your entire site on every request
Step 4: Automate Submission on Deploy
The real value of IndexNow comes from automation — every time you deploy, IndexNow fires automatically. Here’s how to integrate it into a Python deploy script that reads URLs from your sitemap:
import json
import urllib.request
import urllib.error
import xml.etree.ElementTree as ET
SITE_URL = "https://yourdomain.com"
INDEXNOW_KEY = "fde7eef9e3874cc8b53f84b54b6a21d9"
def get_sitemap_urls(sitemap_path):
"""Parse all URLs from a generated sitemap XML file."""
tree = ET.parse(sitemap_path)
ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"}
return [loc.text for loc in tree.findall(".//sm:loc", ns)]
def submit_indexnow(urls):
"""Submit all URLs to IndexNow via Bing's endpoint."""
payload = {
"host": "yourdomain.com",
"key": INDEXNOW_KEY,
"keyLocation": f"{SITE_URL}/{INDEXNOW_KEY}.txt",
"urlList": urls,
}
body = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(
"https://www.bing.com/indexnow", # Bing distributes to all partners
data=body,
headers={
"Content-Type": "application/json; charset=utf-8",
},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=15) as r:
print(f"IndexNow: {r.status} — {len(urls)} URLs submitted")
except urllib.error.HTTPError as e:
print(f"IndexNow error: {e.code} {e.reason}")
# Usage — run after your deploy completes
urls = get_sitemap_urls("dist/sitemap-0.xml")
submit_indexnow(urls)
Why submit from the sitemap? Your sitemap is auto-generated by your build tool and always contains the complete, accurate list of live URLs. Parsing it is more reliable than maintaining a separate URL list.
Call the IndexNow function after your files are live on the server — not before. If you notify IndexNow while your files are still uploading, the engine may crawl before the page is accessible and mark it as a crawl error.
Step 5: Submit to Bing Webmaster Tools Directly
Bing provides a Webmaster Tools interface for manual IndexNow submissions and to verify your setup:
- Go to bing.com/webmasters
- Select your site → URL Submission in the left sidebar
- You’ll see an IndexNow status showing your key verification
- Paste individual URLs here for immediate manual submission
Bing Webmaster Tools also shows crawl stats, indexing status by URL, and which pages returned errors — more granular than Google Search Console for IndexNow-submitted pages.
Response Codes Reference
| HTTP Status | Meaning |
|---|---|
200 OK | URL(s) accepted |
202 Accepted | URL(s) accepted (async processing) |
400 Bad Request | Invalid request format or missing parameters |
403 Forbidden | Key does not match key file on domain |
422 Unprocessable Entity | URLs don’t match the host in the request |
429 Too Many Requests | Slow down — rate limit hit |
The most common error is 403 — it means either the key file doesn’t exist at the expected location or its content doesn’t match the key in the request. Verify with curl before debugging your submission code.
What IndexNow Does Not Do
IndexNow is a crawl hint, not a ranking tool. Submitting a URL means the search engine will crawl it faster — it does not:
- Guarantee the page will be indexed (quality, thin content, and technical issues can still prevent indexing)
- Improve ranking position
- Override manual crawl exclusions in robots.txt
- Work for Google
If a submitted URL returns a 404, the engine updates its index to remove it. This makes IndexNow useful for deletions too — if you remove a page, submit its old URL and Bing will de-index it faster than waiting for its next crawl.
robots.txt: Reference Your Sitemap
While you have IndexNow running, also make sure your robots.txt references your sitemap — crawlers that don’t support IndexNow (including Googlebot) will find it here:
User-agent: *
Allow: /
Sitemap: https://yourdomain.com/sitemap-index.xml
Both IndexNow and the sitemap reference serve different crawlers — they complement rather than replace each other.
Summary: Complete Checklist
- Generate a unique API key (32-char hex string)
- Create
{key}.txtin your webroot containing the key - Verify:
curl https://yourdomain.com/{key}.txtreturns the key - Submit a test GET request and confirm
200response - Add POST submission to your deploy script, parsing URLs from sitemap
- Verify in Bing Webmaster Tools → URL Submission that key is recognised
- Confirm robots.txt references
sitemap-index.xml
The entire implementation takes about 20 minutes, requires no third-party accounts, and runs automatically on every deploy going forward.
If you want us to implement IndexNow submission as part of your deployment pipeline, book a free consultation.