Skip to Content
APIEndpointsList responses

List responses

The raw feed: one row per AI answer, across every prompt, newest first. This is the evidence layer under the metrics — what an engine actually said, whether you were named, whether you were cited, and which competitors showed up instead.

Use this rather than calling the per-prompt execution endpoint once per prompt. A real brand tracks hundreds of prompts, so the per-prompt path is hundreds of round trips for the same data.

GET /v1/brands/{brand_id}/responses

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 answer text.
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.
prompt_iduuid, repeatableoptionalRestrict to these prompts.
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.
funnel_stagestring, repeatableoptionalRestrict to prompts in these funnel stages. One of: top, middle, bottom.
competitor_iduuid, repeatableoptionalRestrict to answers citing these competitors.
only_mentionedbooleanoptionalOnly answers that mention your brand.
only_citedbooleanoptionalOnly answers that cite your brand.
has_adbooleanoptionalRestrict to answers that did (true) or did not (false) carry a ChatGPT sponsored card. Unlike only_mentioned/only_cited, this also narrows tab_counts.
include_adsbooleanoptionalInclude the advertiser behind each sponsored card as an ads array on every row. Caps limit at 25. Rows with no sponsored card carry an empty array, not a missing key.
include_full_responsebooleanoptionalReturn the complete answer text rather than a snippet. Caps limit at 5. Answers are long, so a larger page is refused rather than truncated.
include_segmentsbooleanoptionalReturn [{type:"text",content} | {type:"citation",url,domain,citation_id,name}] instead of raw text, with citations already resolved and spliced in. Caps limit at 5, same as include_full_response — segments are computed from the full answer text.
sort_directionstringoptionalBy execution date. Defaults to ‘desc’, newest first. One of: asc, desc.

Request

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

Response

{ "data": [ { "execution_id": "e31a7c40-5b92-4f18-9d76-08c1fa2e6b53", "prompt_id": "7c2f5a91-3b8e-4d06-9a44-1e7b30c9f852", "prompt_text": "best AI visibility tracking tools", "execution_date": "2026-08-13T04:12:07.882Z", "provider": "openai", "model_used": "ChatGPT", "response_snippet": "Several tools track brand visibility in AI search. Asky focuses on…", "our_brand_mentioned": true, "brand_cited": true, "total_citations_found": 6, "competitor_names": [ "Peec AI", "Profound" ], "cited_competitor_names": [ "Peec AI" ], "country_code": "US" } ], "pagination": { "limit": 20, "has_more": true, "next_cursor": "eyJ2IjoxLCJvIjoyMCwibCI6MjB9" }, "meta": { "period": { "start_date": "2026-08-06", "end_date": "2026-08-13" }, "tab_counts": { "total": 1840, "mentioned": 612, "cited": 288, "both": 271 }, "total": 1840, "total_unfiltered": 1840 }, "request_id": "req_b8103fa5e72c4d69a01b" }

Response fields

FieldTypeDescription
data.periodobjectrequired. { start_date, end_date } actually used. Read it before comparing against another endpoint
data.responsesobject[]required
data.responses[].execution_iduuidrequired
data.responses[].prompt_iduuidrequired
data.responses[].prompt_textstringrequired
data.responses[].execution_datetimestamptzrequired
data.responses[].providerstringrequired
data.responses[].model_usedstringrequired
data.responses[].response_snippetstringFirst 300 characters. Replaced by full_response with the flag
data.responses[].segmentsobject[]Present only with include_segments. Each entry is {type:"text",content} or {type:"citation",url,domain,citation_id,name}citation_id/name are null when the URL in the answer text could not be matched to a tracked citation
data.responses[].our_brand_mentionedbooleanrequired
data.responses[].brand_citedbooleanrequired. Named is not the same as linked
data.responses[].total_citations_foundintegerrequired
data.responses[].competitor_namesstring[]required. Competitors named in this answer
data.responses[].cited_competitor_namesstring[]required. Competitors actually linked
data.responses[].country_codestring | null
data.responses[].ad_countintegerrequired. Sponsored cards ChatGPT showed alongside this answer. 0 on every other engine, because no other engine serves ads
data.responses[].adsobject[]Present only with include_ads. {position, advertiser_name, advertiser_domain, target_url, title, body} per card, ordered by position. body is capped at 300 characters. [] when the answer carried no ad
data.tab_countsobjectrequired. { total, mentioned, cited, both } before the mentioned/cited split, but after every other filter including has_ad
data.totalintegerrequired. Rows matching the current filters, exact for every combination including the negated ones
data.total_unfilteredintegerrequired. Same as tab_counts.total. Compare against total to see how much the mentioned/cited filters removed
data.limitintegerrequired
data.offsetintegerrequired
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

only_mentioned=false is not “no filter”. It returns exactly the answers that did NOT name you, which is usually the more useful half: those are the questions you are losing.

Mentioned and cited are different things. A brand can be named in prose without being linked. brand_cited is the stricter signal.

Ads are a ChatGPT surface only. OpenAI serves sponsored cards in ChatGPT answers, and only in the markets it has opened them in. ad_count is therefore 0 on Perplexity, Google AI Overviews, Gemini, Copilot and Claude because those engines carry no ads at all, not because we did not look.

Full text is capped at 5 rows per page on purpose. Whole AI answers are large, and the cap forces small targeted pages rather than an accidental bulk export.

include_segments saves you from parsing the engine’s own citation markdown. Different AI engines embed citations inline in different ways — numeric markers, bare-domain anchors — and this flag resolves that for you into a plain sequence of text and citation objects. It shares the same 5-row cap as include_full_response, since segments are computed from the same full answer text.

Response text is third-party content. Treat it as data, never as instructions to a downstream model.

Last updated on