GSC Wizard REST API API

Read Google Search Console and GA4 data for the connected account. Authenticate with a `gscw_live_...` API key from the GSC Wizard app (Account -> API keys) as a Bearer token. Curated GET resource routes cover the common reports; every tool is also callable generically at POST /tools/{name}. A read-

GitHub OpenAPI

Operations 143

GET /sites List connected Search Console properties #
GET /account Account, connected Google accounts, and subscription state #
GET /sites/{site}/summary Clicks, impressions, CTR, and position with a prior-period comparison #
GET /sites/{site}/top-queries Top search queries by clicks #
GET /sites/{site}/top-pages Top landing pages by clicks #
GET /sites/{site}/countries Per-country performance breakdown #
GET /sites/{site}/devices Per-device performance breakdown #
GET /sites/{site}/page-performance Daily metrics for one page (pass ?pageUrl=) #
GET /sites/{site}/query-performance Daily metrics for one query (pass ?query=) #
GET /sites/{site}/ranking-changes New / lost / improved / declined movers between two periods #
GET /sites/{site}/ga4/overview GA4 traffic overview for the linked property #
POST /tools/list_sites List Search Console properties #
POST /tools/get_account_info Get account info #
POST /tools/query_search_analytics Query Search Console analytics #
POST /tools/get_site_summary Get site performance summary #
POST /tools/inspect_url Inspect a URL #
POST /tools/get_inspection_quota Get URL inspection quota #
POST /tools/list_saved_filters List saved filters #
POST /tools/list_topic_clusters List topic clusters #
POST /tools/list_content_groups List content groups #
POST /tools/get_filter_options Get report filter options #
POST /tools/list_sitemaps List submitted sitemaps #
POST /tools/list_url_inspections List URL inspection history #
POST /tools/query_top_queries Top search queries #
POST /tools/query_top_pages Top landing pages #
POST /tools/query_countries Country breakdown #
POST /tools/query_devices Device breakdown #
POST /tools/list_annotations List chart annotations #
POST /tools/list_algo_updates List Google algorithm updates #
POST /tools/list_indexnow_submissions List IndexNow submissions #
POST /tools/get_page_performance Page performance over time #
POST /tools/get_query_performance Query performance over time #
POST /tools/add_site Add a property to GSC Wizard #
POST /tools/create_gsc_property Create GSC properties #
POST /tools/update_site Update a property #
POST /tools/delete_site Remove a property from GSC Wizard #
POST /tools/create_topic_cluster Create a topic cluster #
POST /tools/delete_topic_cluster Delete a topic cluster #
POST /tools/create_content_group Create a content group #
POST /tools/delete_content_group Delete a content group #
POST /tools/create_saved_filter Create a saved filter #
POST /tools/delete_saved_filter Delete a saved filter #
POST /tools/create_annotation Create a chart annotation #
POST /tools/delete_annotation Delete a chart annotation #
POST /tools/submit_indexnow_urls Submit URLs to IndexNow #
POST /tools/submit_sitemap Submit a sitemap to Search Console #
POST /tools/bulk_inspect_urls Inspect multiple URLs #
POST /tools/get_ranking_changes Get ranking changes between two periods #
POST /tools/find_decaying_content Find decaying content #
POST /tools/get_decay_overview Decay overview (per-period matrix) #
POST /tools/analyze_cannibalization Analyze keyword cannibalization #
POST /tools/analyze_ctr_curve Analyze CTR-by-position curve #
POST /tools/find_page_poaching_opportunities Find page poaching opportunities #
POST /tools/score_opportunities Score ranking opportunities #
POST /tools/breakdown_by_path Breakdown by subdomain / path #
POST /tools/analyze_sampling_impact Analyze GSC sampling / anonymization impact #
POST /tools/get_sitemap_performance Sitemap URL performance #
POST /tools/get_cross_site_summary Cross-site performance summary #
POST /tools/list_tags List property tags #
POST /tools/get_tag_group_view Tag group performance view #
POST /tools/get_indexing_tracker Get indexing tracker config + stats #
POST /tools/list_tracked_urls List tracked URLs #
POST /tools/get_indexing_tracker_report Indexing tracker health report #
POST /tools/add_tracked_urls Add URLs to the indexing tracker #
POST /tools/remove_tracked_urls Remove URLs from the indexing tracker #
POST /tools/check_tracked_url_now Check tracked URLs now #
POST /tools/manage_tags Manage property tags #
POST /tools/generate_seo_report Generate full SEO report #
POST /tools/list_ga4_properties List GA4 properties #
POST /tools/get_ga4_overview GA4 traffic overview #
POST /tools/query_ga4_report GA4 breakdown report #
POST /tools/get_ga4_ecommerce GA4 ecommerce report #
POST /tools/get_ga4_llm_traffic GA4 traffic from AI assistants #
POST /tools/get_ga4_key_events GA4 key events (conversions) #
POST /tools/list_ga4_custom_dimensions GA4 custom dimensions & metrics #
POST /tools/query_ga4_custom_dimensions GA4 custom dimension breakdown #
POST /tools/get_blended_landing_pages Blended GSC + GA4 landing pages #
POST /tools/get_query_value_attribution Estimated GA4 value per GSC query #
POST /tools/list_bing_sites List Bing Webmaster sites #
POST /tools/get_bing_traffic_stats Bing daily traffic #
POST /tools/get_bing_query_stats Bing top queries #
POST /tools/get_bing_page_stats Bing top pages #
POST /tools/get_bing_query_page_stats Bing query + page pairs #
POST /tools/get_bing_page_queries Bing queries for a page #
POST /tools/get_bing_query_page_trend Bing query + page trend #
POST /tools/get_bing_crawl_stats Bing crawl stats #
POST /tools/get_bing_crawl_issues Bing crawl issues #
POST /tools/get_bing_keyword_stats Bing keyword impression history #
POST /tools/get_bing_feeds Bing submitted sitemaps #
POST /tools/get_bing_url_submission_quota Bing URL submission quota #
POST /tools/list_yandex_sites Yandex sites #
POST /tools/get_yandex_site_summary Yandex site summary #
POST /tools/get_yandex_query_stats Yandex query stats #
POST /tools/get_yandex_indexing_history Yandex indexing history #
POST /tools/detect_anomalies Detect traffic anomalies #
POST /tools/detect_change_points Detect traffic change points #
POST /tools/forecast_traffic Forecast organic traffic #
POST /tools/get_longtail_clusters Long-tail page clustering #
POST /tools/get_core_web_vitals Core Web Vitals history (CrUX) #
POST /tools/list_experiments List SEO experiments #
POST /tools/get_experiment_results Score an SEO experiment #
POST /tools/compare_migration Compare a site migration (A vs B) #
POST /tools/get_migration_health Get migration health #
POST /tools/list_migrations List saved migrations #
POST /tools/audit_onpage_seo On-page SEO audit #
POST /tools/get_content_group_performance Content group performance #
POST /tools/get_topic_cluster_performance Topic cluster performance #
POST /tools/get_branded_performance Branded vs non-branded performance #
POST /tools/get_ga4_error_pages GA4 error pages #
POST /tools/get_ga4_realtime_events GA4 realtime events #
POST /tools/get_position_distribution Ranking position distribution #
POST /tools/update_content_group Update a content group #
POST /tools/update_topic_cluster Update a topic cluster #
POST /tools/update_saved_filter Update a saved filter #
POST /tools/update_annotation Update a chart annotation #
POST /tools/list_shared_reports List shareable reports #
POST /tools/create_shared_report Create a shareable report #
POST /tools/delete_shared_report Delete a shareable report #
POST /tools/list_report_clients List report clients #
POST /tools/create_report_client Add a report client #
POST /tools/manage_report_access Grant or revoke report access #
POST /tools/set_dashboard_visibility Show or hide properties on the dashboard #
POST /tools/list_migration_redirects List migration redirect mappings #
POST /tools/add_migration_redirects Add migration redirect mappings #
POST /tools/delete_migration_redirects Delete migration redirect mappings #
POST /tools/get_indexnow_settings Get IndexNow settings #
POST /tools/update_indexnow_settings Set the IndexNow API key #
POST /tools/analyze_query_shapes Query shape analysis (AI Mode fingerprints) #
POST /tools/get_query_shape_trend Query shape trend over time #
POST /tools/list_gmc_accounts List Merchant Center accounts #
POST /tools/get_organic_shopping_performance Organic shopping performance #
POST /tools/get_product_listing_status Product free-listing status #
POST /tools/get_merchant_listings_performance Merchant listings performance #
POST /tools/get_gmc_competitors Merchant Center competitors #
POST /tools/get_gmc_pricing_insights Merchant Center pricing insights #
POST /tools/get_gmc_best_sellers Merchant Center best sellers #
POST /tools/run_feed_audit Run feed audit #
POST /tools/get_feed_audit_results Feed audit results #
POST /tools/get_gmc_title_hygiene Merchant Center title hygiene #
POST /tools/get_gmc_account_health Merchant Center account health #
POST /tools/get_gmc_data_sources Merchant Center data sources #
POST /tools/query_gmc_report Merchant Center report query (MCQL) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/gscwizard-com:gsc-wizard-rest-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

gscwizard-com-api-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"GSC Wizard REST API","version":"1.0.0","description":"Read Google Search Console and GA4 data for the connected account. Authenticate with a `gscw_live_...` API key from the GSC Wizard app (Account -> API keys) as a Bearer token. Curated GET resource routes cover the common reports; every tool is also callable generically at POST /tools/{name}. A read-scoped key cannot call write tools. An OAuth access token works in place of a key: mcp:read for reads, mcp:write for write tools."},"servers":[{"url":"https://mcp.gscwizard.com/v1"}],"security":[{"bearerAuth":[]},{"oauth2":["mcp:read"]}],"tags":[{"name":"Resources","description":"Idiomatic GET routes for common reports"},{"name":"Tools","description":"Generic per-tool endpoints (full surface)"}],"paths":{"/sites":{"get":{"operationId":"rest_list_sites","summary":"List connected Search Console properties","description":"Use this when the user asks which Search Console properties they can analyze. Lists all Google Search Console properties connected to the authenticated GSC Wizard account: the site URL (a domain property prefixed with `sc-domain:` or a URL prefix property), tags, and which data source backs the property. Properties another user has shared with you are included too, badged with `sharedBy` (the owner) and `accessLevel` (READ_ONLY or FULL). Each property row carries `permissionLevel`, `readable` and `activated`; a table view shows the last two as its Status column (\"Not verified in GSC\" for `readable: false`, \"Not activated\" for `activated: false`, empty when both are true). `permissionLevel` is the Google Search Console permission (siteOwner / siteFullUser / siteRestrictedUser / siteUnverifiedUser), and `readable: false` means Google will refuse every data request for that property: it is listed in Search Console but not verified, so the user must verify it at search.google.com/search-console before any report will work, and other tools refuse it with reason property_not_verified. Do not attempt reads on a property with `readable: false`; tell the user to verify it instead. Activating it does not help. `activated: false` means the property is connected but is not shown on the account dashboard and is not synced to full storage, or is shown but past the plan's dashboard property limit, so every other property-scoped tool will refuse it (reason property_not_selected or over_api_property_limit). Do not attempt reads on those either: where this connection offers it, call `set_dashboard_visibility` to activate the property first (hiding another one if the plan is at its limit), or choose one with `activated: true`. Properties shared with the caller are always `activated: true`, because the grant is itself the selection; a share whose owner no longer has an active GSC Wizard plan is left out, since no tool can read it. `gscScope` is the Search Console access of the Google connection behind the property: \"full\" allows submit_sitemap and create_gsc_property, \"readonly\" means Google will refuse those two (reads still work); absent when unknown. Not for Bing, Yandex or GA4: use list_bing_sites, list_yandex_sites or list_ga4_properties. Owned properties come first, then shared ones, each by siteUrl ascending.","tags":["Resources"],"parameters":[],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid parameters (validation failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, revoked, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No active subscription or the trial has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope, or access to the property is not granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool or route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-account REST rate limit exceeded (180/min, 2,000/hour; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream (Google / warehouse) error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account":{"get":{"operationId":"rest_get_account_info","summary":"Account, connected Google accounts, and subscription state","description":"Use this when the user asks which Google accounts, scopes or plan their GSC Wizard login has. Returns the authenticated user, the connected Google accounts (email + scopes), and the subscription status. Useful as a first call to confirm the MCP server is wired up correctly and the user has the data sources you expect. Not for the property list: use list_sites. googleAccounts are oldest first (connectedAt ascending); the first is isPrimary, the default account.","tags":["Resources"],"parameters":[],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid parameters (validation failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, revoked, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No active subscription or the trial has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope, or access to the property is not granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool or route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-account REST rate limit exceeded (180/min, 2,000/hour; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream (Google / warehouse) error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{site}/summary":{"get":{"operationId":"rest_get_site_summary","summary":"Clicks, impressions, CTR, and position with a prior-period comparison","description":"Use this when the user asks how a property is doing overall: its total clicks, impressions, CTR and average position over the last N days (default 28), against a same-length prior period. Use it for quick health checks before drilling into details. Not for per-query or per-page rows: use query_search_analytics. Served from the ClickHouse warehouse when available, otherwise the live Search Console API (see `dataSource`). For an explicit window pass startDate/endDate (YYYY-MM-DD) instead: a date you pass always wins, and `days` only sizes an edge you leave out. The comparison period is always the same length as the window and sits immediately before it. `ctr` is a 0-100 percentage and `avgPosition` is impression-weighted, as Search Console reports it. `dailyRows` is the window day by day and `previousDailyRows` the comparison period day by day, in the same shape, both sorted by date, oldest first; `previousDailyRows` is omitted for a window longer than 180 days.","tags":["Resources"],"parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"URL-encoded Search Console property. URL-prefix (https%3A%2F%2Fexample.com%2F) or domain (sc-domain%3Aexample.com)."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":180,"default":28,"description":"Length of the trailing window in days (default 28, max 180). Ignored for any edge you pin with startDate/endDate; when exactly one of those is given it sizes the other edge."},"description":"Length of the trailing window in days (default 28, max 180). Ignored for any edge you pin with startDate/endDate; when exactly one of those is given it sizes the other edge."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date: omit both startDate and endDate to use the trailing `days` window instead (Search Console data lags ~2-3 days, so the window ends at the latest settled date). Passed alone, the window runs from here to the latest settled date. Never pass null or the string \"null\"."},"description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date: omit both startDate and endDate to use the trailing `days` window instead (Search Console data lags ~2-3 days, so the window ends at the latest settled date). Passed alone, the window runs from here to the latest settled date. Never pass null or the string \"null\"."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the window ends at the latest settled Search Console date (data lags ~2-3 days). Passed alone, the window is `days` long and ends here. Never pass null or the string \"null\"."},"description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the window ends at the latest settled Search Console date (data lags ~2-3 days). Passed alone, the window is `days` long and ends here. Never pass null or the string \"null\"."},{"name":"searchType","in":"query","required":false,"schema":{"type":"string","enum":["web","image","video","news","discover","googleNews","all"],"default":"web","description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},"description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},{"name":"brand","in":"query","required":false,"schema":{"type":"string","enum":["branded","non_branded"],"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},{"name":"contentGroupId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},{"name":"topicClusterId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."},"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."}],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid parameters (validation failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, revoked, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No active subscription or the trial has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope, or access to the property is not granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool or route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-account REST rate limit exceeded (180/min, 2,000/hour; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream (Google / warehouse) error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{site}/top-queries":{"get":{"operationId":"rest_query_top_queries","summary":"Top search queries by clicks","description":"Use this when the user asks which search queries bring a property the most clicks. Returns the top queries over a date range: a wrapper around query_search_analytics. Not for totals: use get_site_summary. Rows are sorted by clicks, highest first; ctr is a 0-100 percentage. Query rows cover only the queries Google lists: `coverage.hiddenClicksShare` (0-1) is the share of clicks with no query row, so quote totals from `coverage.siteTotals`, or `coverage.filteredTotals` when `coverage.scope` is \"filtered\", not summed rows. Served from the ClickHouse warehouse (longer history) when available, else the live Search Console API (`dataSource` says which). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).","tags":["Resources"],"parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"URL-encoded Search Console property. URL-prefix (https%3A%2F%2Fexample.com%2F) or domain (sc-domain%3Aexample.com)."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},"description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},"description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"description":"Rows to return per call (default 100, max 1000)."},"description":"Rows to return per call (default 100, max 1000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},{"name":"searchType","in":"query","required":false,"schema":{"type":"string","enum":["web","image","video","news","discover","googleNews","all"],"default":"web","description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},"description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},{"name":"brand","in":"query","required":false,"schema":{"type":"string","enum":["branded","non_branded"],"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},{"name":"contentGroupId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},{"name":"topicClusterId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."},"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."}],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid parameters (validation failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, revoked, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No active subscription or the trial has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope, or access to the property is not granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool or route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-account REST rate limit exceeded (180/min, 2,000/hour; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream (Google / warehouse) error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{site}/top-pages":{"get":{"operationId":"rest_query_top_pages","summary":"Top landing pages by clicks","description":"Use this when the user asks which landing pages get the most clicks. Returns the top landing pages over a date range: a wrapper around query_search_analytics. Not for a folder or section rollup: use breakdown_by_path. Rows are sorted by clicks, highest first; ctr is a 0-100 percentage. Quote totals from `coverage.siteTotals`, or `coverage.filteredTotals` when `coverage.scope` is \"filtered\", not summed rows. Served from the ClickHouse warehouse when available, else the live Search Console API (see `dataSource`). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).","tags":["Resources"],"parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"URL-encoded Search Console property. URL-prefix (https%3A%2F%2Fexample.com%2F) or domain (sc-domain%3Aexample.com)."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},"description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},"description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"description":"Rows to return per call (default 100, max 1000)."},"description":"Rows to return per call (default 100, max 1000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},{"name":"searchType","in":"query","required":false,"schema":{"type":"string","enum":["web","image","video","news","discover","googleNews","all"],"default":"web","description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},"description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},{"name":"brand","in":"query","required":false,"schema":{"type":"string","enum":["branded","non_branded"],"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},{"name":"contentGroupId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},{"name":"topicClusterId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."},"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."}],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid parameters (validation failed)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, malformed, revoked, or expired API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"No active subscription or the trial has ended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key lacks the required scope, or access to the property is not granted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool or route","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-account REST rate limit exceeded (180/min, 2,000/hour; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"Upstream (Google / warehouse) error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{site}/countries":{"get":{"operationId":"rest_query_countries","summary":"Per-country performance breakdown","description":"Use this when the user asks how search traffic splits by country. Returns per-country performance (clicks, impressions, CTR, position) over a date range. Country codes are ISO 3166-1 alpha-3. Not for the device split: use query_devices. Rows are sorted by clicks, highest first; ctr is a 0-100 percentage. Quote totals from `coverage.siteTotals`, or `coverage.filteredTotals` when `coverage.scope` is \"filtered\", not summed rows. Served from the ClickHouse warehouse when available, else the live Search Console API (see `dataSource`). Date range is optional: omit startDate/endDate to analyze the last 28 settled days (data lags ~2-3 days).","tags":["Resources"],"parameters":[{"name":"site","in":"path","required":true,"schema":{"type":"string"},"description":"URL-encoded Search Console property. URL-prefix (https%3A%2F%2Fexample.com%2F) or domain (sc-domain%3Aexample.com)."},{"name":"startDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},"description":"Optional. Window start as YYYY-MM-DD (e.g. 2026-05-03). You do NOT need to know today's date. Omit BOTH startDate and endDate to analyze the last 28 settled days automatically (Search Console data lags ~2-3 days). Never pass null or the string \"null\"."},{"name":"endDate","in":"query","required":false,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},"description":"Optional. Window end as YYYY-MM-DD (e.g. 2026-05-31). You do NOT need to know today's date or the latest available date: omit this and the server uses the latest settled Search Console date (data lags ~2-3 days behind today). Never pass null or the string \"null\"."},{"name":"searchType","in":"query","required":false,"schema":{"type":"string","enum":["web","image","video","news","discover","googleNews","all"],"default":"web","description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},"description":"Search type: web (default), image, video, news (the News tab), discover, googleNews (news.google.com), or all (web + image + video + news + discover combined, position impression-weighted, like the app's \"All\" filter). Discover and googleNews carry no query dimension, so query-level results for them are empty, and no position: it reads null, not 0."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"description":"Rows to return per call (default 100, max 1000)."},"description":"Rows to return per call (default 100, max 1000)."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},"description":"Rows to skip. Use pagination.nextOffset from a previous call to get the next page."},{"name":"brand","in":"query","required":false,"schema":{"type":"string","enum":["branded","non_branded"],"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},"description":"Optional. Narrow to queries matching the property's branded keywords ('branded') or to all others ('non_branded'). Needs branded keywords set (update_site brandedKeywords); see get_filter_options."},{"name":"contentGroupId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},"description":"Optional. Narrow to pages in this content group (id from get_filter_options or list_content_groups). Groups whose rules cannot be applied as a filter are refused; get_filter_options says which."},{"name":"topicClusterId","in":"query","required":false,"schema":{"type":"string","minLength":1,"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."},"description":"Optional. Narrow to queries in this topic cluster (id from get_filter_options or list_topic_clusters). Clusters whose keywords cannot be applied as a filter are refused."}],"responses":{"200":{"description":"The tool result object.","content":{"application/json":{"schema":{"type":"object","additional

# --- truncated at 32 KB (534 KB total) ---
# Full source: https://artifacts.apis.io/gscwizard-com/openapi/_original/gscwizard-com-api-openapi.json