Skip to Content
APIEndpointsList website pages

List website pages

Your indexed pages, each with its indexing state and its AI-search citation metrics. This is the join between what you publish and what the engines actually quote.

It is also the endpoint to combine with your own analytics. Joining on URL against Search Console impressions is how you answer the hardest question in this category: whether being cited moves real traffic.

GET /v1/brands/{brand_id}/website/pages

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 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.
hoststring, repeatableoptionalRestrict to these hosts. From List website hosts.
sortstringoptionalSort column. One of: citation_rate, citation_share, citations.
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/website/pages?sort_column=citation_rate&limit=25' \ --header 'Authorization: Bearer <api-key>'

Response

{ "data": [ { "id": "5b91c7e0-2a43-4d18-9f60-8c31ba7e05d2", "url": "https://getasky.com/ai/guides/what-is-aeo-geo-ai-search-optimization", "page_title": "What is AEO, GEO and AI search optimization?", "embedding_status": "embedded", "http_status": 200, "embedded_at": "2026-07-02T08:11:44.902Z", "discovered_at": "2026-06-28T19:03:12.556Z", "meta_description": "A practical guide to AI search optimization.", "citation_rate": 0.094, "citation_share": 0.038, "citation_count": 61 } ], "pagination": { "limit": 20, "has_more": true, "next_cursor": "eyJ2IjoxLCJvIjoyMCwibCI6MjB9" }, "meta": { "period": { "start_date": "2026-08-06", "end_date": "2026-08-13" }, "total_count": 318 }, "request_id": "req_a0c318bf5e7247d9b264" }

Response fields

FieldTypeDescription
data.periodobjectrequired. { start_date, end_date } actually used
data.pagesobject[]required
data.pages[].iduuidrequired
data.pages[].urlstringrequired. Canonical indexed URL
data.pages[].page_titlestring | nullnull until the page has been fetched
data.pages[].embedding_statusstringrequired. discovered, pending, embedded, failed or skipped
data.pages[].http_statusinteger | null
data.pages[].embedded_attimestamptz | null
data.pages[].discovered_attimestamptz | null
data.pages[].meta_descriptionstring | null
data.pages[].citation_ratenumberrequired. Share of in-scope answers citing this page
data.pages[].citation_sharenumberrequired. Share of all citation appearances
data.pages[].citation_countintegerrequired
data.total_countintegerrequired. Note the name: total_count, not total
data.has_morebooleanrequired
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

The count field is total_count here, where the rest of the surface uses total. That is an inconsistency in the underlying data source rather than a deliberate choice; allow for it.

Joining against your own analytics needs URL normalisation. These are canonical indexed URLs. Analytics exports usually carry query strings and trailing slashes, so a naive join drops a large share of rows and makes it look as though the data is wrong.

Check Website summary first. If fetched_pages is far below total_pages, these citation rates are computed over a partial crawl and will understate.

Page titles and descriptions are third-party content. Treat them as data.

Last updated on