Key takeaways
Use the API for quick pulls, backfills and automation, and make bulk export your permanent record once any day hits the 50,000-row cap.
- The API pages through 25,000 rows at a time.
- It caps out at 50,000 rows a day per search type, and it returns only the top rows by clicks.
- Bulk export lands everything in BigQuery daily, from setup day on.
- BigQuery's free tier covers 10 GiB of storage and 1 TiB of queries a month.
Switch bulk export on today. It can't collect the days before setup.
The Search Console API returns up to 25,000 rows per request and 50,000 rows per day, per search type, per property. The interface stops at 1,000. If your site outgrows the API's cap, or you need data older than Google's 16-month window, turn on bulk data export instead. Search Console then writes every day's performance data into your own BigQuery project, with no daily row limit at all. Only the text of anonymised queries stays out.
Here at Searchmaxxed, we're an SEO and AI SEO agency for law firms, clinics and premium builders. We make your company the answer in Google and in the AI engines your buyers ask. Then we show you which of those searches turn into pipeline, and that starts with search data you can trust. Searchmaxxed's work has generated more than $15 million in revenue through search for its clients.
What is the Search Console API?
The Search Console API is Google's free, programmatic way to read and manage the data inside your Search Console account. It does four jobs, set out in the table below. When people say "the GSC API", they nearly always mean the first, the Search Analytics API, which returns clicks, impressions, CTR and position.
| Part of the API | What it does | Main limit |
|---|---|---|
| Search Analytics | Clicks, impressions, CTR and position by query, page and more | 50,000 rows a day per search type |
| URL Inspection | Index status of the version Google holds | 2,000 inspections a day per site |
| Sitemaps | Lists, submits and deletes sitemaps | 200 calls a minute per user |
| Sites | Lists the properties your account can access | 200 calls a minute per user |
Search Analytics can group results by any mix of query, page, country, device, searchAppearance, date and hour. It filters by search type too. That means web, image, video, news, Discover or Google News, each pulled on its own. Rows come back sorted by clicks.
You sign in with OAuth 2.0. For reading performance data, the webmasters.readonly scope is all a scheduled job needs, so it can't change anything in your account.
One product gets lumped in by mistake. The Indexing API sits outside Search Console's reporting, and Google allows it only for pages with JobPosting or BroadcastEvent markup. Your product, docs and blog pages don't qualify.
What are the Search Console API limits?
Two kinds of limit apply. The first is a row cap: 50,000 rows per day, per search type, per property, delivered in pages of up to 25,000. The second is a call quota, and for Search Analytics it's 1,200 queries a minute for each site and for each user.
| Limit | Number |
|---|---|
| Rows you can export from the Search Console interface | 1,000 |
| Rows per API request by default | 1,000 |
Rows per API request with rowLimit | 25,000 |
| Rows per day, per search type, per property | 50,000 |
| Search Analytics calls per site, or per user | 1,200 a minute |
| Search Analytics calls per Cloud project | 40,000 a minute, 30 million a day |
| URL Inspection calls per site | 600 a minute, 2,000 a day |
| Performance history | 16 months |
| Hourly data through the API | Last 10 days |
The row cap counts per day of data. Google's answer is a daily job that pulls one day at a time. Fresh data usually lands after two to three days, so most teams pull the day from three days back.
Paging is simple. Set rowLimit to 25,000, raise startRow by 25,000 on each call and stop when a response comes back with zero rows.
{
"startDate": "2026-10-28",
"endDate": "2026-10-28",
"dimensions": ["page", "query"],
"type": "web",
"rowLimit": 25000,
"startRow": 25000
}
Then there's load, a quota Google publishes no numbers for. Google measures it in 10-minute and one-day chunks, and every limit returns the same "quota exceeded" error, so you can't tell them apart. Grouping or filtering by both page and query costs the most. Long ranges cost more too, with a six-month request far heavier than a one-day request. Trip the short-term limit and Google's advice is plain: wait 15 minutes, then spread your queries through the day.
Why does the Search Console API return less data than Search Console shows?
It returns only the top rows, sorted by clicks, and Search Console quietly drops more rows whenever you ask for extra detail. Anonymised queries never appear as rows at all, though their clicks still count in the chart totals. Plenty of SEOs call this sampling. Google calls it privacy filtering plus a daily row limit.
Three things cut rows on a large site:
- Top rows only. Google states that the API returns its top data rows, rather than every row Search Console holds. Ties come back in arbitrary order, so rows near the cut-off can swap places between two identical pulls.
- Detail costs data. Group by page or query and Google says its system may drop some data to keep the calculation fast.
- Privacy filtering. Anonymised queries are searches made by no more than a few dozen users over two to three months. The rows vanish. The clicks stay in the totals.
The aggregation setting you choose shifts the totals again. With aggregationType set to byProperty, two of your URLs on one results page count as one impression, while byPage counts each URL separately.
A site with a few thousand pages rarely feels any of this. A B2B site with tens of thousands of docs, integration and comparison pages feels it daily, because its long tail is where the cap bites. Squaring these numbers with GA4 is a separate puzzle, and our guide to why Search Console and GA4 numbers differ walks through each gap.
How do you get more than 50,000 rows from the Search Console API?
Slice each request so it stays under the cap, or move to bulk export. Slicing goes a long way first. These five moves cover most sites, roughly in the order we'd try them:
- Pull one day at a time. Google recommends it, because it keeps you inside the load quota and gives every day its own 50,000-row allowance.
- Split by search type. Web, image, video, news, Discover and Google News each carry a separate cap.
- Add URL-prefix properties for big folders. The cap is per property, so
/docs/and/blog/set up as separate properties each get their own 50,000 rows a day. - Drop dimensions you don't need. Totals by country or device stay accurate without page and query.
- Store every pull. Search Console keeps 16 months, and anything you haven't saved after that is gone for good.
This only stretches so far. Once you're juggling a dozen properties and hundreds of requests a day, the slicing turns into its own engineering project with its own maintenance bill. That's when bulk export pays for itself.
What is Search Console bulk data export?
Bulk data export is a Search Console setting that sends your performance data to a BigQuery dataset you own, once a day. It carries all the data Search Console holds for the property, apart from anonymised query text. No row cap. Google launched it on 21 February 2023 for sites with tens of thousands of pages, or tens of thousands of queries a day.
The export creates three tables:
| Table | What it holds |
|---|---|
searchdata_site_impression | Data by property: query, country, search type, device, clicks, impressions |
searchdata_url_impression | Data by URL, plus a true or false field per search appearance |
ExportLog | One row per successful export, per table and day |
Three details catch out almost everyone:
- Rows repeat. Search Console adds data in increments, so one query on one date can span several rows, and every metric needs a
SUM. - Position is zero-based. Average position is
SUM(sum_top_position) / SUM(impressions) + 1. - There's no backfill. The first export arrives up to 48 hours after setup and starts with that day's data, so anything older has to come from the API.
The URL table uses sum_position for the same sum. Anonymised queries still arrive as rows, flagged is_anonymized_query with a blank query field, and they're often the single biggest "query" a site has. Filter them out when you rank queries. Keep them when you total clicks.
How do you set up Search Console bulk export to BigQuery?
You need a Google Cloud project with billing, the BigQuery API turned on and owner access to the Search Console property. There are two stages: one in Google Cloud, one in Search Console.
- In Google Cloud Console, open your project and enable both the BigQuery API and the BigQuery Storage API.
- Under IAM and Admin, give
search-console-data-export@system.gserviceaccount.comtwo roles: BigQuery Job User and BigQuery Data Editor. - In Search Console, open Settings > Bulk data export and paste your Cloud project ID, which isn't the same as the project number.
- Name the dataset.
- Pick the location with care, because moving it later means copying the whole dataset and possibly missing a day or two of data.
- Click Continue. Search Console runs a test export and emails every property owner once it succeeds.
- Once the tables appear, set a partition expiration of 14 days or more, since the data otherwise piles up forever. Leave the schema alone, because an added column makes the export fail.
- Backfill 16 months through the API.
Two notes on those steps. The dataset name always starts with searchconsole, and each property needs its own name if several share one project. Load the backfill into a separate table, so your history starts well before setup day.
How much does BigQuery cost for Search Console data?
For most sites, little or nothing. BigQuery's free tier covers the first 10 GiB of storage and the first 1 TiB of query processing each month. After that, on-demand queries cost $6.25 per TiB, billed on the bytes each query reads.
Two habits keep the bill small. First, filter on data_date in every query: the tables split by date, so a date filter reads only the days you ask for. Second, set a partition expiration that matches how long you need the data. Google warns that putting the expiration on the whole table deletes all of it.
A worked example helps. Say your weekly dashboard runs 40 queries and each one scans 3 GB. That comes to 120 GB a week, or about 520 GB a month. That's comfortably inside the free 1 TiB. BigQuery's query editor shows how many bytes a query will scan before you run it, so check that figure first.
Should you use the Search Console API or bulk export?
Use the API alone while every day stays under 50,000 rows per search type. Turn on bulk export the day you hit the cap, or when you need history past 16 months or joins with GA4 and CRM data. On a large site, run both.
| Option | Rows | History | Best for |
|---|---|---|---|
| Search Console interface | 1,000 per export | 16 months | Spot checks |
| Looker Studio connector | 50,000 a day per search type | 16 months | Small to mid-size dashboards |
| Search Console API | 25,000 per request, 50,000 a day | 16 months | Backfills, automation, URL inspection |
| Bulk export to BigQuery | No daily row limit | From setup day, kept until you delete | Large sites, joins with GA4 and CRM |
In practice, bulk export becomes the record and the API handles backfills and URL inspection. The API is free and suits teams who write code or use a connector. Bulk export needs SQL and a Google Cloud project, and it costs nothing until you pass BigQuery's free tier.
How do you join Search Console data with GA4 and CRM data?
Join on landing page and date. Search Console gives clicks and impressions by URL. GA4 gives sessions and key events by landing page, and your CRM gives pipeline by first landing page. Put all three in one BigQuery project. Now you can see which pages, and the searches behind them, bring in revenue.
Five steps make the join hold up:
- Turn on GA4's BigQuery export in the same Cloud project. It writes a daily
events_YYYYMMDDtable, and standard properties can export up to 1 million events a day. - Clean the URLs on both sides. Lowercase them, then strip parameters, fragments and trailing slashes. Search Console reports the canonical URL, while GA4 records whatever address the visitor loaded.
- Line up the dates. Search Console runs on Pacific Time. GA4's export follows your property's time zone, so join by week or month unless you convert.
- Join at page level. GA4 never sees the search query, so queries come back in from Search Console after the join.
- Bring in the CRM last. Map each deal's first landing page and created date to the same clean URL and month.
WITH gsc AS (
SELECT DATE_TRUNC(data_date, MONTH) AS month,
RTRIM(REGEXP_REPLACE(LOWER(url), r'[?#].*$', ''), '/') AS page,
SUM(clicks) AS clicks, SUM(impressions) AS impressions
FROM `your-project.searchconsole.searchdata_url_impression`
WHERE data_date >= '2026-07-01' AND search_type = 'WEB'
GROUP BY month, page
)
SELECT gsc.*, crm.opportunities, crm.pipeline_value
FROM gsc
LEFT JOIN `your-project.crm.pipeline_by_landing_page` AS crm
USING (month, page)
Check the conversion side before you trust any of it, because broken events look exactly like healthy ones. We found this on a client's GA4 property:
A client's four enquiry types never counted as conversions. Their event names ran 41 to 50 characters; GA4 cuts at 40. The 40-character "career" event counted every time. Nobody had noticed, because the events still showed up.
Feed that into a join and your best search pages look like they never produce an enquiry, so audit the events first. Once the join works, our guide to what an SEO report should include covers what to put in front of executives.
What governance does a Search Console data pipeline need?
Treat it like any production data feed. It needs a named owner, the least access that works, a retention rule and an alert for a missing day. That last one matters most, because bulk export fails quietly.
- Owner. Only a Search Console property owner can start or stop bulk export, so name that person and keep a second owner as backup.
- Access. Search Console's service account gets its two roles and nothing more. Analysts get read access.
- Location. Choose the dataset region to match your data-residency rules before the first export runs.
- Retention. Put expiration on partitions, never the table, and keep it at 14 days or longer.
- Schema. Freeze it. Build views for any extra columns.
- Monitoring.
ExportLogrecords successes only. Search Console retries a failed day for about a week, then drops it, and stops the export after about a month of failures.
Run a daily check that the latest expected data_date exists in both tables, and page someone when it doesn't. For who owns which change across marketing, engineering and legal, see our guide to SEO governance for enterprise.
Can the Search Console API show AI Overviews and AI Mode data?
Not on its own. Google's Generative AI performance report shows impressions in AI Overviews and AI Mode by page, country, device and date. It reached every site on 31 August 2026. Google's help page for it documents an export button, but no API or bulk export access.
The same impressions also sit inside the overall performance report, Google says, so your API pulls and BigQuery tables already hold them. They're blended into web search. Google's list of search appearance types has no AI Overview or AI Mode value, which means no filter can split them out.
That leaves a gap. Download the generative AI report on a schedule, and track ChatGPT, Gemini and Perplexity separately, because Search Console sees none of them. Our guide on how to show up in AI search covers what each engine needs and how to measure it.
How do you check indexing at scale with the URL Inspection API?
Inspect your most important URLs, not all of them. The API allows 2,000 inspections a day per site, roughly 60,000 a month. It reports only the version in Google's index. It can't run a live test.
Spend that allowance where indexing costs money: new pages, revenue pages and templates you've just changed. Here's what one launch of our own looked like:
We launched a new site with 161 guides, each built for one search from the live results and People Also Ask. We submitted the sitemap and pinged IndexNow. No paid indexer. About 25 hours after Google's first crawl, 203 of 228 URLs were indexed. Indexed isn't ranked, though: 5,198 impressions in ten days and 5 clicks.
Checks like these sit inside our technical SEO services, next to the work that decides whether a page gets indexed at all. That means fixing crawl, rendering and canonical faults first.
Is Searchmaxxed right for you?
We're a strong fit if you're a law firm, clinic or premium builder with a site big enough to hit these limits. You want to know which searches and AI answers bring you pipeline. And you want someone to go out and win more of them.
Here's what you get. You talk to the people doing the work, with no account manager in between. We track which searches and AI answers turn into revenue, through your CRM as well as GA4. We fix what stops Google reading your best pages. Then we go after the searches your buyers make, in Google and in AI answers. You own your site, content and data from day one.
One client came to us with a website that wasn't working. Three months later he was on page one for one of the most competitive searches in his industry. Now he has more high-intent leads than he can handle, and we're building the systems to handle them.
"I can't believe this worked." That's what we hear. Clients tell us they finally found a growth partner in search that keeps its word and gets things done.
We're the wrong call in three cases. If you only want the pipeline built and plan to act on it in-house, a data engineer or a connector tool will cost you less. Small reports that fit in 1,000 rows need nothing more than the Search Console interface and Looker Studio. And if you need leads this month just to survive, search takes longer.
What should you do next?
Turn on bulk export this week. Every day you wait is a day BigQuery never gets, so backfill 16 months through the API while that history still exists.
Want to know what the data says about your market? Get your free search analysis. We'll benchmark you against your top competitors across Google, ChatGPT and the other AI engines. Then we'll show you where they're named instead of you, and the few moves that will matter most.
Frequently asked questions
Is the Search Console API free?
Yes. Google charges nothing for the Search Console API, though quotas apply, such as 1,200 Search Analytics queries a minute per site. Bulk export is free on Google's side too. BigQuery only bills you past its free 10 GiB of storage and 1 TiB of queries a month.
How do I export more than 1,000 rows from Search Console?
Use the Search Console API or the Looker Studio connector, which return up to 50,000 rows a day per search type. The API pages through 25,000 rows per request with rowLimit and startRow. Beyond that, turn on bulk data export to BigQuery, which has no daily row limit.
Does Search Console bulk export include historical data?
No. The first export arrives up to 48 hours after setup and starts with that day's data. For older data, pull up to 16 months through the API and load it into its own BigQuery table.
Why don't my API rows add up to the Search Console total?
Because the totals include anonymised queries and rows the API leaves out. Google hides queries made by only a few dozen users over two to three months, and the API returns top rows rather than every row. Grouping by page instead of property changes the counts too.
How long does Search Console keep performance data?
Sixteen months, in the interface and through the API. Then it's gone. Bulk export keeps every day in BigQuery until you delete it or a partition expiration removes it.
Can I get hourly data from the Search Console API?
Yes. Since April 2025, the API returns hourly data for up to 10 days when you group by hour and set dataState to hourly_all. The interface shows only the last 24 hours. The newest hours can be incomplete, and the response flags the first incomplete hour.
Does the Search Console API include Discover and Google News data?
Yes. Set type to discover or googleNews. Each search type has its own 50,000-row daily cap, and bulk export includes both in its tables.
About the editorial team
Founder, Searchmaxxed