Google Custom Search JSON APIは2027年1月1日で停止します。すでに新規受付は終了していて、既存ユーザーには移行期限として同日が案内されています。手元のコードが customsearch/v1 を叩いているなら、残り約17か月で差し替えが必要です。
出典: Custom Search JSON API公式ドキュメント
この記事では、移行先の単価と、実際に手を動かすときに一番効いてくるレスポンス形式の差をまとめます。
今の条件を確認しておく
公式ページに書かれている現行の条件です。
- 1日100クエリまで無料
- 超過分は1,000クエリあたり$5(1リクエスト$0.005)
- 1日あたり10,000クエリが上限
- 新規受付は終了済み
- 2027年1月1日に停止
10,000クエリ/日の上限があるので、もともと大規模用途向けではありませんでした。逆に言うと、移行対象の多くは「小〜中規模で長く動いているスクリプト」だと思います。
Googleが案内している移行先
公式ドキュメントはVertex AI Searchへの移行、もしくはGoogleへの問い合わせを案内しています。ただしVertex AI Searchは同じものの後継ではありません。
- 課金の考え方が違う(クエリ単価ではなくエンタープライズ寄りの体系)
- レスポンス形式が違うので、パーサはどのみち書き直しになる
- セットアップの手数が増える(プロジェクト、データストア、サービスアカウント)
「1つのエンドポイントを叩いて items を回すだけ」のコードから移るには重すぎる、というのが正直なところです。要件がエンタープライズ検索なら妥当な移行先ですが、検索結果のリストが欲しいだけなら明らかに過剰です。
単価で並べる
価格は各社の公式ページで確認できたものだけを載せます。
| 1リクエスト単価 | 状態 | |
|---|---|---|
| Google CSE(現行) | $0.005 | 2027-01-01 停止 |
| SerpAPI Starter | $0.025 | 提供中 |
| SerpAPI Big Data | $275/30,000 = $0.00917 | 提供中 |
| Scavio | $30/7,000 = $0.0043 | 提供中(自社サービス・後述の免責参照) |
出典: SerpAPI公式の料金ページ(2026年8月6日に確認)
SerpAPIは単価こそ高めですが、Google以外のエンジン(Bing、Baidu、YouTube、Maps、Scholar)を1本のAPIでまとめて叩けます。移行のついでに対応エンジンを増やしたいなら選択肢に入ります。
Scavioは1リクエスト1クレジット(月$30で7,000クレジット)で、レスポンスは後述の organic_results 形式です。パラメータとレスポンスの詳細は検索APIのドキュメントにまとまっています。
移行で実際に詰まるのはレスポンス形式
単価より手が止まるのはここです。CSEは結果を items 配列で返し、URLのキーは link です。移行先によってはこのキー名が変わります。
CSEのレスポンス(抜粋)
{
"items": [
{
"title": "ページタイトル",
"link": "https://example.com/page",
"snippet": "説明文…",
"displayLink": "example.com"
}
]
}
キー名の対応を先に表にしておくと、移行作業が単純な置換に落ちます。
| CSE | 移行先の多く | 備考 |
|---|---|---|
items[] |
organic_results[] |
配列名 |
items[].title |
organic_results[].title |
同じ |
items[].link |
organic_results[].link |
同じ |
items[].snippet |
organic_results[].snippet |
同じ |
items[].displayLink |
— | 必要なら link からホスト名を取る |
この organic_results 形式はSerpAPIやScavioなど複数のSERP APIが採用しているので、1つに合わせておけば乗り換えのコストは下がります。
キー名が3つそのままなので、配列名を吸収するだけで既存の処理を活かせます。こういうシムを1枚挟んでおけば、呼び出し側のコードは触らずに済みます。
from urllib.parse import urlparse
def normalize(payload: dict) -> list[dict]:
"""CSEと移行先のレスポンスを1つの形に寄せる。"""
rows = payload.get("items") or payload.get("organic_results") or []
out = []
for r in rows:
link = r.get("link", "")
out.append({
"title": r.get("title", ""),
"link": link,
"snippet": r.get("snippet", ""),
# CSEのdisplayLink相当はURLから作れる
"display_link": r.get("displayLink") or urlparse(link).netloc,
})
return out
呼び出し側は normalize() の戻り値だけを見るようにしておけば、移行先を後から変えても影響が出ません。停止までまだ時間があるので、先にこのシムだけ入れておくのが安全だと思います。エンドポイントの差し替えはあとからでも数行です。
まとめ
- Google Custom Search JSON APIは2027年1月1日に停止、新規受付はすでに終了
- 現行単価は$0.005/リクエスト、1日10,000クエリ上限
- Googleの案内はVertex AI Searchだが、CSEの直接の後継ではなく作業量が増える
- 移行の山場は価格よりレスポンス形式。先に正規化レイヤを挟んでおくと後が楽
- 主要キー(title / link / snippet)は移行先でもそのまま使えることが多い
免責: 私は Scavio というデータAPIを運営しており、上の比較表に自社サービスを含めています。他社の価格・日付はすべて公式ページから引用し、確認日(2026年8月6日)を明記しました。誤りがあればコメントで指摘してください。修正します。