Skip to main content

Search Console

Pages

The pages Google sent traffic to, most clicked first.

GET/sites/{siteId}/search/pages
Pages
curl --request GET \
  --url 'https://truestat.io/api/v1/sites/{siteId}/search/pages' \
  --header 'Authorization: Bearer <token>'
{
  "data": [
    {
      "ctr": 0.0399,
      "path": "/tools/youtube-title-checker",
      "clicks": 72,
      "hostname": "codivupload.com",
      "position": 7.11,
      "impressions": 1803
    }
  ],
  "meta": {
    "page": {
      "limit": 100,
      "offset": 0,
      "has_more": true
    },
    "range": {
      "to": "2026-09-16T00:00:00.000Z",
      "tz": "UTC",
      "from": "2025-09-16T00:00:00.000Z",
      "clamped": false
    },
    "site_id": "6fed8980-a119-4a9c-a4d4-53e448ef9f9e"
  }
}

Your pages ranked by the traffic Google sent them.

Google's figures — see totals for why they do not reconcile with the rest of your analytics.

This is not /breakdowns/path with a filter

The two look alike and rank different things:

Search pages

The pages Google showed in its results, ranked by clicks from Google. A page nobody links to but Google ranks well appears high here.

Breakdowns by path

The pages people actually loaded, from every source. A page that gets all its traffic from a newsletter appears high there and not here at all.

Reading them side by side is where the useful gap shows up: a page with heavy search impressions and little total traffic is ranking without being clicked; a page with heavy traffic and no search presence depends entirely on a channel you do not control.

hostname and path are separate

A Search Console property can cover several subdomains, so the URL is split rather than returned whole.

That way a caller ranking pages across a domain groups on path, and one auditing which subdomain earns the traffic groups on hostname. Joining them into one string would force both to parse it apart again.

Position is per page

position here is the impression-weighted mean for that page across every term it ranked for — not its position for any single term. A page ranking first for a rare term and fortieth for a common one lands somewhere in between, weighted towards the common one.

For position by term, use terms.

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.

Response

application/json

The answer.

dataunknown
See the example.
metaobject