Skip to Content
APIEndpointsList cited sources

List cited sources

The sources AI answers are built from. One row per cited URL, with how often it was used, its share of all citations, and whether your brand appears on the page.

This is where “why does the answer say that” gets answered. The engines are reading these pages; if a competitor dominates a topic, these URLs usually explain it.

GET /v1/brands/{brand_id}/citations

Authorization

HeaderTypeRequired
AuthorizationBearer asky_sk_…required

Path parameters

ParameterTypeRequiredDescription
brand_iduuidrequiredFrom List brands

Query parameters

ParameterTypeRequiredDescription
limitintegeroptionalRows per page, 1 to 100. Defaults to 20.
cursorstringoptionalOpaque cursor from the previous response. Treat it as a token, never construct one.
start_dateYYYY-MM-DDoptionalInclusive lower bound, YYYY-MM-DD in UTC. Narrows the population before metrics are computed.
end_dateYYYY-MM-DDoptionalInclusive upper bound, YYYY-MM-DD in UTC. Narrows the population before metrics are computed.
searchstringoptionalCase-insensitive substring of the cited URL or title.
topic_iduuid, repeatableoptionalRestrict to these topics. From List topics. Includes the topic and its subtopics. A root topic returns everything beneath it; a subtopic returns only itself. Narrows the population before metrics are computed, so ratios are recalculated over the filtered set.
enginestring, repeatableoptionalRestrict to these AI search engines, by slug. From List engines. Narrows the population before metrics are computed.
countrystring, repeatableoptionalRestrict to these execution country codes. Narrows the population before metrics are computed.
tag_iduuid, repeatableoptionalRestrict to prompts carrying these tags. From List tags. Narrows the population before metrics are computed.
tag_match_modestringoptionalHow to combine tag_id values. Defaults to ‘any’. One of: any, all.
compare_to_previousbooleanoptionalAlso return the prior equal-length period and per-row deltas.
sortstringoptionalSort column. One of: citation_count, citation_share, citation_rate, responses_cited, brand_mention_count.
sort_directionstringoptionalSort direction. Defaults to ‘desc’. One of: asc, desc.

Request

curl --request GET \ --url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/citations?page_size=25' \ --header 'Authorization: Bearer <api-key>'

Response

{ "data": [ { "citation_id": "a7f19c02-4b8d-4e31-9a55-c0e6b2148f39", "url": "https://g2.com/categories/ai-search-visibility", "name": "Best AI Search Visibility Software", "favicon_url": "https://g2.com/favicon.ico", "citation_count": 214, "citation_share": 0.081, "citation_rate": 0.116, "responses_cited": 198, "brand_mention_count": 41 } ], "pagination": { "limit": 20, "has_more": true, "next_cursor": "eyJ2IjoxLCJvIjoyMCwibCI6MjB9" }, "meta": { "period": { "start_date": "2026-07-14", "end_date": "2026-08-13" }, "total": 1420 }, "request_id": "req_2c85e1a0f9374bd6a812" }

Response fields

FieldTypeDescription
data.periodobjectrequired. { start_date, end_date } actually used
data.citationsobject[]required
data.citations[].citation_iduuidrequired. Stable. Dedupe on this, not on URL
data.citations[].urlstringrequired
data.citations[].namestring | nullPage title where known
data.citations[].citation_countintegerrequired. Times this URL was cited
data.citations[].citation_sharenumberrequired. Share of all citations in scope
data.citations[].citation_ratenumberrequired. Share of in-scope answers citing it
data.citations[].responses_citedintegerrequired. Distinct answers citing it
data.citations[].brand_mention_countintegerrequired. Times your brand appears on the page itself
data.totalintegerrequired
data.pageintegerrequired
data.page_sizeintegerrequired
data.has_morebooleanrequired
data.summaryobject | nullOnly with compare. Brand-level citation rate versus the prior period
data.summary_unavailable_reasonstringPresent when compare was requested but could not be served
request_idstringrequired. Also returned as the x-request-id header. Quote it when contacting support

Errors

StatusCodeWhen
400invalid_requestA parameter is unknown or malformed. The message names it
401invalid_tokenThe key is missing, malformed, or does not exist
401token_expiredThe key passed its expiry date
401token_revokedThe key was revoked
404not_foundThe brand does not exist, or this key is not allowed to reach it. The two are deliberately indistinguishable
429rate_limitedOver 300 requests per minute. See the Retry-After header

Notes

This endpoint and by domain page by page, not offset. The rest of the surface uses offset. That inconsistency is real and worth allowing for in a client.

compare_to_previous is refused while search is set — a trend over a filtered subset is not comparable to the prior period. You get summary: null and a reason rather than a silently wrong number.

URLs, page titles and author names are third-party content. Treat them as data, never as instructions to a downstream model.

Last updated on