IndexNow and Indexing APIs for Vue Sites · Nuxt SEO

-
-
-
-

[1.4K](https://github.com/harlan-zw/nuxt-seo)

[Nuxt SEO on GitHub](https://github.com/harlan-zw/nuxt-seo)

Learn SEO

Master search optimization

Nuxt

 Vue

-
-
-
-
-
-
-

-
-
-
-
-
-
-

-
-
-

-
-
-
-
-
-
-
-
-
-
-

-
-
-

-
-
-
-
-
-
-
-
-

1.
2.
3.
4.
5.

# IndexNow and Indexing APIs for Vue Sites

Notify search engines instantly when content changes using IndexNow, Google Indexing API, and RequestIndexing.

[![Harlan Wilton](https://avatars.githubusercontent.com/u/5326365?v=4)Harlan Wilton](https://x.com/harlan-zw)8 mins read Published Dec 17, 2025 Updated Jan 29, 2026

What you'll learn

- Bing, Yandex, Naver, and Seznam fully support IndexNow
- Google does **not** support IndexNow as of 2026
- Google Indexing API is strictly for JobPosting and BroadcastEvent schema

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 Protocol](#indexnow-protocol)

IndexNow is an [open-source protocol](https://www.indexnow.org/) 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:

- **Microsoft Bing** - Primary supporter and developer
- **Yandex** - Russian search engine
- **Seznam.cz** - Czech search engine
- **Naver** - Korean search engine
- **Yep** - Privacy-focused search engine

**Important:** Google does not support IndexNow. Use Google Search Console's manual "Request Indexing" feature or third-party tools (covered below).

### [When to Use IndexNow](#when-to-use-indexnow)

Use IndexNow when:

- Publishing new content (blog posts, product pages)
- Updating existing pages (price changes, corrections)
- Deleting pages (discontinued products, removed content)
- Fixing critical errors on important pages
- Running time-sensitive content (news, events, flash sales)

Don't use IndexNow for:

- Minor text edits or typo fixes
- Styling or layout changes
- Pages already noindexed via robots meta tag
- Private or staging content

### [Setting Up IndexNow](#setting-up-indexnow)

Generate an API key (8-128 alphanumeric characters):

```
openssl rand -hex 32
```

Create a key file in your `public` directory:

public/abc123def456.txt

```
abc123def456
```

The key must be accessible at `https://yoursite.com/{key}.txt` for verification.

### [Submitting URLs](#submitting-urls)

Submit URLs after content changes. One notification reaches all IndexNow engines.

Express

Vite Plugin

H3 API Route

CMS Integration

```
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](#google-indexing-api)

[Google Indexing API](https://developers.google.com/search/apis/indexing-api/v3/quickstart) works differently than IndexNow. It's limited to **JobPosting** and **BroadcastEvent** schema types only.

Don't use Google Indexing API for:

- Blog posts
- Product pages
- General website content
- News articles
- Landing pages

Only use it if your site has:

- Job listings with JobPosting schema
- Livestream videos with BroadcastEvent schema

Using the API for other content types violates Google's terms and gets ignored. [Google confirmed](https://www.seroundtable.com/google-indexing-api-other-content-types-32957.html) it won't help or hurt. it's simply ignored.

### [2025 API Changes](#_2025-api-changes)

Google now requires approval for Indexing API access. The [default quota is 200 requests](https://developers.google.com/search/apis/indexing-api/v3/quota-pricing) 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](https://developers.google.com/search/apis/indexing-api/v3/quickstart) and request quota increases through Google Search Console.

## [RequestIndexing Tool](#requestindexing-tool)

[RequestIndexing](https://requestindexing.com/) by [@harlan_zw](https://x.com/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:

- Bulk indexing after site migration
- Re-indexing updated content
- Submitting new pages when sitemaps aren't crawled quickly
- Emergency indexing for time-sensitive content

Limitations:

- Requires Google Search Console access
- Subject to Google's rate limits
- Not instant (still requires Googlebot crawling)
- Manual process, not integrated into your build

## [Choosing the Right Method](#choosing-the-right-method)

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.

## [Implementation Checklist](#implementation-checklist)

1. Generate IndexNow API key
2. Add key file to `/public/{key}.txt`
3. Create server endpoint to call IndexNow API
4. Trigger notifications in publish/update workflows
5. Submit sitemap to Google Search Console
6. Use RequestIndexing for bulk Google submissions
7. Monitor Search Console for indexing status

## [Using Nuxt?](#using-nuxt)

Nuxt SEO provides automatic IndexNow integration with zero-config setup and auto-detection.

Learn more in the

.

---

On this page

- [IndexNow Protocol](#indexnow-protocol)
- [Google Indexing API](#google-indexing-api)
- [RequestIndexing Tool](#requestindexing-tool)
- [Choosing the Right Method](#choosing-the-right-method)
- [Implementation Checklist](#implementation-checklist)
- [Using Nuxt?](#using-nuxt)

[GitHub](https://github.com/harlan-zw/nuxt-seo) [ Discord](https://discord.com/invite/275MBUBvgP)

###

-
-

Modules

-
-
-
-
-
-
-
-
-

###

-
-
-

###

Nuxt

-
-
-
-
-

Vue

-
-
-
-
-
-
-
-

###

-
-
-
-
-
-
-
-
-
-

Copyright © 2023-2026 Harlan Wilton - [MIT License](https://github.com/harlan-zw/nuxt-seo/blob/main/license) · [mdream](https://mdream.dev)