AnswerLine Start free

Google Search

Google Search AI Overview

Google's AI Overview for a query: answer text, cited sources and citation pills, or null when absent.

Request it with `include.aioverview`. The field carries the answer text, markdown, sources and citation pills when Google shows an overview, and `null` when it doesn't, which is a valid observation for presence tracking.

Returned in result

Field
aioverview

Request

curl -X POST "https://api.answerline.dev/v1/monitor/google" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"project management software","country":"US","include":{"aioverview":{"markdown":true}}}'

What the AI Overview is

The AI Overview is the generated answer Google places at the top of some results pages, with citation chips, a rail of sources, and sometimes videos and ads.

result.aioverview returns all of it as fields. Because the overview answers the query above the organic results, it is tracked for presence (which keywords trigger one, per market), citation share (which domains Google cites, yours included), attribution of sources to individual chips through citationPills, and the ads and videos placed inside it.

Field reference

result.aioverview

Object, or null when requested but not shown. Absent when not requested.

Field Type Meaning
text string Overview text.
markdown string Overview as markdown, when include.aioverview.markdown is true.
sources[] array The source rail.
citationPills[] array One entry per (chip, source) pair. Omitted when the overview has no chips.
relatedLinks[] array URLs under a chip’s “View related links” flyout that are not in sources. Omitted when no chip has them.
videos[] array Videos included in the overview.
ads[] array Sponsored ads Google placed inside the overview.

sources[]

Field Type Meaning
position number 1-based position.
url string Source URL.
label string Title shown on the rail.
description string Source snippet.
redirectLink string Google’s /goto redirect, present only when Google served the link as one.
Field Type Meaning
label string, required Per-source title; empty string when there is none.
citationPillId integer, required 1-based chip ordinal shared by all entries of one chip. On relatedLinks, matches the chip it belongs to.
url string, required Direct URL.
domain string, required Host extracted from url.
description string Snippet; omitted when absent.
position integer, required on pills 1-based position in aioverview.sources. Related links have no position.
redirectLink string Google’s /goto redirect, when served.

videos[]

Field Type Meaning
url string Direct video URL.
title string Video title.
thumbnail string Thumbnail URL.
source string Channel or source name.
platform string Video platform.
date string Upload date.
duration string Duration.
redirectLink string Google’s /goto redirect, when served.

ads[]

Field Type Meaning
position number, required 1-indexed ad position.
title string, required Ad title.
url string, required Destination URL.
type TEXT or SHOPPING, required Text ads carry domain and description; shopping ads carry price, store and optional old_price.
domain string Advertiser domain, on TEXT ads.
description string Ad copy, on TEXT ads.
price object On SHOPPING ads: value (number, nullable), currency (string, nullable), raw (string, nullable).
old_price object Pre-discount price on SHOPPING ads with sale pricing; same shape.
store string Retailer, on SHOPPING ads.
image string Product photo or hero image.

Annotated excerpt

Values are illustrative; names and types follow the POST /v1/monitor/google result schema. The request set include.aioverview: {"markdown": true}.

{
  "result": {
    "aioverview": {                          // null if Google showed no overview
      "text": "A heat pump can cut heating costs when...",
      "markdown": "A heat pump can **cut heating costs** when...",
      "sources": [
        { "position": 1, "url": "https://energy.example.gov/heat-pumps", "label": "Heat Pump Systems", "description": "..." },
        { "position": 2, "url": "https://www.example-hvac.com/blog/heat-pump-cost", "label": "Heat pump running costs", "description": "..." }
      ],
      "citationPills": [
        // One chip ("Heat Pump Systems +1") citing two sources: two entries, same ID.
        { "label": "Heat Pump Systems", "citationPillId": 1, "url": "https://energy.example.gov/heat-pumps", "domain": "energy.example.gov", "position": 1 },
        { "label": "Heat pump running costs", "citationPillId": 1, "url": "https://www.example-hvac.com/blog/heat-pump-cost", "domain": "example-hvac.com", "position": 2 }
      ],
      "relatedLinks": [
        // Under chip 1's flyout, not in sources, so no position.
        { "label": "Compare heat pumps", "citationPillId": 1, "url": "https://www.example-compare.com/heat-pumps", "domain": "example-compare.com" }
      ],
      "videos": [],
      "ads": [
        { "position": 1, "title": "Heat Pump Installation Quotes", "url": "https://www.example-installers.com/", "type": "TEXT", "domain": "example-installers.com", "description": "Compare local installers..." }
      ]
    }
  }
}

Cost

Add include.aioverview as an object. It adds +$0.00071 when Google shows an overview; include.paaAioverview is free:

Request Credits
One page $0.00103
+ include.aioverview +$0.00071 (total $0.00174)
+ include.paaAioverview as well +0 more
Each extra page +$0.00071

The add-on is charged only when the response holds an overview: a request with aioverview: null is not charged the +$0.00071. GET /v1/countries?model=aioverview lists supported markets.

Example: chip structure, co-citation and organic overlap

The AI Overview monitoring post covers presence rate, citation share and rank gap for one domain. This script looks at the structure instead: which domains appear in the most chips, which domains are cited together in one chip, how many cited URLs also rank in the organic top 10, and how often overviews carry ads or videos.

import os
import time
from collections import Counter
from datetime import date
from itertools import combinations

import requests

API = "https://api.answerline.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
KEYWORDS = ["are heat pumps worth it", "heat pump vs furnace", "heat pump running cost", "heat pump in cold climate"]
DAY = date.today().isoformat()


def run_tasks(tasks):
    resp = requests.post(f"{API}/v1/async/task/batch", headers=HEADERS, json=tasks, timeout=60)
    resp.raise_for_status()
    pending = {item["task"]["id"]: tasks[item["index"]] for item in resp.json()["results"] if item["success"]}
    done = []
    while pending:
        time.sleep(10)
        for task_id in list(pending):
            body = requests.get(f"{API}/v1/async/task/{task_id}", headers=HEADERS, timeout=30).json()
            if body["task"]["status"] in ("COMPLETED", "FAILED"):
                task = pending.pop(task_id)
                if body["task"]["status"] == "COMPLETED":
                    done.append((task["payload"]["query"], body["response"]["result"]))
    return done


tasks = [
    {
        "taskType": "GOOGLE",
        "payload": {"query": kw, "country": "US", "include": {"aioverview": {}}},
        "idempotencyKey": f"aio-structure-{i}-{DAY}",
    }
    for i, kw in enumerate(KEYWORDS)
]

chips_per_domain, pairs = Counter(), Counter()
overviews = cited_urls = cited_in_top10 = with_ads = with_videos = 0
for keyword, result in run_tasks(tasks):
    overview = result.get("aioverview")
    if overview is None:
        continue
    overviews += 1
    with_ads += bool(overview.get("ads"))
    with_videos += bool(overview.get("videos"))

    chips = {}
    for pill in overview.get("citationPills", []):
        chips.setdefault(pill["citationPillId"], set()).add(pill["domain"].removeprefix("www."))
    for domains in chips.values():
        chips_per_domain.update(domains)
        pairs.update(combinations(sorted(domains), 2))

    top10 = {r["link"] for r in result["organicResults"] if r["position"] <= 10}
    for source in overview.get("sources", []):
        cited_urls += 1
        cited_in_top10 += source["url"] in top10

print(f"overviews: {overviews}/{len(KEYWORDS)}  with ads: {with_ads}  with videos: {with_videos}")
print(f"cited URLs also ranking top 10 organically: {cited_in_top10}/{cited_urls}")
print("Domains by number of chips:", chips_per_domain.most_common(10))
print("Domains cited together in one chip:", pairs.most_common(10))

Exact URL matching understates overlap when URL variants differ; normalize URLs first if the number drives decisions.

Pitfalls

Three states need separate handling: key absent (not requested), null (requested, no overview), and an object without citationPills or relatedLinks (an overview without chips or flyouts).

The same query can show an overview on one run and not the next. Measure presence and citations as rates over several runs per keyword, with country fixed, and budget for the +$0.00071 on every overview Google shows; the ones that come back null cost nothing extra.

markdown can hold more URLs than sources, because related links appear inline in it. Count rail citations from sources and citationPills and flyout links from relatedLinks; don’t extract URLs from markdown.

Count distinct citationPillId values for chip counts. IDs start at 1 here and at 0 on ChatGPT.

Questions

How do I request the AI Overview from Google Search?

Add include.aioverview as an object, for example {} or {"markdown": true}. The flag is enabled by the key being present, so {"markdown": false} still requests the overview.

How much does the AI Overview add?

$0.00071, once per request, only when Google shows an overview; include.paaAioverview is free. A one-page Google Search request with the AI Overview costs $0.00174.

What does aioverview null mean?

It means you requested the overview and Google did not show one. It is a valid result, and the request is charged including the add-on. When you did not request it, the aioverview key is absent.

What is the difference between sources, citationPills and relatedLinks?

sources is the overview's source rail. citationPills has one entry per inline chip and source pair, with a 1-based citationPillId and a position into sources. relatedLinks lists URLs under a chip's related links flyout that are not in sources.

Which countries support the AI Overview?

Call GET /v1/countries?model=aioverview for the list of markets the API supports for AI Overview requests.

More Google Search data

All Google Search fields · API reference