Skip to main content

AI

Pages crawled

Which of your pages the AI crawlers fetched, and what they came for.

GET/sites/{siteId}/ai/pages
Pages crawled
curl --request GET \
  --url 'https://truestat.io/api/v1/sites/{siteId}/ai/pages' \
  --header 'Authorization: Bearer <token>'
{
  "data": [
    {
      "path": "/",
      "views": 703,
      "purpose": "ai_training"
    },
    {
      "path": "/pricing",
      "views": 88,
      "purpose": "search"
    }
  ],
  "meta": {
    "page": {
      "limit": 100,
      "offset": 0,
      "has_more": true
    },
    "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"
  }
}

A ranked list of the pages crawlers actually fetched.

Fetched is not the same as cited

This endpoint and referrals look similar and count opposite things:

Pages crawled

A machine fetched this page. Nobody read it. It may be used to answer a question later, or to train a model, or neither.

Referrals

A person landed on this page after clicking a link in an assistant's answer. Your page was recommended and somebody acted on it.

The interesting reading is the gap. A page crawled heavily and never referred is being consumed rather than recommended — read into a model, not handed to a reader. A page with few fetches and steady referrals is the opposite: it gets cited, and citations bring people.

Neither is automatically good or bad. But they are different things, and a tool that adds them together tells you nothing about either.

purpose travels with the page

Each row carries the purpose of the fetch, so the same path appears more than once when it was fetched for more than one reason. /pricing under search and /pricing under ai_training are two rows, and it usually matters which one grew.

Paging

The default page is 100 rows, ordered by fetches. limit and offset work as they do everywhere else, and meta.page.has_more tells you whether there is another page — it is measured, not guessed from a row count.

Crawler traffic is always counted here, whatever bots says. See crawlers.

Authorizations

Authorizationstringheaderrequired

An 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)pathrequired
The site's id, from `GET /sites`. A site that is not yours and a site that does not exist both answer 403, so this cannot be used to discover other people's ids.

Query parameters

periodenum<string>query
A named window, resolved in `tz`. Cannot be combined with `from`/`to` — a request carrying both is refused rather than guessed at.
options:todayyesterdaylast24hlast7dlast30dlast12mmonthyearall
fromstring (date-time)query
Start of the window, ISO 8601 with an offset. Must be given together with `to`.
tostring (date-time)query
End of the window. Must be given together with `from`.
tzstringquerydefault: UTC
IANA timezone for day boundaries. `period=today&tz=Europe/Istanbul` means the reader's today, not the server's. Defaults to UTC.
botsenum<string>querydefault: excluded
Whether crawler traffic is counted. Excluded by default — the `/ai/*` endpoints report it separately and always include it.
options:excludedincluded
limitintegerquerydefault: 100
Rows per page, 1 to 1000.
offsetintegerquerydefault: 0
Rows to skip.
filter_pathstringquery
Narrow the result to one `path`.
filter_path_patternstringquery
Narrow the result to one `path_pattern`.
filter_hostnamestringquery
Narrow the result to one `hostname`.
filter_entry_pathstringquery
Narrow the result to one `entry_path`.
filter_exit_linkstringquery
Narrow the result to one `exit_link`.
filter_file_downloadstringquery
Narrow the result to one `file_download`.
filter_goalstringquery
Narrow the result to one `goal`.
filter_browserstringquery
Narrow the result to one `browser`.
filter_osstringquery
Narrow the result to one `os`.
filter_devicestringquery
Narrow the result to one `device`.
filter_countrystringquery
Narrow the result to one `country`.
filter_regionstringquery
Narrow the result to one `region`.
filter_citystringquery
Narrow the result to one `city`.
filter_referrerstringquery
Narrow the result to one `referrer`.
filter_channelstringquery
Narrow the result to one `channel`.
filter_utm_sourcestringquery
Narrow the result to one `utm_source`.
filter_utm_mediumstringquery
Narrow the result to one `utm_medium`.
filter_utm_campaignstringquery
Narrow the result to one `utm_campaign`.
filter_gad_campaign_idstringquery
Narrow the result to one `gad_campaign_id`.
filter_utm_termstringquery
Narrow the result to one `utm_term`.
filter_bot_kindstringquery
Narrow the result to one `bot_kind`.

Response

application/json

The answer.

dataunknown
See the example.
metaobject