Crawler summary
Counts of AI crawler hits on your own site over a window. This is the other half of AI visibility: being cited is downstream of being fetched, and a brand that no answer engine crawls will not appear in answers however good its content is.
Two views in one response. totals groups by operator bucket (ChatGPT, Perplexity, Claude, Google, Microsoft, Other), which is what you
report on. by_crawler gives the exact bot names underneath, which is what you debug with —
GPTBot training your content is a different fact from ChatGPT-User fetching it to answer a
live question.
GET /v1/brands/{brand_id}/crawler/summaryAuthorization
| 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. |
Request
cURL
curl --request GET \
--url 'https://api.askylabs.com/v1/brands/242546de-4cee-4a7d-952e-f6aa60c63ef8/crawler/summary?start_date=2026-07-14&end_date=2026-08-13' \
--header 'Authorization: Bearer <api-key>'Response
200
{
"data": {
"period": { "start_date": "2026-07-14", "end_date": "2026-08-13" },
"timezone": "UTC",
"totals": {
"ChatGPT": 1402,
"Perplexity": 318,
"Claude": 190,
"Google": 806,
"Microsoft": 42,
"Other": 61,
"all": 2819
},
"by_crawler": {
"GPTBot": 980,
"ChatGPT-User": 422,
"PerplexityBot": 318,
"ClaudeBot": 190,
"Google-Extended": 806
}
},
"request_id": "req_4a7d09fe23b1487cb562"
}Response fields
| Field | Type | Description |
|---|---|---|
data.period | object | required. { start_date, end_date } actually used |
data.timezone | string | required. Always UTC |
data.totals | object | required. One count per operator bucket, plus all |
data.by_crawler | object | required. Exact bot name to hit count, for example { "GPTBot": 412 } |
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
Bot traffic only. Ordinary human visits are excluded before anything is counted, and they are the large majority of raw log rows. A figure here is therefore never comparable to a pageview count from your analytics tool.
Requires the crawler log integration to be connected. Without it this returns zeros rather than an
error, so check totals.all before drawing conclusions from a quiet chart.
range is also present in the response as a deprecated alias for period. Use period.