SERP APIを使用して独自のSEOランクトラッカーを構築する

市販のランクトラッカーは、キーワードごとにレンタルするブラックボックスです。SERP APIをデータベースに接続することで、地理的深度、AI概要キャプチャ、アラートを所有し、価格の一部で利用できます。

商業用ランクトラッカーはキーワードごとに料金を請求し、クエリできないダッシュボードを提供します。SERP API上に独自のものを構築することで、これを逆転させます: 生のSERPスナップショットを所有し、追跡する地理やデバイスを正確に選択し、現在の可視性を決定する結果ページの部分をキャプチャします — AI概要、People Also Ask、ローカルパック — そして、既に使用しているものにアラートを接続します。これは完全なチュートリアルです: スキーマ、日次実行、AI概要とPAAのキャプチャ、差分とアラート、そして2026年の注意点が含まれています。QuantumProxies SERP APIで動作するため、プロキシプールを管理する必要はありません。

ランクトラッキングを再定義した注意点

2つの変更により、現代のトラッカーは2020年のものとは異なって見えます。まず、Googleは&num=100パラメータを削除したため、1回のリクエストで100件の結果を取得することができなくなりました — 約10件ずつページネーションする必要があり、追跡の深さに影響を与え、効率的なAPIが必須となりました。次に、結果ページはもはや10個の青いリンクのクリーンなリストではありません: AI概要がすべての上に座ってクエリに直接答えることができ、People Also Askボックスや特集スニペットがクリックを吸収し、ローカルパックが商業的意図を所有します。それらを無視して単純な位置番号を追跡することは、間違ったものを追跡することです。2026年におけるSERPスクレイピングの仕組みに関する解説では、num=100の影響を深く掘り下げています。

ステップ1: 差分用に構築されたスキーマ

システム全体は昨日と比較する日次スナップショットであるため、スキーマはスナップショット優先です: キーワード、地理、デバイス、日ごとに1行、ランキングデータとSERP機能が一緒に保存されます。AI概要とPAAを構造化された列として保持し、直接クエリできるようにします。

CREATE TABLE serp_snapshot (
  id           bigserial PRIMARY KEY,
  keyword      text        NOT NULL,
  country      text        NOT NULL,   -- gl: us, gb, de...
  city         text,                   -- optional city-level
  device       text        NOT NULL,   -- desktop | mobile
  position     int,                    -- your domain's best rank, null = not found
  landing_url  text,
  aio_present  boolean     NOT NULL,   -- AI Overview shown?
  aio_cited    boolean     NOT NULL,   -- did it cite your domain?
  paa          jsonb,                  -- People Also Ask questions
  top3         jsonb,                  -- who owns positions 1-3
  captured_at  date        NOT NULL,
  UNIQUE (keyword, country, city, device, captured_at)
);

ステップ2: 日次地理実行

コアループは各ターゲット地理とデバイスにわたってキーワードを反復し、各組み合わせごとにSERP APIを1回呼び出し、ドメインの最良の位置を見つけます。APIは解析されたJSONを返し、回転、地理、ブロックを内部で処理するため、これは単純なループのままです — ヘッドレスブラウザもプロキシ回転コードもCAPTCHA処理も不要です。glを国用に設定し、都市レベルの位置を指定すると、結果は既にローカライズされて返ってきます。

import requests, datetime

QP = "https://api.quantumproxies.io/serp"
HEAD = {"Authorization": f"Bearer {QP_KEY}"}

def run_keyword(keyword, country, device="desktop", city=None):
    params = {"engine": "google", "q": keyword,
              "gl": country, "device": device, "num": 20}
    if city:
        params["location"] = city
    data = requests.get(QP, headers=HEAD, params=params, timeout=45).json()

    pos, url = None, None
    for r in data.get("organic", []):
        if "yourdomain.com" in r["link"]:
            pos, url = r["position"], r["link"]
            break
    return data, pos, url

トラッカーを駆動するためのSERP APIキーを取得する

キーワードを地理にわたってSERP APIを通じてデータベースに流し込み、差分とアラートを行うランクトラッカーパイプラインの図
キーワード×地理、1日1回、差分可能なストアに — SERP APIは各実行ごとに解析された位置とAIOおよびPAAを返します。

ステップ3: AI概要とPAAのキャプチャ

ここで自家製トラッカーは安価な商業用トラッカーを凌駕します。多くの商業用トラッカーはまだ10個のリンクのみを報告しています。AI概要は、あなたのオーガニック結果を「3位」にランクインしていても画面下に押しやることができ、AI概要内で引用されることが今や独自の可視性指標として追跡する価値があります。AIOの存在とそれがあなたのドメインを参照しているかどうかを両方取得し、PAAの質問を保存します — これらは新しいキーワードとコンテンツのアイデアとしても役立ちます。

def extract_features(data, domain="yourdomain.com"):
    aio = data.get("ai_overview") or {}
    aio_present = bool(aio)
    aio_cited = any(domain in s.get("link", "")
                    for s in aio.get("sources", []))
    paa = [q["question"] for q in data.get("people_also_ask", [])]
    top3 = [r["link"] for r in data.get("organic", [])[:3]]
    return aio_present, aio_cited, paa, top3

AIOの引用を時間とともに追跡することは、急速に見出しのSEO指標になりつつあります — AI概要の存在をプログラムでキャプチャするに関するガイドでは、ログに記録する価値のあるシグナルを詳しく説明しています。同じキーワードを複数の国から実行すると、ランキングとAIOの引用が地理によって異なることがわかります。これは、グローバルにSERPの変化を監視するで説明されているように、ローカルまたは国際的なフットプリントを持つ人にとって都市レベルの実行が重要である理由です。

現代のランクトラッカーが各実行でキャプチャするものと、アラートをトリガーするべき条件のチェックリスト
位置だけではもはやランキングではありません — AI概要、PAA、ローカルパックをキャプチャし、それらが移動したときにアラートを出します。

ステップ4: 差分とアラート

誰も読まないトラッカーはログファイルです。価値はアラートにあります — 何かが動いた瞬間にメッセージを送ることです。各実行後、新しいスナップショットを前日のものと比較し、重要な変化に基づいてアラートを発します: 3つ以上の位置の低下、AI概要の引用の獲得または喪失、競合他社がトップ3に入る、またはURLが1ページ目から外れるなどです。それらをSlack、メール、またはWebhookに送信して、SEOチームがトラフィックレポートよりも早くスライドを知ることができるようにします。

def diff_and_alert(kw, geo, today, yesterday):
    alerts = []
    if yesterday.position and today.position:
        if today.position - yesterday.position >= 3:
            alerts.append(f"{kw} [{geo}] dropped "
                          f"{yesterday.position} -> {today.position}")
    if yesterday.aio_cited and not today.aio_cited:
        alerts.append(f"{kw} [{geo}] lost its AI Overview citation")
    if today.position and today.position > 10 and \
       (yesterday.position or 0) <= 10:
        alerts.append(f"{kw} [{geo}] fell off page one")
    for a in alerts:
        notify(a)   # -> Slack / email / webhook

スケジューリングとボリュームに対する正直さを保つ

全体を日次のcronで実行し、理想的には一貫した時間に行うことで、日々の差分が比較可能になります。スケールについて現実的であること: キーワード×国×都市×デバイスが実際のクエリ数であり、それは急速に増加します — 5か国で2つのデバイスを使用した100のキーワードは、1日あたり1000のSERPコールです。SERP APIはクエリごとに課金されるため、実際に行動する組み合わせを追跡し、想像しうるすべてを追跡するのではなく、実際に行動するものを追跡します。これを内部ツールではなく製品に組み込む場合、AIおよびSEOツール用のSERP APIの選択に関する投稿では、クエリごとの経済性をカバーしています。同じエンドポイントはMCPサーバーを通じて利用可能であり、エージェントから実行を駆動することもできます。

よくある質問

SERP APIを使用してランクトラッカーをどのように構築しますか?

キーワード、地理、デバイス、日ごとに1つのスナップショットを保存し、各組み合わせごとにSERP APIを1回呼び出して解析された結果を取得し、ドメインの位置とAI概要およびPAAデータを抽出し、前日と比較して意味のある動きに基づいてアラートを発します。APIはプロキシ、地理、ブロックを処理するため、コードはデータベース上でスケジュールされたループのままです。

1クエリあたり100件の結果をまだ取得できますか?

1回のリクエストではできません — Googleはnum=100パラメータを削除したため、結果は約10件ずつページに表示され、より深い追跡にはページネーションが必要です。ほとんどの追跡では上位20件程度で十分であり、クエリボリュームとコストを抑えることができます。ページネーションを行うSERP APIは、この詳細を1回の呼び出しの背後に隠します。

AI概要の存在をどのように追跡しますか?

各実行で2つのことをキャプチャします: クエリに対してAI概要が表示されたかどうか、およびそのソースにあなたのドメインが引用されているかどうかです。両方を別々のフィールドとして保存し、時間とともに引用をトレンド化できるようにします — AI概要内で参照されることは、オーガニックポジションとは異なる独自の可視性指標です。

ランクトラッカーはどのくらいの頻度で実行すべきですか?

SEOでは日次が標準であり、一貫した時間に実行することで差分が比較可能になります。変動が激しいまたは高価値の用語は1日2回の実行が正当化されることがあります。安定した低優先度の用語は週1回でも問題ありません。キーワードが実際にどれだけ速く動くか、およびSERP-APIクエリ予算に合わせて頻度を調整します。キーワード×地理×デバイスが実際のコストドライバーです。

ランクトラッカーはスキーマ、日次のSERPコール、差分です — すべてを所有することでレバレッジが生まれます。関心のある地理にわたって位置、AI概要、PAAをキャプチャし、実際の動きに基づいてアラートを発し、商業用のものの一部のコストで、彼らが決して尋ねさせてくれない質問に答えるトラッカーを持つことができます。

QuantumProxies SERP APIでランクトラッカーを構築する