·8 min read

Google AI Overview API: How to Get AI Overviews as JSON

If you need Google AI Overviews as machine-readable data, you have two realistic options: build and babysit your own scraping pipeline against a hostile, constantly shifting results page, or call a Google AI Overview API that fetches the live SERP, detects whether an Overview appeared, and hands you the text and citations as JSON. This article covers both routes honestly — what an AI Overview actually contains, why DIY scraping is harder than it looks, and what the API request/response looks like in practice.

The short version: an AI Overview is not a stable object. It appears for some queries and not others, varies by country and experiment bucket, and renders dynamically inside the SERP. Any serious tracking setup has to treat "did an Overview appear at all?" as a first-class data point, not just parse the text when one happens to show up.

What is an AI Overview, exactly?

AI Overviews are the AI-generated summary blocks Google places above (or within) the classic organic results for a subset of queries. They are generated at query time, synthesized from web sources, and — crucially for anyone doing SEO or GEO work — they push the classic blue links down the page for the queries where they trigger.

Structurally, an AI Overview has three parts you care about:

  1. The answer text — one or more paragraphs, sometimes with lists or steps.
  2. The cited sources — the links Google shows alongside or inside the Overview. These are the new "rankings": being cited here is the visibility prize.
  3. Position context — what ranked organically beneath the Overview, because position 1 under an Overview is not the position 1 of 2023.

One thing to internalize early: AI Overviews and AI Mode are different surfaces. The Overview is a summary block on the normal results page. AI Mode is a separate conversational search experience with its own tab, longer answers, and different citation behavior. They need different endpoints and different tracking logic — we cover the other surface in Google AI Mode API: Scrape AI Mode Results, Citations, and Place Cards.

Why the same query shows different Overviews to different people

If you have ever compared your own browser against a colleague's, you have seen this: same query, different Overview — or no Overview at all. This is not a bug in your methodology. It is the methodology problem.

Google varies AI Overviews along several axes:

  • Region. The same query can trigger an Overview in the US and nothing in Germany, or produce a differently sourced Overview per country.
  • Experiment buckets. Google continuously runs experiments on when Overviews trigger and how they render. Two clean sessions can land in different buckets.
  • Session and account state. Logged-in personalization and search history nudge what appears.
  • Time. Overviews for the same query change as Google regenerates them and as the underlying index moves.

The practical consequence: checking by hand in your own browser tells you almost nothing about what your audience sees. You need repeated, geolocated, clean-context sampling — which is exactly the thing that is miserable to build yourself.

The DIY route, and where it hurts

Scraping AI Overviews yourself means running headless browsers against Google Search. The known pain points:

  • Dynamic rendering. Overviews load and expand client-side. You need a real browser executing JavaScript, waiting for the block to hydrate before you read it — plain HTTP fetches of the SERP will miss it.
  • Selector churn. Google's SERP markup is obfuscated and changes without notice. Your parser is a depreciating asset from the day you write it.
  • Consent walls and bot defenses. Depending on region you will hit consent interstitials before you ever see a result, and sustained automated traffic gets challenged or blocked. Solving this at scale means proxy pools, fingerprint management, and retry logic.
  • Geo variance. To know what a user in the UK sees, you need to genuinely request from a UK context — which means residential-grade infrastructure per market you track.
  • The "absence" problem. Your scraper has to reliably distinguish "no Overview exists for this query" from "the Overview didn't render before I read the page." Getting this wrong silently corrupts your presence data.

None of this is impossible. It is just an ongoing engineering tax that has nothing to do with the insight you are actually after.

Your options for AI Overview data

RouteWhat you getTrade-off
DIY headless browsersFull controlYou own selector churn, consent walls, proxies, and geo infrastructure forever
SerpApiEstablished SERP API with a Google AI Overview productBroad SERP focus; ChatGPT/Perplexity web surfaces are not part of its catalog
DataForSEOSERP + LLM-mentions data productsOriented around its own data ecosystem; check how its AI data is sourced for your use case
llmdataAI Overview + classic SERP in one call, plus ChatGPT, Perplexity, Gemini, Grok, Copilot and AI Mode from the same accountEarly access — join the waitlist

The differentiator to evaluate is coverage breadth: if you are building anything GEO-shaped, you will want ChatGPT and Perplexity data next week, and stitching two vendors together is its own maintenance burden.

Getting AI Overviews as JSON with llmdata

llmdata's Google AI Overview endpoint fetches the real results page from a real regional context, detects whether an Overview was shown, and returns the AI layer and the classic SERP in one response.

The request:

curl -X POST https://api.llmdata.dev/v1/monitor/google-ai-overview \
  -H "Authorization: Bearer $LLMDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "how to reduce cart abandonment",
    "country": "US",
    "include": { "serp": true }
  }'

The response:

{
  "success": true,
  "result": {
    "aiOverview": {
      "present": true,
      "text": "To reduce cart abandonment, focus on...",
      "sources": [
        { "title": "...", "url": "https://...", "position": 1 }
      ]
    },
    "serp": { "organic": [ ... ] }
  }
}

The fields that matter:

  • aiOverview.present — whether an Overview appeared for this query in this region. When it's false, that is data, not an error: tracked over time it shows Google expanding or shrinking Overview coverage in your niche.
  • aiOverview.text — the full Overview content, ready for diffing or brand-mention analysis.
  • aiOverview.sources — every cited link with title, URL and position, in order. This is your citation-tracking backbone.
  • serp — the classic organic results from the same page load, so you can correlate "we rank #2" with "but an Overview sits on top, citing three competitors."

Because the request specifies country, the page is fetched from that market's context — so tracking the US, UK and Germany means three calls, not three proxy fleets.

Tracking AI Overview presence over a keyword set

The single most useful AIO report is a presence-and-citation matrix over your money keywords. Here is the skeleton — a scheduled job that records, per keyword: did an Overview appear, and were we cited?

import requests, datetime, json

KEYWORDS = ["how to reduce cart abandonment", "best checkout flow examples", ...]
MY_DOMAIN = "yourbrand.com"

def check(query, country="US"):
    r = requests.post(
        "https://api.llmdata.dev/v1/monitor/google-ai-overview",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={"query": query, "country": country, "include": {"serp": True}},
    )
    result = r.json()["result"]
    aio = result["aiOverview"]
    cited = any(MY_DOMAIN in s["url"] for s in aio.get("sources", [])) if aio["present"] else False
    return {
        "date": datetime.date.today().isoformat(),
        "query": query,
        "present": aio["present"],
        "cited": cited,
        "sources": [s["url"] for s in aio.get("sources", [])] if aio["present"] else [],
    }

rows = [check(kw) for kw in KEYWORDS]
# append rows to your store (Postgres, BigQuery, even a CSV) and diff week over week

Run it daily or weekly, and three numbers fall out per week: trigger rate (share of keywords with an Overview), citation rate (share of triggered Overviews citing you), and source turnover (which domains entered or left the citation lists). Those three lines are the whole AIO story for a portfolio. The same diffing pattern extends naturally to other engines — see How to Track Brand Mentions in ChatGPT for the prompt-based version.

Cost logic: sampling beats snapshots

Because Overviews vary by session and bucket, a single check per keyword is a weak signal. A more defensible pattern is sampling: multiple fetches per keyword per period, with presence recorded as a rate rather than a boolean. When you price out a provider, do the math per 1,000 keyword-checks at your sampling frequency — a keyword set of 500 checked daily in three countries is 1,500 calls a day before any repeat sampling. Whatever provider you pick, that multiplication is the number that matters, not the sticker price per call.

FAQ

Does Google offer an official AI Overview API? No. There is no official endpoint that returns AI Overview content; the surface exists only inside the results page, which is why this entire category of tooling exists.

Can I get AI Overview data and classic rankings in one call? With llmdata, yes — include: { "serp": true } returns the organic results from the same page load as the Overview, which keeps the two perfectly consistent (same session, same bucket).

How do I track Overviews in multiple countries? Pass a different country per request. Treat each market as its own time series; Overviews genuinely differ per region and averaging them destroys the signal.


llmdata is in early access — the Google AI Overview endpoint, the Google SERP API and the other AI surfaces are being onboarded in waves. Join the early access to get an API key.

Try the best SEO and AI SEO scraper

Monitor your brand and your competitors, at global scale and with the best performance.

No credit card required.