この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:11
ページ更新者:guest
更新日時:2026-06-11 07:12:00

タイトル: Google Custom Search API
SEOタイトル: Google Custom Search JSON API 完全ガイド (cx/料金/Bing比較)

この記事の要点
  • Google Custom Search JSON API = Google 検索結果をプログラムから取得できる唯一の公式 API
  • 前提: Google Cloud プロジェクト + API キー + Programmable Search Engine (旧 CSE) の cx ID の3点が必須
  • 料金: 無料 100 クエリ/日、超過分は $5 / 1000 クエリ、1日最大1万クエリ
  • エンドポイント: https://www.googleapis.com/customsearch/v1?key=KEY&cx=CX&q=KEYWORD
  • 画像検索は searchType=image、サイト指定は siteSearch、PSE の設定で「Web 全体」検索も可能

Custom Search API とは

Google Custom Search JSON API は、Google が公式に提供する唯一の検索 API です。通常の google.com をスクレイピングするのは規約違反なので、自動化したい場合はこれが正規ルートです。

もともとは「自社サイト内検索」用に提供された Custom Search Engine (CSE、現 Programmable Search Engine) を API 経由で呼ぶ仕組みで、設定により Web 全体を検索することもできます。

セットアップ手順 (3 ステップ)

ステップ1: Programmable Search Engine を作成

  1. programmablesearchengine.google.com にアクセス
  2. 「追加」をクリック
  3. 名前を入力
  4. 検索対象:
    • 特定サイト内 → 「検索するサイト」に example.com を入力
    • Web 全体 → 「ウェブ全体を検索」を ON
  5. 作成後、検索エンジン ID (cx) をコピー(例: 017576662512468239146:omuauf_lfve

ステップ2: Google Cloud で API キーを取得

  1. Google Cloud Console でプロジェクト作成
  2. 「APIs & Services」→「Library」→ Custom Search API を有効化
  3. 「Credentials」→「Create credentials」→「API key」
  4. キーを取得(例: AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXX
  5. セキュリティのため HTTP referrer 制限 / IP 制限を設定推奨

ステップ3: 課金有効化(無料枠を超える場合)

無料 100 クエリ/日を超えるなら、Google Cloud で請求先アカウントの紐付けと、CSE 管理画面で Custom Search Site Restricted JSON API 課金を有効化。

基本的な呼び出し

curl "https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CX_ID&q=Laravel+tutorial"

レスポンス例:

{
  "kind": "customsearch#search",
  "queries": {
    "request": [{
      "totalResults": "12300000",
      "searchTerms": "Laravel tutorial",
      "count": 10,
      "startIndex": 1,
      "language": "lang_ja"
    }]
  },
  "searchInformation": {
    "searchTime": 0.42,
    "totalResults": "12300000"
  },
  "items": [
    {
      "kind": "customsearch#result",
      "title": "Laravel Tutorial - 初心者向け",
      "link": "https://example.com/laravel",
      "displayLink": "example.com",
      "snippet": "Laravel は PHP のフレームワーク...",
      "pagemap": { ... }
    }
  ]
}

主なクエリパラメータ

パラメータ説明
keyAPI キーAIza...
cx検索エンジン ID017576...
q検索キーワードLaravel+tutorial
num1ページの件数 (1〜10)10
start取得開始位置 (1始まり、最大91)11 (2ページ目)
lr言語制限lang_ja
gl地域 (国コード)jp
hlUI 言語ja
searchTypeimage で画像検索image
siteSearch特定サイト限定/除外example.com
dateRestrict期間 (d1=1日, m1=1月)m6
fileTypeファイル形式pdf
safeセーフサーチactive

Python で呼ぶ

import requests

API_KEY = 'YOUR_API_KEY'
CX = 'YOUR_CX_ID'

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'])

# 画像検索
res = google_search('猫', searchType='image', num=5)
for item in res.get('items', []):
    print(item['link'], item['image']['width'], 'x', item['image']['height'])

# 100件取得 (10件×10ページ)
all_items = []
for page in range(10):
    start = page * 10 + 1
    res = google_search('Python', start=start)
    all_items.extend(res.get('items', []))
    if 'nextPage' not in res.get('queries', {}):
        break

PHP で呼ぶ

<?php
function googleSearch(string $query, array $extra = []): array {
    $params = array_merge([
        'key' => getenv('GCS_API_KEY'),
        'cx'  => getenv('GCS_CX'),
        'q'   => $query,
        'num' => 10,
    ], $extra);
    $url = 'https://www.googleapis.com/customsearch/v1?' . http_build_query($params);
    $json = file_get_contents($url);
    return json_decode($json, true);
}

$res = googleSearch('Laravel', ['lr' => 'lang_ja', 'gl' => 'jp']);
foreach ($res['items'] ?? [] as $it) {
    echo $it['title'] . ' - ' . $it['link'] . PHP_EOL;
}

料金体系 (2026 年時点)

項目料金
無料枠100 クエリ / 日
有料$5 / 1000 クエリ
1日上限10,000 クエリ
1リクエスト最大件数10件
取得可能な最大件数 / クエリ100件 (start=91 まで)

大量に検索したい場合は 1 万クエリ/日 = 月最大 30 万クエリ = 月 $1,500 がプラン上限となります。それ以上は Custom Search Site Restricted JSON API を別途検討するか、SerpAPI / Bing API を併用。

Bing Search API との比較

項目Google Custom SearchBing Web Search v7
料金$5 / 1000$3 / 1000〜(S1〜S6 階層)
無料枠100/日月 1000 (F1)
1日上限10,000事実上無し
1リクエスト最大10件50件
サイト指定○ (siteSearch)○ (site:演算子)
提供終了予定無し2025/8/11 終了 → Azure AI Foundry 移行

よくあるエラー

HTTPエラー原因と対処
400Invalid Valuecx ID 誤り / start > 91
403Daily Limit Exceeded無料枠 100 超え → 課金有効化 or 翌日
403API key not validキー誤り / Custom Search API 未有効化
429Rate Limit Exceeded短時間多発 → スリープ + バックオフ

FAQ

Q: 通常の Google 検索結果と完全に同じになる?
A: ほぼ同じですが、パーソナライズが効かない分、若干順位が異なります。リアルユーザーの結果と完全一致は保証されません。

Q: 100件以上取得したい
A: API 仕様上 1 クエリで取得できるのは最大 100 件です。それ以上はキーワードを分割するか、SerpAPI 等を併用してください。

Q: 自社サイト内検索だけに使える?
A: いいえ、PSE の「ウェブ全体を検索」を ON にすれば一般 Web 検索として使えます。

Q: 商用利用 OK か
A: 利用規約の範囲内で OK です。ただし結果を加工せず再配布することには制限あり (検索結果の再販禁止)。