Crawler activity over time
Crawl volume over time, split by operator bucket. Use it to spot a trend, a spike after a publish, or a crawler that has stopped coming.
Granularity is derived, not chosen: a single-day range returns 24 hourly buckets, any longer range returns daily buckets.
GET /v1/brands/{brand_id}/crawler/timeseriesAuthorization
| 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. |
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/timeseries?start_date=2026-07-14&end_date=2026-08-13' \
--header 'Authorization: Bearer <api-key>'Response
200
{
"data": [
{
"bucket": "2026-08-11",
"ChatGPT": 44,
"Perplexity": 9,
"Claude": 6,
"Google": 27,
"Microsoft": 1,
"Other": 3,
"total": 90
},
{
"bucket": "2026-08-13",
"ChatGPT": 51,
"Perplexity": 12,
"Claude": 4,
"Google": 30,
"Microsoft": 0,
"Other": 2,
"total": 99
}
],
"pagination": {
"limit": 20,
"has_more": true,
"next_cursor": "eyJ2IjoxLCJvIjoyMCwibCI6MjB9"
},
"meta": {
"period": {
"start_date": "2026-08-11",
"end_date": "2026-08-13"
},
"granularity": "day",
"timezone": "UTC"
},
"request_id": "req_ce20b7418d3f49a0b7e5"
}Response fields
| Field | Type | Description |
|---|---|---|
data.period | object | required |
data.granularity | string | required. hour or day |
data.timezone | string | required. Always UTC |
data.points | object[] | required. { bucket, ChatGPT, Perplexity, Claude, Google, Microsoft, Other, total } |
data.points[].bucket | string | integer | required. A date for daily, an hour 0–23 for hourly |
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.
Buckets with no visits are omitted. The series is sparse, so a missing date means zero crawls, not missing data. If you are charting this, fill the gaps client-side or a quiet day will silently close up and distort the shape — note the example above skips 2026-08-12.
Last updated on