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}/promptsAuthorization
| Header | Type | Required |
|---|---|---|
Authorization | Bearer asky_sk_… | required |
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
brand_id | uuid | required | From List brands |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | integer | optional | Rows per page, 1 to 100. Defaults to 20. |
cursor | string | optional | Opaque cursor from the previous response. Treat it as a token, never construct one. |
is_active | boolean | optional | Filter by active state. |
topic_id | uuid, repeatable | optional | Restrict 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_stage | string, repeatable | optional | Restrict to prompts in these funnel stages. One of: top, middle, bottom. |
language | string | optional | Two-letter language code, e.g. en. |
search | string | optional | Case-insensitive substring of the prompt text. |
volume_tier | string, repeatable | optional | Restrict 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. |
sort | string | optional | Order. ‘volume’ ranks by search demand; defaults to newest first. One of: created_at, volume. |
Request
cURL
curl --request GET \
--url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/prompts?limit=50' \
--header 'Authorization: Bearer <api-key>' \Response
200
{
"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
| Field | Type | Description |
|---|---|---|
data.prompts | object[] | required |
data.prompts[].id | uuid | required |
data.prompts[].prompt_text | string | required. The question as asked |
data.prompts[].is_active | boolean | required. Currently always true — see the notes |
data.prompts[].topic_id | uuid | null | null for an uncategorised prompt |
data.prompts[].country_codes | string[] | required. Markets this prompt runs in. A prompt can target several |
data.prompts[].funnel_stages | string[] | required. Multi-label, not a single stage |
data.prompts[].language | string | null | |
data.prompts[].mentions_own_brand | boolean | null | true = branded, false = unbranded category demand. See the note below |
data.prompts[].tags | object[] | required. { id, name, slug, color } |
data.prompts[].volume_tier | string | null | niche … very_high. Never a raw number |
data.prompts[].volume_state | string | null | analyzing or unknown when no tier is available yet |
data.prompts[].difficulty_tier | string | null | easy, medium or hard. Never inferred, so null when unmeasured |
data.prompts[].created_at | timestamptz | required |
data.total | integer | required. Matching prompts, ignoring pagination |
data.limit | integer | required |
data.offset | integer | required |
data.has_more | boolean | required |
request_id | string | required. Also returned as the x-request-id header. Quote it when contacting support |
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | A parameter is unknown or malformed. The message names it |
| 401 | invalid_token | The key is missing, malformed, or does not exist |
| 401 | token_expired | The key passed its expiry date |
| 401 | token_revoked | The key was revoked |
| 404 | not_found | The brand does not exist, or this key is not allowed to reach it. The two are deliberately indistinguishable |
| 429 | rate_limited | Over 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.