You have access to google-search-console-cli, a CLI for the Google Search Console API. Use it to query search analytics, inspect URL indexing, and manage sites and sitemaps.
bash
# Check if the CLI is available
google-search-console-cli --help
# List accessible sites
google-search-console-cli sites
If the CLI is not installed, install it:
bash
npm install -g google-search-console-cli
The CLI uses a Google service account. Credentials are resolved in this order:
--credentials <path> flag (per-command)GOOGLE_APPLICATION_CREDENTIALS env var~/.config/google-search-console-cli/credentials.json (auto-detected)Before running any command, verify credentials are configured by running google-search-console-cli sites. If it fails with a credentials error, ask the user to set up authentication.
Search Console uses two property types:
https://www.example.com/ (must include trailing slash and protocol)sc-domain:example.com (covers all protocols and subdomains)Always use the exact format as registered in Search Console. The site URL is a positional argument for most commands.
All commands output pretty-printed JSON by default. Use --format compact for single-line JSON (useful for piping).
The query command is the primary tool for search performance data.
bash
google-search-console-cli query <siteUrl> --start-date <date> --end-date <date> [options]
Required:
--start-date <date> -- Start date (YYYY-MM-DD)--end-date <date> -- End date (YYYY-MM-DD)Optional:
--dimensions <names> -- Comma-separated: date, query, page, country, device, searchAppearance, hour--type <type> -- Search type: web (default), image, video, news, discover, googleNews--dimension-filter <json> -- JSON array of dimension filter groups (see below)--aggregation-type <type> -- auto, byPage, byProperty, byNewsShowcasePanel--row-limit <n> -- Max rows, 1-25000 (default 1000)--start-row <n> -- Starting row offset (default 0)--data-state <state> -- Data freshness: all, final, hourly_all--all -- Fetch all rows with auto-pagination (mutually exclusive with --start-row)Response fields per row:
keys -- Array of dimension values (in the order specified by --dimensions)clicks -- Number of clicksimpressions -- Number of impressionsctr -- Click-through rate (0.0 to 1.0)position -- Average position in search resultsWhen --all is specified, the CLI automatically paginates through all results (using 25000 rows per page) and returns the complete dataset. This is useful for exporting all data without manual pagination.
bash
# Get ALL queries (auto-paginates through all pages)
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--all
Note: --all and --start-row cannot be used together. When --all is used, --row-limit is ignored.
bash
# List all sites
google-search-console-cli sites
# Get info about a specific site
google-search-console-cli site <siteUrl>
# Add a site (requires Full permission)
google-search-console-cli site-add <siteUrl>
# Remove a site (requires Full permission)
google-search-console-cli site-remove <siteUrl>
bash
# List sitemaps for a site
google-search-console-cli sitemaps <siteUrl>
# List sitemaps under a specific sitemap index
google-search-console-cli sitemaps <siteUrl> --sitemap-index <url>
# Get info about a specific sitemap
google-search-console-cli sitemap <siteUrl> <feedpath>
# Submit a sitemap (requires Full permission)
google-search-console-cli sitemap-submit <siteUrl> <feedpath>
# Delete a sitemap (requires Full permission)
google-search-console-cli sitemap-delete <siteUrl> <feedpath>
bash
# Inspect a single URL's index status
google-search-console-cli inspect <siteUrl> <inspectionUrl>
# With a specific language for messages
google-search-console-cli inspect <siteUrl> <inspectionUrl> --language zh-CN
The --language option controls the language of the messages in the response (default: en-US).
The response includes: index status (indexing state, crawl time, robots.txt status, canonical URL), AMP analysis (if applicable), mobile usability, and rich results detection.
Inspect multiple URLs in a single command:
bash
# From a file (one URL per line)
google-search-console-cli inspect-batch https://www.example.com/ --file urls.txt
# From stdin
cat urls.txt | google-search-console-cli inspect-batch https://www.example.com/
# With compact format (NDJSON, streams results as they complete)
cat urls.txt | google-search-console-cli inspect-batch https://www.example.com/ --format compact
Options:
--file <path> -- File with URLs (one per line); reads stdin if omitted--language <code> -- Language code for messages (default: en-US)Progress is written to stderr: Inspecting 1/50: https://...
With --format compact, each result is streamed as NDJSON (one JSON object per line) as soon as it completes. With --format json (default), all results are collected and output as a JSON array at the end.
Per-URL errors are captured in the output (with an error field) without stopping the batch.
The --dimension-filter option takes a JSON array of filter groups. Each filter group contains:
groupType -- "and" (all filters must match)filters -- Array of filter objectsEach filter object:
dimension -- One of: query, page, country, device, searchAppearanceoperator -- One of: equals, notEquals, contains, notContains, includingRegex, excludingRegexexpression -- The value to match againstCountry codes use 3-letter ISO 3166-1 alpha-3 format (e.g., USA, GBR, DEU, JPN).
Device values: DESKTOP, MOBILE, TABLET.
Single filter:
json
[{"groupType":"and","filters":[{"dimension":"country","operator":"equals","expression":"USA"}]}]
Multiple filters (AND):
json
[{"groupType":"and","filters":[{"dimension":"country","operator":"equals","expression":"USA"},{"dimension":"device","operator":"equals","expression":"MOBILE"}]}]
Regex filter:
json
[{"groupType":"and","filters":[{"dimension":"query","operator":"includingRegex","expression":"buy|purchase|order"}]}]
Page filter:
json
[{"groupType":"and","filters":[{"dimension":"page","operator":"contains","expression":"/blog/"}]}]
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--row-limit 50
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions date
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--row-limit 50
bash
google-search-console-cli query sc-domain:example.com \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions country
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions device
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"page","operator":"equals","expression":"https://www.example.com/product"}]}]'
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"country","operator":"equals","expression":"USA"},{"dimension":"device","operator":"equals","expression":"MOBILE"}]}]'
bash
# Brand queries
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"query","operator":"includingRegex","expression":"example|exmpl"}]}]'
# Non-brand queries
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"query","operator":"excludingRegex","expression":"example|exmpl"}]}]'
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"page","operator":"contains","expression":"/blog/"}]}]'
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--type image \
--row-limit 50
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--dimension-filter '[{"groupType":"and","filters":[{"dimension":"query","operator":"equals","expression":"best running shoes"}]}]'
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query,page \
--row-limit 100
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions date,device
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--type googleNews
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--type discover
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-03-17 \
--end-date 2026-03-17 \
--dimensions hour \
--data-state hourly_all
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions page \
--aggregation-type byPage
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--all
bash
# First 1000 rows
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--row-limit 1000
# Next 1000 rows
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions query \
--row-limit 1000 \
--start-row 1000
bash
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 \
--end-date 2026-03-17 \
--dimensions searchAppearance
bash
google-search-console-cli inspect https://www.example.com/ https://www.example.com/important-page
bash
# Create a file with URLs to inspect
echo "https://www.example.com/page1
https://www.example.com/page2
https://www.example.com/page3" > urls.txt
# Batch inspect
google-search-console-cli inspect-batch https://www.example.com/ --file urls.txt
# Or pipe from another command
google-search-console-cli query https://www.example.com/ \
--start-date 2026-02-16 --end-date 2026-03-17 \
--dimensions page --format compact \
| jq -r '.rows[].keys[0]' \
| google-search-console-cli inspect-batch https://www.example.com/ --format compact
bash
# List all sitemaps
google-search-console-cli sitemaps https://www.example.com/
# Check a specific sitemap
google-search-console-cli sitemap https://www.example.com/ https://www.example.com/sitemap.xml
google-search-console-cli sites to find accessible sitesquery with --dimensions date for the daily trendquery with --dimensions query for top queriesquery with --dimensions query and a --dimension-filter for the page URLinspect to check the page's index statusquery with --dimensions device for the overview--dimensions query,device to find queries that perform differently across devicesquery with --dimensions country for country breakdown--dimension-filter for specific countriesinspect for specific URLs, or inspect-batch for bulk checkingsitemaps and sitemap commandsquery with --all to auto-paginate through all results--format compact for NDJSON output suitable for piping to jq or other toolssites, site, query, sitemaps, sitemap, inspect, inspect-batchsite-add, site-remove, sitemap-submit, sitemap-deleteMost analysis workflows only need read-only permission.
ReferenceWhen to Usegoogle-search-console-cli documentationFull README, setup guide, installationSearch Analytics APIQuery method, dimensions, filters, response formatURL Inspection APIInspect method, request/response fieldsSites APISite management methods and permission levelsSitemaps APISitemap management methods and resource fields