Skip to Content
APIEndpointsCited domains over time

Cited domains over time

How often AI answers cite each domain, one day at a time. These are the figures behind the Citations chart on your Dashboard, with the same filters, so a chart built from them matches the one in Asky.

Each day carries two measures per domain:

  • Citation rate is the share of AI answers that cite the domain at least once.
  • Citation share is the domain’s portion of all citations that day.

For one total per domain over the whole window, use Cited sources by domain. For the same series per page, use Cited sources over time.

GET /v1/brands/{brand_id}/citations/domains/timeseries

Authorization

HeaderTypeRequired
AuthorizationBearer asky_sk_…required

Requires the read:citations scope.

Path parameters

ParameterTypeRequiredDescription
brand_iduuidrequiredFrom List brands

Query parameters

ParameterTypeRequiredDescription
limitintegeroptionalDays 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. Defaults to 30 days ago. The window can span at most 92 days.
end_dateYYYY-MM-DDoptionalInclusive upper bound, YYYY-MM-DD in UTC. Defaults to today.
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, as ISO 3166-1 alpha-2 (GB, not UK). Narrows the population before metrics are computed.
tag_iduuid, repeatableoptionalTags to filter by; tag_match_mode decides whether prompts carrying them are kept or excluded. From List tags. Narrows the population before metrics are computed.
tag_match_modestringoptionalHow tag_id values apply. ‘any’ (default) or ‘all’ keep prompts carrying any or all of the tags; ‘exclude_any’ or ‘exclude_all’ drop them instead. One of: any, all, exclude_any, exclude_all.
top_nintegeroptionalHow many of the most-cited domains in the window to chart, 1 to 30. Defaults to 10. Cannot be combined with domain.
domainstring, repeatableoptionalChart exactly these domains instead of the most-cited ones. Up to 30. www.g2.com and g2.com are the same domain. Cannot be combined with top_n.

Request

curl --request GET \ --url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/citations/domains/timeseries?start_date=2026-07-14&end_date=2026-08-13&limit=100' \ --header 'Authorization: Bearer <api-key>'

Response

{ "data": [ { "date": "2026-07-14", "total_citations": 1184, "total_responses": 412, "domains": [ { "domain": "g2.com", "citations": 96, "responses_cited": 71, "citation_rate": 17.23, "citation_share": 8.11 }, { "domain": "example.com", "citations": 41, "responses_cited": 38, "citation_rate": 9.22, "citation_share": 3.46 } ] }, { "date": "2026-07-15", "total_citations": 1210, "total_responses": 409, "domains": [ { "domain": "g2.com", "citations": 88, "responses_cited": 66, "citation_rate": 16.14, "citation_share": 7.27 }, { "domain": "example.com", "citations": 0, "responses_cited": 0, "citation_rate": 0, "citation_share": 0 } ] } ], "pagination": { "limit": 100, "has_more": false, "next_cursor": null }, "meta": { "period": { "start_date": "2026-07-14", "end_date": "2026-08-13", "default_applied": false }, "brand_id": "242546de-4cee-4a7d-952e-f6aa60c63ef8", "brand_domain": "example.com", "series": ["g2.com", "example.com"] }, "request_id": "req_4c1e9a07b2d84f5e9a31" }

Response fields

FieldTypeDescription
dataobject[]required. One entry per day, oldest first
data[].dateYYYY-MM-DDrequired. The UTC day
data[].total_citationsintegerrequired. Every citation in that day’s answers, across all domains. The denominator of citation_share
data[].total_responsesintegerrequired. Every answer that day. The denominator of citation_rate
data[].domainsobject[]required. One entry per domain in meta.series, in the same order
data[].domains[].domainstringrequired. The registrable domain, for example g2.com
data[].domains[].citationsintegerrequired. Times the domain was cited that day
data[].domains[].responses_citedintegerrequired. Answers that cited the domain at least once
data[].domains[].citation_ratenumberrequired. responses_cited as a percentage of total_responses, two decimals
data[].domains[].citation_sharenumberrequired. citations as a percentage of total_citations, two decimals
meta.periodobjectrequired. { start_date, end_date, default_applied } actually used
meta.brand_iduuidrequired
meta.brand_domainstring | nullrequired. Your brand’s primary domain. Null when the brand has no domain on record, or nothing was cited in the window
meta.seriesstring[]required. The domains every day carries, most cited across the window first
paginationobjectrequired. See pagination
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 window spans more than 92 days, top_n and domain are both set, or a domain is not a domain. The message names the problem
401invalid_tokenThe key is missing, malformed, or does not exist
401token_expiredThe key passed its expiry date
401token_revokedThe key was revoked
403insufficient_scopeThe key lacks read:citations
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
500internal_errorThe request could not be completed. On a brand with a very large prompt set, a long window can take too long: request a shorter window or add filters

Notes

The numbers match the Dashboard. Both use the same calculation and the same filters. Both percentages are taken over the whole day, every domain included, not only the domains listed here.

Your own domain is always included. Your brand’s primary domain is charted beside the most-cited ones (so top_n=10 can return 11 domains) or beside the domains you name. meta.brand_domain says which one it is.

Every day lists every domain. A domain not cited on a day shows zeros, so the domains form the same columns on every day. A day is left out only when no answer that day cites any of the listed domains.

Longer histories. The window spans at most 92 days. For a longer history, request one window at a time and name the same domains with domain in each. The most-cited list is worked out per window, so without named domains two windows can chart different domains.

Paging. Pages are days. A 92-day window fits one page with limit=100.

Last updated on