Export Google Search Console Data Without Losing Half of It
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 Header | Data Type | Definition |
|---|---|---|
Top queries / Query | String | The exact search string entered by the user (excluding anonymized queries). |
Top pages / Page | String | The canonical URL served in the search result. |
Clicks | Integer | Total count of clicks that brought the user to your property. |
Impressions | Integer | Number of times a user saw a link to your site in Google search results. |
CTR | Percentage | Calculated as Clicks / Impressions * 100. |
Position | Float | Average 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
| Method | Format | Max Rows | Automation Potential | Best For |
|---|---|---|---|---|
| Search Console UI | .csv / Google Sheets | 1,000 | Manual only | Quick one-off spot checks |
| Search Analytics API | .json / Paginated | 25,000 per request | High (Cron/Scripts) | Custom applications, local warehouses |
| BigQuery Bulk Export | SQL Tables | Unlimited | Native Google ingestion | Enterprise-scale historical archives |
| DadSEO Automated Sync | JSON API / UI Roadmap | Unlimited | 100% Automated | Strategic 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:
- In Google Cloud Console, create a project (or use an existing one) and enable the BigQuery API.
- In Search Console, go to Settings → Bulk data export.
- Enter the GCP project ID and dataset name. Set a region.
- Add
search-console-data-export@system.gserviceaccount.comas 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
startRowfor 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 hand | API + a Postman/curl request |
| Build a historical warehouse from scratch | API (for 16-month backfill) → BigQuery |
| Get every query every day, going forward | Bulk Data Export to BigQuery |
| Stop maintaining pipes and start making decisions | A strategic tool like DadSEO |
| Pipe GSC into an AI workflow | DadSEO API or MCP server |
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