| この記事の要点 |
|
Google Custom Search JSON API とは(2026 年時点の状況)
Custom Search JSON API は、Programmable Search Engine(旧 Custom Search Engine、CSE)で作った検索エンジンに対して、プログラムから検索をかけて結果を JSON で受け取るための API です。エンドポイントは https://www.googleapis.com/customsearch/v1 で、API キーと検索エンジン ID(cx)を付けて呼び出します。
長く「Google の検索結果をプログラムから取得する正規の手段」として使われてきましたが、2026 年時点では次のように終了に向かっています。これから検索機能を作る場合は、この API を前提にしないでください。
| 対象 | 状況 | 日付 |
|---|---|---|
| Custom Search Site Restricted JSON API | 提供終了(トラフィックの受付を停止) | 2025 年 1 月 8 日 |
| Custom Search JSON API(新規) | 新規の利用受付を終了 | 受付終了済み |
| Programmable Search Engine(新規エンジン) | 「検索するサイト」の設定が必須。指定できるのは最大 50 ドメイン。ウェブ全体の検索は不可 | 2026 年 1 月 20 日から |
| 既存エンジンの「ウェブ全体を検索」 | 2027 年 1 月 1 日まで現状の動作を維持。一度オフにすると再びオンにはできない | 2027 年 1 月 1 日まで |
| Custom Search JSON API(既存ユーザー) | この日までに別の仕組みへ移行が必要 | 2027 年 1 月 1 日 |
出典: Custom Search JSON API(Google for Developers)、Custom Search Site Restricted JSON API、Programmable Search Engine ヘルプ
今からどうすればいいか(用途別の結論)
| やりたいこと | 2026 年時点の選択肢 |
|---|---|
| 自社サイト(50 ドメイン以内)の検索をサイトに埋め込みたい(プログラムからの取得は不要) | Programmable Search Engine の「検索するサイト」で検索エンジンを作り、検索ボックス(Search Element)を貼る |
| 自社サイトや特定サイト群(50 ドメイン以内)の検索結果を API で取得したい | Vertex AI Search のウェブサイト検索アプリへ移行(Google 公式の移行先) |
| ウェブ全体の検索結果を API で取得したい | Google は「より高度なウェブ全体検索のソリューション」への問い合わせを案内している(一般公開の後継 API が案内されているわけではない) |
| すでに Custom Search JSON API を使っている | 2027 年 1 月 1 日までは従来どおり動く。期限までに上の移行先へ切り替える計画を立てる |
Programmable Search Engine 自体がなくなるわけではありません。変わるのは「ウェブ全体を検索する」使い方と、JSON で結果を取得する API の部分です。
移行先: Vertex AI Search(ウェブサイト検索)
Google は Custom Search JSON API の代わりとして、50 ドメインまでの検索には Vertex AI Search を案内しています。Google Cloud の生成 AI アプリ(AI Applications)の一機能で、Google Cloud のドキュメントでは Agent Search への名称変更も告知されています。コンソールやドキュメントでどちらの名前でも出てくる可能性があります。
Google Cloud のドキュメントには、Custom Search からの移行手順(Migrate from Custom Search)が用意されています。流れは次のとおりです。
- Google Cloud コンソールでプロジェクトを選び、Vertex AI Search(Agent Search)を有効にする
- 「AI Applications」のページで「アプリを作成」から、サイト検索のアプリを作成する
- ウェブサイト検索には Enterprise エディションの機能が必要なので有効にする。従来の API と同じ「検索結果だけ」を返す使い方なら、生成 AI による回答(Generative Responses)はオフにする
- ロケーションは global を選ぶ
- データストアを作成し、データソースに「ウェブサイトのコンテンツ」を選ぶ
- 「高度なウェブサイト インデックス登録」をオフにすると、旧 Site Restricted JSON API に近い動作になる(オンにすると要約などの機能が使えるが、ドメインの所有権確認と追加のインデックス費用が必要)
- 「含めるサイト」に検索対象の URL パターンを入力して作成する
API キーのまま呼びたい場合は searchLite
Vertex AI Search の通常の検索メソッド(search)は OAuth 2.0 による認証が必要です。Custom Search JSON API のように API キーで呼びたい場合は searchLite メソッドを使います。searchLite が扱えるのは公開ウェブサイトの検索だけで、Google はセキュリティ上、可能なら OAuth 2.0 と IAM を使う search を推奨しています。
公式ドキュメントにある呼び出し例は次の形です(PROJECT_ID・APP_ID・API_KEY・QUERY は自分の値に置き換えます)。
curl -X POST -H "Content-Type: application/json" \
"https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:searchLite?key=API_KEY" \
-d '{
"servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search",
"query": "QUERY",
"userPseudoId": "USER_PSEUDO_ID"
}'
Custom Search JSON API とはエンドポイント・リクエストの形(GET のクエリ文字列から POST の JSON へ)・レスポンスの構造がすべて異なります。呼び出し部分だけでなく、結果を表示するコードも作り直しが必要です。API キーを使う場合は、移行手順にあるとおりキーの API 制限を https://discoveryengine.googleapis.com/* 向けに設定します。料金は Custom Search JSON API とは別体系なので、Google Cloud の料金ページで確認してください。
既存ユーザー向け: Custom Search JSON API の使い方(2027 年 1 月 1 日まで)
以下は、すでに Custom Search JSON API を使っているシステムを保守するための情報です。新規には使えません。
必要なもの
- API キー: Custom Search API を有効にした Google Cloud プロジェクトで発行したもの
- 検索エンジン ID(cx): Programmable Search Engine のコントロールパネルで確認できる
- 課金設定: 1 日 100 クエリを超えて使う場合のみ、Google Cloud の請求先アカウントを紐付ける
基本的な呼び出し
curl "https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CX_ID&q=Laravel+tutorial"
レスポンスは JSON で、検索結果は items 配列に入ります。各要素の title・link・snippet・displayLink を使うのが基本です。次ページがある場合は queries.nextPage が含まれます。
{
"kind": "customsearch#search",
"queries": {
"request": [{ "searchTerms": "Laravel tutorial", "count": 10, "startIndex": 1 }],
"nextPage": [{ "startIndex": 11 }]
},
"searchInformation": { "searchTime": 0.42, "totalResults": "12300000" },
"items": [
{
"kind": "customsearch#result",
"title": "Laravel Tutorial - 初心者向け",
"link": "https://example.com/laravel",
"displayLink": "example.com",
"snippet": "Laravel は PHP のフレームワーク..."
}
]
}
主なクエリパラメータ
| パラメータ | 説明 | 例 |
|---|---|---|
key | API キー | AIza... |
cx | 検索エンジン ID | コントロールパネルの値 |
q | 検索キーワード | Laravel tutorial |
num | 1 回で返す件数(1〜10) | 10 |
start | 取得開始位置(1 始まり)。取得できるのは先頭 100 件まで | 11(2 ページ目) |
lr | 結果の言語を絞る | lang_ja |
gl | 地域(国コード)で結果を寄せる | jp |
searchType | image で画像検索 | image |
siteSearch | 特定サイトに限定、または除外(siteSearchFilter と併用) | example.com |
dateRestrict | 期間で絞る(d=日、w=週、m=月、y=年) | m6 |
fileType | ファイル形式で絞る | pdf |
safe | セーフサーチ | active |
検索対象の範囲は、パラメータではなく検索エンジン(cx)側の設定で決まります。2026 年 1 月 20 日以降に作られたエンジンは「検索するサイト」で指定したドメインだけが対象です。
Python での呼び出し例
import os
import requests
API_KEY = os.environ["GCS_API_KEY"]
CX = os.environ["GCS_CX"]
def google_search(query, start=1, num=10, **kwargs):
params = {"key": API_KEY, "cx": CX, "q": query, "num": num, "start": start, **kwargs}
r = requests.get("https://www.googleapis.com/customsearch/v1", params=params, timeout=10)
r.raise_for_status()
return r.json()
res = google_search("Laravel tutorial", lr="lang_ja", gl="jp")
for item in res.get("items", []):
print(item["title"], "-", item["link"])
# 最大 100 件まで(10 件 x 10 ページ)
all_items = []
for page in range(10):
res = google_search("Python", start=page * 10 + 1)
all_items.extend(res.get("items", []))
if "nextPage" not in res.get("queries", {}):
break
API キーはコードに直接書かず、環境変数などから読み込みます。キーには Google Cloud コンソールで API の制限(Custom Search API のみ)と、サーバーの IP アドレスなどのアプリケーション制限を付けておくと、漏えい時の被害を抑えられます。
料金と上限(既存ユーザーのみ)
| 項目 | 内容 |
|---|---|
| 無料枠 | 1 日 100 クエリ |
| 有料 | 1,000 クエリあたり 5 ドル |
| 1 日の上限 | 10,000 クエリ |
| 1 リクエストで返る件数 | 最大 10 件 |
| 1 つの検索語で取得できる件数 | 最大 100 件 |
公式ページでは、この料金は「既存ユーザーに対して 2027 年 1 月 1 日の提供終了まで適用される」と明記されています。
よくあるつまずき
- 新しいプロジェクトで Custom Search API を有効にしても使えない: 新規受付を終了しているためです。新規の検索機能は Vertex AI Search で作ります。
- 新しく作った検索エンジンでウェブ全体を検索できない: 2026 年 1 月 20 日以降の新規エンジンは「検索するサイト」(最大 50 ドメイン)しか設定できません。
- 既存エンジンの「ウェブ全体を検索」をオフにしたら戻せない: 一度オフにすると再びオンにはできません。検証目的で切り替えないよう注意します。
- Site Restricted JSON API の呼び出しがエラーになる: 2025 年 1 月 8 日に提供終了しています。Vertex AI Search のウェブサイト検索(高度なインデックス登録オフ)が移行先です。
- start を大きくするとエラーになる: 取得できるのは先頭 100 件までです。それ以上はキーワードや条件を分けて検索します。
- クォータ超過のエラー: 1 日の無料枠や設定した上限を超えると、リクエストがエラーで返ります。Google Cloud コンソールの「API とサービス」でクォータと使用量を確認します。
よくある質問
Q: 2027 年 1 月 1 日以降も Custom Search JSON API は使える?
A: 使えません。公式ページで、既存ユーザーはこの日までに別の解決策へ移行するよう告知されています。
Q: Google 検索の結果そのものを API で取得する公式の手段は?
A: 2026 年時点で、ウェブ全体の検索結果を誰でも申し込める形で提供する公式 API は案内されていません。Custom Search JSON API の公式ページは、ウェブ全体の検索が必要な場合は Google に問い合わせるよう案内しています。なお、google.com の検索結果ページを自動で取得(スクレイピング)するのは Google の利用規約で認められていません。
Q: Bing Search API に乗り換えられる?
A: Microsoft の Bing Search API は 2025 年 8 月 11 日に提供を終了しており、代わりにはなりません。
Q: サイト内検索の検索ボックスを置きたいだけなら?
A: Programmable Search Engine で「検索するサイト」を指定してエンジンを作り、発行される検索ボックスのコードを貼れば足ります。API は不要です。
関連
- Google Cloud で API を有効化する手順(Console / gcloud / 認証情報・課金・クォータ)
- Google Cloud Platform(GCP)とは|主要サービスと特徴・料金の考え方
- Google OAuth 2.0 認証の実装方法
- AI検索とは?Perplexity など引用付き回答エンジンの使い方
- YouTube Data API (v3)
- Twitter API
- Facebook API
- Google Trends
- Google Custom Search API
- App Store Connect API
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Struts JSP タグ完全リファレンス(Struts 1/2 + Spring MVC への移行) 2026-10-14 01:45:33
- struts-config.xmlの説明 2026-10-14 01:45:33
- Struts1 の ActionForm とは? validate() / reset() / DynaActionForm の使い分け 2026-10-14 01:45:32
- Struts パスに対するアクションのインスタンスがありません の対処 2026-10-14 00:47:47
- Eclipse「cvc-complex-type.2.4.a Invalid content」XML スキーマ検証エラーの原因と対処 2026-10-14 00:47:47
- Struts 1 の Action クラス完全解説 (execute / ActionForm / forward) 2026-10-14 00:47:47
- Struts「TLD によると、タグ form の属性 id は無効です」原因と対処 2026-10-14 00:02:06
- Cannot find bean in any scope (Struts) エラー対処 2026-10-14 00:02:05
- java.lang.NullPointerException: Module 'null' not found 2026-10-13 23:12:26
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45