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.
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.
- Why Instant Indexing Matters
- IndexNow Protocol
- Google Indexing API
- Comparison: IndexNow vs. Google Indexing API
- Monitoring and Troubleshooting
- Automation Workflows
- When This Approach Isn't Right
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:Instant Indexing Solves This
IndexNow and Indexing API timeline:- 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
How IndexNow Works
https://example.com/{API_KEY}.txt (validates ownership)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 & Admin → Service 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 Settings → Users 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 Console → IAM & Admin → Quotas
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
Pays for itself in the first week.