Back to blog
google-search-consoledata-analysisapi-export

Export Google Search Console Data Without Losing Half of It

Isaac Gounton·

The 1,000-Row Trap

Open the Performance report in Google Search Console. Click the export button. Choose CSV. You get a file with up to 1,000 rows per dimension — and nothing in the UI tells you that you're missing the other 24,000.

For most sites that gets you the visible iceberg and none of the tail. The queries Google calls "anonymized" — typically 30–50% of impressions, often the most informative ones — never even appear in the export. The long tail that drives most real-world organic traffic gets silently truncated.

If you've ever exported GSC data and felt like the numbers didn't match the dashboard, this is why.

Three paths get you the actual dataset. Each has a different cost-vs-power tradeoff, so I'll cover all three and tell you which to pick based on what you're trying to do.


Official GSC CSV Column Definitions

When you export from the Search Console Performance report UI, Google generates a ZIP archive containing individual CSV files (Queries.csv, Pages.csv, Countries.csv, Devices.csv, Search_Appearance.csv, Dates.csv).

Here is the exact schema of the exported CSV columns:

Column HeaderData TypeDefinition
Top queries / QueryStringThe exact search string entered by the user (excluding anonymized queries).
Top pages / PageStringThe canonical URL served in the search result.
ClicksIntegerTotal count of clicks that brought the user to your property.
ImpressionsIntegerNumber of times a user saw a link to your site in Google search results.
CTRPercentageCalculated as Clicks / Impressions * 100.
PositionFloatAverage ranking position of your URL on the search result page (1-based index).

Official Reference: Google Search Central: Exporting Performance Data


Method Comparison: CSV vs. JSON API vs. BigQuery

MethodFormatMax RowsAutomation PotentialBest For
Search Console UI.csv / Google Sheets1,000Manual onlyQuick one-off spot checks
Search Analytics API.json / Paginated25,000 per requestHigh (Cron/Scripts)Custom applications, local warehouses
BigQuery Bulk ExportSQL TablesUnlimitedNative Google ingestionEnterprise-scale historical archives
DadSEO Automated SyncJSON API / UI RoadmapUnlimited100% AutomatedStrategic roadmaps & instant insights

Path 1: Bulk Data Export to BigQuery

Google's Bulk Data Export feature ships daily query, page, country, device, and search appearance data to a BigQuery dataset you control. No row limits. No anonymization on individual queries (you still get the is_anonymized_query flag, but you also get the impressions tied to that flag).

When to pick this: you want the full long tail, you're comfortable in SQL or a data warehouse, and you're going to do this for more than one site.

What it costs:

  • BigQuery storage: GSC data is small. A medium site (50k clicks/month) generates maybe 100 MB per year. Storage is ~$0.02/GB/month.
  • BigQuery query cost: $5 per TB scanned. You'll spend pennies unless you're running unbounded queries on years of data.

The setup:

  1. In Google Cloud Console, create a project (or use an existing one) and enable the BigQuery API.
  2. In Search Console, go to Settings → Bulk data export.
  3. Enter the GCP project ID and dataset name. Set a region.
  4. Add search-console-data-export@system.gserviceaccount.com as a BigQuery Data Editor on the project.

Within 48 hours, daily tables start landing. The schema gives you searchdata_site_impression (aggregated) and searchdata_url_impression (per URL) — both partitioned by date. From there it's plain SQL:

SELECT
  query,
  SUM(impressions) AS impressions,
  SUM(clicks) AS clicks,
  SAFE_DIVIDE(SUM(clicks), SUM(impressions)) AS ctr,
  AVG(position) AS avg_position
FROM `your-project.your-dataset.searchdata_site_impression`
WHERE data_date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) AND CURRENT_DATE()
  AND is_anonymized_query = FALSE
GROUP BY query
ORDER BY impressions DESC
LIMIT 1000;

The catch: Bulk export is forward-looking only. It doesn't backfill the 16 months of historical data GSC retains. If you turn it on today, you only get data from today forward. Combine it with one of the next two paths for historical coverage.


Path 2: The Search Console API (JSON Export)

The Search Analytics API is what most BI tools and SEO platforms use under the hood. It exposes the same 16-month window the dashboard uses, with one important difference: per request, you can pull up to 25,000–50,000 rows instead of 1,000.

For a full walkthrough on exporting API data to JSON, see our guide on How to Export Google Search Console Data to JSON.

curl -X POST \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startDate": "2025-11-01",
    "endDate": "2026-05-01",
    "dimensions": ["query", "page"],
    "rowLimit": 25000,
    "startRow": 0
  }' \
  "https://www.googleapis.com/webmasters/v3/sites/https%3A%2F%2Fexample.com%2F/searchAnalytics/query"

A few things worth knowing before you write the script:

  • Per-request row limit is 25,000 for query/page/country/device breakdowns (50,000 for less granular reports). Paginate with startRow for larger pulls.
  • Anonymized queries are excluded by default. They still consume impressions in your totals, which is why API numbers won't match the dashboard exactly.
  • OAuth, not API keys. You authenticate as a user (or service account) with verified ownership of the property.
  • Quotas are generous — 1,200 QPM, 30,000 QPD per project.

Path 3: Tools That Handle It For You

If you don't want to maintain a BigQuery dataset or write a sync script, the third option is a tool that wraps the API and presents the data in a more useful shape:

  • Dashboards (Looker Studio's GSC connector, AgencyAnalytics, etc.) re-render the same data with prettier charts. They don't unlock new analysis — they unlock prettier sharing.
  • Analyzers (DadSEO) join GSC data against strategy engines. They unlock cross-referencing — which of your ranking pages have declining CTR, what topics you cover that competitors don't, where your ranked-but-not-clicked queries cluster.

For DadSEO specifically, GSC sync is the foundation of every audit. Every site connects via OAuth, syncs up to 16 months of data on initial import, and refreshes daily. Audits then run against that real query data — not a crawler's guess about what your site is about.

If you want to drive this from code rather than a dashboard, DadSEO also ships a REST API and an MCP server — same data, exposed to your scripts and to AI assistants directly.


Which Path Should You Pick?

You want to…Pick
Pull more than 1,000 rows once, by handAPI + a Postman/curl request
Build a historical warehouse from scratchAPI (for 16-month backfill) → BigQuery
Get every query every day, going forwardBulk Data Export to BigQuery
Stop maintaining pipes and start making decisionsA strategic tool like DadSEO
Pipe GSC into an AI workflowDadSEO API or MCP server

Connect Google Search Console to DadSEO →

IG
Isaac Gounton

Founder of DadSEO. I build tools that turn SEO data into strategy — not scores. Previously spent years running audits that told me what was broken without telling me what mattered.

Read more about me →

Ready to see what your SEO data actually means?

DadSEO connects to Google Search Console and gives you a strategic diagnosis — threats, gaps, and opportunities ranked by impact.

Get Your Free Audit