Get visibility
Visibility is the penalized rate at which the brand is mentioned across in-scope AI answers, plus the supporting counts: how many executions ran, weighted sentiment, and where in the answer the brand tends to appear.
Set compare_to_previous=true and you get the preceding window of equal length with deltas in the
same response. Prefer that over issuing two requests with hand-built ranges — it is one round trip
and the period arithmetic cannot drift.
GET /v1/brands/{brand_id}/visibilityAuthorization
| 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 |
|---|---|---|---|
start_date | YYYY-MM-DD | optional | Inclusive lower bound, YYYY-MM-DD in UTC. Narrows the population before metrics are computed. |
end_date | YYYY-MM-DD | optional | Inclusive upper bound, YYYY-MM-DD in UTC. Narrows the population before metrics are computed. |
compare_to_previous | boolean | optional | Also return the prior equal-length period and per-row deltas. |
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. |
engine | string, repeatable | optional | Restrict to these AI search engines, by slug. From List engines. Narrows the population before metrics are computed. |
country | string, repeatable | optional | Restrict to these execution country codes. Narrows the population before metrics are computed. |
tag_id | uuid, repeatable | optional | Restrict to prompts carrying these tags. From List tags. Narrows the population before metrics are computed. |
Request
cURL
curl --request GET \
--url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/visibility?compare_to_previous=true' \
--header 'Authorization: Bearer <api-key>'Response
200
{
"data": {
"brand_id": "242546de-4cee-4a7d-952e-f6aa60c63ef8",
"period": { "start_date": "2026-08-06", "end_date": "2026-08-13" },
"visibility_pct": 34.2,
"total_executions": 1840,
"sentiment_score": 71.4,
"avg_rank": 2.8,
"previous": {
"period": { "start_date": "2026-07-30", "end_date": "2026-08-06" },
"has_data": true,
"visibility_pct": 29.7,
"total_executions": 1795,
"sentiment_score": 69.1,
"avg_rank": 3.1
},
"deltas": {
"visibility_pct": 4.5,
"total_executions": 45,
"sentiment_score": 2.3,
"avg_rank": -0.3
}
},
"request_id": "req_0f9a26cb45e1478db3d2"
}Response fields
| Field | Type | Description |
|---|---|---|
data.brand_id | uuid | required |
data.period | object | required. { start_date, end_date } actually used. Read it before comparing endpoints — their defaults differ |
data.visibility_pct | number | null | Penalized mention rate. null when nothing ran in the window |
data.total_executions | integer | required. Answers collected in scope |
data.sentiment_score | number | null | 0–100, weighted |
data.avg_rank | number | null | Average first-mention position. Lower is better |
data.previous | object | Only with compare_to_previous. Same shape, plus has_data |
data.deltas | object | Only with compare_to_previous. Change per metric, current minus previous |
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
A blended visibility number overstates performance. Branded prompts — ones that already name
you — are far easier to appear in than category prompts that do not. Split the two using
mentions_own_brand on List prompts and report them separately, or
the figure flatters itself.
previous.has_data distinguishes “the prior period was quiet” from “the prior period was zero”.
A delta computed against an empty window is not a trend.