誤診と原因の記録・2026年8月15日

Search Console APIで「表示ゼロ」と誤診した|次元をひとつ足すと数字の4割が消える

APIで検索データを取って「このページは表示ゼロだ」と判定し、危うく8位に付いているページを削除候補に入れるところでした。原因はページ側ではなく、集計するときに指定した次元でした。

このサイトはAnthropicの公式サイトではありません。Claude Codeの機能・料金・提供範囲は変わる可能性があるため、重要な判断の前には公式のドキュメントと自分のアカウント設定を確認してください。

何を間違えたか

ページごとの実力を測るつもりで、次のようなリクエストを投げていました。

{
  "startDate": "2026-05-17",
  "endDate":   "2026-08-15",
  "dimensions": ["page", "query"],
  "rowLimit": 25000
}

「ページごとに、どの語で来ているかも一緒に見たい」と思って query を足したわけです。ところがこの1語が判定を壊しました。

Search Consoleは検索語ごとの行数が少ないものを匿名化して返しません。個人が特定されうる稀な検索語を出さないための仕様です。query を次元に入れると集計の単位が「ページ×語」まで細かくなるため、1語あたりの数が小さいページは行そのものが返ってこなくなります

結果として、実際には表示があるページが集計結果に1行も現れず、「表示ゼロ」に見えました。実測では、query を混ぜると混ぜない場合に比べて表示回数の合計が4割ほど少なくなりました。ロングテール中心のサイトほど差が大きく出ます。

ページの実力は page 単独で測る

直し方は単純で、測りたい単位だけを次元に指定することです。

知りたいことdimensions
ページごとの表示・クリック・順位["page"]
語ごとの表示・クリック・順位["query"]
そのページに来ている語(探索用)["page","query"] ただし合計値の判定には使わない

3つめは「見る」用途としては有用です。使ってはいけないのは、そこから出た合計をページの実力として扱うことです。「このページは0だから外す」という判断に使うと、実際には順位が付いているページを消すことになります。

この件で危なかったのは、誤診の方向が「消す」側だったことです。表示回数を多めに誤ると「まだ様子を見よう」で済みますが、少なめに誤ると削除やnoindexに進んでしまいます。判定が削除につながる集計は、次元を最小にしてもう一度取り直す価値があります。

sitemap APIの「インデックス済み」は常に0

もうひとつ、同じ日に引っかかったものがあります。Sitemaps API の応答に含まれるインデックス済み件数のフィールドはすでに廃止されていて、どのサイトでも常に0が返ります

これを知らずに読むと「全サイト、インデックス0本」という壊滅的な数字が出ます。実際にはどのサイトも普通にインデックスされていました。

sitemapの健全性を見たいときに実際に使える値は次の2つです。

  • 最終取得日lastDownloaded)— これが何週間も前なら、そもそも読まれていません
  • エラー・警告の件数登録URL数 — 手元のsitemapの本数と一致するか

個々のURLがインデックスされているかどうかを知りたい場合は、URL検査APIを使います。ただしこちらは1日あたりの呼び出し回数がすぐ上限に達します。全URLを回すような使い方はできないので、判定したいURLを先に絞ってから投げてください。

「クロールされていない」と「順位が付かない」を分ける

表示が出ない原因は大きく2つあり、対処が正反対です。

クロールされていない順位が付かない
URL検査の結果「検出 - インデックス未登録」「URLがGoogleに認識されていません」インデックス済み。ただし平均順位が20位前後
やるべきこと内部リンクを増やす・sitemapを整える・クロールの無駄を減らす本文を厚くする・重複を解く・titleを見直す
やってはいけないこと本文をいくら足しても読まれていないので効かないリンクを足しても順位の理由は変わらない

この切り分けをせずに「表示が出ないから加筆しよう」と進めると、読まれていないページに時間を使うことになります。逆に「クロール枯渇だ」と決めつけて内部リンクだけ増やしても、インデックス済みのページには効きません。

実際に測ってみると、あるサイトでは表示ゼロのページの8割がインデックス済みでした。つまりクロールの問題ではなく、内容の問題でした。別のサイトでは逆に7割が未クロールで、こちらはリンクとクロール配分の問題でした。同じ症状でも原因は逆です。

集計コードで気をつけている点

  • 日付は絶対値で書く。「過去90日」のような相対指定は、後から結果を見返したときに何の期間か分からなくなります
  • rowLimit の上限に当たっていないか確認する。返ってきた行数が上限とぴったり同じなら、切り捨てられている可能性があります
  • 0件の結果を「0」として保存しない。「取得できなかった」と「本当に0だった」を区別できる形で残します
  • サイトのURLは末尾のスラッシュまで一致させる。プロパティの指定がずれていると、エラーではなく空の結果が返ってきます

4つめは特に静かに失敗します。https://example.jphttps://example.jp/ の違いで、丸ごと空になります。

よくある質問

なぜ匿名化されるのですか?

検索語には個人が特定できる内容が入りうるためです。件数の少ない語は返さない仕様になっています。ページ単位の集計では起きないので、次元を分ければ回避できます。

画面(Search Consoleの管理画面)でも同じことが起きますか?

起きます。「クエリ」タブの合計と「ページ」タブの合計が一致しないのは同じ理由です。画面でもページの実力を見るときはページ側で見てください。

APIとブラウザ操作、どちらがいいですか?

集計はAPIが速くて正確です。ただしインデックス登録のリクエストのように画面からしかできない操作もあり、そちらは手で押すことになります。回数の上限があるので、押す前に本命を決めておくのが現実的です。

次に読むページ