Search console data export: how to pull your own data instead of paying for it
The data you already own
Every site you’ve verified in Google Search Console is sitting on months of query-level data that nobody else has: what people typed, which page showed up, how often it got clicked, and where it landed in the results. That’s the raw material for most of the paid keyword and rank tracking tools on the market. Some of them layer on genuinely new data (their own SERP scrapes, keyword volume estimates from clickstream panels), but a lot of what people pay monthly for is just a nicer way to look at data Search Console already gave them for free.
If you’re running more than one or two sites, the case for exporting it yourself gets stronger. You’re not paying per property, you’re not capped at whatever row limit the vendor decided was fair for your plan tier, and you own the historical record instead of renting access to it.
What’s actually in a search console export
The Performance report in Search Console breaks down into four dimensions you can combine: query, page, country, and device, each with clicks, impressions, CTR, and average position, all on a daily grain. That’s the whole dataset. There’s no secret tab with more detail hiding somewhere in the UI.
Two limits matter before you plan anything around this data. First, Search Console only retains 16 months of history on a rolling basis. Anything older than that is gone from the interface and the API alike, so if you want a longer trend line you have to be capturing it yourself before it ages out. Second, Google withholds a subset of query data for privacy reasons, mostly very low-volume or unusual queries get folded into an anonymized bucket rather than shown individually. You’ll see this as a gap between the sum of your named-query rows and your total clicks and impressions. That gap isn’t a bug in your export, it’s Google declining to expose queries that are rare enough to potentially identify a searcher.
Why the built-in export feels limited
Click “export” on a Performance report and you get a CSV, a Google Sheets link, or an Excel download, but it’s capped at 1,000 rows per table. For a small site that covers most of your queries. For anything with real scale, a thousand rows of query data is a fraction of what’s actually being tracked, and the UI doesn’t tell you how much you’re missing.
This is the point where most people conclude they need to buy a tool. You don’t, you need to stop using the export button and start using the API.
Pulling more than 1,000 rows
The Search Console API’s searchanalytics.query method doesn’t share the UI’s row cap. You set a rowLimit up to 25,000 per request, and if you need more than that for a given date range, you paginate using startRow and keep requesting until a response comes back with fewer rows than you asked for. That’s the signal you’ve reached the end of the data for that combination of dimensions and date range.
You don’t need to write this from scratch. Google’s own Search Console API quickstart libraries handle authentication and pagination in a few dozen lines, and if you’d rather not touch code at all, the Search Console connector in Looker Studio and the Search Console add-on for Google Sheets both call the same API under the hood and handle the pagination for you. Either route gets you the full dataset for the date range instead of the top thousand rows.
The bulk export to BigQuery
For anyone who wants the raw feed without querying anything, Search Console has a bulk data export feature that writes your daily performance data directly into a BigQuery table in a project you control. You set it up once per property (linking your GC project, granting the service account access, and choosing a dataset), and after that it appends new rows automatically each day. No API calls to schedule, no pagination logic to maintain.
This is the closest thing to owning the raw log. It still respects the same anonymization Google applies elsewhere (that low-volume query bucket doesn’t get de-anonymized just because you’re in BigQuery), but you get every date, every query, every page, at full resolution, and it doesn’t age out after 16 months because it’s your table, not Google’s rolling window. If you’re managing several properties, this is the setup that actually solves the retention problem instead of just working around the UI’s row cap.
What third-party tools add and what they don’t
It’s worth being honest about what you’re buying if you do pay for a rank tracking or SEO reporting tool. Some of it is real: independent SERP scraping to check where you rank for terms you haven’t earned impressions on yet, keyword volume and difficulty estimates built from data sources you don’t have access to, and competitor visibility that Search Console can’t show you at all since it only reports on properties you own. That’s not something an export script replicates.
But a good chunk of what these tools sell is presentation. Multi-property dashboards, prettier charts, alerts when a page drops out of the top ten, these are things you can build yourself once the data is in a spreadsheet or a warehouse table, they’re just work someone else has already done for you. If what you actually need is “my own clicks and impressions, rolled up across twelve sites, going back further than 16 months,” that’s a data pipeline problem, not a reason to pay for a SaaS seat.
A simple export routine that works
For a small portfolio, this doesn’t need to be elaborate. Set up the BigQuery bulk export on each property once. Write a scheduled query or a lightweight script that appends the new day’s rows into a combined table with a site column, so you can query across properties without switching context the way the GSC UI forces you to. Keep it there indefinitely since BigQuery storage for this kind of volume is cheap relative to what a per-site tracking subscription costs.
If BigQuery feels like overkill for what you’re running, the Sheets add-on is a reasonable middle ground: it pulls the full API result (not the UI’s 1,000-row cap) into a spreadsheet on a schedule, and you build whatever pivot or chart you need on top of that. It won’t survive well past a few hundred thousand rows before Sheets gets sluggish, but for a handful of sites it’s enough.
When paying for a tool still makes sense
None of this is an argument that every paid SEO tool is pointless. If you need rank data for keywords you don’t currently rank for, or competitor data, or search volume estimates, you’re outside what your own Search Console export can give you, because that data was never yours to export in the first place. The distinction that matters is whether you’re paying for data you don’t have access to, or paying a markup on data you could pull yourself in an afternoon.
Nobody can promise you a ranking or a timeline from any of this, and nothing here changes how Google decides what to rank, this is purely about who’s holding the data you already generated and what it costs to keep holding it.
If you want more breakdowns like this on the practical, unglamorous side of SEO, find us on YouTube or head back to the SEO Desk homepage for the rest of what we’ve written up.