IndexNow and Google's Indexing API both let a site say "this URL changed" instead of waiting for a crawler to notice. They do not talk to the same systems, and they do not accept the same kinds of pages. Treating them as two buttons for the same job is how publishers send ordinary articles to an API that will not use them, or skip a simple notification that would have told other engines the story was updated.

A notification is not an index decision. IndexNow's own documentation says an HTTP 200 only means the engine received the URL. Google's Indexing API documentation says submissions are checked for spam, and that the API exists so Google can schedule a fresh crawl of specific page types. Scheduling a crawl is not a promise that the URL stays in results.

What IndexNow asks you to do

IndexNow is an open protocol. Participating search engines share submitted URLs with one another, so you do not have to call each engine separately. The protocol's site describes it as a ping that a URL was added, updated, or deleted.

You prove you control the host by publishing a key file. The key is 8 to 128 characters and may contain letters, digits, and dashes. The simplest setup is a UTF-8 text file at the root, named {key}.txt, whose body is the key. You can instead put the file deeper on the same host and send keyLocation with every request. A key file in /catalog/ can only vouch for URLs under /catalog/. The root file is the one IndexNow recommends.

A single URL is a GET request to the engine's IndexNow endpoint with url and key. A batch is a JSON POST with host, key, and urlList. One post can carry up to 10,000 URLs, and the list may mix http and https. The response codes in the protocol docs are specific: 200 means the URL was received, 202 means it was received and key validation is still pending, 400 means the format is invalid, 403 means the key is missing or does not match the file, 422 means the URLs do not belong to the host or the key location does not cover them, and 429 means you are sending too much.

Submit the canonical URL, on a real change, including deletions. Do not ping on every typo fix if you are also rebuilding the page every few minutes for a view counter. The protocol asks you to automate submission when content is added, updated, or deleted, within reason.

IndexNow is not Google Search's indexing channel. Calling it does not notify Google. If a tool in your CMS says it "submits to all search engines" through IndexNow, read that as "participating IndexNow engines". Google's path for the pages it documents is the Indexing API, sitemaps, and ordinary crawling.

What Google's Indexing API asks you to do

Google's quickstart limits the Indexing API to pages that contain JobPosting structured data or a BroadcastEvent embedded in a VideoObject. Those are short-lived pages: a job that expires, a livestream that starts and ends. The API can notify Google of a new or updated URL (URL_UPDATED), notify Google that a URL was removed (URL_DELETED), check the last notification Google received for a URL, and batch up to 100 calls in one HTTP request.

The default quota is 200 requests, described as the allowance for onboarding and submission testing. Higher quota requires Google's approval. Using multiple accounts to get around the quota is called out as abuse and can get access revoked.

Setup is a Google Cloud project with the Indexing API enabled, a service account, and that service account added as an owner of the Search Console property. The calls are authenticated. A key file on the website is not the credential. The service-account walkthrough on this site is the setup sequence if you actually publish jobs or livestreams.

Google's quickstart also says that for sites full of short-lived job or livestream URLs, the Indexing API is preferable to waiting on a sitemap, because it can prompt a crawl sooner. It still tells you to submit a sitemap for the rest of the site. The API does not replace sitemaps, and it does not apply to the news article you posted this morning unless that page is genuinely a job posting or a livestream video page.

Side by side

Question IndexNow Google Indexing API
Who receives it Participating IndexNow engines, which share URLs with each other Google
Pages it is meant for URLs on the verified host Job posting pages and livestream video pages
How you prove control Key file on the host Cloud service account that owns the Search Console property
Batch size documented Up to 10,000 URLs in one post Up to 100 calls in one HTTP request
Default Google quota Not a Google API 200 requests for onboarding, more only with approval
What success means The engine received the URL Google received a notification it may use to schedule a crawl
Ordinary articles Appropriate to send to participating engines Outside the documented page types

What to use for a normal article

For Bing and the other engines in IndexNow, send the article URL when you publish it, when you update it in a way that matters, and when you delete it. Keep the key file at the root and monitor 403 and 422 responses so a redesigned host does not silently drop the key.

For Google, put the article in the XML sitemap with an accurate lastmod, and link it from the section page. That pairing is the sitemap guide plus the internal linking guide. For a handful of URLs where you need a person to look at Google's view, use URL Inspection and, if the live test is clean, the manual request. The Indexing API versus manual inspection article explains why that manual request is the Google tool for ordinary pages, and why it is not a bulk pipe.

Do not point a plugin at the Indexing API for every blog post because the plugin offers a toggle. The quickstart limits the page types. Notifications for other types are outside that purpose, and Google says abuse can cost you the quota you might later need for real job pages.

A publishing pipeline that keeps the channels apart

  1. Publish the canonical URL. Confirm it returns 200, is not noindex, and is not blocked in robots.txt.
  2. Update the sitemap lastmod for that URL only.
  3. Add the internal links from the section and from related stories.
  4. Send the URL to IndexNow for participating engines.
  5. If, and only if, the page is a job posting or a livestream video page, send URL_UPDATED through the Indexing API. If you removed it, send URL_DELETED.
  6. Watch Search Console for Google and the participating engines' webmaster tools for the rest. A 200 from either protocol is not the same screen as "URL is on Google".

If the article is still unindexed on Google after a clean live test, the next questions are duplication and whether the page is worth keeping. Those are in the indexing diagnostic. Another IndexNow ping will not answer them.

Failures that look like success

The key file returns HTML because the site has a single-page fallback for every path. IndexNow then answers 403 or 422, or it accepts the URL and fails validation. Serve the key file as the raw key text.

The URL in the payload is the staging host or a parameter copy. You have asked engines to prioritise the wrong URL. Send the canonical. The canonical guide is how that URL is chosen.

The Indexing API returns success for a page type you hoped was close enough. Read the metadata for the notification, and still judge the URL in Search Console. A successful API call on an ineligible page is not a new indexing method. It is a call Google may ignore.

Quota errors on the Indexing API are not a reason to create a second project and a second owner. That is the abuse case the quickstart describes. If you publish more than the default allowance of eligible pages, request a quota increase.

Use IndexNow for the engines that participate, use the Indexing API for the two page types Google documents, and use sitemaps plus links for everything you want Google to discover as ordinary content. The next URL you publish should go out on the channel that matches the page, not on every channel the CMS can reach.

CrawlFaster is built for eligible Indexing API notifications and for watching indexing status afterward. It does not turn a news article into a job posting, and it should not be asked to.