Skip to Content
APIEndpointsCrawler summary

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/summary

Authorization

HeaderTypeRequired
AuthorizationBearer asky_sk_…required

Path parameters

ParameterTypeRequiredDescription
brand_iduuidrequiredFrom List brands

Query parameters

ParameterTypeRequiredDescription
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.

Request

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

{ "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

FieldTypeDescription
data.periodobjectrequired. { start_date, end_date } actually used
data.timezonestringrequired. Always UTC
data.totalsobjectrequired. One count per operator bucket, plus all
data.by_crawlerobjectrequired. Exact bot name to hit count, for example { "GPTBot": 412 }
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

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.

Last updated on