Blog/SEO, GEO and news
5 min read

AI Visibility Tracking: Store the Shape of Each Results Page

Track AI visibility and SERP history per call: AI Overview, People Also Ask, cited sources and position in one row, from live runs of five endpoints.

AI Visibility Tracking: Store the Shape of Each Results Page

Record what a Google results page looked like, not only where you ranked, in one prompt. Paste this into your agent:

Set up https://monid.ai/SKILL.md, and then use Monid to search Google for "ai visibility tracking", and give me one row with the top three organic links, whether an AI Overview appeared, the sources it cited, and how many People Also Ask questions showed.

One prompt stores one row of shape. 1 min setup · 12-30 hrs saved.

You rank fourth for a keyword, the position line is flat for months, and the clicks fall anyway. The line records where you sat, not what the page around you looked like. This guide shows how to record both: the organic results, the AI Overview, the People Also Ask questions and the sources an AI answer cited. We ran every call below on 2026-10-16. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.

What is the easiest way to track AI visibility and SERP history through an API?

Monid. Install it once, add a key, and your agent runs a search call per keyword and gets the results page back as typed JSON, with the AI Overview, the related questions and the cited sources in the same response. There is no tracker subscription to set up and no platform to log in to.

  • Pay per call. A Google search with the AI Overview included is billed at $0.00015 per call (Verified 2026-10-16 on the web search tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
  • One install, every API. The same key and balance call the search endpoint, the AI Mode endpoint and every other tool on Monid, not another vendor per job.
  • Lives inside your agent. Install the CLI, add your key, run the prompt above, and the loop runs whenever your agent needs it, with nothing to keep running between sweeps. Your agent reads SKILL.md and learns the rest, so setup is about a minute.

At that price a sweep of 100 keywords is about $0.015 (Verified 2026-10-16), so a daily sweep for a month is about $0.45.

What is SERP history, and how is it different from rank history?

SERP history is the record of how a results page changed over time for a keyword. Two different things go by that name, and most tools only sell the first.

Position history: where you sat

A number per keyword per day. Every rank tracker produces it. It measures you.

Page-shape history: what the page looked like

Whether an AI Overview fired, which sources it cited, how many People Also Ask questions showed, and which three sites held the top. It measures the environment, and it explains the other half.

Why the shape matters even when the number does not move

Your position can stay at four all year while everything that decides your traffic changes. We saw one reason in the data on 2026-10-16: for the query "ai visibility tracking", the DataForSEO endpoint returned the AI Overview as the first item on the page (rank_absolute 1), and the first organic result was rank_absolute 2. A rank tracker calls that organic result position 1. The searcher scrolls past an AI answer to reach it.

A keyword where an AI block appeared in March is a keyword you can lose without moving. Position history records stability; a stored boolean records the month it happened.

📖 See also Rank Tracking API: The Hard Part Is Not the Fetch

How do you record a results page's shape over time?

Run one search call per keyword on a schedule and write a fixed set of fields from each response.

For agents

Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:

set up https://monid.ai/SKILL.md

It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.

For humans

npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main

Step 1. Inspect the endpoint

monid inspect -p litescrape -e /google/search

Inspecting is free. The schema lists the controls that make a series comparable (gl, hl, device, google_domain, location) and says the response includes ai_overview when Google generates one.

monid run -p litescrape -e /google/search --query '{"q":"ai visibility tracking","gl":"us","hl":"en"}' -w

On 2026-10-16 this returned nine organic results, each with position, position_absolute, title, link, displayed_link, source and snippet (and a date on some of them). Next to the organic list came related_searches (nine entries), related_questions (four People Also Ask questions, question text only), ask_ai_mode (three follow-up prompts), search_information with total_results 109, a pagination block and an ai_overview object with text_blocks and nine references. There was no knowledge_graph key on this query. The call billed $0.00015 (Verified 2026-10-16).

Read the absences too. A missing knowledge_graph is data: a block absent in August and present in November has changed the page, and the only way to know is to have written the absence down.

Step 3. Write a fixed row

from urllib.parse import urlparse

def shape_row(q, res, my_domain):
    organic = res["organic_results"]
    aio = res.get("ai_overview") or {}
    return {
        "keyword": q,
        "checked_at": now_utc(),
        "source": "litescrape /google/search",
        "params": res["search_parameters"],
        "organic_count": len(organic),
        "top_three": [r["link"] for r in organic[:3]],
        "my_position": next((r["position"] for r in organic
                             if my_domain in urlparse(r["link"]).netloc), None),
        "had_ai_overview": bool(aio),
        "aio_sources": sorted({ref.get("source") for ref in aio.get("references", [])}),
        "paa_count": len(res.get("related_questions", [])),
        "had_knowledge_graph": "knowledge_graph" in res,
        "total_results": res["search_information"]["total_results"],
    }

Three choices carry the weight. top_three is the cheapest competitive record there is: a keyword whose top three changed completely between runs is telling you something no position number will. source and params make the series provable, because a row tied to no provider and no parameters cannot be compared with the next one. aio_sources reads the source name and not the link, for a reason covered below.

Step 4. Loop it over your keywords

Put one keyword per line in keywords.txt, and write one file per keyword:

mkdir -p out
while read -r k; do
  monid run -p litescrape -e /google/search --query "{\"q\":\"$k\",\"gl\":\"us\",\"hl\":\"en\"}" -w > "out/$(echo "$k" | tr ' ' '-').json"
done < keywords.txt

Each keyword bills one call. The loop for the same job on other engines is in Bing SERP Tracker API.

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to check these 20 keywords weekly, store my position plus whether an AI Overview showed, the sources it cited, the People Also Ask count and the top three links, and tell me which keywords changed shape since last week.

How do you track AI Overviews and AI Mode answers?

Use the AI Overview that comes back with the search call, ask the dedicated endpoints when you want only the answer, and score naming and citing as separate fields.

The AI Overview on its own

monid run -p litescrape -e /google/ai-overview --query '{"q":"serp history","gl":"us","hl":"en"}' -w

This returns ai_overview with text_blocks (paragraphs, headings, lists) and references (a title, link, snippet and source for each). It billed $0.00015 (Verified 2026-10-16). Its description says it answers a 404 that is not charged when Google shows no overview. Both test queries had one, so we did not see the 404.

The AI Mode answer

monid run -p mrscraper -e /google/ai-mode -i '{"keyword":"how to track brand visibility in AI answers","country":"us"}' -w

This returns the answer as six typed text_blocks (paragraphs and two lists), the whole answer as markdown, and a total_time_taken of 5.191 seconds. It billed $0.01 (Verified 2026-10-16). The reference_links array was empty while the answer ran at length and named four approaches to tracking, so the answer talked about the topic and cited nothing.

That empty array is the reason to store two fields. A tracker that scores only citations writes a zero for an answer that discussed your category at length. Score named (your brand appears in the text) and cited (a source of yours appears in the references) separately.

Adding a citation count from a third party

ahrefs /site-explorer/ai-responses-count counts how often a domain is cited across eight AI platforms. We inspected it and did not run it: it bills $0.0774 per returned row (Verified 2026-10-16), so the bill follows the rows returned. The input is a target plus optional date, country and mode. It suits a weekly sanity check next to your own rows.

📖 See also Answer Engine Optimization: We Asked Four Surfaces the Same Six Questions

Can you build AI visibility tracking yourself with Python?

Yes, for a handful of keywords it is a weekend. You request the results page, parse the organic blocks, and look for the AI Overview and the People Also Ask block in the HTML.

The cost is everything around the parsing. Google changes its markup, so selectors that found the AI Overview last quarter find nothing this quarter and the job keeps running with a column of falses. You also need a fetch layer that survives blocking and location handling so two runs are comparable. A detector that suddenly finds zero overviews has usually broken rather than observed a change.

The Monid route is the choice for anything you will run weekly. The fetch and the parsing are maintained for you, the output is typed JSON instead of HTML, and a search is $0.00015 (Verified 2026-10-16). Free online checkers are quicker for one query by hand, not for a list.

What goes wrong when you track the shape of a results page?

Five things show up as soon as you compare two runs. All five are from the 2026-10-16 calls.

Why do two providers disagree about the same query?

Because each one asks Google its own way. We searched "ai visibility tracking" with LiteScrape and, about nine seconds later, with DataForSEO. LiteScrape's top three links were zapier.com, rankscale.ai and alhena.ai. DataForSEO's organic top three were backlinko.com, tryanalyze.ai and thatmarketingbuddy.com, and zapier.com appeared only as a source inside the AI Overview. They are two samples of a page that varies by location, device and moment. Pick one provider per series and never compare rows across providers.

Why does the AI Overview change between two calls?

Because the generated text is not a fixed document. We asked about "serp history" twice, about ten seconds apart, through the search endpoint and then the AI Overview endpoint. The first overview defined SERP history and listed tools, with eleven references. The second laid out a timeline of results-page eras, with eight references, and only one source (Ahrefs) appeared in both lists. A series that expects the same overview twice will flag noise as change. Store the text and the source list, count how often an overview appears, and read the trend over weeks.

Why does the domain of a reference not always come back as a domain?

Several reference links in the second overview were Google redirect URLs of the form google.com/goto?url=..., so a parser that reads the domain from the link records Google as the source. Read the source field instead, which held the site name.

Why is a missing People Also Ask not a no?

Because the two sources disagreed on it. For "ai visibility tracking", LiteScrape carried four related_questions and the DataForSEO response had no People Also Ask item at all, only an AI Overview, organic results and related searches. Treat a zero as a measurement of that provider on that call. Over three months the count warns you that Google is answering the topic itself. Which kind of search product returns which blocks is covered in SERP API for AI Agents.

What does a sweep cost, and does the position still mean what you think?

A keyword costs $0.00015 for a LiteScrape search, $0.002 for a DataForSEO page of ten results and $0.01 for an AI Mode answer (Verified 2026-10-16). As for position, DataForSEO numbers the AI Overview as rank_absolute 1 and the first organic result as rank_absolute 2, so decide whether your position counts blocks or organic results, and keep it the same for the life of the series.

Which endpoint should I use for which job?

EndpointWhat it doesInputBillingPrice (Verified 2026-10-16)
litescrape/google/searchResults page with organic results, related questions and the AI Overviewq, gl, hl, devicePer call$0.00015
litescrape/google/ai-overviewThe AI Overview only, with its references; a 404 that is not charged when none existsq, gl, hlPer call$0.00015
dataforseo/serp/google-organicEvery SERP element parsed, with rank_absolute and optional target filteringkeyword, location_code, language_code, depthPer page of 10 results$0.002
mrscraper/google/ai-modeGoogle AI Mode answer as typed blocks and markdownkeyword, countryPer call$0.01
ahrefs/site-explorer/ai-responses-countCitation counts across eight AI platformstarget, date, country, modePer returned row$0.0774
api.strale.io/x402/google-searchStructured Google resultsquery, country, language, num_resultsPer call$0.1188

Prices Verified 2026-10-16 with monid inspect. We ran the first four. The last two were inspected and not run: the Ahrefs endpoint bills per returned row, and the Strale endpoint is priced above our test-call cap. Loop the first row over a keyword list. The second suits keywords where you only care whether an overview exists. The third bills per page of ten results, so a depth of 20 is two units.

When is another route a better fit?

You need history you did not collect. A call returns the page as it is now. If the question is what a results page looked like before you started recording, only a vendor with its own archive can answer, and no schema decision made today reaches backwards.

You need ChatGPT, Perplexity or Gemini answers. The endpoints here cover Google's results page, AI Overview and AI Mode. Other assistants are other sources; keep one column per surface.

You need charts and client reports. Trackers ship dashboards. Database vendors often quote by the seat, which suits a team with no pipeline of its own.

Your use touches terms of use or personal data. Rules differ by country and by use, so check yours before you schedule a sweep.

And the disclosure: we sell per-call access to these endpoints. The most useful advice here holds wherever you buy: store the shape next to the position, and keep the series on one provider.

Conclusion

The quickest way to track AI visibility and SERP history through an API is a search call per keyword through Monid: $0.00015 for a search with the AI Overview included (Verified 2026-10-16), one key for every tool, about a minute to set up. Building the parsing yourself works for a few keywords and costs hours of upkeep.

Two things matter more than the endpoint. Store the shape in the same row as the position, because it cannot be added later. And keep the series comparable: one provider, the same parameters, the provider name in every row, and naming scored apart from citing.

How we estimated the time saved: building and running your own results-page collector is roughly 8 to 16 hours for the fetch layer, the parsing of the overview and question blocks, and the schedule, plus 4 to 14 hours for the first month of repairs when the markup changes. That is 12 to 30 hours. The 1 minute is the install, key and first call once you already have a Monid key.

Free next step: run monid inspect -p litescrape -e /google/search, then make one call on a keyword you know well and compare the related_questions and ai_overview fields with your browser. Start at monid.ai.

FAQ

What is AI visibility tracking?

It is recording whether and how your brand appears in AI-generated answers, such as Google's AI Overview and AI Mode, over time. Store three things per prompt: whether you are named, whether you are cited, and which sources the answer used.

Is there a free AI visibility tracking tool?

Free checkers exist for one-off looks, but a series needs a call per keyword per run. Through Monid a Google search with the AI Overview costs $0.00015 (Verified 2026-10-16), with no monthly plan and no minimum top-up, and inspection is free.

How do you detect an AI Overview programmatically?

Call an endpoint that reports it as a field and test whether the object is present. On the search endpoint above the answer is whether ai_overview exists in the response, and the dedicated endpoint returns a free 404 when there is none. Alert on your own detection rate, because a detector that suddenly finds none has usually broken.

What is PAA in SEO, and should you track it?

PAA is People Also Ask, the expandable block of related questions on a results page. Track the count per keyword per run rather than the questions: a growing block pushes organic results down without changing anyone's position number.

Can you get historical SERP data you never collected?

Only by buying it from a vendor that kept an archive, and only for the keywords it tracked. This route produces history from the day you schedule it.

Published August 2026.

ai visibility trackingserp historyai overviewpaa seorank tracking