Indexing & API8 min readβ€’July 18, 2026β€’Updated: August 12, 2026β€’640 Reads

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.

πŸ‘¨β€πŸ’»
Anik Chowdhury
Founder & Lead Technical SEO Architect
Founder & Chief Technical SEO Architect, Search Automation Specialist
Share:

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.”

Executive Summary β€” Key Takeaways
  • 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:

  1. Generate a unique 8-to-128 character hexadecimal API key (e.g. c3a8e9124bf048b2a19e8432104523ad).
  2. Create a plain text file named c3a8e9124bf048b2a19e8432104523ad.txt containing the key string inside.
  3. Upload the file to your domain root: https://yourdomain.com/c3a8e9124bf048b2a19e8432104523ad.txt.
  4. 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

Terminal Window
cURL / HTTP
GET https://api.indexnow.org/indexnow?url=https://smallseoengine.com/blog/article-1&key=c3a8e9124bf048b2a19e8432104523ad

2. 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:

Terminal Window
JSON
{
  "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:

Terminal Window
PHP
<?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:

Terminal Window
TYPESCRIPT
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:

Terminal Window
TYPESCRIPT
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:

Terminal Window
PYTHON
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 chunks

IndexNow 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):

Terminal Window
PHP
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.org returns 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 the host parameter to es.domain.com and set keyLocation to https://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:

Terminal Window
TYPESCRIPT
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.org times 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 .txt file and application environment variables.
  • Cloudflare Edge Cache Rules: Serve key files with Cache-Control: public, max-age=86400 to 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.

SmallSEOEngine Recommended Software

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.

Get Instant Indexing API

Frequently Asked Questions

IndexNow is natively supported by Microsoft Bing, Yandex, Seznam.cz, Naver, and participating search engines. Pings sent to any participating endpoint are automatically shared across all partner engines.
πŸ‘¨β€πŸ’»

Anik Chowdhury

Founder & Lead Technical SEO Architect

Founder & Chief Technical SEO Architect, Search Automation Specialist

Anik Chowdhury is the Founder & Lead Technical SEO Architect at SmallSEOEngine. He leads software development, AI search optimization engineering, and automated indexing infrastructure.

500+ SEO TOOLS SCRIPT & TRAFFIC MAGNET
View Script Overview

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.

500+ Automated Web & SEO Utilities
AdSense & Affiliate Monetization Ready

Related SEO Intelligence

Hand-picked articles to expand your search engineering authority.

View All Articles
Plugins & Software13 min read

Best Table of Contents Plugin for WordPress

Discover how automated heading extraction, floating drawers, sticky sidebars, and reading progress bars transform article navigation.

πŸ‘¨β€πŸ’»Anik Chowdhury
Read

SmallSEOEngine