GSC APIで検索クエリを取得する方法【初心者でもコピペで動いた最小コード】
結論|GSC APIでクエリを取得する仕組みと使い道
GSC APIでクエリ一覧を取得するには、searchanalytics.query メソッドに dimensions: ['query'] を指定するだけです。コマンド1つでどんなキーワードで検索されているかを自動取得できます。
すぐ試したい場合は、以下のパターン1のコードをそのまま実行してください。事前準備(GCPとサービスアカウント)についてはSearch Console APIでCSV出力する方法【初心者でもコピペで動いた最小コード】をご覧ください。
なお、この記事はCSV出力記事の「中身(データ取得)」を解説する続編です。CSV出力の仕組みはすでに動いている前提で、検索クエリの取得方法に特化した内容を解説します。
この記事は以下に当てはまる方向けです。
- GSC APIは設定できたが、クエリ一覧の取得方法がわからない
- どのキーワードでサイトに流入しているか知りたい
- dimensionsの指定方法が知りたい
- 特定のページへの流入クエリだけを絞り込みたい
- 取得したクエリをSEO改善に使いたい
CSV出力記事との違い
前回のCSV出力記事では dimensions: ['query', 'page'] でクエリとページの両方を取得しました。今回は検索クエリに特化した取得と、ページでフィルタリングする方法に絞って解説します。特定の記事にどんなキーワードで流入しているかを調べるときに使えます。
APIリクエストの基本|dimensionsの仕組み
GSC APIの searchanalytics.query では、何の軸でデータを取得するかを dimensions で指定します。ここが理解できると、クエリ以外のデータも自由に取れるようになりますよね。
dimensionsに指定できる値
| 値 | 取得できるもの |
|---|---|
| query | 検索クエリ(キーワード) |
| page | 流入したページURL |
| date | 日付 |
| device | デバイス種別(desktop/mobile/tablet) |
| country | 国 |
複数を配列で指定すると組み合わせ軸で取得できます。['query', 'page'] にすると「この検索クエリはどのページに流入したか」がわかります。
クエリ取得の基本リクエスト構造
const res = await searchConsole.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate: '2026-01-01',
endDate: '2026-04-01',
dimensions: ['query'], // クエリのみ
rowLimit: 1000,
},
})res.data.rows に結果が入ります。各rowには keys(クエリ名)・clicks・impressions・ctr・position が含まれます。
フィルターの使い方
特定のページへの流入クエリだけを取りたい場合は dimensionFilterGroups を使います。
requestBody: {
startDate: '2026-01-01',
endDate: '2026-04-01',
dimensions: ['query'],
dimensionFilterGroups: [{
filters: [{
dimension: 'page',
operator: 'contains',
expression: '/chunkloaderror-cache-not-fixed'
}]
}],
rowLimit: 1000,
}これで特定の記事URLへの流入クエリだけが取れます。
最小コードでクエリ一覧を取得する
3パターンのコードを公開します。状況に応じて使い分けてください。すぐ試したい方はパターン1から実行できます。
パターン1:全検索クエリを取得する(最小構成)
import { google } from 'googleapis'
const KEY_FILE = '/path/to/gsc_key.json'
const SITE_URL = 'sc-domain:example.com'
const auth = new google.auth.GoogleAuth({
keyFile: KEY_FILE,
scopes: ['https://www.googleapis.com/auth/webmasters.readonly'],
})
const sc = google.searchconsole({ version: 'v1', auth })
const res = await sc.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate: '2026-01-01',
endDate: '2026-04-01',
dimensions: ['query'],
rowLimit: 1000,
},
})
const rows = res.data.rows ?? []
rows.forEach(row => {
console.log(`${row.keys[0]} | クリック:${row.clicks} | 順位:${row.position.toFixed(1)}`)
})パターン2:特定ページの流入クエリを取得する
const res = await sc.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate: '2026-01-01',
endDate: '2026-04-01',
dimensions: ['query'],
dimensionFilterGroups: [{
filters: [{
dimension: 'page',
operator: 'contains',
expression: '/your-slug'
}]
}],
rowLimit: 1000,
},
})expression に調べたい記事のslugを入れてください。
パターン3:クエリとページを両軸で取得する(CSV出力記事と同じ)
const res = await sc.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate: '2026-01-01',
endDate: '2026-04-01',
dimensions: ['query', 'page'],
rowLimit: 25000,
startRow: 0,
},
})これはSearch Console APIでCSV出力する方法【初心者でもコピペで動いた最小コード】で使った構成と同じです。CSVに保存してSEO分析に活用したい場合は、そちらで仕組み全体を解説しています。
実際に詰まったポイント
クエリ取得はシンプルに見えて、いくつか詰まりやすい箇所がありました。実際に遭遇した問題を書きます。
詰まり①:rowLimitの上限が25000件
rowLimit に大きな数値を入れても、1回のリクエストで取得できるのは最大25000件です。それ以上ある場合は startRow でページネーションが必要です。
// 25000件超えに対応するページネーション
let rows = []
let startRow = 0
while (true) {
const res = await sc.searchanalytics.query({
siteUrl: SITE_URL,
requestBody: {
startDate, endDate,
dimensions: ['query'],
rowLimit: 25000,
startRow,
},
})
const fetched = res.data.rows ?? []
rows = rows.concat(fetched)
if (fetched.length < 25000) break
startRow += fetched.length
}詰まり②:直近2〜3日のデータが取得できない
GSCのデータには2〜3日の遅延があります。今日の検索クエリデータを取ろうとしても空になります。endDate を new Date() にすると0件になることがあるので、3日前までを上限にするのが安全です。
const endDate = new Date()
endDate.setDate(endDate.getDate() - 3) // 3日前まで詰まり③:クエリが「その他」に集約されている
GSCのUIでは低頻度クエリが「その他」として集約されますが、APIではその制限がなく個別のクエリが取得できます。ただしプライバシー保護の観点から、極端に検索数が少ないクエリは返ってこない場合があります。
詰まり④:日付範囲が長すぎると重い
1年分などの長い期間でクエリを取ろうとすると、レスポンスに時間がかかります。通常は90日以内を推奨します。分析目的であれば90日で十分な場合が多いです。
判断基準:
- データが空 → 日付範囲を確認・3日前を上限にする
- 取得件数が25000件ちょうど → ページネーションで続きを取得する
- 特定記事の検索クエリを取りたい →
dimensionFilterGroupsでページフィルター - レスポンスが遅い → 日付範囲を短くする(90日推奨)
取得した検索クエリをSEO改善に使う
クエリが取れたら、どう使えばいいでしょうか。実際にやっている使い方を書きます。
記事ごとの流入クエリを分析する
パターン2(特定ページのフィルター)で各記事の流入クエリを取ると、「この記事はどのキーワードで読まれているか」が分かります。意図していたキーワードと違うクエリで流入していれば、タイトルや本文の見直しサインです。
順位11〜20位のクエリを特定する
const nearTopQueries = rows.filter(row => row.position >= 11 && row.position <= 20)順位11〜20位はあと少しで1ページ目に入れる領域です。このクエリが含まれる記事を優先的に改善すると、短期間でクリック数が増えやすくなります。
CSVに保存して継続的に分析する
取得した検索クエリをCSVに保存して分析するのが最も実用的です。まずCSVとしてデータを出力する仕組みを作りたい場合は、Search Console APIでCSV出力する方法【初心者でもコピペで動いた最小コード】で全体の仕組みを解説しています。クエリ取得からCSV保存まで一連の処理として組み合わせることができます。
なお、このデータ取得の仕組みを作るには、まず本番環境が正常に動いていることが前提です。CloudflareデプロイがWindowsだけ失敗して本番が白画面になる原因とWSLで解決した手順でデプロイ環境を整えてから、データ収集の仕組みを作る順番が自然です。
まとめ
ここまでの仕組みを組み合わせることで、以下の一連の流れをすべて自動化できます。
- 検索クエリ取得(この記事)
- CSVへの出力と保存(CSV出力記事)
- 改善すべき記事の判断(順位・CTRのデータを元に)
デプロイ問題(Cloudflare記事)を解決して本番が動いている状態で、このデータ収集の仕組みを回し続けることが、SEO改善の基盤になります。
GSC APIでクエリ一覧を取得する方法をまとめます。
基本: dimensions: ['query'] を指定するだけで全検索クエリが取得できる。
特定記事を絞る: dimensionFilterGroups にページフィルターを追加する。
よくある詰まり: データ遅延(3日前を上限に)・rowLimitの上限(ページネーション対応)・日付範囲が長すぎる。
クエリデータを取れるようになると、どの記事がどんなキーワードで読まれているかが客観的に見えてきます。感覚ではなくデータで改善の優先順位を決められるようになります。
データを取得して分析できると、次は「どのデータに注目して何を判断するか」という問題になります。bizinets.bizでは、こうした判断の軸を体系化して公開しています。
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →