SoftSolzSoftSolz
HomeAPI GuideAPI ReferenceWidget Tester
seo

Google clicks, impressions, CTR and position for exact dates, by page, search or country.

Asks Search Console for exactly the days requested, so any range works, not only whole months. dimension=page lists pages, query lists searches, country lists countries. Narrow with page_prefix (a path such as /blog/ or a full address), query (one exact search), country, or page_set=blog (only blog post addresses, when Blogs is active). search filters the list by text, sort orders it (clicks, impressions, ctr, position or change, prefix - to reverse) and limit/offset page through it. Per-search figures leave out searches Google keeps private, so they add up to less than page or country totals.

GEThttps://app.softsolz.uk/api/v1/services/seo/sites/{site_id}/search-performance

Recent Requests

Kept only in this browser
TimeStatusTook
Send a request with Try it to see it here.

Path Params

site_idstringrequired

Headers

Authorizationstringrequired

Bearer token: `Bearer sk_live_...` (or `sk_test_...` for sandbox). A login token will not work here.

Query Params

dimensionstring

page (default), query or country.

rangestring

7d, 28d, 3m, 6m, 12m or all. Ignored when from and to are set.

fromstring

First day (YYYY-MM-DD), inclusive.

tostring

Last day (YYYY-MM-DD), inclusive.

comparestring

previous (default), year (same days a year earlier) or none.

countrystring

Only searches from one country: a two-letter ISO code or Google's three-letter code.

page_prefixstring

Only pages whose address starts with this path or address.

querystring

Only one exact search.

page_setstring

blog: only blog post addresses.

searchstring

Keep rows whose page address or search contains this text.

sortstring

clicks (default), impressions, ctr, position or change. Prefix - to reverse.

limitinteger

Rows per page, up to 500. Default 50.

offsetinteger

Rows to skip.

Response

Response Body

siteobjectThe website.
dimensionstringpage, query or country.
sourcestringlive (asked Google for exactly these days), monthly (whole months from stored data, used when Google could not be reached) or daily (countries from stored daily totals).
stalebooleanTrue when an older copy of Google's answer was used.
reconnect_requiredbooleanTrue when the Search Console connection needs to be reconnected.
fallback_reasonstring | nullWhy monthly data was used: reconnect_required, google_failed, rate_limited or not_connected.
effective_rangeobjectWith monthly data: the whole months actually covered.
truncatedbooleanTrue when Google returned more rows than are kept, so only the top rows by clicks are included.
rangeobjectThe range used.
previous_rangeobjectThe comparison range, or null.
page_setsarray of objectsGroups of pages that page_set accepts here.
totalsobjectTotals across every row that matched, before paging.
previous_totalsobjectThe same totals for the comparison range, or null.
rowsarray of objectsOne page of rows.
total_rowsintegerRows that matched, before paging.
has_morebooleanTrue when another page follows.

Request

curl --request GET \
--url https://app.softsolz.uk/api/v1/services/seo/sites/{site_id}/search-performance \
--header 'Authorization: Bearer sk_live_your_key'

Credentials

Sent as a Bearer token and used in the samples above and in Try it. Kept only in this browser. Use an sk_test_ key to stay in your sandbox.

Response · 200

{
"data": {
"site": {
"id": "3f2b9c44-8f4e-4d0a-9c1b-2a7d6e5f1a23",
"name": "Main site",
"domain": "example.com"
},
"dimension": "page",
"source": "live",
"stale": false,
"reconnect_required": false,
"fallback_reason": null,
"effective_range": null,
"truncated": false,
"range": {
"key": "28d",
"label": "Last 28 days",
"from": "2026-09-09",
"to": "2026-10-06",
"days": 28
},
"previous_range": {
"from": "2026-08-12",
"to": "2026-09-08"
},
"page_sets": [
{
"id": "blog",
"label": "Blog posts"
}
],
"totals": {
"clicks": 120,
"impressions": 4200,
"ctr": 0.0286,
"position": 8.4
},
"previous_totals": {
"clicks": 120,
"impressions": 4200,
"ctr": 0.0286,
"position": 8.4
},
"rows": [
{
"key": "https://example.com/pricing",
"url": "https://example.com/pricing",
"path": "/pricing",
"title": null,
"query": "pricing software",
"country": "gbr",
"country_code": "GB",
"clicks": 120,
"impressions": 4200,
"ctr": 0.0286,
"position": 8.4,
"previous": {
"clicks": 120,
"impressions": 4200,
"ctr": 0.0286,
"position": 8.4
},
"change": {
"clicks": 0.25,
"clicks_delta": 24,
"impressions": 0.1,
"ctr": 0.004,
"position": -1.2
}
}
],
"total_rows": 230,
"has_more": true
}
}