Table of Contents
- The Complete Workflow Overview
- Website Changes: What Triggers IndexNow?
- The Ping Request: GET vs. POST
- API Request Structure Deep Dive
- Verification Key: Generation and Management
- Key File: Placement and Requirements
- Search Engine Receiving Notifications
- The Crawling Process After Notification
- Indexing Process: From Crawl to Search Results
- Ranking vs. Indexing: The Critical Distinction
- Cache Updates
- Crawl Budget Implications
The Complete Workflow Overview
Understanding IndexNow means grasping the entire lifecycle of a URL change notification—from the moment content changes on your site to the moment it appears in search results.
The Six-Step IndexNow Process
┌─────────────────────────────────────────────────────────────────────────┐
│ INDEXNOW COMPLETE WORKFLOW │
└─────────────────────────────────────────────────────────────────────────┘
STEP 1 STEP 2 STEP 3 STEP 4
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Content │ │ Generate│ │ Host Key│ │ Send API│
│ Changes │───────▶│ API Key │───────▶│ File │───────▶│ Request │
│ on Site │ │ (once) │ │ on Root │ │ (Ping) │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│
STEP 5 STEP 6 STEP 7 │
┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ Search │ │ URL │ │ Crawler │◀───────┘
│ Engine │───────▶│ Shared │───────▶│ Fetches │
│ Validates│ │ Across │ │ Page │
│ Key │ │ Engines │ │ Content │
└─────────┘ └─────────┘ └─────────┘
│
STEP 8 STEP 9 │
┌─────────┐ ┌─────────┐ │
│ Content │ │ Search │◀─────────────┘
│ Indexed │───────▶│ Results │
│ & Ranked│ │ Updated │
└─────────┘ └─────────┘
Fig 2.1: The validation flowchart shows how search engines verify domain ownership. When a ping is received, the search engine fetches a key file hosted on the website root directory to authenticate the API request.
Website Changes: What Triggers IndexNow?
IndexNow should be triggered by three types of content changes. Knowing what qualifies is critical for proper implementation.
Type 1: URL Added (New Content)
When a new page is published, submit it to IndexNow.
Examples of “new content”:
- New blog post published
- New product added to ecommerce catalog
- New landing page created for marketing campaign
- New documentation page added
- New user-generated content (forum post, review page)
- New category or tag page created
What doesn’t qualify:
- Pagination pages (page 2, page 3 of a listing)
- Filter/sort result pages
- Search result pages
- Session-based or personalized pages
Type 2: URL Updated (Modified Content)
When an existing page’s content changes significantly, submit it.
What counts as “significant” update:
- Price changes on product pages
- Availability status changes (in stock / out of stock)
- Content rewritten or substantially expanded (more than 20% change)
- Metadata changes (title, description, structured data)
- Media additions (new images, videos)
- Correction of factual errors
- Addition of new sections or features
What doesn’t count as significant:
- CSS or styling changes
- Minor typo fixes (unless they affect meaning)
- Navigation menu updates
- Footer changes
- Analytics tag additions
- Layout adjustments without content changes
- Comment additions (unless comments are the primary content)
Expert Tip: Only submit URLs when the actual content a user sees has changed. Search engines track submission accuracy. Sites that abuse IndexNow by submitting unchanged URLs may see reduced crawl priority.
Type 3: URL Deleted (Removed Content)
When a page is permanently removed, IndexNow can tell search engines to remove it from their index.
Examples:
- Product discontinued and page removed
- Blog post deleted
- Outdated documentation removed
- Expired event pages removed
- User account deleted (profile pages removed)
- Content merged into another page
HTTP Status Code Requirements:
| Status Code | Meaning | IndexNow Action |
|---|---|---|
| 410 Gone | Permanently removed | Preferred—search engines remove from index quickly |
| 404 Not Found | Temporarily or permanently unavailable | Search engines may retry before removing |
| 301 Moved Permanently | Content moved to new URL | Submit new URL; old URL will be updated |
The Ping Request: GET vs. POST
The “ping” is the HTTP request sent to the IndexNow API. There are two methods for different scenarios.
Method 1: Simple GET Request (Single URL)
For a single URL change, use a GET request:
GET https://api.indexnow.org/indexnow?url=https://example.com/new-page&key=YOUR_API_KEYParameters:
url: The full URL of the changed page (must be URL-encoded)key: Your unique API key
When to use GET:
- Testing the API
- Single URL submissions
- Simple scripts or browser-based testing
- Quick manual submissions
Limitations:
- Only 1 URL per request
- Key is visible in URL (less secure)
- URL length limitations (browsers typically limit URLs to ~2,000 characters)
Method 2: POST Request (Multiple URLs) — RECOMMENDED
For batch submissions (up to 10,000 URLs), use POST:
POST https://api.indexnow.org/indexnow HTTP/1.1
Content-Type: application/json; charset=utf-8
{
"host": "example.com",
"key": "YOUR_API_KEY",
"keyLocation": "https://example.com/YOUR_API_KEY.txt",
"urlList": [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
]
}Why POST is preferred:
- Supports up to 10,000 URLs per request
- More secure (key in request body, not URL)
- Better for automation and batch processing
- Required for
keyLocationverification - Proper JSON structuring
When to use POST:
- Production implementations
- Batch submissions
- Automated workflows
- Any serious setup
API Request Structure Deep Dive
Let’s break down every component of the POST request.
Endpoint
https://api.indexnow.org/indexnowYou can also submit directly to individual search engine endpoints:
| Search Engine | Endpoint |
|---|---|
| Central (recommended) | https://api.indexnow.org/indexnow |
| Bing | https://www.bing.com/indexnow |
| Yandex | https://yandex.com/indexnow |
| Naver | https://searchadvisor.naver.com/indexnow |
| Seznam | https://search.seznam.cz/indexnow |
| Yep | https://yep.com/indexnow |
Critical Rule: Submitting to ANY ONE of these endpoints automatically shares the URLs with ALL participating search engines. You never need to submit to more than one.
Request Headers
| Header | Value | Required | Purpose |
|---|---|---|---|
Content-Type | application/json; charset=utf-8 | Yes | Tells the API you’re sending JSON |
Accept | application/json | Recommended | Indicates you expect JSON response |
Request Body (JSON Fields)
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
host | string | Yes* | The fully qualified domain name (no protocol) | "example.com" |
key | string | Yes | Your unique API key (minimum 8 chars, recommended 32+ hex) | "8f7d6e5c4b3a2918f7d6e5c4b3a2918f" |
keyLocation | string | Yes* | Full HTTPS URL where the key file is hosted | "https://example.com/8f7d6e5c4b3a2918f7d6e5c4b3a2918f.txt" |
urlList | array | Yes** | Array of up to 10,000 absolute URLs | ["https://example.com/page1"] |
*Required for POST requests
**Either urlList (POST) or url (GET) is required
URL Requirements
- Must be absolute URLs (including protocol:
https://) - Must use the same host as specified in the
hostfield - Must be URL-encoded if containing special characters
- Maximum 10,000 URLs per request
- Each URL maximum 2,048 characters
- Must use HTTPS (HTTP URLs are rejected)
Example: Minimal Valid Request
POST https://api.indexnow.org/indexnow HTTP/1.1
Content-Type: application/json; charset=utf-8
{
"host": "example.com",
"key": "abc123def456789ghi012jkl345mno67",
"keyLocation": "https://example.com/abc123def456789ghi012jkl345mno67.txt",
"urlList": ["https://example.com/new-blog-post"]
}Example: Batch Submission
POST https://api.indexnow.org/indexnow HTTP/1.1
Content-Type: application/json; charset=utf-8
{
"host": "example.com",
"key": "abc123def456789ghi012jkl345mno67",
"keyLocation": "https://example.com/abc123def456789ghi012jkl345mno67.txt",
"urlList": [
"https://example.com/products/new-widget",
"https://example.com/blog/2026-guide",
"https://example.com/about-updated",
"https://example.com/pricing-new",
"https://example.com/docs/api-v3"
]
}Verification Key: Generation and Management
The verification key proves you own the domain you’re submitting URLs for. Without it, anyone could submit URLs for any site.
Key Generation
Generate a key using any cryptographically secure random generator. The key should be:
- Minimum: 8 characters
- Recommended: 32–64 hexadecimal characters (128–256 bits of entropy)
- Format: Alphanumeric characters, hyphens, and underscores
- Security: Cryptographically random (not predictable)
Recommended method using OpenSSL:
openssl rand -hex 32
# Output: 8f7d6e5c4b3a2918f7d6e5c4b3a2918f7d6e5c4b3a2918f7d6e5c4b3a2918f7dPython:
import secrets
key = secrets.token_hex(32)
print(key)
# Output: 8f7d6e5c4b3a2918f7d6e5c4b3a2918f7d6e5c4b3a2918f7d6e5c4b3a2918f7dNode.js:
const crypto = require('crypto');
const key = crypto.randomBytes(32).toString('hex');
console.log(key);PHP:
$key = bin2hex(random_bytes(32));
echo $key;Go:
package main
import (
"crypto/rand"
"encoding/hex"
"fmt"
)
func main() {
bytes := make([]byte, 32)
rand.Read(bytes)
key := hex.EncodeToString(bytes)
fmt.Println(key)
}Key Management Best Practices
| Practice | Why It Matters | Implementation |
|---|---|---|
| Use a secrets manager | Prevents key exposure in code | AWS Secrets Manager, Azure Key Vault, HashiCorp Vault |
| Separate keys per domain | Limits blast radius if one key is compromised | Generate unique key for each domain |
| Rotate annually | Reduces risk from long-term key exposure | Schedule rotation in calendar |
| Never commit to version control | Prevents accidental public exposure | Add to .gitignore, use environment variables |
| Limit access | Reduces insider threat | Only necessary personnel should know the key |
| Monitor usage | Detect unauthorized submissions | Log all submissions with timestamps |
Key File: Placement and Requirements
The key file is how search engines verify domain ownership. It must be publicly accessible so search engines can fetch it and compare it to the key in your API requests.
File Requirements
| Requirement | Specification | Why It Matters |
|---|---|---|
| Location | Root of domain (e.g., https://example.com/key.txt) | Proves domain ownership |
| Protocol | Must be HTTPS | Security and integrity |
| Content | Only the key string (no HTML, no whitespace) | Clean comparison |
| Content-Type | text/plain | Correct MIME type |
| Status Code | HTTP 200 OK | Must be accessible |
| Filename | Must match the key exactly | Verification mechanism |
Standard File Placement
URL: https://example.com/8f7d6e5c4b3a2918f7d6e5c4b3a2918f.txt
Content: 8f7d6e5c4b3a2918f7d6e5c4b3a2918fPlatform-Specific Placement
| Platform | File Location | Notes |
|---|---|---|
| WordPress | /public_html/{key}.txt or /var/www/html/{key}.txt | Root of web server document root |
| Shopify | Upload via Settings > Files, then redirect | Must be accessible at root URL |
| Wix | Upload via Site Tools > File Manager | Place in root directory |
| Next.js | public/{key}.txt | Automatically served from root |
| Nuxt.js | static/{key}.txt or public/{key}.txt | Automatically served from root |
| Laravel | public/{key}.txt | Public directory |
| Django | static/{key}.txt with URL routing | Configure to serve at root |
| Static Site (Netlify/Vercel) | Root of build output | Include in deployment |
| Cloudflare Pages | Root of repository | Include in deployment |
Common Mistakes with Key Files
| Mistake | Why It Fails | Solution |
|---|---|---|
| HTML wrapper | Search engines see <html>key</html> instead of just key | Serve raw text file |
| BOM (Byte Order Mark) | Invisible character at start of file | Save as UTF-8 without BOM |
| Trailing newline | File contains key\n instead of key | Remove trailing whitespace |
| Wrong location | File in /assets/ instead of root | Must be at domain root |
| HTTP instead of HTTPS | Search engines reject insecure URLs | Force HTTPS |
| File permissions | Server returns 403 Forbidden | Set permissions to 644 |
| CDN caching | Old key cached after rotation | Purge cache or use versioned filename |
Verification Checklist
Before submitting URLs, verify your key file with these commands:
# Test 1: Check accessibility
curl -I https://example.com/YOUR_KEY.txt
# Expected: HTTP/2 200, Content-Type: text/plain
# Test 2: Check content
curl https://example.com/YOUR_KEY.txt
# Expected: YOUR_KEY (exactly, no extra characters)
# Test 3: Check from external network
# Use a VPN or mobile hotspot to verify accessibility
# Some firewalls block certain IP rangesSearch Engine Receiving Notifications
When a search engine receives an IndexNow request, it runs a validation process:
Validation Flowchart
┌─────────────────────────────────────────┐
│ IndexNow API Receives Request │
└─────────────────┬───────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Step 1: Validate JSON Format │
│ • Is it valid JSON? │
│ • Are required fields present? │
└─────────────────┬───────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ Valid │ │ Invalid │
└────┬────┘ └────┬────┘
│ │
▼ ▼
Continue Return 400
to Step 2 Bad Request
┌─────────────────────────────────────────┐
│ Step 2: Validate Host Format │
│ • Is host a valid domain? │
│ • No protocol, no path, no port │
└─────────────────┬───────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ Valid │ │ Invalid │
└────┬────┘ └────┬────┘
│ │
▼ ▼
Continue Return 400
to Step 3 Bad Request
┌─────────────────────────────────────────┐
│ Step 3: Fetch keyLocation │
│ • Is keyLocation accessible? │
│ • Does it return HTTP 200? │
│ • Is Content-Type text/plain? │
└─────────────────┬───────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ Success │ │ Fail │
└────┬────┘ └────┬────┘
│ │
▼ ▼
Continue Return 403
to Step 4 Forbidden
┌─────────────────────────────────────────┐
│ Step 4: Validate Key Match │
│ • Does file content match request key?│
└─────────────────┬───────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ Match │ │ No Match│
└────┬────┘ └────┬────┘
│ │
▼ ▼
Continue Return 403
to Step 5 Forbidden
┌─────────────────────────────────────────┐
│ Step 5: Validate URLs │
│ • Are URLs valid HTTPS? │
│ • Do URLs match the host domain? │
│ • Are URLs properly formatted? │
│ • Is urlList ≤ 10,000 items? │
└─────────────────┬───────────────────────┘
│
┌─────────┴─────────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ Valid │ │ Invalid │
└────┬────┘ └────┬────┘
│ │
▼ ▼
Return 200 Return 400
OK Bad Request
+ Share URLs
+ Queue for CrawlResponse Codes
| Status Code | Meaning | Action Required |
|---|---|---|
| 200 OK | Success! URLs accepted and queued | None—monitor for crawler visits |
| 202 Accepted | Success (some engines return this) | Same as 200 |
| 400 Bad Request | Invalid request format | Check JSON structure, required fields |
| 403 Forbidden | Key validation failed | Verify key file is accessible and matches |
| 422 Unprocessable Entity | Valid JSON but invalid data | Check URL format, host matching |
| 429 Too Many Requests | Rate limit exceeded | Implement backoff and retry |
| 500 Internal Server Error | Server error on engine side | Retry with exponential backoff |
What Happens After Validation
- Key Verification: The search engine fetches your
keyLocationURL and verifies the key matches the request - URL Validation: Each URL is checked for proper format and domain matching
- Acceptance: If valid, the search engine returns HTTP 200 OK
- Distribution: The URL list is shared with all other participating search engines
- Crawl Queue: URLs are added to the search engine’s priority crawl queue
- Crawling: Crawlers visit the URLs (typically within minutes to hours)
- Indexing: Content is processed and added/updated/removed from the index
The Crawling Process After Notification
Once a URL passes validation and enters the crawl queue, here’s what happens next:
Crawl Priority
IndexNow-submitted URLs get high priority in the crawl queue:
| Priority Level | Source | Typical Crawl Delay |
|---|---|---|
| Critical | IndexNow notifications | Minutes to 1 hour |
| High | Sitemap lastmod recent | 1–24 hours |
| Medium | Internal links from high-authority pages | 1–7 days |
| Low | Exploratory crawl, old sitemap entries | 7–30 days |
Crawler Actions
When a crawler visits an IndexNow-notified URL:
- Fetch: The crawler requests the HTML document (and critical resources)
- Parse: Extracts content, links, metadata, structured data, images
- Render: For JavaScript-heavy sites, the crawler may render the page
- Compare: Checks if content actually changed (for updates)
- Quality Assessment: Evaluates content quality, relevance, uniqueness
- Index Decision: Determines whether to index, update, or ignore
- Store: Updates the search index with new content
- Cache: Updates cached version for search results
Server Log Evidence
After submitting via IndexNow, you should see crawler visits in your server logs within hours. Here’s an example:
# Example server log entries after IndexNow submission
203.0.113.1 - - [26/Jun/2026:14:32:01 +0000] "GET /new-blog-post HTTP/1.1" 200 4521 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
203.0.113.2 - - [26/Jun/2026:14:33:15 +0000] "GET /new-blog-post HTTP/1.1" 200 4521 "-" "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"Indexing Process: From Crawl to Search Results
Crawling and indexing are distinct processes that often get confused:
| Process | Definition | Outcome | Timeframe |
|---|---|---|---|
| Crawling | Fetching and reading a web page | Content is retrieved and analyzed | Minutes to hours |
| Indexing | Adding the page to the search engine’s database | Page becomes eligible for search results | Hours to days |
| Ranking | Determining position in search results | Position in SERPs for queries | Ongoing |
The Indexing Pipeline
┌─────────┐ ┌──────────────┐ ┌─────────────────┐
│ Crawl │───▶│ Content │───▶│ Quality │
│ Complete│ │ Analysis │ │ Assessment │
└─────────┘ └──────────────┘ └────────┬────────┘
│
┌────────┴────────┐
▼ ▼
┌──────────┐ ┌──────────┐
│ Pass │ │ Fail │
└────┬─────┘ └────┬─────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Add to │ │ Skip or │
│ Index │ │ De-index │
└────┬─────┘ └──────────┘
│
▼
┌──────────┐
│ Ranking │
│ Algorithm│
└────┬─────┘
│
▼
┌──────────┐
│ SERP │
│ Position │
└──────────┘Important: IndexNow accelerates crawling and discovery, but it doesn’t guarantee indexing or influence ranking. The search engine still evaluates content quality before adding it to the index.
Ranking vs. Indexing: The Critical Distinction
This is the most commonly misunderstood aspect of IndexNow. Let’s be clear:
IndexNow helps search engines DISCOVER and CRAWL your content faster. It does NOT directly improve your RANKINGS.
What IndexNow Actually Impacts
| Metric | Impact | Explanation |
|---|---|---|
| Discovery Speed | ✅ Dramatically improved | URLs found in minutes instead of days |
| Crawl Efficiency | ✅ Improved | Only changed URLs are crawled |
| Indexing Speed | ✅ Improved | Faster crawling leads to faster indexing |
| Ranking Position | ❌ No direct impact | Rankings depend on content quality, relevance, authority |
| Click-Through Rate | ⚠️ Indirect | Fresher snippets may improve CTR |
The Indirect Ranking Benefits
While IndexNow doesn’t directly affect rankings, faster indexing creates indirect benefits:
- First-Mover Advantage: For trending topics, being indexed first means capturing traffic before competitors
- Freshness Signals: Some ranking algorithms favor fresh content for time-sensitive queries
- Accurate Information: Updated product information (prices, availability) improves conversion rates
- User Experience: Current information reduces bounce rates, which may indirectly influence rankings
Example Scenario:
Query: "iPhone 16 Pro review"
Your site: Publishes review at 10:00 AM, submits via IndexNow at 10:01 AM
Competitor: Publishes review at 10:00 AM, relies on traditional crawling
Result: Your review is indexed by 10:30 AM and starts ranking.
Competitor's review is discovered at 2:00 PM and indexed by 6:00 PM.
You capture 8 hours of search traffic with minimal competition.
This isn't because IndexNow improved your ranking—it's because
your content was available to rank while your competitor's wasn't.Cache Updates
When a search engine crawls an IndexNow-submitted URL, it updates several cache layers:
Types of Cache Updates
| Cache Type | What Updates | Timeline |
|---|---|---|
| Search result snippet | Title, description, rich results | Hours |
| Page cache | Cached version of the page | Hours to days |
| Image index | New or changed images | Hours to days |
| Structured data cache | Rich snippets, knowledge panels | Hours to days |
| Link graph | New outbound links discovered | Days |
Crawl Budget Implications
IndexNow has big implications for crawl budget management.
Before IndexNow: The Waste Problem
Daily Crawl Budget: 50,000 pages
Changed Pages Today: 500 pages
Unchanged Pages: 49,500 pages
Wasted Crawls: 49,500 (99% of budget!)After IndexNow: Targeted Efficiency
Daily Crawl Budget: 50,000 pages
IndexNow-submitted Pages: 500 pages
Additional Exploratory: 10,000 pages (search engine's choice)
Remaining Budget: 39,500 for deep discovery
Efficiency Gain: MassiveThe Promise of Future Crawl Reduction
Bing has stated that search engines may reduce exploratory crawling for sites that consistently use IndexNow accurately. This means:
- Less server load
- Lower bandwidth costs
- Reduced hosting expenses
- Better environmental sustainability
Official Statement from Bing: “By telling search engines whether a URL has been changed, website owners provide a clear signal helping search engines to prioritize crawl for these URLs, thereby limiting the need for exploratory crawl to test if the content has changed. In the future, search engines intend to limit crawling of websites adopting IndexNow.”
Key Takeaways
✅ IndexNow workflow: Content changes → Generate key → Host key file → Send API request → Search engine validates → URLs shared across engines → Crawler visits → Content indexed
✅ Three change types trigger submissions: New URLs, updated URLs, deleted URLs
✅ POST requests are preferred for production (supports 10,000 URLs per batch)
✅ GET requests work for single URLs and testing
✅ Key file must be at domain root, accessible via HTTPS, containing only the key
✅ One submission reaches ALL participating engines automatically
✅ IndexNow accelerates discovery and crawling, not ranking
✅ Proper implementation can reduce bot traffic by 20–40%
✅ Search engines may reduce exploratory crawling for accurate IndexNow users
Previous: Part 1: What is IndexNow?
Next: Part 3: Why Use IndexNow?
Related Articles
Deepen your understanding with these curated continuations.

IndexNow API Deep Dive: Mastering JSON Payloads & Key Verifications
Advanced guide to the IndexNow API. Learn JSON request payload structure, batch submission strategies, and error handling.

IndexNow Implementation Guide: WordPress, Shopify, Wix & Custom
Step-by-step implementation guide for IndexNow. Learn how to set up IndexNow on WordPress, Shopify, Wix, Squarespace, and Cloudflare.

Which Search Engines Support IndexNow? Complete Guide
Find out which search engines support IndexNow, how they share submitted URLs, and how it impacts AI search engines like ChatGPT.



