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.
https://app.softsolz.uk/api/v1/services/seo/sites/{site_id}/search-performanceRecent Requests
Kept only in this browserPath Params
site_idstringrequiredHeaders
AuthorizationstringrequiredBearer token: `Bearer sk_live_...` (or `sk_test_...` for sandbox). A login token will not work here.
Query Params
dimensionstringpage (default), query or country.
rangestring7d, 28d, 3m, 6m, 12m or all. Ignored when from and to are set.
fromstringFirst day (YYYY-MM-DD), inclusive.
tostringLast day (YYYY-MM-DD), inclusive.
comparestringprevious (default), year (same days a year earlier) or none.
countrystringOnly searches from one country: a two-letter ISO code or Google's three-letter code.
page_prefixstringOnly pages whose address starts with this path or address.
querystringOnly one exact search.
page_setstringblog: only blog post addresses.
searchstringKeep rows whose page address or search contains this text.
sortstringclicks (default), impressions, ctr, position or change. Prefix - to reverse.
limitintegerRows per page, up to 500. Default 50.
offsetintegerRows 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 }}