AI
Crawler series
Crawler activity in buckets, split by what each fetch came to do.
curl --request GET \
--url 'https://truestat.io/api/v1/sites/{siteId}/ai/series' \
--header 'Authorization: Bearer <token>'{
"data": [
{
"total": 338,
"bucket": "2026-09-09 00:00:00",
"indexing": 50,
"training": 209,
"answering": 2,
"ai_referrals": 4
}
],
"meta": {
"range": {
"to": "2026-09-16T13:40:00.000Z",
"tz": "UTC",
"from": "2026-09-09T13:40:00.000Z",
"clamped": false
},
"site_id": "6fed8980-a119-4a9c-a4d4-53e448ef9f9e"
}
}Crawler activity over time, with each bucket split by purpose — what the AI chart is drawn from.
Why the split lives here and not in /timeseries
/timeseries carries crawler_views,
a single total per bucket. That is the line the visitor chart draws.
The split comes from its own query, and it is here because the distinction is the whole reason the AI section exists: a fetch that answers somebody's question right now and a fetch that harvests pages for a training run arrive the same way and mean opposite things. One is a reader you never see; the other is nobody at all. Collapsed into one line, that difference disappears.
So: one number for the chart, four for the argument.
total is more than the three parts
answering + indexing + training will usually come to less than total, and
nothing is missing. Crawls whose purpose we do not recognise are counted in
total and have no column of their own — a recognised crawler doing something
unclassified, rather than an error.
Measured on a real site in one hour: 9 answering, 26 training, total 37.
Bucket size
unit takes minute, hour, day, week or month, and defaults to a
size that suits the window — hours for a day, days for a month, weeks for a
year. A year in minutes is half a million buckets, which is not a chart.
Buckets are cut in UTC
tz resolves the window here as it does everywhere: period=today&tz=Europe/Istanbul
means your today, not the server's.
What it does not do is move the boundaries inside that window. A unit=day
bucket starts at UTC midnight whatever tz you pass.
For this measurement it matters little — a crawler keeps no office hours, so
an edge a few hours out changes the shape of the curve rather than what it
says. It is written down because /timeseries does cut its buckets in tz,
so the two charts disagree at the edges, and a caller comparing them deserves
the reason rather than a mystery.
Crawler traffic is always counted here, whatever bots says. See
crawlers.
Authorizations
AuthorizationstringheaderrequiredAn API key from Settings → API keys. Scopes available: analytics:read, sites:read, sites:write, settings:read, settings:write, goals:read, goals:write, funnels:read, funnels:write, notes:read, notes:write, alerts:read, alerts:write, team:read, team:write, revenue:read, revenue:write.
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path parameters
siteIdstring (uuid)pathrequiredQuery parameters
unitenum<string>queryminutehourdayweekmonthperiodenum<string>querytodayyesterdaylast24hlast7dlast30dlast12mmonthyearallfromstring (date-time)querytostring (date-time)querytzstringquerydefault: UTCbotsenum<string>querydefault: excludedexcludedincludedfilter_pathstringqueryfilter_path_patternstringqueryfilter_hostnamestringqueryfilter_entry_pathstringqueryfilter_exit_linkstringqueryfilter_file_downloadstringqueryfilter_goalstringqueryfilter_browserstringqueryfilter_osstringqueryfilter_devicestringqueryfilter_countrystringqueryfilter_regionstringqueryfilter_citystringqueryfilter_referrerstringqueryfilter_channelstringqueryfilter_utm_sourcestringqueryfilter_utm_mediumstringqueryfilter_utm_campaignstringqueryfilter_gad_campaign_idstringqueryfilter_utm_termstringqueryfilter_bot_kindstringqueryResponse
The answer.
dataunknownmetaobjecterrorobjecterrorobjecterrorobjecterrorobject