Search engines discover content changes through regular crawling, which can take days or weeks. Indexing APIs let you notify search engines immediately when you publish, update, or delete content.
IndexNow is an open-source protocol that notifies search engines instantly when URLs change. Instead of waiting for crawlers to discover updates, you push notifications directly to participating engines.
Supported search engines:
Important: Google does not support IndexNow. Use Google Search Console's manual "Request Indexing" feature or third-party tools (covered below).
Use IndexNow when:
Don't use IndexNow for:
Generate an API key (8-128 alphanumeric characters):
openssl rand -hex 32
Create a key file in your public directory:
abc123def456
The key must be accessible at https://yoursite.com/{key}.txt for verification.
Submit URLs after content changes. One notification reaches all IndexNow engines.
import express from 'express'
const app = express()
async function notifyIndexNow(urls: string[]) {
await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
host: 'yoursite.com',
key: 'abc123def456',
keyLocation: 'https://yoursite.com/abc123def456.txt',
urlList: urls
})
})
}
// Trigger after publishing
app.post('/api/publish', async (req, res) => {
// Save content to database
await db.posts.create(req.body)
// Notify search engines
await notifyIndexNow([`https://yoursite.com/blog/${req.body.slug}`])
res.json({ success: true })
})
// vite-plugin-indexnow.ts
import type { Plugin } from 'vite'
export function indexNowPlugin(options: { key: string, host: string }): Plugin {
return {
name: 'vite-plugin-indexnow',
async closeBundle() {
const urls = [
`https://${options.host}/`,
`https://${options.host}/about`,
// Add your generated URLs
]
await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
host: options.host,
key: options.key,
urlList: urls
})
})
console.log(`Notified IndexNow: ${urls.length} URLs`)
}
}
}
import { defineEventHandler, readBody } from 'h3'
export default defineEventHandler(async (event) => {
const { urls } = await readBody(event)
await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
host: 'yoursite.com',
key: process.env.INDEXNOW_KEY,
keyLocation: `https://yoursite.com/${process.env.INDEXNOW_KEY}.txt`,
urlList: urls
})
})
return { success: true, count: urls.length }
})
// In your CMS save handler
async function savePost(post) {
await database.save(post)
// Notify IndexNow if published
if (post.status === 'published') {
await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
host: 'yoursite.com',
key: process.env.INDEXNOW_KEY,
urlList: [post.url]
})
})
}
}
Submit up to 10,000 URLs per request. For single URLs, use GET:
https://api.indexnow.org/IndexNow?url=https://yoursite.com/page&key=abc123def456
Google Indexing API works differently than IndexNow. It's limited to JobPosting and BroadcastEvent schema types only.
Don't use Google Indexing API for:
Only use it if your site has:
Using the API for other content types violates Google's terms and gets ignored. Google confirmed it won't help or hurt—it's simply ignored.
Google now requires approval for Indexing API access. The default quota is 200 requests for testing. Production use requires partner authorization. Smaller job boards and recruitment sites lost direct access.
If you run a job board, follow the official quickstart and request quota increases through Google Search Console.
RequestIndexing by @harlan_zw automates bulk URL submission to Google Search Console. It uses your Search Console credentials to programmatically trigger the manual "Request Indexing" button for multiple URLs.
This isn't an official API—it automates the manual workflow. Google allows requesting indexing for individual URLs; RequestIndexing does this in bulk.
Use cases:
Limitations:
Pick based on search engine priority and content type:
| Method | Best For | Limitations |
|---|---|---|
| IndexNow | Bing/Yandex users, instant updates | Doesn't work for Google |
| Google Indexing API | Job boards, livestreams | JobPosting/BroadcastEvent only |
| RequestIndexing | Bulk Google submissions | Manual process, rate limited |
| Search Console Manual | One-off important pages | Slow, not scalable |
| XML Sitemap | Routine crawling | Passive, no urgency signal |
Recommendation: Implement IndexNow for all content changes. Your Bing and Yandex traffic gets instant updates. For Google, use XML sitemaps for routine discovery and RequestIndexing for bulk submissions after major updates.
Don't waste time on Google Indexing API unless you're a job board or livestream platform.
/public/{key}.txtNuxt SEO provides automatic IndexNow integration. See IndexNow documentation for zero-config setup with auto-detection and API key management.
Learn more in the Nuxt Launch & Listen guide.