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. |
citationPills[] and relatedLinks[]
| 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.
Related
- Monitoring Google AI Overviews and AI Overviews with async batches and webhooks.
- AI Overview API options and the Google AI Overview API post.
- People Also Ask, where
include.paaAioverviewfills in AI-answered questions. - AI Mode sources, Google’s conversational surface.
- Google Search engine guide for targeting, batches and billing.
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
organic results
Ranked Google listings with titles, URLs and snippets, pages 1 through 10.
ads
The ads Google shows for a query, with block position, copy, destination and shopping-card prices.
People Also Ask
The People Also Ask questions Google clusters around a query, with their answers.
People are saying
The 'People are saying' discussion links Google shows for a query.
related searches
The related queries Google suggests at the foot of the page.
knowledge graph
The knowledge panel Google shows for an entity: description, website, profiles, key facts and Knowledge Graph ID.
local pack
Map-pack results with names, ratings and positions for local queries.