REFERENCE · FOR MARKETERS AND DEVELOPERS

Google Search Console API Guide: Limits, Quotas and Exports

The Google Search Console API returns Performance data, sitemaps, properties and URL Inspection results, but not every report. This reference covers what it returns and what it doesn’t, the row limits and quotas that catch people out, how to authenticate, and when BigQuery or an MCP server is the better route.

By GSC MCP Server teamUpdated 16 min read

What is the Google Search Console API?

The Google Search Console API is Google’s free REST API for reading Search Console data in code. It has four parts: Search Analytics (clicks, impressions, CTR and position by query, page, country, device, date and search appearance), Sitemaps, Sites and URL Inspection. It returns up to 25,000 rows per request and up to 50,000 rows of Performance data per day, per search type, per property. Reports such as Page indexing, Links and Core Web Vitals are not in it at all.

Every limit below comes from Google’s documentation, checked on 30 October 2026; follow the links before you build on a number. We make GSC MCP Server, a hosted Search Console MCP server that reads Search Console through this API, so we mention it where it helps and say where a plain script or BigQuery is the better tool.

What the Search Console API covers

The API reference lists four resources. Search Analytics, Sitemaps and Sites live under https://www.googleapis.com/webmasters/v3; URL Inspection lives under https://searchconsole.googleapis.com/v1.

ResourceMethodsWhat you getGSC MCP Server tool
Search Analyticssearchanalytics.queryClicks, impressions, CTR and average position, grouped by query, page, country, device, date, hour or search appearance, for web, image, video, news, Discover or Google Newsquery_search_analytics (all dimensions except hour) plus the summary tools
Sitemapslist, get, submit, deleteSubmitted sitemaps, submit and download dates, errors, warnings and submitted URL countslist_sitemaps (read-only)
Siteslist, get, add, deleteProperties you can access and your permission levellist_search_properties
URL InspectionurlInspection.index.inspectGoogle’s indexed version of one URL: verdict, coverage state, last crawl, Google and user canonicals, robots.txt state, rich resultsinspect_url

Two details trip people up:

  • Sitemaps don’t report indexed counts. The indexed field in a sitemap’s contents is marked deprecated (“do not use”) and Google stopped filling it in 2019. You get the number of URLs submitted, not how many are indexed.
  • URL Inspection reads the indexed version only. Google’s method reference says you can’t test a live URL through the API, and there is no request-indexing method. Our guide to URL Inspection from Cursor and VS Code covers how to use the results.

Recent changes worth knowing

  • April 2025: hourly data arrived through a new hour dimension and the hourly_all data state, covering up to 10 days.
  • Later in 2025: responses gained a metadata object that marks the first incomplete date or hour.
  • August 2026: the FAQ search appearance was deprecated in the API, after FAQ rich results stopped appearing in Google Search on 7 May 2026.

What the API doesn’t include

Google’s overview says the API offers “much of the functionality” of Search Console. The gaps matter, because many people assume every report is available.

Search Console featureIn the API?Closest alternative
Page indexing report (counts and reasons)NoURL Inspection one URL at a time; export from the report
Video indexing and rich result (enhancement) reportsNoRich results per URL from URL Inspection
Links reportNoExport from the interface
Core Web Vitals reportNoThe Chrome UX Report API
Crawl stats reportNoYour own server logs
Manual actions, Security issues, RemovalsNoInterface and email alerts
Generative AI performance report (AI Overviews, AI Mode)NoThe report’s export button
Web split into text and multimodal (from 24 September 2026)Not documented. Google hasn’t said whether the API’s web type includes multimodal; one test found API web totals matched the text-based view.The search type filter in the interface
Branded queries filter, annotations, InsightsNoA brand regex filter on the query dimension

If indexing is your problem, the interface remains the place to start; our walkthrough of “Crawled – currently not indexed” shows how to combine the report with URL Inspection. For AI features, see what Search Console’s generative AI report shows and why it is export-only. For brand splits, the branded vs non-branded guide builds the regex.

Row limits: 1,000, 25,000 and 50,000

Three different numbers get mixed up in most guides. They apply at different layers.

WhereLimitSource
Report tables and exports in the interface1,000 rowsExport data from a report
One API requestrowLimit 1–25,000 (default 1,000)searchanalytics.query
Performance data exposed by the API50,000 rows per day, per search type, per propertyExport using the API
Bulk data export to BigQueryNo daily row capSearch Central announcement

Pagination with startRow

To get past 25,000 rows, repeat the identical request and raise startRow (zero-based) by your rowLimit: 0, then 25,000, then 50,000. Stop when a response returns fewer rows than you asked for; a startRow beyond the end returns a successful response with no rows. Rows come sorted by clicks, highest first (by date, oldest first, when you group by date), so change nothing but startRow between pages.

Google’s “getting all your data” guide recommends querying one day at a time, with startDate and endDate set to the same date, and paging through each day. That keeps every request cheap and lets each day reach its own 50,000-row ceiling. Even then, Google says the API returns the top rows and doesn’t guarantee all of them.

How to export more than 1,000 rows from Search Console

  1. Slice the export. Filter the Performance report by folder, country or device and export each slice. Fine for a one-off job, tedious beyond that.
  2. Use the Looker Studio connector or a Sheets add-on. Both call the API for you, so the 50,000-row daily cap still applies.
  3. Call the API with pagination, in a script or a no-code connector.
  4. Set up the bulk data export if you need every row from now on.

GSC MCP Server’s query_search_analytics returns at most 1,000 rows per call and gives you a nextStartRow to continue from. The cap is deliberate: 25,000 rows would swamp an AI assistant’s context window, so filter first and page only when you need to.

Try this prompt
Using query_search_analytics on example.com for September 2026, group by query with a page includingRegex filter for /blog/, limit 1000. Keep paging with startRow until there are no more rows (each page is one tool call; stop after 10 pages), then tell me how many distinct queries the blog received clicks for and list the 25 with the most impressions and a CTR under 1%.

The regex syntax (RE2, no lookarounds) is covered in our Search Console regex cheat sheet.

Why API totals don’t match the Performance report

Sum the rows from a query-level API pull and you will almost always get less than the chart in Performance → Search results. Neither number is wrong. These are the usual reasons:

  • Anonymised queries. Google’s performance data deep dive explains that queries not issued by more than a few dozen users over two to three months never appear as rows, but their clicks still count in unfiltered totals. Any query filter removes them, so “contains X” plus “doesn’t contain X” falls short of the total.
  • Property vs page aggregation. When you group by query, country, device or date, two of your URLs in one result count as one impression. Group or filter by page and each URL counts separately. The aggregationType field controls this (auto, byPage or byProperty), and the response tells you which was used.
  • Dropped rows. Grouping by page or query, and above all both together, can drop some data so results are calculated in reasonable time.
  • Top rows only. Past the daily cap, the long tail is simply not exposed.
  • Dates and data state. Dates are Pacific Time, not your time zone, and the default final state leaves out the last two or three days that the interface shows.
  • Units. The API returns CTR as a fraction from 0 to 1, while the interface shows a percentage.

Historical impressions also need care. Google’s data anomalies page records a logging error that affected impressions, CTR and position (not clicks) from 13 May 2025 to 27 April 2026. The API serves the same data, so year-over-year impression comparisons across that window are unreliable. Our explainer on Search Console metrics goes deeper on how each metric is counted.

Try this prompt
For example.com, last 28 days: run get_search_overview, then query_search_analytics grouped by query with limit 1000, paging with startRow until done (each page is one tool call; stop after 10 pages). Compare the overview’s total clicks with the sum of the query rows and tell me what share of clicks comes from anonymised or unexposed queries.

Freshness, dataState and 16 months of history

  • Final data lags 2–3 days. That is Google’s typical figure for finalised data, and the API’s default.
  • dataState: all adds fresh data that isn’t final yet, some of it less than a day old. When you group by date, the response’s metadata.first_incomplete_date marks where numbers may still change.
  • hourly_all with the hour dimension returns hourly rows for up to 10 days, against 24 hours in the interface. GSC MCP Server doesn’t expose hourly data; our tools work at daily granularity.
  • 16 months is the ceiling. The API can’t return anything older than the interface can. If you want longer history, archive the data yourself every month or start the bulk export.
  • New properties take time. Google says a newly added site can take up to a week to show data.
Try this prompt
Using query_search_analytics for example.com with dimensions date and dataState all, show daily clicks and impressions for the last 10 days. Treat the most recent three days as provisional, and compare each earlier day with the same weekday a week before.

Search Console API quotas and load limits

From Google’s usage limits page, checked on 30 October 2026. QPS, QPM and QPD mean queries per second, minute and day.

APIPer site (property)Per userPer Cloud project
Search Analytics1,200 QPM1,200 QPM40,000 QPM; 30,000,000 QPD
URL Inspection2,000 QPD; 600 QPMNot listed15,000 QPM; 10,000,000 QPD
Sites, Sitemaps and other resourcesNot listed20 QPS; 200 QPM100,000,000 QPD

The load quota

Search Analytics also has a load quota, which measures the work a query costs Google rather than how many you send. Exceed it and you get a “quota exceeded” error.

  • Short-term load is counted in 10-minute windows. Wait 15 minutes and spread your queries across the day.
  • Long-term load is counted per day. If a single query in a 10-minute window still triggers the error, you have hit it, and you need to make queries cheaper.

Grouping or filtering by page or query is expensive, and both together is the most expensive. Longer date ranges cost more, and re-pulling the same data counts every time. Query one day at a time, drop the page dimension when you don’t need it, and cache what you have already fetched.

URL Inspection’s 2,000 a day

The inspection quota is per property, so 2,000 a day is enough to check new or changed URLs, not to crawl a large site. Prioritise pages that earn clicks or should.

Try this prompt
Get the 40 pages on example.com with the most impressions in the last 28 days from get_search_pages, then run inspect_url on each through multicall in batches of 10. List any page that isn’t indexed, whose Google-selected canonical differs from mine, or that hasn’t been crawled in 60 days.

Our server’s plans add their own monthly allowance on top of Google’s quotas: 30 tool calls on Free, 10,000 on Pro and 50,000 on Agency, with each call inside a multicall counted. See pricing.

Authentication: OAuth or a service account

Google’s authorisation guide is blunt: requests must use OAuth 2.0, and API keys alone won’t read your data. There are two scopes:

  • https://www.googleapis.com/auth/webmasters.readonly for reading. Use this unless you must change something.
  • https://www.googleapis.com/auth/webmasters for read and write, which you need to submit or delete sitemaps and add or remove properties.

OAuth for people, service accounts for jobs

OAuth with user consent suits tools that people sign in to. The user approves the scope once, you store a refresh token, and the API sees exactly the properties that person can see.

A service account suits scheduled jobs. Create it in Google Cloud, then add its email address as a user in Settings → Users and permissions → Add user on each property. Only owners can open that page, and a property allows up to 100 non-owner users. According to Google’s permissions help page, Restricted users get view rights on most data, while Full users can see everything and submit sitemaps. Google’s API docs centre on OAuth, so treat the service-account route as common practice rather than a documented recipe.

Your first Search Analytics API request

In words: enable the Google Search Console API in your Cloud project (APIs & Services → Library), create credentials, then send a POST to https://www.googleapis.com/webmasters/v3/sites/SITE_URL/searchAnalytics/query with your access token in the Authorization header and a JSON body. This body asks for the top queries and pages in the blog folder for September 2026:

FieldExample valueWhat it does
startDate2026-09-01Required. First day, Pacific Time, inclusive
endDate2026-09-30Required. Last day, inclusive
dimensionsquery, pageGrouped in this order; omit for a single total row. Also country, device, date, hour, searchAppearance
typewebDefault. Or image, video, news, discover, googleNews; web excludes Discover and Google News (see Discover data in the API)
dimensionFilterGroupsOne group: page contains /blog/Only the and group type works. Operators: equals, notEquals, contains, notContains, includingRegex, excludingRegex
aggregationTypeautoDefault; let Google choose property or page aggregation
rowLimit250001–25,000; default 1,000
startRow0Zero-based offset; next page is 25000
dataStatefinalDefault. all adds fresh data; hourly_all goes with the hour dimension

The response holds a rows array. Each row has keys (dimension values in the order you asked for), clicks, impressions, ctr and position, plus a responseAggregationType for the whole response. Note that equals and notEquals are case-sensitive for page and query, while contains and notContains are not.

Search Console API with Python

  1. Install google-api-python-client and google-auth-oauthlib.
  2. For a local script, create an OAuth client of type Desktop app and run InstalledAppFlow with the read-only scope. For a server job, load a service account key with service_account.Credentials instead.
  3. Build the client with build("searchconsole", "v1"), the service name Google’s Python quickstart uses.
  4. Call searchanalytics().query(siteUrl=..., body=...) with the fields above, then .execute().
  5. Loop over days, and within each day raise startRow by 25,000 until a response comes back short. Write rows to a database as you go so a quota error doesn’t lose the run.

Four ways to get Search Console data out

1. Export from the interface

Most reports have an Export button that downloads what is on screen, filters included, to Google Sheets, Excel or CSV. It stops at 1,000 rows, and cells shown as “~” or “-” export as zeros. It is also the only way to get data out of reports the API lacks, such as Page indexing and Links.

2. The API, directly or through a connector

Scripts, ETL tools, Google Sheets add-ons and Looker Studio’s Search Console connector all sit on the same API and the same daily row cap. The Looker Studio connector offers two tables: Site Impression (aggregated by property; web, image, video and news) and URL Impression (aggregated by page; also Discover and Google News). You need at least view permission on the property.

3. Bulk data export to BigQuery

The bulk export writes a daily copy of your Performance data into BigQuery, without the 50,000-row cap. The setup steps:

  1. In a Google Cloud project with billing, enable the BigQuery API and BigQuery Storage API.
  2. In IAM and Admin, grant search-console-data-export@system.gserviceaccount.com the BigQuery Job User and BigQuery Data Editor roles.
  3. In Search Console, open Settings → Bulk data export, enter the project ID, keep or change the searchconsole dataset name, and choose a location carefully: it is hard to change later. You need owner permission on the property.

The first export arrives within 48 hours. You get three tables: searchdata_site_impression (by property), searchdata_url_impression (by URL, with true/false columns for each search appearance) and ExportLog. Anonymised queries are flagged by is_anonymized_query, with the query text left empty.

If an export fails, Search Console retries the next day and holds the missing data for about a week; after about a month of failures it stops. Some properties lost 28 February and 1 March 2026 for good, according to the anomalies page.

4. An MCP server for questions in plain English

An MCP server puts the API behind tools your AI assistant can call, so you ask “which blog posts lost clicks this month?” instead of writing the request. It is the right fit for ad hoc analysis, not for extracting every row. Our plain-English guide to Search Console MCP servers explains how they work, and the comparison of Search Console MCP servers covers hosted and open-source options.

GSC MCP Server uses the read-only scope: it can’t submit sitemaps, request indexing or change anything, and it can’t read reports the API lacks. It also reads Bing Webmaster Tools through Bing’s own API. Setup takes a few minutes in Claude, ChatGPT, Cursor or VS Code (see the connection guide).

Try this prompt
Compare the last 28 days with the previous period for example.com using compare_search_periods by page. For the five pages that lost the most clicks, run query_search_analytics grouped by query to show which queries dropped, and inspect_url to confirm each page is still indexed with my canonical.

Which method should you use?

You needUseWhy
A quick look at top queries or pagesInterface exportNo setup; 1,000 rows is often enough
A recurring dashboard for colleaguesLooker Studio connectorFree, shareable, same API limits
Every query on a large site, kept indefinitelyBulk data exportNo daily row cap; start now, as there is no backfill
The last 16 months in full, todayAPI, one day at a timeThe only route to history before an export began
Joins with CRM, analytics or revenue dataBigQuery or your own API pipelineSQL and full control of the schema
Index status for a list of URLsURL Inspection API2,000 a day per property
Page indexing, Links or Core Web Vitals reportsThe interface (CrUX API for Web Vitals)Not in the Search Console API
Answers to ad hoc questions in plain EnglishAn MCP serverThe assistant writes and pages the requests for you

Many teams combine three: the bulk export as the permanent archive, a Looker Studio report for stakeholders, and an assistant for the questions in between. All of them read the same underlying data, with the same anonymised queries and Pacific Time dates, so note which route each figure came from and compare like with like.

Frequently asked questions

Is the Google Search Console API free?

Yes. Google’s pricing page says all use of the Search Console API is free of charge, subject to usage limits. The BigQuery bulk export is also free on the Search Console side, but BigQuery storage and queries are billed once you pass Google Cloud’s free tier.

How many rows can the Search Console API return?

Up to 25,000 rows per request (the default is 1,000), and you page through more with startRow. For Performance data, Google exposes at most 50,000 rows per day per search type per property, so large sites query one day at a time. The BigQuery bulk export has no daily row cap.

How do I export more than 1,000 rows from Search Console?

The interface stops at 1,000 rows per table and per export. To get more, use the Looker Studio connector, a script or add-on that calls the Search Analytics API with pagination, or the bulk data export to BigQuery. For a one-off job you can also export filtered slices, such as one folder or one country at a time.

What are the Search Console API quota limits?

Search Analytics allows 1,200 queries a minute per site and per user, and 40,000 a minute and 30 million a day per Google Cloud project, plus a load quota that penalises long date ranges and grouping by both page and query. URL Inspection allows 2,000 inspections a day and 600 a minute per property. Sites and Sitemaps calls allow 20 queries a second and 200 a minute per user.

Can I get Page indexing report data from the API?

No. The API has no endpoint for the Page indexing report, its totals or its reasons. The URL Inspection API returns the index status of one URL at a time, up to 2,000 a day per property, and the report itself can only be exported from the interface, up to 1,000 rows.

Does the BigQuery bulk export include historical data?

No. It exports data from the day you set it up, with the first export arriving within about 48 hours. To keep earlier months, pull them through the Search Analytics API before they fall outside the 16-month window and load them into your own table.