AI Search Citation Monitor — Google AI Overview & AI Mode
Pricing
from $10.00 / 1,000 query processeds
AI Search Citation Monitor — Google AI Overview & AI Mode
Track which sources Google's AI Overview cites for your keywords. One record per query: AI answer text and Markdown, cited URLs with position and domain, whether your target domains were cited, and the organic top 10. Built for GEO / AI visibility monitoring. Failed queries are not charged.
Pricing
from $10.00 / 1,000 query processeds
Rating
0.0
(0)
Developer
Yosuke Sakaguchi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Share
Find out which websites Google's AI answers cite for the keywords you care about. Give the Actor a list of search queries and, optionally, the domains you want to track (your site, your clients, your competitors). For every query it fetches the Google results page, extracts the AI Overview block, and returns the answer text, every cited source with its real URL and domain, a yes/no hit for each target domain, and the organic top 10 for comparison.
Use it for GEO (generative engine optimization) reporting, AI-visibility tracking, content gap analysis, or simply to see whether Google's AI sends traffic to you or to someone else.
What you get
One dataset record per query and engine:
| Field | Type | Description |
|---|---|---|
query | string | The query you passed in |
engine | google_ai_overview | google_ai_mode | Which AI surface was checked |
countryCode, languageCode | string | Localization used for the search |
hasAiAnswer | boolean | Whether an AI answer was present on the page |
answerText | string | null | Plain text of the AI answer as served in the results page |
answerMarkdown | string | null | The same answer as Markdown, with inline links resolved to real URLs |
citations | { position, url, domain, title, resolved }[] | Sources cited by the AI answer in order of appearance. domain is without www. |
citedDomains | string[] | Unique cited domains, first-seen order |
targetDomainHits | { domain, cited, positions }[] | One entry per target domain from the input. Subdomains count as hits |
organicTop10 | { position, url, domain, title, resolved }[] | Up to 10 organic results from the same page |
extractionMethod | string | null | Which extraction path found the answer (useful when Google changes its markup) |
serpUrl | string | The Google URL that was requested |
fetchedAt | string | ISO 8601 timestamp |
status | ok | failed | skipped | failed = blocked, network error or AI Mode unavailable; skipped = spending cap reached |
error | string | Present only when status is not ok |
The run always finishes as SUCCEEDED, even when some queries fail. Check status per record instead of the run status.
Input
| Field | Type | Default | Description |
|---|---|---|---|
queries | string[] | required | Search queries. One record per query and engine |
targetDomains | string[] | [] | Domains to track, e.g. ["example.com", "competitor.io"]. Protocol, www. and paths are stripped |
engines | string[] | ["google_ai_overview"] | google_ai_overview and/or google_ai_mode (experimental, see below) |
countryCode | string | us | Selects the Google domain (google.com, google.co.uk, google.de, ...) and the gl parameter |
languageCode | string | en | Interface language (hl). Extraction is most reliable with en |
maxQueries | integer | 100 | Safety cap on the number of queries processed |
resolveUrls | boolean | true | Google serves result links as opaque redirect tokens. When on, the Actor follows each redirect (headers only) to get the real URL and domain |
proxyGroup | auto | GOOGLE_SERP | RESIDENTIAL | auto | Which Apify Proxy group fetches the results page. auto prefers the Google SERP proxy |
maxConcurrency | integer | 3 | Parallel result-page fetches (1–10) |
debugSaveHtml | boolean | false | Store the raw HTML of every fetched page in the run's key-value store (HTML-0001.html, ...) |
Example input:
{"queries": ["best project management software", "how to make sourdough bread"],"targetDomains": ["forbes.com", "kingarthurbaking.com"],"engines": ["google_ai_overview"],"countryCode": "us","languageCode": "en"}
Output example
{"query": "best project management software","engine": "google_ai_overview","countryCode": "us","languageCode": "en","hasAiAnswer": true,"answerText": "The top project management software platforms for 2026 depend on your team's size, workflow style, and budget:\nTop Software Picks\nClickUp\nBest for: All-in-one flexibility and custom workflows.\nKey features: 13+ task views (list, board, Gantt, timeline), built-in AI, and a generous free plan ...","answerMarkdown": "The top project management software platforms for 2026 depend on your team's size, workflow style, and budget:\n\nTop Software Picks\n\n- **ClickUp** [ClickUp](https://www.clickup.com/)\n - **Best for:** All-in-one flexibility and custom workflows.\n ...","citations": [{ "position": 1, "url": "https://www.clickup.com/", "domain": "clickup.com", "title": "ClickUp", "resolved": true },{ "position": 2, "url": "https://www.forbes.com/advisor/business/software/best-project-management-software/", "domain": "forbes.com", "title": "10 Best Project Management Software of 2026 – Forbes Advisor", "resolved": true },{ "position": 3, "url": "https://www.monday.com/", "domain": "monday.com", "title": "monday.com", "resolved": true },{ "position": 4, "url": "https://www.reddit.com/r/projectmanagement/comments/1jwjw9s/what_project_management_tools_do_you_guys/", "domain": "reddit.com", "title": "What project management tools do you guys recommend? - Reddit", "resolved": true },{ "position": 5, "url": "https://www.youtube.com/watch?v=v33m1aDCs1w&t=270", "domain": "youtube.com", "title": "Ranking the Best Project Management Tools of 2026", "resolved": true }],"citedDomains": ["clickup.com", "forbes.com", "monday.com", "reddit.com", "youtube.com"],"targetDomainHits": [{ "domain": "forbes.com", "cited": true, "positions": [2] },{ "domain": "kingarthurbaking.com", "cited": false, "positions": [] }],"organicTop10": [{ "position": 1, "url": "https://www.icagile.com/resources/honest-review-of-6-personal-project-management-tools-with-kanban-view", "domain": "icagile.com", "title": "Honest Review of 6 Personal Project Management Tools ...", "resolved": true },{ "position": 2, "url": "https://www.paymoapp.com/blog/project-management-software/", "domain": "paymoapp.com", "title": "20+ Best Project Management Software for 2026", "resolved": true }],"extractionMethod": "heading:ai-overview","serpUrl": "http://www.google.com/search?q=best+project+management+software&hl=en&gl=us&pws=0","fetchedAt": "2026-10-15T04:40:12.345Z","status": "ok"}
A query where Google shows no AI Overview still returns status: "ok" with hasAiAnswer: false and the organic top 10, because "no AI answer for this keyword" is itself a monitoring result. A failed query looks like this and is not charged:
{"query": "best project management software","engine": "google_ai_mode","status": "failed","error": "ai_mode_not_available","hasAiAnswer": false,"citations": [],"organicTop10": [],"fetchedAt": "2026-10-15T04:40:12.345Z"}
Pricing
Pay per event. You are charged only for records with status: "ok".
| Event | Price | When |
|---|---|---|
query-processed | $0.01 | One query checked on one engine and the results page parsed (with or without an AI answer) |
Monitoring 200 keywords once a day costs $1.00 per day. Failed queries (blocked page, network error, AI Mode unavailable) are free. You can cap spending per run with the Maximum total charge setting in Apify Console or the maxTotalChargeUsd API parameter; once the cap is reached, remaining queries are returned with status: "skipped".
Usage
Apify Console
Open the Actor, paste your keywords into Search queries, add your domains to Target domains, click Start, and download the dataset as JSON, CSV or Excel. Schedule the task daily or weekly to build a time series of AI citations.
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fre.d/ai-search-citations').call({queries: ['best project management software', 'how to make sourdough bread'],targetDomains: ['forbes.com', 'kingarthurbaking.com'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const r of items) {if (r.status !== 'ok') { console.warn(r.query, r.error); continue; }console.log(r.query, r.hasAiAnswer ? r.citedDomains.join(', ') : '(no AI Overview)');for (const hit of r.targetDomainHits) if (hit.cited) console.log(' cited:', hit.domain, 'at', hit.positions);}
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient(token=os.environ["APIFY_TOKEN"])run = client.actor("fre.d/ai-search-citations").call(run_input={"queries": ["best project management software", "how to make sourdough bread"],"targetDomains": ["forbes.com", "kingarthurbaking.com"],})for r in client.dataset(run["defaultDatasetId"]).iterate_items():if r["status"] != "ok":print("failed:", r["query"], r["error"])continueprint(r["query"], "->", r["citedDomains"] if r["hasAiAnswer"] else "(no AI Overview)")
AI agents via MCP
Add the Apify MCP server to your agent (Claude Desktop, Cursor, LangGraph, etc.) and allow this Actor:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=fre.d/ai-search-citations","headers": { "Authorization": "Bearer <APIFY_TOKEN>" }}}}
The agent can then call the tool with {"queries": ["..."], "targetDomains": ["..."]} and read citedDomains, targetDomainHits and answerText directly from the result.
HTTP API
curl -X POST "https://api.apify.com/v2/acts/fre.d~ai-search-citations/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"queries": ["best project management software"], "targetDomains": ["forbes.com"]}'
How it works
- Queries are de-duplicated and combined with the selected engines.
- Each results page is fetched through Apify Proxy (Google SERP proxy by default, residential as fallback) with your country and language settings.
- The AI Overview block is located by a chain of strategies: known container attributes, then the "AI Overview" heading and its enclosing block, then a text-structure fallback. The strategy that succeeded is reported in
extractionMethod. - Google serves result links as opaque redirect tokens. With
resolveUrlson, the Actor follows each redirect (reading only theLocationheader, never downloading the target page) to obtain the real URL and domain. - The answer is converted to plain text and Markdown, citations are de-duplicated and numbered, and target domains are matched against the cited domains (subdomains included).
Limitations and notes
- Not an official Google API. Results are scraped from the public results page and are a snapshot: AI Overviews vary by country, language, time of day and even between two requests. Treat single runs as samples and schedule repeated runs for trends.
- Partial answer text. Google serves only the collapsed part of the AI Overview in the HTML; text behind "Show more" is loaded later by the browser and is not included. Citations visible in the collapsed block are captured; sources that only appear after expanding may be missing.
- AI Mode is experimental. Google renders AI Mode (
udm=50) in the browser. When the HTML does not contain an answer, the record is returned withstatus: "failed"anderror: "ai_mode_not_available"and is not charged. - Markup changes. Google changes its HTML frequently. If
hasAiAnswerdrops tofalseacross all queries while Google clearly shows AI Overviews, open an issue;extractionMethodanddebugSaveHtmlexist to make the fix fast. - No personal data. The Actor only processes public search result pages for the keywords you provide. It does not use cookies, Google accounts or logins, and it does not collect data about individuals. Keep your
queriesfree of personal information. languageCodeother thanenworks for fetching, but the AI Overview heading is recognised in a limited set of languages (en, ja, de, fr, es, it, pt, nl, zh, ko).
Support
Open an issue on the Actor's Issues tab in Apify Store. Feature requests (Bing Copilot, Perplexity, ChatGPT search, historical comparison between runs) are welcome.