SEO by Role 11 min read

IndexNow and Google Indexing API: Instant Indexing for Developers

Waiting for Google to discover new pages wastes days or weeks. IndexNow and Google Indexing API push URLs to search engines instantly. Here's how developers implement both protocols.

V
Victor Romo
|

IndexNow and Google Indexing API: Instant Indexing for Developers

Quick Summary

- What this covers: Waiting for Google to discover new pages wastes days or weeks. IndexNow and Google Indexing API push URLs to search engines instantly. Here's how developers implement both protocols.

- Who it's for: SEO practitioners at every career stage

- Key takeaway: Read the first section for the core framework, then use the specific tactics that match your situation.

Google normally discovers new pages through crawling: Googlebot visits your site, finds links, adds them to the crawl queue, and eventually indexes them. This process takes days, weeks, or months depending on your site's crawl budget.

IndexNow and Google Indexing API bypass this delay by pushing URL changes directly to search engines the moment they happen. IndexNow is an open protocol supported by Microsoft Bing, Yandex, and others (not Google). Google Indexing API is Google's proprietary instant indexing system (limited to specific use cases).

This guide explains when to use each, how to implement them, API authentication, rate limits, and integration patterns for common CMS platforms and frameworks.

Why Instant Indexing Matters

Traditional Crawling is Slow

Timeline for new pages:
  • Publish page
  • Submit sitemap (optional)
  • Googlebot discovers page (1-7 days for established sites, weeks for new sites)
  • Googlebot crawls page
  • Google indexes page (if it passes quality checks)
  • Total time: 3-30 days depending on site authority and crawl budget. Problem: Time-sensitive content (news, events, flash sales) may be irrelevant by the time Google indexes it.

    Instant Indexing Solves This

    IndexNow and Indexing API timeline:
  • Publish page
  • Send API request notifying search engine
  • Search engine adds URL to crawl queue (within minutes)
  • Search engine crawls and indexes (within hours)
  • Total time: Hours instead of days/weeks. Use cases:
    • News sites (breaking news must be indexed immediately)
    • E-commerce (new products, price changes, stock updates)
    • Job boards (job postings expire quickly)
    • Event sites (tickets go on sale, events get canceled)

    IndexNow Protocol

    What it is: Open protocol for notifying search engines of URL changes. Supported by:
    • Microsoft Bing
    • Yandex
    • Seznam.cz
    • Naver
    NOT supported by: Google (as of 2026—Google uses its own Indexing API)

    How IndexNow Works

  • Generate an API key (any string, e.g., UUID)
  • Host the key at https://example.com/{API_KEY}.txt (validates ownership)
  • Send POST request to IndexNow endpoint with list of URLs
  • Search engines crawl the URLs within hours
  • Generating an API Key

    Method 1: Generate UUID

    ``bash

    uuidgen

    Output: 3b7a6f2c-9d8e-4a1b-8c5f-2e9a6d4c1f8b

    ` Method 2: Use any 32+ character string `bash

    openssl rand -hex 16

    Output: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

    ` Host the key: Create file at: https://example.com/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6.txt Content: (Can be empty or contain the key) `

    a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

    `

    IndexNow API Request

    Endpoint:
    `

    https://api.indexnow.org/indexnow

    ` Method: POST or GET Parameters:

    | Parameter | Required | Description |

    |-----------|----------|-------------|

    | host | Yes | Your domain (e.g., example.com) |

    | key | Yes | Your API key |

    | urlList | Yes | Array of URLs to notify (max 10,000 URLs per request) |

    | keyLocation | No | URL of key file (default: https://example.com/{key}.txt) |

    Example (JSON POST): `bash

    curl -X POST https://api.indexnow.org/indexnow \

    -H "Content-Type: application/json" \

    -d '{

    "host": "example.com",

    "key": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",

    "urlList": [

    "https://example.com/new-page",

    "https://example.com/updated-page"

    ]

    }'

    ` Example (GET): `bash

    curl "https://api.indexnow.org/indexnow?url=https://example.com/new-page&key=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"

    ` Response:
    • 200 OK: Request accepted (URLs added to crawl queue)
    • 400 Bad Request: Invalid parameters
    • 403 Forbidden: Key validation failed (key file not found or doesn't match)
    • 429 Too Many Requests: Rate limit exceeded

    IndexNow Rate Limits

    No official rate limits as of 2026, but recommended:
    • Submit URLs as batches (up to 10,000 per request)
    • Avoid submitting same URL repeatedly within 24 hours
    Best practice: Only submit URLs when content changes (new page, update, delete).

    IndexNow Implementation Examples

    Node.js (Express)

    Install dependencies:
    `bash

    npm install axios

    ` Function to submit URLs: `javascript

    const axios = require('axios');

    async function submitToIndexNow(urls) {

    const API_KEY = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6';

    const HOST = 'example.com';

    try {

    const response = await axios.post('https://api.indexnow.org/indexnow', {

    host: HOST,

    key: API_KEY,

    urlList: urls,

    });

    console.log('IndexNow response:', response.status);

    } catch (error) {

    console.error('IndexNow error:', error.response?.data || error.message);

    }

    }

    // Usage

    submitToIndexNow([

    'https://example.com/new-page',

    'https://example.com/updated-page'

    ]);

    `

    Python (Flask)

    Install dependencies:
    `bash

    pip install requests

    ` Function to submit URLs: `python

    import requests

    def submittoindexnow(urls):

    API_KEY = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6'

    HOST = 'example.com'

    payload = {

    'host': HOST,

    'key': API_KEY,

    'urlList': urls

    }

    response = requests.post('https://api.indexnow.org/indexnow', json=payload)

    print(f'IndexNow response: {response.status_code}')

    Usage

    submittoindexnow([

    'https://example.com/new-page',

    'https://example.com/updated-page'

    ])

    `

    WordPress (Plugin or Functions.php)

    Add to
    functions.php: `php

    function submittoindexnow($urls) {

    $api_key = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6';

    $host = 'example.com';

    $payload = json_encode([

    'host' => $host,

    'key' => $api_key,

    'urlList' => $urls

    ]);

    $response = wpremotepost('https://api.indexnow.org/indexnow', [

    'headers' => ['Content-Type' => 'application/json'],

    'body' => $payload

    ]);

    if (iswperror($response)) {

    errorlog('IndexNow error: ' . $response->geterror_message());

    }

    }

    // Hook into post publish/update

    addaction('savepost', function($post_id) {

    $post = getpost($postid);

    if ($post->post_status === 'publish') {

    $url = getpermalink($postid);

    submittoindexnow([$url]);

    }

    });

    `

    Google Indexing API

    What it is: Google's proprietary instant indexing API. Supported use cases:
    • Job postings (JobPosting structured data)
    • Livestream videos (BroadcastEvent structured data)
    NOT supported:
    • General web pages
    • Blog posts
    • Product pages
    • News articles
    Why the limitation: Google restricts the API to high-velocity, time-sensitive content to prevent abuse. For other content, use traditional sitemaps.

    Google Indexing API Setup

    Step 1: Create Google Cloud Project

  • Go to Google Cloud Console
  • Create new project (e.g., "Indexing API")
  • Enable Google Indexing API (APIs & Services → Library → search "Indexing API" → Enable)
  • Step 2: Create Service Account

  • Go to IAM & AdminService Accounts
  • Click Create Service Account
  • Name: "Indexing API Bot"
  • Grant role: Indexing API Owner
  • Create key (JSON format) → Download
  • JSON key file looks like:
    `json

    {

    "type": "service_account",

    "project_id": "your-project-id",

    "privatekeyid": "...",

    "private_key": "-----BEGIN PRIVATE KEY-----\n...",

    "client_email": "[email protected]"

    }

    `

    Step 3: Grant Access in Google Search Console

  • Go to Google Search Console for your site
  • Click SettingsUsers and permissions
  • Click Add user
  • Enter service account email (e.g., [email protected])
  • Select Owner permission
  • Click Add
  • This allows the service account to submit URLs for your site.

    Google Indexing API Requests

    Endpoint:
    `

    https://indexing.googleapis.com/v3/urlNotifications:publish

    ` Authentication: OAuth 2.0 using service account credentials. Request body: `json

    {

    "url": "https://example.com/job-posting",

    "type": "URL_UPDATED"

    }

    ` Types:
    • URL_UPDATED: Notify that URL was created or updated
    • URL_DELETED: Notify that URL was removed
    Rate limits:
    • 200 requests per day per site (free tier)
    • Can request quota increase via Google Cloud Console

    Implementation Examples

    Node.js (Using google-auth-library)

    Install dependencies:
    `bash

    npm install googleapis google-auth-library

    ` Code: `javascript

    const { google } = require('googleapis');

    async function submitToGoogleIndexing(url, type = 'URL_UPDATED') {

    const auth = new google.auth.GoogleAuth({

    keyFile: './service-account-key.json',

    scopes: ['https://www.googleapis.com/auth/indexing'],

    });

    const indexing = google.indexing({ version: 'v3', auth });

    try {

    const response = await indexing.urlNotifications.publish({

    requestBody: {

    url: url,

    type: type,

    },

    });

    console.log('Indexing API response:', response.data);

    } catch (error) {

    console.error('Indexing API error:', error.message);

    }

    }

    // Usage

    submitToGoogleIndexing('https://example.com/job-posting', 'URL_UPDATED');

    `

    Python (Using google-auth and google-api-python-client)

    Install dependencies:
    `bash

    pip install google-auth google-auth-httplib2 google-api-python-client

    ` Code: `python

    from google.oauth2 import service_account

    from googleapiclient.discovery import build

    def submittogoogleindexing(url, notificationtype='URL_UPDATED'):

    credentials = serviceaccount.Credentials.fromserviceaccountfile(

    'service-account-key.json',

    scopes=['https://www.googleapis.com/auth/indexing']

    )

    service = build('indexing', 'v3', credentials=credentials)

    body = {

    'url': url,

    'type': notification_type

    }

    response = service.urlNotifications().publish(body=body).execute()

    print('Indexing API response:', response)

    Usage

    submittogoogleindexing('https://example.com/job-posting', 'URLUPDATED')

    `

    Comparison: IndexNow vs. Google Indexing API

    | Feature | IndexNow | Google Indexing API |

    |---------|----------|---------------------|

    | Supported search engines | Bing, Yandex, Seznam, Naver | Google only |

    | Setup complexity | Simple (generate key, host file) | Complex (Google Cloud, service account) |

    | Use cases | Any content | Job postings, livestreams only |

    | Rate limits | None (recommended: batch submissions) | 200/day (free tier) |

    | Authentication | API key | OAuth 2.0 service account |

    | Cost | Free | Free (200/day), paid for higher limits |

    Strategy: Implement both if you have job postings or livestreams. Use IndexNow for general content (to reach Bing/Yandex).

    Monitoring and Troubleshooting

    IndexNow Debugging

    Check if key file is accessible:
    `bash

    curl https://example.com/a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6.txt

    ` Should return 200 OK. Common errors:
    • 403 Forbidden: Key file not found or doesn't match submitted key
    • 400 Bad Request: Invalid JSON or missing required fields
    • 429 Too Many Requests: Submitting too frequently (wait 24 hours between duplicate submissions)

    Google Indexing API Debugging

    Check quota usage:
  • Go to Google Cloud ConsoleIAM & AdminQuotas
  • Search "Indexing API"
  • View current usage
  • Common errors:
    • 403 Forbidden: Service account not granted Owner permission in Google Search Console
    • 401 Unauthorized: Invalid or expired service account credentials
    • 429 Too Many Requests: Exceeded daily quota (200 requests)
    Verify service account has correct role:
    `bash

    gcloud projects get-iam-policy YOURPROJECTID \

    --flatten="bindings[].members" \

    --filter="bindings.members:serviceAccount:YOURSERVICEACCOUNT_EMAIL"

    `

    Automation Workflows

    On New Content Publish

    Trigger: New blog post published Workflow:
  • Publish post via CMS
  • CMS triggers webhook or post-save hook
  • Send URLs to IndexNow
  • If job posting: Also send to Google Indexing API
  • On Content Update

    Trigger: Existing page updated Workflow:
  • Update content
  • Send URL_UPDATED to IndexNow
  • If job posting: Send URL_UPDATED to Google Indexing API
  • On Content Deletion

    Trigger: Page deleted Workflow:
  • Delete page (returns 404 or 410)
  • Send URL_DELETED to IndexNow
  • If job posting: Send URL_DELETED` to Google Indexing API
  • Note: Notify search engines of deletions to prevent crawling dead URLs. Take Action: Give Your AI a Memory

    Everything above gets easier when your AI already knows your business. The Claude Code + Obsidian setup builds persistent, file-based memory so context compounds instead of evaporating between sessions.

    Key Recap

    • Comparison: IndexNow vs. Google Indexing API: Everything above gets easier when your AI already knows your business.
    • Monitoring and Troubleshooting: Everything above gets easier when your AI already knows your business.
    • Automation Workflows: Everything above gets easier when your AI already knows your business.

    Frequently Asked Questions

    Does Google support IndexNow?

    No, as of 2026. Google has its own Indexing API for specific use cases. For general pages, use traditional sitemaps.

    Can I use Google Indexing API for blog posts?

    No. Google restricts the API to job postings and livestreams. Submitting other content may result in API access being revoked.

    How often can I submit URLs to IndexNow?

    No hard limit, but avoid submitting the same URL multiple times within 24 hours. Batch submissions recommended.

    Do instant indexing APIs guarantee ranking?

    No. They only guarantee discovery (search engine crawls the URL). Ranking depends on content quality, backlinks, and other signals.

    What happens if I submit a URL that returns 404?

    Search engine will crawl, see 404, and remove URL from index (as expected). Useful for notifying search engines of deletions.

    Can I submit competitor URLs to IndexNow?

    No. You must host the API key file on your domain to validate ownership. You can't submit URLs you don't control.

    Instant indexing isn't magic—it doesn't bypass Google's quality filters or force rankings. But for time-sensitive content (news, jobs, events), the difference between indexing in hours vs. weeks determines whether you capture traffic or miss it entirely.


    When This Approach Isn't Right

    This guidance may not fit if:

    • You're brand new to SEO. Some frameworks here assume working knowledge of crawling, indexing, and ranking fundamentals. Start with the basics first — this article builds on them.
    • Your site has fewer than 50 indexed pages. Some strategies (like cannibalization audits or hub-and-spoke restructuring) require a minimum content base. Focus on content creation before optimization.
    • You're working on a site with active penalties. Manual actions require a different playbook. Resolve the penalty first, then apply these optimization frameworks.

    Your AI Has Amnesia. Here's the Fix.

    $997. 90 minutes. One file that gives Claude permanent memory of your business, your clients, and your preferences.

    • Personal CLAUDE.md file built for your specific context
    • Obsidian vault structure optimized for AI retrieval
    • Claude Code configuration and hook scripts
    • Live 90-minute walkthrough of the entire system
    Get Your Setup - $997

    Pays for itself in the first week.