1.

Google Custom Search JSON API|新規受付終了・移行期限と既存実装の確認

利用条件の変更に注意:2026年10月確認。Google公式はCustom Search JSON APIの新規受付終了と、既存利用者が2027年1月1日までに代替へ移行する必要があることを案内しています。以下を新規の無料検索API導入手順として使わないでください。

新規利用停止、既存利用の点検、代替への移行を分ける図

根拠: Google公式の利用状況・終了時期・料金案内。この案内と、過去の画面/サンプルを分けて読んでください。

既存システムで先に確認すること

  1. 対象のGoogle Cloudプロジェクト、既存の利用資格、検索エンジンIDと検索対象を運用担当と照合する。
  2. 呼び出し箇所と利用量/割当・課金を把握し、終了前に移行できる計画を立てる。キー作成やAPI有効化だけで継続資格が得られるとは考えない。
  3. 移行先は検索対象・料金/契約・応答形式・言語/画像/ページング・利用条件を個別比較する。別サービスをURLだけ変更すれば置換できると保証しない。
  4. HTTP/JSON/0件/エラーを分けて扱い、エラーを空結果として隠さない。キー・検索語・応答本文を無条件にログへ出さない。
この記事の要点
  • Google Custom Search JSON APIは新規利用者の受付終了。既存利用者も2027年1月1日までに代替へ移行が必要
  • 前提: 既存のAPI利用資格と対象プロジェクトを確認。検索エンジンを作るだけで新規API利用が可能になるわけではない
  • 使い方: https://www.googleapis.com/customsearch/v1?key=...&cx=...&q=検索語
  • 料金/割当: 公式の無料100件/日等の案内は既存利用者向けで、2027年1月1日の終了までの条件。新規の無料導入案内ではない

 

本稿は既存のCustom Search JSON APIを点検する保守資料です。下の画面と要求例は旧環境の記録として保持し、新規導入の成功を保証する手順とは区別します。

 

JSON APIとは?

プログラムを通じてJSON APIを利用することでGoogleの検索結果をJSON形式で受け取ることが出来ます。

 

カスタムサーチエンジンの作成

下は旧管理画面の操作例です。まず既存のAPI利用資格と検索エンジンIDを確認します。新しく検索エンジンを作成できることと、JSON APIの新規利用可否は別です。

旧資料の管理URLは下に保持しています。現在の管理画面/利用条件を公式案内で確認し、移行計画なしに新しいAPI前提の構成を増やさないでください。

https://cse.google.com/cse/all

JSON API

 

サーチエンジンを作成したらEdit search engine → Setupの項目で更に詳細設定をすることが出来ます。

下のImage search/Language/Search the entire webは旧画面の表示です。現在も同じ項目や検索範囲を新規設定できるとは限りません。既存エンジンの検索対象・言語・画像検索の有効性を、実際の設定と公式の現行条件で照合してください。

JSON API

 

API Keyの取得

既存の許可されたプロジェクト/キーを運用担当と確認します。キーを作成すれば受付終了を回避できるわけではありません。利用APIとアプリケーションの制限・割当を確認し、キーを記事/ソース管理/画面出力/ログへ公開しないでください。

キーの扱いはGoogle公式のAPIキー管理指針を確認してください。画面やログを共有するときも秘密値を除外します。

 

Custom Search Engine の有効化

以下は旧有効化URLです。対象プロジェクトの利用資格/既存設定を先に確認し、リンクを開けば新規APIを利用できるとは扱いません。既存設定や課金をこの記事の点検のために変更する必要はありません。

https://console.developers.google.com/apis/library/customsearch.googleapis.com

 

APIの使用

必須パラメータは以下の通りです。

・API Key: Google Cloud Consoleから取得することが出来ます。

・Custom search engine ID: 「Edit search engine」→「Setup」から確認できます。

・q: 検索キーワードです。

下はキーを含む旧URLの構造例で、改行を含む表示をそのまま送信する手順ではありません。ブラウザ履歴やアクセスログ等に秘密値が残り得るため、実キー入りURLをそのまま共有/記録しません。検索語はURLエンコードし、許可された既存利用の範囲でタイムアウト/割当を設計します。

https://www.googleapis.com/customsearch/v1
?key=API Key
&cx=Custom search engine ID
&q=keyword

その他のパラメータおよびレスポンスに関しては以下の公式ドキュメントを参照してください。

https://developers.google.com/custom-search/v1/cse/list?hl=ja

 

取得後のJSONをオフラインで確認する例

次はPython 3の解析関数だけです。API通信・キー取得・課金・再試行は行いません。HTTP状態と取得済み本文を渡し、検索応答のkindと使用する項目の型を検査します。items省略/空配列は0件、不正JSONやAPIエラーは別に扱い、エラー本文をそのまま例外へ含めません。応答スキーマ全体を検証する関数ではありません。

"""Parse a completed API response only; no network, retries or raw-response logging."""
import json
from urllib.parse import urlsplit


def read_search_result(status, body):
    if type(status) is not int or not 100 <= status <= 599:
        raise ValueError("invalid_status")
    if not 200 <= status < 300:
        raise ValueError("http_error")
    try:
        data = json.loads(body)
    except (ValueError, TypeError, UnicodeError):
        raise ValueError("invalid_json") from None
    if not isinstance(data, dict) or "error" in data:
        raise ValueError("api_error_or_invalid_response")
    if data.get("kind") != "customsearch#search":
        raise ValueError("unexpected_response")
    items = data.get("items", [])
    if not isinstance(items, list):
        raise ValueError("invalid_items")
    results = []
    for item in items:
        if not isinstance(item, dict):
            raise ValueError("invalid_item")
        title, link, snippet = item.get("title"), item.get("link"), item.get("snippet", "")
        if not all(isinstance(v, str) for v in (title, link, snippet)):
            raise ValueError("invalid_item_fields")
        try:
            url = urlsplit(link)
            valid = url.scheme in ("https", "http") and bool(url.hostname) and not url.username and not url.password
        except ValueError:
            valid = False
        if not valid or any(ord(c) < 33 for c in link):
            raise ValueError("invalid_result_url")
        results.append({"title": title, "url": link, "snippet": snippet})
    return results

title/snippetはHTMLとして挿入せず、表示先に応じてエスケープする文字列です。この関数は結果のHTTP(S) URLを検査しますが、リンク先の安全性/信頼性を保証するものではありません。応答サイズ制限・通信タイムアウト・ページング・利用規約への適合は呼び出し側の別設計です。実API接続の成功や代替サービスへの移行を検証した例ではありません。

空結果・権限・割当を混同しない

正常応答でitemsが無い場合と、403等のHTTPエラーは別です。同じHTTP状態でも理由は異なり得るため、受付条件・キーの制限・対象API・割当を確認します。無限再試行や制限解除で回避せず、診断情報を共有する場合も秘密値と検索語を除外してください。

公式の要求パラメータと応答スキーマを参照してください。関連項目は親のGoogle Custom Search APIページの子ページから選んでください。古いスクリーンショット2点と元の要求例は本文中に保持していますが、現行UIや新規利用可否の根拠にはしません。

子ページ

子ページはありません

同階層のページ

同階層のページはありません

最近更新/作成されたページ