The Ultimate Guide to IndexingNow API for Instant Search Engine Indexing
Stop waiting weeks for search engine crawlers. Learn how IndexingNow API automatically notifies Bing, Yandex, and participating engines the moment content is published.
Quick Answer
βThe IndexNow API is an open-source web protocol created by Microsoft Bing and Yandex that enables websites to push URL notification payloads instantly to participating search engines. A single HTTP GET or POST ping to api.indexnow.org notifies all participating crawlers simultaneously, reducing search discovery latency from weeks to seconds.β
- IndexNow allows single or batch (up to 10,000 URLs) submissions in a single HTTP payload.
- Validation is performed via a text key file (8-128 hex chars) placed in your site domain root directory.
- Pings submitted to Bing automatically sync across Yandex, Seznam, Naver, and participating search engines.
- Easily automate via our IndexingNow Pro WordPress Plugin or custom REST API hooks.
What is the IndexNow Protocol?
IndexNow is an open-source, event-driven web protocol initiated by Microsoft Bing and Yandex that allows website owners to instantly inform search engines whenever content is published, updated, or deleted. Rather than waiting for search engine crawlers to periodically discover changes through passive XML sitemaps, IndexNow enables proactive HTTP pings that trigger priority crawling within seconds.
If you are managing WordPress platforms, you can automate this using our IndexingNow Pro WordPress Plugin, enhance long-form UX with Smart TOC Pro, or audit your URL indexation status with our Free Bulk Indexing Status Inspector.
How IndexNow Key Verification Works
Security and authorization in IndexNow are maintained through a simple domain-root key file verification mechanism. Zero OAuth complex tokens are required:
- Generate a unique 8-to-128 character hexadecimal API key (e.g.
c3a8e9124bf048b2a19e8432104523ad). - Create a plain text file named
c3a8e9124bf048b2a19e8432104523ad.txtcontaining the key string inside. - Upload the file to your domain root:
https://yourdomain.com/c3a8e9124bf048b2a19e8432104523ad.txt. - When search engines receive an API ping with your key, they fetch the text file to confirm domain authorization before enqueuing your URLs.
Single URL GET Ping vs Batch JSON Payload
1. Single URL HTTP GET Ping
GET https://api.indexnow.org/indexnow?url=https://smallseoengine.com/blog/article-1&key=c3a8e9124bf048b2a19e8432104523ad2. Batch JSON Payload (Up to 10,000 URLs per payload)
For programmatic SEO websites, e-commerce stores, and news platforms publishing large volumes of content daily, send a POST payload to https://api.indexnow.org/indexnow:
{
"host": "smallseoengine.com",
"key": "c3a8e9124bf048b2a19e8432104523ad",
"keyLocation": "https://smallseoengine.com/c3a8e9124bf048b2a19e8432104523ad.txt",
"urlList": [
"https://smallseoengine.com/blog/article-1",
"https://smallseoengine.com/blog/article-2",
"https://smallseoengine.com/free-seo-tools/indexing-checker"
]
}3. PHP cURL Production Implementation Example
The PHP script below dispatches batch URL notifications directly from your server background hooks or WordPress theme save_post action:
<?php
function send_indexnow_batch_ping($urls) {
$domain = 'smallseoengine.com';
$key = 'c3a8e9124bf048b2a19e8432104523ad';
$payload = array(
'host' => $domain,
'key' => $key,
'keyLocation' => "https://{$domain}/{$key}.txt",
'urlList' => $urls
);
$ch = curl_init('https://api.indexnow.org/indexnow');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpCode === 200 || $httpCode === 202);
}
?>4. Next.js 14 App Router Route Handler (TypeScript API)
In modern Next.js 14 applications, trigger IndexNow pings inside your App Router Route Handler (e.g. app/api/indexing/indexnow/route.ts) whenever database records are mutated:
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
try {
const { urls } = await request.json();
const domain = 'smallseoengine.com';
const key = process.env.INDEXNOW_API_KEY || 'c3a8e9124bf048b2a19e8432104523ad';
if (!urls || !Array.isArray(urls) || urls.length === 0) {
return NextResponse.json({ error: 'urlList must be a non-empty array' }, { status: 400 });
}
const payload = {
host: domain,
key: key,
keyLocation: `https://${domain}/${key}.txt`,
urlList: urls.slice(0, 10000) // IndexNow batch cap
};
const response = await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json; charset=utf-8' },
body: JSON.stringify(payload)
});
return NextResponse.json({
success: response.ok,
statusCode: response.status,
submittedCount: urls.length
});
} catch (err: any) {
return NextResponse.json({ error: err.message }, { status: 500 });
}
}5. Cloudflare Worker Edge-Level IndexNow Dispatcher (TypeScript)
Modern Serverless and Edge architectures can dispatch IndexNow pings automatically when content changes occur in Cloudflare D1 or KV databases:
export interface Env {
INDEXNOW_KEY: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method Not Allowed', { status: 405 });
}
const { targetUrls } = await request.json<{ targetUrls: string[] }>();
const domain = 'smallseoengine.com';
const indexNowPayload = {
host: domain,
key: env.INDEXNOW_KEY,
keyLocation: `https://${domain}/${env.INDEXNOW_KEY}.txt`,
urlList: targetUrls
};
const res = await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json; charset=utf-8' },
body: JSON.stringify(indexNowPayload)
});
return new Response(JSON.stringify({ success: res.ok, status: res.status }), {
headers: { 'Content-Type': 'application/json' }
});
}
};6. Python Enterprise Batch Chunking Submitter
For large programmatic SEO platforms containing over 50,000 URLs, chunk the URL array into maximum batch payloads of 10,000 URLs per POST request:
import requests
import time
def submit_indexnow_enterprise_chunks(url_list, domain, api_key):
CHUNK_SIZE = 10000
endpoint = "https://api.indexnow.org/indexnow"
for i in range(0, len(url_list), CHUNK_SIZE):
chunk = url_list[i:i + CHUNK_SIZE]
payload = {
"host": domain,
"key": api_key,
"keyLocation": f"https://{domain}/{api_key}.txt",
"urlList": chunk
}
try:
r = requests.post(endpoint, json=payload, headers={"Content-Type": "application/json"})
print(f"[Batch {i // CHUNK_SIZE + 1}] Status: {r.status_code} | Count: {len(chunk)}")
except Exception as e:
print(f"[Batch {i // CHUNK_SIZE + 1}] Failed: {e}")
time.sleep(1) # Polite backoff between chunksIndexNow Integration Code for PHP Frameworks (Laravel & Symfony)
In PHP frameworks like Laravel, wrap IndexNow dispatching inside a dedicated Artisan console command or Eloquent model event listener (e.g. saved model hook):
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
use IlluminateSupportFacadesHttp;
class SendIndexNowPing extends Command {
protected $signature = 'indexnow:ping {urls*}';
protected $description = 'Dispatch batch IndexNow payload to Microsoft Bing';
public function handle() {
$urls = $this->argument('urls');
$domain = config('app.url_domain', 'smallseoengine.com');
$key = config('services.indexnow.key');
$response = Http::post('https://api.indexnow.org/indexnow', [
'host' => $domain,
'key' => $key,
'keyLocation' => "https://{$domain}/{$key}.txt",
'urlList' => $urls
]);
$this->info("IndexNow Response [{$response->status()}]: Submitted " . count($urls) . " URLs");
}
}IndexNow Rate Limits & Automated Exponential Backoff Handler
While IndexNow generously permits up to 10,000 URL submissions per day per domain host, automated bulk crawling scripts can occasionally trigger rate limits (HTTP 429). Implement exponential backoff retry algorithms to handle network congestion gracefully:
- Initial Retry Interval: If
api.indexnow.orgreturns HTTP 429 or 5xx server errors, wait 2 seconds before retrying. - Exponential Multiplier: Double the delay on each subsequent retry (2s, 4s, 8s, 16s) up to a maximum cap of 60 seconds.
- Batch Payload Slicing: If submitting over 5,000 URLs at once, split the array into smaller chunks of 1,000 URLs with a 500ms sleep delay between requests.
Enterprise Scaling: Managing Multi-Tenant IndexNow Pings Across Subdomains
SaaS platforms, multi-region e-commerce stores, and enterprise networks managing hundreds of subdomains (e.g. us.domain.com, uk.domain.com, app.domain.com) can streamline IndexNow verification using host-level key delegation:
- Single Master Key File: Place a single key file at your root domain:
https://domain.com/c3a8e9124bf048b2a19e8432104523ad.txt. - Subdomain Payload Delegation: When dispatching pings for subdomain URLs (e.g.
https://es.domain.com/landing-page), set thehostparameter toes.domain.comand setkeyLocationtohttps://domain.com/c3a8e9124bf048b2a19e8432104523ad.txt. - Cross-Host Verification: Search engine verification bots validate that the root domain key file grants authority to manage subdomain indexing events, eliminating the need to deploy text files across 100+ separate web servers.
Automated XML Sitemap Synchronization & Real-Time Diff Payload Engine
While IndexNow handles real-time single and batch URL pings, integrating IndexNow with your existing sitemap.xml infrastructure guarantees 100% synchronization without manual intervention. SmallSEOEngine recommends building an automated sitemap parser worker that executes every 6 hours:
import axios from 'axios';
import { parseStringPromise } from 'xml2js';
async function syncXmlSitemapWithIndexNow(sitemapUrl: string) {
const { data } = await axios.get(sitemapUrl);
const result = await parseStringPromise(data);
const urlEntries = result.urlset.url;
// Filter URLs updated in the last 24 hours
const now = new Date().getTime();
const recentlyUpdated = urlEntries.filter((entry: any) => {
const lastmod = new Date(entry.lastmod[0]).getTime();
return (now - lastmod) < 86400000;
}).map((entry: any) => entry.loc[0]);
if (recentlyUpdated.length > 0) {
console.log(`Dispatched ${recentlyUpdated.length} sitemap URLs to IndexNow`);
await axios.post('https://api.indexnow.org/indexnow', {
host: 'smallseoengine.com',
key: process.env.INDEXNOW_API_KEY,
keyLocation: 'https://smallseoengine.com/key.txt',
urlList: recentlyUpdated
});
}
}IndexNow Automated Failover & Disaster Recovery Protocol
Although api.indexnow.org automatically routes notifications across Bing, Yandex, and Seznam, building enterprise resilience requires secondary endpoint fallback:
- Multi-Endpoint Target Rotation: If
api.indexnow.orgtimes out, dispatch payloads directly to Bing's dedicated endpoint (www.bing.com/indexnow) or Yandex (yandex.com/indexnow). - Queue Persistence: Store failed URL submissions in a dead-letter queue (DLQ) for automatic retry after 1 hour.
- Response Verification: Monitor HTTP status codes. 200 OK confirms instant processing, while 202 Accepted indicates payload queued for validation.
IndexNow Protocol Multi-Language & International Domain Configuration (hreflang)
For international domains serving multi-regional content (e.g. https://smallseoengine.com/es/, https://smallseoengine.com/fr/), ensure your IndexNow key verification file is accessible across all sub-path locales. Alternatively, host a single key file at your root domain level and include all localized hreflang alternate URLs inside the same batch array payload.
IndexNow HTTP Response Status Codes Reference
When sending requests to api.indexnow.org, inspect the returned HTTP status code to ensure successful payload ingestion:
| HTTP Status | Status Meaning | Required Action |
|---|---|---|
| 200 OK | URL payload submitted and key successfully validated. | None. Enqueued for priority crawl. |
| 202 Accepted | Payload accepted; key validation deferred to background sweep. | None. Search engines will fetch key file shortly. |
| 400 Bad Request | Invalid JSON format, missing required parameters, or invalid URL scheme. | Verify JSON syntax and ensure all URLs begin with http:// or https://. |
| 403 Forbidden | Key not valid or key file not found at declared keyLocation URL. | Check domain root key file and ensure Cloudflare bot protection is not blocking Bingbot. |
| 422 Unprocessable Entity | Submitted URLs inside urlList do not match host property domain. | Ensure all URLs in urlList belong to the exact domain passed in host. |
| 429 Too Many Requests | Daily submission quota exceeded (over 10,000 URLs/day per host). | Implement exponential backoff or combine URLs into batch array pings. |
Key Rotation Security & Verification Best Practices
To prevent unauthorized third parties from submitting fake indexation pings for your domain, follow these security standards:
- Hexadecimal Key Generation: Generate keys using cryptographically secure random number generators (8 to 128 hex characters).
- Key Auto-Renewal: Rotate your IndexNow API key every 90 days. Update both your domain root
.txtfile and application environment variables. - Cloudflare Edge Cache Rules: Serve key files with
Cache-Control: public, max-age=86400to allow search engine verification bots fast access without stressing origin servers.
IndexNow vs Google Indexing API Comparison Overview
While IndexNow covers Microsoft Bing, Yandex, Seznam, and Naver, Google operates its own proprietary Indexing API. Learn more in our IndexNow vs. Google Indexing API Comparison Guide or integrate both using our Bulk Indexing Service.
Automate Google Instant Indexing in 2 Minutes
Connect Google Indexing API v3 and IndexNow to get published URLs indexed by Googlebot in under 15 minutes.
Frequently Asked Questions
Anik Chowdhury
Founder & Lead Technical SEO Architect
Anik Chowdhury is the Founder & Lead Technical SEO Architect at SmallSEOEngine. He leads software development, AI search optimization engineering, and automated indexing infrastructure.
Launch Your Own 500+ SEO Tools Portal & Drive 100K+ Organic Traffic
Get instant live demo access to our flagship 500+ PHP SEO & Web Tools Platform. Includes AI auto-blogging, 100% automated tool pages, AdSense monetization, and sub-15 minute Google Indexing API integration.
Related SEO Intelligence
Hand-picked articles to expand your search engineering authority.
How to Rank in Google AI Overviews & AI Mode: Complete 2026 GEO Guide
Learn how to optimize website content for Google AI Overviews, Google AI Mode, and Perplexity AI using Generative Engine Optimization (GEO), high vector similarity, and nested JSON-LD schema microdata.
How to Get Google Instant Indexing in 2026 Using Official Indexing APIs
Stop waiting weeks for Googlebot to discover your new content. Learn how to connect Google Indexing API v3 and IndexNow to get published URLs indexed within minutes with complete production code examples.
How Autonomous AI SEO Agents Are Transforming Organic Search Growth in 2026
Discover how autonomous AI SEO agents perform technical site audits, keyword intent cluster analysis, and real-time content optimization for Generative Engine Optimization (GEO).
Why Every Article Needs an Interactive Table of Contents for SEO Dwell Time
How adding dynamic TOC navigation improves user engagement, reduces bounce rate, and earns Google Search rich snippet jump links.
Best Table of Contents Plugin for WordPress
Discover how automated heading extraction, floating drawers, sticky sidebars, and reading progress bars transform article navigation.
How to Build a 500+ Online SEO Tools Website Platform in 5 Minutes
A comprehensive technical breakdown on launching client-side utility platforms using SQLite databases and automated PHP tool engines.