記事を公開しても、検索エンジンのクローラーが巡回してくれるまで検索結果には載りません。サイトの規模やクロール頻度によっては、これが数日単位のタイムラグになります。この構造を「こちらから通知する」方向にひっくり返すのが IndexNow です。
自分はRust用のクライアント indexnow-api を書いて公開しているので、プロトコルの仕組みから実装までを整理しておきます。
IndexNowって何
IndexNowは、サイトのコンテンツの追加・更新・削除を検索エンジンに即座に通知するオープンプロトコルです。2021年にMicrosoft(Bing)とYandexが共同で公開しました。仕組みは3ステップで説明が終わるくらいシンプルです。
- APIキーを生成し、キーファイルをサイトのルートに置く(所有権の証明)
- コンテンツが変わったら、変更URLをIndexNowエンドポイントにHTTPで送る
- 検索エンジン側がクロール・インデックスの優先度を引き上げる
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 | キーが無効 |
| 422 | URLがホストと不一致 |
| 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サイトマップとは役割が違うので、置き換えではなく併用です。
| 項目 | IndexNow | XMLサイトマップ |
|---|---|---|
| 通知タイミング | リアルタイム(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 でどうぞ。
