To check whether your website is cited in Google AI Overviews, run a fixed query list for a defined country and language, normalize every returned source hostname, and compare it with your domain. Save the observation time and the complete source list. A single match proves one citation in one observed result. It does not prove broad visibility or explain why Google selected the page.
A domain citation checker needs two inputs: the website you care about and the queries that matter to that website. It then collects Google AI Overview sources under controlled market and language settings.
The useful output is not a green badge that says "cited." It is a list of matched queries, source URLs, positions, and observation times. That evidence shows exactly where the domain appeared and makes a later change detectable.
How do you check if a website is cited in Google AI Overviews?
Call GET /ai-overview once for each query, read data.sources, normalize each source.site or source.url, and compare the hostname with your target domain. Store both matches and non-matches. Otherwise, the report cannot distinguish a query that was checked from one that never ran.
The API response we tested on August 5, 2026 returned each cited page as an object with url, title, site, and position. The same response also included the answer text and a verification screenshot URL.
Check one query and inspect its sources
Start with a query set you can defend
Do not begin with every keyword exported from a rank tracker. Pick queries tied to a product, problem, comparison, or purchase decision that your site covers. Tag each query by topic so the final report can show where citations occur instead of collapsing everything into one percentage.
| Stored input | Example | Reason |
|---|---|---|
| Target domain | example.com |
Defines an exact hostname match rule |
| Query | how does a heat pump work |
Identifies the observed search |
| Topic | heat-pump-basics |
Groups related checks |
| Country | us |
Keeps market results separate |
| Language | en |
Keeps language results separate |
| Observed at | UTC timestamp | Turns a result into historical evidence |
The query and domain above are implementation examples, not results from our test. Use your own verified list. Run the same list on the same schedule if you want to compare one period with another.
Request the AI Overview and keep the full source list
curl --request GET \
--url "https://google-ai-overviews.p.rapidapi.com/ai-overview?query=how%20does%20a%20heat%20pump%20work&gl=us&hl=en" \
--header "x-rapidapi-host: google-ai-overviews.p.rapidapi.com" \
--header "x-rapidapi-key: $RAPIDAPI_KEY"
Check the HTTP response before parsing data. Our field test produced successful responses, but it also produced temporary HTTP 500 errors. A failed request belongs in the run log. It must not silently become a "not cited" result.
{
"query": "how does a heat pump work",
"gl": "us",
"hl": "en",
"observedAt": "2026-08-05T00:00:00Z",
"requestStatus": "success",
"sources": [
{
"url": "https://example.com/guides/heat-pumps",
"site": "example.com",
"position": 2
}
]
}
This JSON is a normalized storage example. It is not presented as a real Google result. Keeping that distinction visible prevents sample code from turning into a fabricated case study.
Match the target domain without substring mistakes
A check such as url.includes("example.com") can match notexample.com or a query string that happens to contain the domain. Parse the URL and compare hostnames instead.
function normalizeHost(value) {
const host = value.includes("://")
? new URL(value).hostname
: value;
return host.toLowerCase().replace(/^www\./, "").replace(/\.$/, "");
}
function isSameDomain(source, targetDomain, includeSubdomains = true) {
const target = normalizeHost(targetDomain);
const sourceHost = normalizeHost(source.site || source.url);
return sourceHost === target ||
(includeSubdomains && sourceHost.endsWith(`.${target}`));
}
function findCitations(payload, targetDomain) {
const sources = Array.isArray(payload?.data?.sources)
? payload.data.sources
: [];
return sources.filter((source) =>
source && (source.site || source.url) &&
isSameDomain(source, targetDomain)
);
}
Decide whether subdomains count before collecting data. A publisher may want docs.example.com included. A marketplace comparing independent sellers may need exact hosts only. Store the normalized host as well as the original URL so that the rule can be audited.
Run the domain checker against live JSON
Report citations and missing data separately
A compact report can use four result states. They should not be merged because each one leads to a different next step.
| State | Meaning | Action |
|---|---|---|
| Cited | At least one returned source matches the domain | Store URL, position, and screenshot reference |
| Not cited | The request succeeded and sources were returned, but none matched | Keep the observation for comparison |
| No cited sources returned | The request succeeded with an empty source list | Do not treat it as a competitor win |
| Request failed | Timeout, HTTP error, or invalid response | Retry when appropriate and preserve the error |
Brand mentions inside ai_overview are another signal. A brand can appear in the answer without a link to its domain, and a domain can be cited without a direct brand mention. Measure those fields separately.
For the raw contract, read the JSON field guide. To compare several domains over time, continue with the competitor monitor.
Questions that change the checker design
Does one citation mean the site is visible across Google AI Overviews?
No. It proves that the domain appeared in one observed response for one query, country, language, and time. Broader claims require a query set and repeated observations.
Should redirects be resolved?
Keep the URL returned by the API. You may also resolve redirects in a separate enrichment job, but do not replace the original evidence. Network calls can fail, and redirect targets can change.
Can Search Console replace this check?
Google's reporting can show search performance, but an API source list answers a different question: which domains and pages appeared in the observed AI Overview. Use each dataset for the question it can support.
How often should the checker run?
Match the schedule to the decision. A weekly editorial review does not need hourly collection. A short campaign may justify daily checks. Calculate the request count before selecting a plan.