Citations and Mentions
AI provider responses may contain citations (URL references to web pages) and mentions (textual references to brand names). These are extracted and stored for each prompt run.
Brand citations
Brand citations are aggregated by URL, giving you a view of which pages are most frequently cited for a brand. Each result includes the AI providers and topics that cited the URL.
query GetAiVisibilityBrandCitations(
$accountId: ObjectID!
$aiVisibilityProjectId: ObjectID!
$aiVisibilityBrandId: ObjectID!
$dateRange: AiVisibilityDateRangeInput
) {
getAiVisibilityBrandCitations(
accountId: $accountId
aiVisibilityProjectId: $aiVisibilityProjectId
aiVisibilityBrandId: $aiVisibilityBrandId
dateRange: $dateRange
first: 20
orderBy: [{ field: totalBrandCitations, direction: DESC }]
) {
nodes {
pageId
canonicalUrl
url
title
aiProviderTypes
topicNames
avgBrandPosition
totalBrandCitations
avgCitationScore
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
Fields
| Field | Description |
|---|---|
pageId | Stable id for the cited page, shared with every other AI Visibility query |
canonicalUrl | Canonical form of the cited URL; the key rows are grouped by |
url | A representative raw cited URL, for linking |
title | Search-result title for the page, or null if SERP discovery has never seen it |
aiProviderTypes | Array of AI providers that cited this URL |
topicNames | Array of topic names associated with this URL's citations |
avgBrandPosition | Average citation position across all appearances |
totalBrandCitations | Total number of times this URL was cited |
avgCitationScore | Average citation quality score (nullable) |
brand | The brand the citations are attributed to (see below) |
Each node is one page, not one URL spelling: citations of https://example.com/p?ref=chat and https://example.com/p aggregate into a single row, and totalCount counts pages. Join a row to page scores, discovered pages and page runs on pageId — see Page Identity.
Cited pages across all brands
Omit aiVisibilityBrandId to list the pages cited for every brand in the project at once. A citation is attributed to the brand recognised as the cited page's publisher, so each row is one page and one publisher, with that brand in brand:
query GetAiVisibilityCitedPagesAcrossBrands(
$accountId: ObjectID!
$aiVisibilityProjectId: ObjectID!
$aiVisibilityPromptId: ObjectID
$brandTypes: [AiVisibilityBrandType!]
$dateRange: AiVisibilityDateRangeInput
) {
getAiVisibilityBrandCitations(
accountId: $accountId
aiVisibilityProjectId: $aiVisibilityProjectId
aiVisibilityPromptId: $aiVisibilityPromptId
brandTypes: $brandTypes
dateRange: $dateRange
first: 20
) {
nodes {
pageId
canonicalUrl
url
title
brand {
id
name
type
}
totalBrandCitations
avgBrandPosition
avgCitationScore
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
- A page normally has one publisher, so it is normally one row. It appears once per brand when AI answers attributed it to different publishers;
totalCountcounts these rows. - Merged brands are shown as their merge target.
- Citations whose publisher was not recognised as any brand are a row with
brand: null. brandTypeslimits the rows to pages published by brands of those types, for example[Own, Competitor], and leaves out pages with no recognised publisher. It is only accepted whenaiVisibilityBrandIdis omitted.previousPeriodcompares each row with the same page and brand incomparisonDateRange.
Across a whole project the result covers every cited page, so scope it with aiVisibilityPromptId or aiVisibilityTopicId and a dateRange where you can.
When aiVisibilityBrandId is given, brand is that brand on every row.
Sorting
Citations can be sorted by: url, avgBrandPosition, totalBrandCitations, avgCitationScore. The url field sorts on canonicalUrl.
Default sort is totalBrandCitations DESC, canonicalUrl ASC. Across all brands, rows for the same page are then ordered by brand.
Filtering
All parameters that filter brand citations:
| Parameter | Type | Description |
|---|---|---|
aiVisibilityProjectId | ObjectID! | Required. Scopes to a project |
aiVisibilityBrandId | ObjectID | Optional. The brand (including merged variants); omit for all brands |
brandTypes | [AiVisibilityBrandType] | Optional. All brands only: limit to these publisher brand types |
aiVisibilityTopicId | ObjectID | Optional. Filter to a specific topic |
aiVisibilityTopicIds | [ObjectID] | Optional. Filter to any of these topics (maximum 100) |
aiVisibilityPromptId | ObjectID | Optional. Filter to a specific prompt |
dateRange | AiVisibilityDateRangeInput | Optional. Defaults to last 30 days |
aiProviderTypes | [AiVisibilityAiProviderType] | Optional. Filter by AI platform |
search | String | Optional. Search the cited page's canonical URL |
citedByAiProviderTypes | [AiVisibilityAiProviderType] | Optional. Pages cited by at least one of these AI platforms |
notCitedByAiProviderTypes | [AiVisibilityAiProviderType] | Optional. Pages cited by none of these AI platforms |
totalBrandCitations | AiVisibilityIntFilterInput | Optional. Compare the page's totalBrandCitations |
avgCitationScore | AiVisibilityFloatFilterInput | Optional. Compare the page's avgCitationScore |
avgBrandPosition | AiVisibilityFloatFilterInput | Optional. Compare the page's avgBrandPosition |
search drops pages whose canonical URL does not contain the text, without changing the metrics of the pages it keeps, and totalCount counts only the matching pages — see Searching pages.
aiVisibilityTopicIds scopes the query the way aiVisibilityTopicId does, but to several topics: only citations from prompts in those topics count, so every metric changes with it. Pass one or the other, not both.
Filtering on what a page reports
The remaining filters choose which pages are returned without changing any page's metrics, and totalCount counts only the pages that match:
query GetAiVisibilityFilteredCitedPages(
$accountId: ObjectID!
$aiVisibilityProjectId: ObjectID!
$aiVisibilityBrandId: ObjectID!
$aiVisibilityTopicIds: [ObjectID!]
$citedByAiProviderTypes: [AiVisibilityAiProviderType!]
$totalBrandCitations: AiVisibilityIntFilterInput
$avgCitationScore: AiVisibilityFloatFilterInput
$dateRange: AiVisibilityDateRangeInput
) {
getAiVisibilityBrandCitations(
accountId: $accountId
aiVisibilityProjectId: $aiVisibilityProjectId
aiVisibilityBrandId: $aiVisibilityBrandId
aiVisibilityTopicIds: $aiVisibilityTopicIds
citedByAiProviderTypes: $citedByAiProviderTypes
totalBrandCitations: $totalBrandCitations
avgCitationScore: $avgCitationScore
dateRange: $dateRange
first: 20
) {
nodes {
pageId
canonicalUrl
aiProviderTypes
topicNames
totalBrandCitations
avgCitationScore
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
citedByAiProviderTypeskeeps a page when any of the listed AI platforms cited it;notCitedByAiProviderTypeskeeps it when none of them did. Both test the platforms in the page'saiProviderTypes. This differs fromaiProviderTypes, which leaves the other platforms' citations out of every metric.totalBrandCitations,avgCitationScoreandavgBrandPositiontake the comparisonseq,ne,lt,le,gtandge. Every comparison you set must hold, so{ ge: 40, lt: 60 }selects a band. Averages are compared as returned, rounded to one decimal place, so a page shown withavgCitationScore: 60is not kept by{ gt: 60 }.- Filters on different fields, and every other argument, combine with AND.
Brand mentions
Brand mentions return individual mention rows with full details including the mention text, its position in the response, and sentiment analysis.
query GetAiVisibilityBrandMentions(
$accountId: ObjectID!
$aiVisibilityProjectId: ObjectID!
$aiVisibilityBrandId: ObjectID!
$dateRange: AiVisibilityDateRangeInput
) {
getAiVisibilityBrandMentions(
accountId: $accountId
aiVisibilityProjectId: $aiVisibilityProjectId
aiVisibilityBrandId: $aiVisibilityBrandId
dateRange: $dateRange
first: 20
orderBy: [{ field: brandMentionQualityScore, direction: DESC }]
) {
nodes {
rawId
text
textSpan {
start
end
}
position
brandName
brandType
sentiment
sentimentJustification
brandMentionQualityScore
aiProviderType
createdAt
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
Fields
| Field | Description |
|---|---|
rawId | Unique mention identifier |
text | The mention text |
textSpan | Character offset range (start and end) within the full response |
position | Position of the mention within the answer |
brandName | Original brand name (preserved even for merged brands) |
brandType | Brand type (own, competitor, other) |
sentiment | Sentiment score |
sentimentJustification | Explanation for the sentiment rating |
brandMentionQualityScore | Quality score (0-100) |
aiProviderType | Which AI provider generated this mention |
createdAt | When the prompt run was created |
citations | Citations the answer used to support this mention (see below) |
Citations behind a mention
citations lists the sources the answer used to support each mention, in answer order. These are the citations placed in the passage that names the brand, or those the AI platform itself reported as backing it. A citation's publisher is not necessarily the mentioned brand: a review site can support a mention of your competitor, and publisherBrandName tells you who publishes the page.
Each citation carries:
| Field | Description |
|---|---|
position | Position of the citation within the answer |
url / canonicalUrl | The cited URL as returned, and its canonical page key |
domain | Host of the cited page, lowercased and without www. |
domainOwnership | Own, Competitor or Other, checked against your brands' domains |
publisherBrandName | Brand that publishes the cited page, when one was recognised |
sourceType | Authoritative, Listicle or Weak: the kind of page the source is |
backing | How the citation was tied to the passage: Grounded (reported by the platform), Inline, Marker or None |
citationQualityScore | Citation quality score (0-100) |
domainOwnership compares the cited page's host with the domains of your project's own and competitor brands. A brand domain covers subdomains only when includeSubdomains is set on it, and www. is ignored on both sides. When a domain belongs to both an own and a competitor brand, it counts as Own.
citations is empty when the answer's sources could not be tied to the passage. Some AI platforms, such as Google AI Overviews and AI Mode, never report where their sources sit, so their mentions have no backing citations. Mentions from runs processed before citations were linked to mentions are also empty.
sourceType can differ between two runs that cite the same page, so compare it across many mentions rather than reading a single citation's value as settled.
query GetAiVisibilityBrandMentionsFromIndependentSources(
$accountId: ObjectID!
$aiVisibilityProjectId: ObjectID!
$aiVisibilityBrandId: ObjectID!
$dateRange: AiVisibilityDateRangeInput
) {
getAiVisibilityBrandMentions(
accountId: $accountId
aiVisibilityProjectId: $aiVisibilityProjectId
aiVisibilityBrandId: $aiVisibilityBrandId
dateRange: $dateRange
citationSource: NonOwnDomain
first: 20
) {
nodes {
rawId
text
sentiment
brandMentionQualityScore
aiProviderType
citations {
position
url
domain
domainOwnership
publisherBrandName
sourceType
backing
}
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
Sorting
Mentions can be sorted by: id, position, brandMentionQualityScore, createdAt.
Default sort is brandMentionQualityScore DESC.
Filtering
Same filtering parameters as brand citations (project, brand, topic, prompt, date range, AI provider types), plus filters on the citations behind each mention:
| Argument | Description |
|---|---|
citationSource | Cited, Uncited, OwnDomain, NonOwnDomain (backed by a page outside your own domains) or ThirdPartyDomain (outside own and competitor domains) |
citationSourceTypes | Only mentions backed by a citation of these source types |
citationDomains | Only mentions backed by a citation on one of these domains or their subdomains, such as reddit.com |
answerMentionsOwnBrand | true or false: whether the same answer also mentions one of your own brands |
citationSource, citationSourceTypes and citationDomains must all hold for the same backing citation: citationSource: NonOwnDomain with citationSourceTypes: [Listicle] returns mentions backed by a listicle outside your domains. Combining Uncited with either of the other two returns no mentions. totalCount reflects every filter.
To find competitor mentions in answers that leave your brand out, sourced from independent pages, query the competitor's mentions with answerMentionsOwnBrand: false and citationSource: ThirdPartyDomain.
Schema reference
AiVisibilityCitationListItem-- Citation aggregation typeAiVisibilityMentionListItem-- Mention row typeAiVisibilityMentionCitation-- Citation backing a mentionAiVisibilityMentionCitationSource-- Citation source filterAiVisibilityTextSpan-- Text span typeAiVisibilityCitationQualityScoreComponent-- Citation quality breakdownAiVisibilityMentionQualityScoreComponent-- Mention quality breakdown