IndexNow tells search engines the moment a page changes. One verification file has to sit at the root of your domain. Our team handles the setup during onboarding, and the submissions afterwards are ours: this page is here so you can check the work, or do it yourself if you prefer.
What is IndexNow
IndexNow is an open protocol that lets a website tell search engines the moment a page is added, updated or deleted, instead of waiting for a crawler to find the change. The engines that implement it are listed in the official specification, linked at the foot of this page.
How the setup works
A secret key is generated. A small text file holding that key is hosted at the root of the domain, so the engines can verify who owns the site. The same key comes to us on your shared channel, and from then on your URLs are submitted whenever content changes.
1. Generate a key
The key is 8 to 128 characters, letters, numbers and dashes only. A random hex string works: any UUID with the dashes removed will do, or openssl rand -hex 16 in a terminal.
texta1b2c3d4e5f67890abcdef12345678902. Host the key file
A UTF-8 text file named after the key, whose contents are exactly the key: nothing else, no quotes, no extra whitespace. It has to answer at the root of the domain. Pick your framework in the list beside this for the steps.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt3. Send us the key
Once the file is live, the key goes to us on Slack or by email and the submissions start. One key file per domain is enough: the same key works across every engine that supports IndexNow.
HTML and static websites
For a static site on FTP or cPanel, or on S3, Netlify, Vercel, GitHub Pages and the like.
1. Create the key file
A plain-text file named after the key. Its only contents are the key: no quotes, no line breaks, no HTML.
texta1b2c3d4e5f67890abcdef12345678902. Upload it to the site root
The file goes in the same folder as index.html, often called public_html, www or htdocs. FTP, SFTP or the host's file manager, whichever you use.
3. Verify it
Open this URL in a browser. It has to return the key as plain text. A 404 or your homepage means the file is not being served from the root.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
React (Vite or CRA)
Vite and Create React App both copy everything inside the public folder to the site root at build time, which is exactly what IndexNow needs.
1. Drop the key file in public/
A file at public/{your-key}.txt whose only contents are the key.
texta1b2c3d4e5f67890abcdef12345678902. Build and deploy
Run the usual build command and deploy. The file is then served at the root of the domain.
bash# Vite npm run build && npm run preview # Create React App npm run build3. Verify it
Open the URL in a browser. It has to return the key as plain text.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
Next.js
Identical for the App Router and the Pages Router: Next.js serves anything in the public folder at the site root.
1. Add the key file to public/
At the project root, in public/{your-key}.txt.
texta1b2c3d4e5f67890abcdef12345678902. Deploy
Push to Vercel or your host as usual. The file must not go under app/ or pages/: only files inside public/ are served as static assets at the root domain.
3. Verify it
Open the URL in a browser. It has to return the key as plain text.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
WordPress
Three routes in. Pick whichever fits how the site is usually managed.
Option 1: an SEO plugin (recommended)
Rank Math, Yoast SEO and All in One SEO all support IndexNow. Enable it in the plugin settings and copy the generated key. The plugin hosts the key file for you, so there is nothing to upload.
Option 2: upload the file over FTP or cPanel
Without an SEO plugin, the key file goes in the WordPress install root, the folder holding wp-config.php, usually public_html.
texta1b2c3d4e5f67890abcdef1234567890Option 3: add a route in functions.php
If files cannot be uploaded but the theme can be edited, this snippet serves the key. Replace YOUR_KEY with the real one.
phpadd_action('init', function () { $key = 'YOUR_KEY'; if ($_SERVER['REQUEST_URI'] === '/' . $key . '.txt') { header('Content-Type: text/plain; charset=utf-8'); echo $key; exit; } });Verify it
Open the URL in a browser. It has to return the key as plain text.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
Vue.js and Nuxt
Vue 3 with Vite and Nuxt 3 both ship a public folder whose contents are served at the site root.
Vue 3 (Vite)
The file goes at public/{your-key}.txt.
texta1b2c3d4e5f67890abcdef1234567890Nuxt 3
The file goes at public/{your-key}.txt in the Nuxt project root. Nuxt copies it to the site root on build.
Verify it
Open the URL in a browser. It has to return the key as plain text.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
Cloudflare
Two options, depending on whether the site runs on Cloudflare Pages or behind a Worker.
Cloudflare Pages
The key file goes in the repository's static output directory, typically public or dist depending on the framework. Commit and push: Pages serves it at the site root.
texta1b2c3d4e5f67890abcdef1234567890Cloudflare Workers
With a Worker in front of the site, it intercepts the request and answers with the key. Replace YOUR_KEY with the real one.
javascriptexport default { async fetch(request, env, ctx) { const url = new URL(request.url); const key = "YOUR_KEY"; if (url.pathname === "/" + key + ".txt") { return new Response(key, { headers: { "Content-Type": "text/plain; charset=utf-8" }, }); } // Pass through everything else return fetch(request); }, };Verify it
Open the URL in a browser. It has to return the key as plain text.
urlhttps://yoursite.com/a1b2c3d4e5f67890abcdef1234567890.txt
The other documents
The rest of the documentation, in the same place.