Every API here is available over the APIs.io API and to AI agents over MCP.
{"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