Skip to content
← All articles Google Search Console API: export more than 1,000 rows

Google Search Console API: export more than 1,000 rows

A practical Search Analytics API export workflow covering pagination, quotas, validation and the limits of available data.

The Google Search Console API is useful when a manual export is too small or too difficult to reproduce. It lets you retrieve search performance programmatically, preserve a request configuration and refresh a report without clicking through the interface. A complete extraction cannot stop at the first response. Search Analytics uses a default rowLimit of 1,000, accepts up to 25,000 rows per response and uses startRow for pagination. Even after paging, Google returns top rows within internal limits, so the result is not a complete event log of every query.

This guide focuses on pages, queries, clicks, impressions, CTR and position. It separates Search Analytics from URL Inspection and sitemap management, uses read-only access and provides a numerical check for the extraction. Store a request manifest beside every output: property, dates, search type, dimensions, filters, data state and retrieval time.

What can the Google Search Console API do?

The Search Console API contains several resources with different purposes. They can read performance data, list accessible properties, manage sitemaps and inspect information about the indexed version of an individual URL. Google's API overview explains that a caller must have the relevant Search Console permission for a property.

TaskMethodOutputMain limitation
Export clicks and impressionssearchAnalytics.queryRows grouped by dates, pages, queries, countries, devices and other dimensionsThe service returns top rows and does not promise every possible combination
Inspect a URLurlInspection.index.inspectIndex status, canonical information, crawl details and detected issuesIt inspects the indexed version rather than running a live-page test
List sitemapssitemaps.listSubmitted sitemap files and their statusThis is not a list of every site URL
List propertiessites.listProperties available to the authorized userThe result depends on that account's permissions

This distinction prevents a common category error. Search Analytics is not an indexing test, and URL Inspection is not a bulk live-page checker. The URL Inspection method reference states that the response concerns the version in Google's index.

If you first need to identify which interface report answers each question, read the Search Console capabilities overview. API work should start after choosing the relevant report and aggregation level.

Why does a default export stop at 1,000 rows?

The Search Analytics request body makes rowLimit optional. If you omit it, the service uses 1,000. The accepted range is 1 through 25,000. The startRow field is the zero-based index of the first row in the next slice. These values are documented in the query method reference.

Changing rowLimit to 25,000 increases only one response. To continue, repeat the same request with startRow set to 25,000, then 50,000. Dates, dimensions, filters, search type and data state must remain the same. If any of them changes between pages, the rows are no longer slices of one extraction.

{
  "startDate": "2026-09-01",
  "endDate": "2026-09-01",
  "type": "web",
  "dimensions": ["page", "query"],
  "rowLimit": 25000,
  "startRow": 0,
  "dataState": "final"
}

The property appears in the request URL. A URL-prefix property includes its protocol and trailing slash, such as https://example.com/. A Domain property uses the form sc-domain:example.com. These are syntax examples and do not identify the analyzed project.

How do you export more than 1,000 rows without gaps between batches?

Stop when a response is empty or contains fewer than the requested 25,000 rows. Google's Search Analytics query guide explains an important boundary case: when the available row count is exactly divisible by the batch size, the next request is empty. That empty response proves the end of the slice; it is not a failure.

start_row = 0
batch_size = 25000

while True:
    body["startRow"] = start_row
    body["rowLimit"] = batch_size
    rows = request_search_analytics(body)
    save(rows)
    if len(rows) < batch_size:
        break
    start_row += batch_size

Our calculation. If one date and one search type expose exactly 50,000 rows, the loop makes three calls: two responses with 25,000 rows and one empty response that confirms the boundary. Running the same daily extraction for a 31-day month and one search type can therefore require 93 calls: 31 × 3. This is a request-count calculation for that scenario, not a claim that every property returns 50,000 rows.

Record the offset and row count for every batch. After combining the files, test the uniqueness of the selected dimensions, for example date + page + query + country + device. A duplicate key suggests that a batch was stored twice or that request settings differed. It does not, by itself, demonstrate a Google data error.

Why does pagination still not guarantee every query?

Search Analytics sorts results by clicks and warns that internal limitations restrict the response to top rows rather than guaranteeing every data row. Google's guide to getting performance data states that the method exposes at most 50,000 rows per day and search type. “Full export” therefore means the largest available result for a defined request, not every anonymized or rare combination.

Google recommends requesting data separately by day and search type when the aim is to retrieve more available rows. A wide date range is convenient but does not increase the daily ceiling. Splitting by country or device creates additional requests and may change aggregation. Do that for a stated analysis question, rather than merely to make a file larger.

Interpretation boundary. When detailed rows sum to fewer clicks than an aggregate query, do not invent an “unknown query” row and assign unsupported metrics to it. Keep aggregates and detailed dimensions as separate data levels and document the difference.

How do you authorize access without granting unnecessary permissions?

User data requires OAuth 2.0. An ordinary API key does not replace Search Console authorization. Google's authorization guide lists two scopes: webmasters.readonly for read access and webmasters for read/write access. A performance export needs only the read-only scope.

  1. Create a project in Google Cloud Console and enable the Search Console API.
  2. Configure an OAuth consent screen and create a client for the application type.
  3. Request https://www.googleapis.com/auth/webmasters.readonly.
  4. Authorize a user who has access to the required property.
  5. Treat the refresh token as a secret and keep it out of reports and source control.

Google lists these prerequisites in its application preparation guide. Existing Search Console permissions still apply. A token cannot reveal a property that the user is not allowed to access.

Which quotas matter before a bulk extraction?

Quotas differ by resource. Google's current usage limits allow 1,200 Search Analytics queries per minute for a site and for a user, with separate project limits. Search Analytics also applies load quotas. Grouping or filtering by page and query is more expensive, and longer date ranges consume more load.

URL Inspection has a separate per-property limit of 2,000 inspections per day and 600 per minute. That budget cannot provide performance metrics and should not be spent repeatedly inspecting unchanged URLs. Handle quota errors with delayed retries and increasing intervals instead of a tight infinite loop.

SignalCheckAction
Response has 25,000 rowsWhether another page existsIncrease startRow by 25,000
Response has fewer than 25,000 rowsRequest settings remained identicalFinish that slice
Empty response at an exact boundaryThe preceding batch was fullRecord completion rather than an error
Quota exceededAffected resource and quota windowSpread requests and retry later
Detailed totals are below an aggregateGrouping and internal data limitsStore the aggregate separately and document the limit

How should you validate the resulting CSV or table?

Compare settings before comparing rows. Two files need the same date interpretation, search type, final or all data state, dimensions, filters and property. Then calculate rows per batch, earliest and latest dates, unique keys, clicks and impressions. Recalculate aggregate CTR as sum of clicks / sum of impressions. Do not average already averaged positions without a defined weighting method.

For a one-off analysis, use the GSC full export tool. It removes the need to configure an OAuth client or write a paging loop, but it cannot remove the source API's limits. Keep the request settings and retrieval date beside the file.

What does the Search Console API not do?

The API does not add a site to Google's index, submit arbitrary pages for accelerated indexing or reveal hidden queries. It is not a fixed-rank tracker: the position field is an aggregate Search Console metric. URL Inspection does not run a live test, and Search Analytics does not explain the cause of an increase or decrease.

Automation also cannot repair an unclear data model. A large file becomes misleading when search types, periods and properties are combined without explicit columns. An automated report is useful only when its request can be repeated and explained.

What should you do after the first extraction?

Save the request manifest and raw response before building derived metrics. Keep daily aggregates separate from dimension-level rows. Then answer one question, such as which pages receive impressions without clicks or which queries changed between comparable periods. The guide to first Google impressions and clicks shows why a short spike should not automatically be treated as a lasting trend.

FAQ

Short answers to the most common questions from this article.

Does Google Search Console have an API?
Yes. The Search Console API includes Search Analytics, Sites, Sitemaps and URL Inspection resources. Each resource has a separate purpose and requires appropriate property access.
What is the Google Search Console API?
It is a REST API for programmatic access to part of Search Console. It can return performance data, accessible properties, sitemap information and details about the indexed version of a URL.
How do you get Google Search Console API access?
Enable the API in a Google Cloud project, create an OAuth client and authorize a user who can access the property. The webmasters.readonly scope is sufficient for exports.
Do you need an API key for Search Console?
Private Search Console data requires OAuth 2.0. An API key applies to separate public testing tools and does not replace a user's consent to read their data.
How do you export more than 1,000 Search Console rows?
Set rowLimit to as many as 25,000 and repeat the same request while increasing startRow by the batch size. Stop after a short or empty response and preserve the request settings.