記事を公開しても、検索エンジンのクローラーが巡回してくれるまで検索結果には載りません。サイトの規模やクロール頻度によっては、これが数日単位のタイムラグになります。この構造を「こちらから通知する」方向にひっくり返すのが IndexNow です。

自分はRust用のクライアント indexnow-api を書いて公開しているので、プロトコルの仕組みから実装までを整理しておきます。

IndexNowって何

IndexNowは、サイトのコンテンツの追加・更新・削除を検索エンジンに即座に通知するオープンプロトコルです。2021年にMicrosoft(Bing)とYandexが共同で公開しました。仕組みは3ステップで説明が終わるくらいシンプルです。

  1. APIキーを生成し、キーファイルをサイトのルートに置く(所有権の証明)
  2. コンテンツが変わったら、変更URLをIndexNowエンドポイントにHTTPで送る
  3. 検索エンジン側がクロール・インデックスの優先度を引き上げる

1回のリクエストで最大10,000件のURLを一括送信でき、しかも送信先の検索エンジンは受け取ったURLを他の対応エンジンと共有します。Bingに送ればYandexにも伝わる、という建て付けなので、送信先を使い分ける必要はありません。

普及も進んでいて、2026年1月時点で8,000万以上のサイトがIndexNowを使っており、Bingでは検索結果でクリックされたURLの 22% がIndexNow経由の登録という数字が出ています(IndexerNow)。

対応している検索エンジン(Googleは非対応)

対応しているのはBing、Yandex、Naver(韓国)、Seznam(チェコ)など。肝心のGoogleはというと、2021年に「テストする」と表明したきり、2026年2月時点でも正式対応していませんIndexerNow)。Googleへの通知はsitemap.xmlとSearch Consoleという従来ルートのままです。

「じゃあ意味ないでしょ」と思うかもしれませんが、Bing経由の検索流入は無視できない規模になってきていますし、AI検索系のクローラーがBingのインデックスを参照するケースもあるので、導入コストの低さを考えれば入れておく価値はあります。

もうひとつ正直に書いておくと、IndexNowで改善するのはインデックスの速度だけです。送ったからといってインデックスが保証されるわけでも、順位が上がるわけでもありません。そこは期待しないでください。

設定方法

1. APIキーを生成する

キーは32文字の16進数文字列です。

# OpenSSLで生成
openssl rand -hex 16

# 出力例: 7be9fca90b3b4b039983fa8f06e03ee8

indexnow.org でも生成できます。

2. キーファイルをルートに置く

生成したキーをそのままファイル名・ファイル内容にして、サイトのルートに置きます。

配置先: https://www.example.com/7be9fca90b3b4b039983fa8f06e03ee8.txt
ファイル内容: 7be9fca90b3b4b039983fa8f06e03ee8

これで検索エンジンは「このキーで送ってくる相手はサイトの所有者だ」と確認できます。

3. URLを送信する

単発ならGETで済みます。ブラウザから叩けるのでテストにも使えます。

https://api.indexnow.org/indexnow?url=https://www.example.com/new-page&key=7be9fca90b3b4b039983fa8f06e03ee8

複数URLはJSONのPOSTで。

curl -X POST "https://api.indexnow.org/indexnow" \
  -H "Content-Type: application/json" \
  -d '{
    "host": "www.example.com",
    "key": "7be9fca90b3b4b039983fa8f06e03ee8",
    "urlList": [
      "https://www.example.com/page1",
      "https://www.example.com/page2"
    ]
  }'

レスポンスコードはこの辺を押さえておけば十分です。

HTTPステータス意味
200送信成功
202受理済み(後で処理)
400リクエスト形式エラー
403キーが無効
422URLがホストと不一致
429レート制限超過

WordPressの場合は、Microsoft提供の公式IndexNowプラグインを有効化するだけで、記事の作成・更新・削除時に自動送信されます。All in One SEOにも組み込まれているので、その場合は設定画面でONにするだけです。

RustでIndexNowを実装する

静的サイトや独自システムなら、デプロイフローに送信処理を組み込むことになります。curlをCIに仕込むだけでも動きますが、Rustのバックエンドから送るなら自分が書いた indexnow-api を使ってください。tokioベースの非同期対応です。

use indexnow_api::IndexNowApi;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let api = IndexNowApi::new(
        "www.example.com",
        "7be9fca90b3b4b039983fa8f06e03ee8"
    );

    let urls = vec![
        "https://www.example.com/new-article".to_string(),
        "https://www.example.com/updated-page".to_string(),
    ];
    api.send_urls(urls).await?;
    Ok(())
}
[dependencies]
indexnow-api = "0.1.0"
tokio = { version = "1", features = ["full"] }

特定エンジンへの直接送信や、キーファイルを別の場所に置いている場合の指定もできます。

let mut api = IndexNowApi::new("www.example.com", "your-api-key");
api.set_search_engine("https://www.bing.com");
api.set_key_location("https://www.example.com/my-indexnow-key.txt");

CMSのWebhook、SSGのビルド後フック、ECサイトの商品更新時など、「コンテンツが変わった瞬間」に送るのが基本形です。

sitemap・Google Indexing APIとの関係

XMLサイトマップとは役割が違うので、置き換えではなく併用です。

項目IndexNowXMLサイトマップ
通知タイミングリアルタイム(push型)クローラー巡回時(pull型)
対象変更があったURLのみサイト全体のURL一覧
適したシーン更新の即時通知サイト全体の構造把握

Google向けにはIndexing APIという別物があります。こちらは本来JobPosting/BroadcastEvent向けで、OAuthサービスアカウントが必要、1日200件までと制約が多め。「Bing/YandexにはIndexNow、Googleにはsitemap+必要ならIndexing API」という整理で考えるのが現実的です。

運用の注意はシンプルで、同じURLを短時間に連投しない、存在しないURLやnoindexページを送らない、キーを漏らさない。この3つを守っていれば特に困ることはありません。

というわけで

IndexNowは「クローラーが来るのを待つ」を「こっちから知らせる」に変えるプロトコルで、導入はキーファイル1個とHTTPリクエストだけ。Googleは相変わらず非対応ですが、Bing圏とAI検索の存在感を考えると入れておいて損はない部類です。Rustなら indexnow-api でどうぞ。