Skip to Content
APIEndpointsList prompts

List prompts

Prompts are the questions run against AI search engines on this brand’s behalf. Everything else on the surface is downstream of them: responses, citations, visibility.

This endpoint returns their definitions, not their performance. For visibility share, citation rate and average rank per prompt, use Prompt metrics and join on id.

GET /v1/brands/{brand_id}/prompts

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.
is_activebooleanoptionalFilter by active state.
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.
funnel_stagestring, repeatableoptionalRestrict to prompts in these funnel stages. One of: top, middle, bottom.
languagestringoptionalTwo-letter language code, e.g. en.
searchstringoptionalCase-insensitive substring of the prompt text.
volume_tierstring, repeatableoptionalRestrict to these search-demand tiers. One of: niche, low, medium, high, very_high. Prompts with no measured tier are excluded entirely while this filter is active.
sortstringoptionalOrder. ‘volume’ ranks by search demand; defaults to newest first. One of: created_at, volume.

Request

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

Response

{ "data": [ { "id": "7c2f5a91-3b8e-4d06-9a44-1e7b30c9f852", "prompt_text": "best AI visibility tracking tools", "is_active": true, "topic_id": "4beb0694-7c2e-488b-84c1-613738e7eaf6", "country_codes": [ "US", "GB" ], "funnel_stages": [ "middle", "bottom" ], "language": "en", "mentions_own_brand": false, "tags": [ { "id": "1f8c2a5e-9d40-4b17-8e6a-3c05b91e7d22", "name": "Bottom funnel", "slug": "bottom-funnel", "color": "emerald" } ], "volume_tier": "medium", "volume_state": null, "difficulty_tier": "hard", "created_at": "2026-03-04T09:15:22.401Z" } ], "pagination": { "limit": 20, "has_more": true, "next_cursor": "eyJ2IjoxLCJvIjoyMCwibCI6MjB9" }, "request_id": "req_2f7b90c14ae8471da3cd" }

Response fields

FieldTypeDescription
data.promptsobject[]required
data.prompts[].iduuidrequired
data.prompts[].prompt_textstringrequired. The question as asked
data.prompts[].is_activebooleanrequired. Currently always true — see the notes
data.prompts[].topic_iduuid | nullnull for an uncategorised prompt
data.prompts[].country_codesstring[]required. Markets this prompt runs in. A prompt can target several
data.prompts[].funnel_stagesstring[]required. Multi-label, not a single stage
data.prompts[].languagestring | null
data.prompts[].mentions_own_brandboolean | nulltrue = branded, false = unbranded category demand. See the note below
data.prompts[].tagsobject[]required. { id, name, slug, color }
data.prompts[].volume_tierstring | nullnichevery_high. Never a raw number
data.prompts[].volume_statestring | nullanalyzing or unknown when no tier is available yet
data.prompts[].difficulty_tierstring | nulleasy, medium or hard. Never inferred, so null when unmeasured
data.prompts[].created_attimestamptzrequired
data.totalintegerrequired. Matching prompts, ignoring pagination
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

is_active is always true. Deactivating a prompt exists in the data model but was never shipped, so every tracked prompt is running. The field is returned for forward compatibility; do not build a filter or a status display on it expecting variation.

Demand is reported as tiers, never as raw numbers. volume_tier and difficulty_tier are the same resolution the product displays, so an API answer can never disagree with what a customer sees in the app. Exact search volume and keyword difficulty are stripped from every response on this surface.

mentions_own_brand is the branded/unbranded split. false means the prompt describes category demand without naming you, which is the harder and more valuable ground. Reporting visibility without separating the two overstates how well a brand is doing.

topic_id matches that topic exactly and does not expand to its subtopics. Since most prompts hang off subtopics rather than roots, filtering by a root topic returns far fewer prompts than you probably expect. Resolve the subtree yourself from List topics and filter client-side, or filter on the subtopic directly.

Last updated on