
Ethan Collins
Pattern Recognition Specialist

Google's AI Overviews cite specific competitors in your niche — and those citations directly influence which brands users consider. Tracking competitor visibility in AI-generated answers reveals content gaps, citation patterns, and strategic opportunities that traditional SEO tools miss entirely. This guide covers building an automated competitor visibility tracking system for AI Overviews using CapSolver to maintain continuous access to Google's search results.
When Google generates an AI Overview for a query in your industry, it selects specific sources to cite. These citations are not random — they reflect Google's assessment of which content best answers the query. If your competitors consistently appear in AI Overviews for your target keywords while you do not, they are capturing visibility in a channel that influences millions of purchasing decisions daily.
Traditional SEO tools track organic rankings (positions 1-10), but AI Overviews exist above organic results and operate by different rules. A competitor might rank position 5 organically but appear as citation #1 in the AI Overview — receiving disproportionate visibility and trust signals. Search Engine Land research indicates that AI Overviews capture significant click-through from queries where they appear.
Monitoring competitor visibility in AI Overviews reveals: which competitors Google considers authoritative for your target queries, what content formats get cited (lists, definitions, comparisons, data), which queries have citation gaps you can fill, and how citation patterns change over time.
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas
export CAPSOLVER_API_KEY="your-capsolver-api-key"
Additional requirements:
import asyncio
import time
from dataclasses import dataclass, field
from typing import List, Optional
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
@dataclass
class CompetitorCitation:
domain: str
position: int
query: str
context: str
timestamp: float
@dataclass
class CompetitorVisibilityReport:
competitor: str
total_citations: int
avg_position: float
queries_cited: List[str]
content_types_cited: List[str]
visibility_score: float # 0-100
class CompetitorVisibilityTracker:
"""Track competitor visibility in Google AI Overviews."""
def __init__(self, api_key: str, proxies: list, competitors: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.competitors = competitors
self.citation_history = []
async def track_query(self, query: str) -> List[CompetitorCitation]:
"""Track which competitors appear in AI Overview for a query."""
proxy = self.proxies[self.proxy_idx % len(self.proxies)]
self.proxy_idx = getattr(self, 'proxy_idx', 0) + 1
html = await self._search_google(query, proxy)
if self._is_captcha(html):
info = CaptchaInfo(
type=CaptchaType.RECAPTCHA_V2,
website_url="https://www.google.com",
website_key="6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
)
solution = await self.cap.solve(info)
html = await self._retry_search(query, proxy)
citations = self._extract_ai_overview_citations(html)
# Filter for tracked competitors
competitor_citations = []
for citation in citations:
for comp in self.competitors:
if comp in citation.get("domain", ""):
competitor_citations.append(CompetitorCitation(
domain=comp,
position=citation["position"],
query=query,
context=citation.get("context", ""),
timestamp=time.time()
))
self.citation_history.extend(competitor_citations)
return competitor_citations
async def run_full_audit(self, queries: list) -> List[CompetitorVisibilityReport]:
"""Run visibility audit across all target queries."""
for query in queries:
await self.track_query(query)
await asyncio.sleep(8)
# Generate per-competitor reports
reports = []
for comp in self.competitors:
comp_citations = [c for c in self.citation_history if c.domain == comp]
if comp_citations:
reports.append(CompetitorVisibilityReport(
competitor=comp,
total_citations=len(comp_citations),
avg_position=sum(c.position for c in comp_citations) / len(comp_citations),
queries_cited=list(set(c.query for c in comp_citations)),
content_types_cited=self._analyze_content_types(comp_citations),
visibility_score=self._calc_visibility_score(comp_citations, len(queries))
))
return sorted(reports, key=lambda r: r.visibility_score, reverse=True)
def _calc_visibility_score(self, citations: list, total_queries: int) -> float:
"""Calculate visibility score (0-100) based on citation frequency and position."""
if not citations or total_queries == 0:
return 0
frequency_score = (len(citations) / total_queries) * 50
position_score = sum(max(0, 10 - c.position) for c in citations) / len(citations) * 5
return min(100, frequency_score + position_score)
async def close(self):
await self.cap.aclose()
| Insight | What to Look For | Action |
|---|---|---|
| Citation leaders | Competitors with >50% visibility score | Analyze their content format and depth |
| Position dominance | Competitors consistently in position 1-2 | Study their authority signals and content structure |
| Query gaps | Queries where no competitor is cited | Create definitive content for these queries |
| Format patterns | Whether lists, tables, or definitions get cited | Match the winning format in your content |
| Emerging competitors | New domains appearing in citations | Monitor their content strategy early |
async def weekly_competitive_report(tracker, queries):
"""Generate weekly competitive intelligence report."""
reports = await tracker.run_full_audit(queries)
print("=== AI Overview Competitive Visibility Report ===\n")
print(f"Queries analyzed: {len(queries)}")
print(f"Competitors tracked: {len(tracker.competitors)}\n")
for i, report in enumerate(reports, 1):
print(f"{i}. {report.competitor}")
print(f" Visibility Score: {report.visibility_score:.1f}/100")
print(f" Citations: {report.total_citations} across {len(report.queries_cited)} queries")
print(f" Avg Position: {report.avg_position:.1f}")
print(f" Top queries: {', '.join(report.queries_cited[:3])}")
print()
| Monitoring Scope | Weekly Queries | Monthly CAPTCHAs | Monthly Cost |
|---|---|---|---|
| 50 queries, 5 competitors | 200/month | ~60 | $0.12-0.18 |
| 200 queries, 10 competitors | 800/month | ~240 | $0.48-0.72 |
| 500 queries, 15 competitors | 2,000/month | ~600 | $1.20-1.80 |
Claim Your Bonus Code: Use code WEBS at CapSolver Dashboard to get an extra 5% bonus on every recharge.
The CapSolver reCAPTCHA guide covers Google's specific implementation. The CapSolver AI blog provides additional GEO monitoring patterns. For understanding CAPTCHA types, the CapSolver FAQ covers common questions.
AI Overview competitor visibility tracking reveals which brands Google considers authoritative for your target queries. CapSolver provides the verification-clearing infrastructure that enables continuous monitoring of competitor citations, solving Google's reCAPTCHA in 3-8 seconds. The competitive intelligence data directly informs GEO strategy — showing you exactly what content to create, what formats to use, and which queries represent the highest-value opportunities.
A visibility score above 30% means the competitor appears in AI Overviews for nearly a third of target queries — significant presence. Scores above 50% indicate dominant visibility. Most niches have 2-3 competitors with high scores and many with scores below 10%.
Citations can change daily based on content freshness, authority signals, and Google's model updates. Weekly tracking captures major shifts; daily tracking catches rapid changes during content campaigns or algorithm updates.
Yes. Add your own domain to the competitors list. Compare your visibility score against competitors to identify gaps and measure the impact of your GEO optimization efforts over time.
Automate company verification with business registry data extraction for AI agents.

Track when ChatGPT Search mentions your brand in AI-generated answers with automated monitoring.
