Skip to main content
Technical SEO 17 min

Search Console at Scale: API, BigQuery & SEO

Choose between the Search Console UI, Search Analytics API and BigQuery export, then build reliable, cost-aware SEO analysis with explicit data limits.

EG

Elu Gonzalez

Author

When should an SEO team use the Search Console UI, API or BigQuery export?

Use the Search Console UI for quick diagnosis and visual checks on one property. Use the Search Analytics API for repeatable, filtered extracts and historical backfills that fit its row and quota limits. Use bulk export to BigQuery when you need an ongoing daily dataset, more complete query and URL coverage, joins across business data, or analysis that must remain reproducible at scale.

Key takeaways

  • The UI is best for exploration, the API for bounded automation, and bulk export for a durable analytical dataset; none is universally superior.
  • Search Console data is aggregated, follows Pacific Time dates and omits or masks privacy-protected queries, so chart totals and visible query rows need not reconcile.
  • The Search Analytics API allows 25,000 rows per response but exposes at most 50,000 rows per day per search type, even when pagination is correct.
  • Bulk export creates property-level, URL-level and export-log tables. Always aggregate metrics and filter the date partition before adding other dimensions.
  • Control BigQuery spend through narrow date ranges, selected columns, dry runs, maximum-bytes limits and monitored scheduled queries, not through LIMIT alone.

Search Console data at scale is less a dashboard problem than a data-contract problem. The interface, Search Analytics API and BigQuery bulk export expose related performance data, but they do not offer the same coverage, history or operating model. Choosing the wrong one can leave an analysis incomplete even when the SQL, chart or spreadsheet is technically correct.

Use the interface to investigate one property and frame a question. Use the API for repeatable, filtered extracts within Search Analytics limits. Use bulk export for a daily dataset the organisation can retain, join and test. Make that choice before designing the warehouse.

This guide assumes a verified property and familiarity with clicks, impressions, CTR and average position. The practical Google Search Console guide covers setup and everyday reports; this one focuses on reliable retrieval beyond manual exports.

Choose the smallest surface that can answer the question

Route Best fit Main boundary Operational burden
Search Console UI A quick visual check, one-off comparison or diagnosis on one property Limited table rows, manual state and incomplete query detail Low
Search Analytics API Scheduled extracts, filtered reports, historical backfill and controlled integrations Top-row coverage, daily row ceiling, quotas and code ownership Medium
Bulk export to BigQuery Ongoing history, large query/URL datasets, joins, cohort analysis and reproducible models Starts from activation, Cloud setup, storage/query costs and pipeline monitoring High

Start in the UI when the next action depends on human inspection, such as comparing a page before and after an edit or finding which filter exposes a pattern. Its performance table shows at most 1,000 rows, while totals can include rows absent from the table (Google’s explanation of Search Console data). It is an investigative surface, not a complete database.

Move to the API when the question repeats: for example, a weekly page-query cohort, a daily baseline across properties or an available-history backfill. Code preserves filters and aggregation choices for review.

Choose bulk export when completeness and continuity matter more than convenience. Search Console describes a daily BigQuery export of all available performance data except anonymised queries. Search Console bulk export does not disclose protected query text. Google explains the privacy limit in its bulk-export overview. The export provides a fuller working set than UI or API top rows in storage the organisation controls.

A warehouse is not automatically the mature option. A small site with a few recurring reports may be better served by a versioned API script and a destination table. A property network needing page-level joins and durable history will outgrow spreadsheets. Scale means repeated analysis, not merely many rows.

Treat Search Console numbers as aggregated observations

Search Console does not expose a raw event log. Each row aggregates dimensions such as date, query, page, country, device, search type and search appearance. Changing dimensions changes the grain, so summing separately retrieved datasets can double-count performance.

Dates need special care. Search Console labels daily performance in Pacific Time, and the API expects its date range in Pacific Time. Google says collected data is normally available after two to three days, although updates are published at intervals (About Search Console data). The API’s dataState parameter can include fresh, preliminary data when set to all; omitting it returns finalised data (Search Analytics query reference). A daily pipeline should record whether it accepted preliminary rows and whether it later replaced them.

Privacy protection creates another apparent mismatch. Rare or sensitive queries can be anonymised. They may contribute to chart totals even though their text is absent from the query table. Applying a query filter can also change how those totals are calculated. In bulk export, anonymised rows are identified with is_anonymized_query and the query value is empty, so analysts can retain their aggregate clicks and impressions without claiming to know the underlying terms (bulk-export table reference).

Label a named-query subtotal honestly; do not call it “all queries” or assign the difference to a guessed “other” topic. Use property aggregation for property reporting and the URL table for URL reporting. Present both as separate, documented grains when needed.

Average position is weighted, not the arithmetic mean of row-level averages. In bulk export, property-level position comes from SUM(sum_top_position) / SUM(impressions) + 1; URL-level position uses sum_position in the same weighted calculation. Google’s table reference defines both fields as zero-based sums (bulk-export table reference). Re-averaging already averaged positions gives high- and low-impression rows equal influence and produces the wrong answer.

Use the Search Analytics API without confusing pagination with completeness

The Search Analytics endpoint accepts a date range, dimensions, filters, search type, aggregation type and data state. A request can return at most 25,000 rows; startRow is the zero-based offset used for pagination (Search Analytics query reference). A robust extractor requests the maximum page size, increments the offset by the number of rows received and stops when the response is empty or shorter than the page size.

That loop does not make the source complete. Google documents a separate maximum of 50,000 rows per day per search type, sorted by clicks, for Search Analytics data. Detailed grouping by page or query can lose data even within that ceiling (Getting your performance data). Pagination retrieves the available top rows. It cannot retrieve rows the service never exposes.

A sensible extraction pattern is:

  1. Query one day and search type at a time when coverage matters.
  2. Store the request, property, extraction time and dataState.
  3. Paginate with rowLimit: 25000 and a rising startRow.
  4. Stop on a short page; flag any day reaching 50,000 rows as potentially truncated.
  5. Replace preliminary dates after finalisation rather than appending them.
  6. Keep property totals separate from page-query detail so missing detail stays visible.

Quotas need two controls. Search Analytics has short-term and daily load quotas whose numeric capacity Google does not publish; wide date ranges and grouping or filtering by both page and query consume more load. It also publishes request quotas of 1,200 queries per minute per site, 1,200 per minute per user, and 40,000 per minute plus 30,000,000 per day per project (Search Console API usage limits). Do not design to the headline project quota. A single expensive query can meet a load limit long before request count becomes the issue.

Reduce pressure by slicing dates, caching final periods and avoiding unchanged months. Cap exponential backoff and surface failed days. Stagger schedules when clients share a Cloud project so one burst does not delay every property. Keep the OAuth scope read-only unless broader access is necessary.

The API is a good bridge for history because native bulk export is prospective. Google states that the first bulk export contains data for the day of export and recommends the API or reports for earlier data (bulk-export setup guide). Store an API backfill with its source and coverage flags. Do not silently union it with bulk rows and imply identical completeness.

Set up bulk export with ownership and location decided first

Bulk export needs a Google Cloud project with billing enabled, the BigQuery API and BigQuery Storage API. The Search Console service account [email protected] needs the BigQuery Job User and BigQuery Data Editor roles in that project. The person starting the export must be an owner of the Search Console property (Search Console bulk-export management guidance).

Those roles are broad enough to deserve an owner and periodic IAM review. Separate the exporter from analyst identities, and give analysts dataset or approved-view access instead of project ownership. Query jobs also require permission to create a BigQuery job as well as permission to read the relevant data (BigQuery resource hierarchy).

Choose the dataset location before activation. Search Console creates the dataset during the first export, and bulk export does not natively support changing its location later. BigQuery normally runs a query in the same location as the tables it references (query execution guidance). For an ordinary single-location job, the specified or inferred job location must match every dataset read or written; a mismatch returns an error. A single region and a multi-region do not match even when the region sits inside the multi-region, so EU and europe-west1 are not interchangeable (BigQuery locations).

Global queries are the exception, and the feature remains in Preview. They can reference data in more than one region. To use them, enable global-query execution for the querying project in the primary region. Each project holding remote data must also allow global-query data access in that remote region. The caller needs bigquery.jobs.createGlobalQuery (global-query enablement and permissions).

BigQuery runs a subquery in each remote region and copies the required data into temporary tables in the primary region. BigQuery retains those tables for 24 hours and runs the final query in the primary region with the collected data. The bill can include remote and final compute, inter-location copying and those 24 hours of temporary storage. Cross-region transfer also adds latency, and global queries do not work through regional endpoints (global-query execution, pricing and limitations).

For ordinary jobs, a reservation is used only when its location matches the job location. If no compatible reservation exists, the job runs on demand (BigQuery locations). For a European organisation, check residency policy, planned joins, reservations and downstream tools before the export starts.

A setup review covers:

  • the Cloud project ID, not the project number;
  • billing ownership, budget alerts and a cost centre;
  • BigQuery and BigQuery Storage APIs enabled;
  • the Search Console exporter principal and its two required roles;
  • a searchconsole dataset name, unique within a shared project;
  • a location compatible with the organisation’s other analytical data;
  • property-owner access for the person activating it;
  • a monitoring owner for the first delivery and later failures.

The first export can take up to 48 hours after successful configuration. It does not backfill. Once tables exist, Search Console advises against changing their schema and recommends at least 14 days if a partition expiration is configured, because a shorter expiry can break export writes (bulk-export setup guide). If long history is the reason for the warehouse, an aggressive expiry defeats the design.

Understand the three-table model before writing SQL

The default searchconsole dataset contains three tables:

  • searchdata_site_impression stores performance aggregated at property level;
  • searchdata_url_impression adds the landing URL grain;
  • ExportLog records successful writes to the two performance tables.

Both performance tables are partitioned by data_date. Dimensions include property, query, country, search type and device; the URL table also includes url and search-appearance flags. ExportLog contains the data date, target namespace, publication time and an epoch_version that increases if Search Console later revises a date (bulk-export table reference).

Rows are not guaranteed to be consolidated by date or by any other key. Every analytical query should therefore aggregate clicks, impressions and position sums, even if the selected dimensions appear unique. Google makes this requirement explicit in its bulk-export query guidance.

This parameterised pattern produces named web-query performance by URL while pruning the date partition:

SELECT
  data_date,
  url,
  query,
  SUM(clicks) AS clicks,
  SUM(impressions) AS impressions,
  SAFE_DIVIDE(SUM(clicks), SUM(impressions)) AS ctr,
  SAFE_DIVIDE(SUM(sum_position), SUM(impressions)) + 1 AS avg_position
FROM `your-project.searchconsole.searchdata_url_impression`
WHERE data_date BETWEEN @start_date AND @end_date
  AND search_type = 'WEB'
  AND NOT is_anonymized_query
GROUP BY data_date, url, query;

The partition filter belongs in the base query, not in a dashboard layer that reads the full table first. Select only the columns needed. BigQuery documents that partition pruning reduces scanned data, while SELECT * and selecting unnecessary columns increase processing (BigQuery computation practices). A LIMIT changes output row count, but on a non-clustered table it does not reduce bytes read.

Build a thin modelling layer so dashboards do not reimplement these rules. Use one daily table for finalised property totals and another for named query-URL detail with coverage flags. A calendar table can align Pacific dates with the reporting timezone; stable URL mappings can add template, language or content type. Keep raw tables untouched so revised logic can be replayed.

Put cost controls into the query path

BigQuery has on-demand analysis, priced by bytes processed, and capacity-based analysis, priced through reserved capacity. Storage is a separate part of the bill. The right model and current price depend on location, workload and account terms, so a universal per-query estimate would be misleading. Review the current official BigQuery pricing page against the chosen region and billing model.

Cost control starts before execution:

  • preview tables without a query when exploring their shape;
  • require bounded data_date parameters for production queries;
  • select named columns instead of SELECT *;
  • use a dry run or console query validator to estimate bytes;
  • set maximum bytes billed on on-demand jobs so an unexpectedly broad query fails;
  • materialise reused daily or monthly transformations instead of rescanning raw data for every dashboard;
  • label scheduled jobs and review bytes processed, failures and slot use by owner.

Google’s cost guidance confirms that dry runs estimate bytes and that a maximum-bytes setting rejects a query before it incurs a charge when the estimate exceeds the limit. It also warns that LIMIT does not control cost on non-clustered tables (BigQuery cost practices). These controls are more reliable than a static monthly budget assumption because the data volume and query mix will change.

Operations matter as much as SQL. Give each scheduled query, destination and alert an owner. A dashboard showing yesterday as zero is misleading when an export failed. Expose freshness and row completeness with the result.

Make data QA part of every SEO result

Before interpreting a rise or fall, test the dataset that produced it.

First, use ExportLog to check that both searchdata_site_impression and searchdata_url_impression completed for every expected date. They can arrive at different times. The log records successful writes, not failed attempts. Search Console retries a missed date for about a week; persistent export problems can eventually stop the export, and property owners and full users receive error messages (bulk-export monitoring guidance).

Second, compare closed-date property totals with a stable reference. A mismatch may reflect fresh versus final data, anonymised rows, aggregation or search type, timezone, or late corrections. Record those choices with the metric. When epoch_version changes, rebuild that date’s derived rows rather than appending a copy.

Third, run structural tests:

  • no future data_date values;
  • no negative clicks or impressions;
  • clicks do not exceed impressions at the chosen aggregation grain;
  • CTR is computed from summed clicks and impressions;
  • average position is weighted from position sums;
  • recognised search types and devices only, with unknown values quarantined rather than dropped;
  • named-query reports exclude anonymised rows explicitly, while total reports retain them;
  • URL joins report unmatched records instead of silently discarding them.

Test business mappings separately because URLs can redirect, change locale, move template or join several campaigns. Date mutable classifications. The SEO observability and CI/CD guide covers ownership and release checks; the GA4 SEO measurement guide addresses behaviour after the search click.

Analyses that justify the warehouse

BigQuery earns its overhead when the interface or a bounded API extract cannot support the decision cleanly.

Query-to-URL stability

Count distinct landing URLs for each named query by week and inspect repeated changes in the leading URL. This can reveal internal competition, migrations or shifting intent, but it does not prove cannibalisation. Sitelinks, multiple useful results and low-impression noise need review.

Launch cohorts

Join controlled publication dates to Search Console URLs and compare equal post-launch windows by country, device and page type. Keep seasonality and site changes visible. The cohort shows whether pages entered their intended query set; it does not prove the release caused every click change.

Apply a versioned, case-insensitive regular expression that includes verified brand spellings. Preserve anonymised performance as a separate bucket. A brand classifier is an analyst-defined model, so keep its version and review false matches whenever a product or market name changes.

Opportunity queues

Materialise pages with sustained impressions, stable average position and CTR below a comparable page-type baseline. Avoid a universal threshold because result features, brand familiarity, country, device and intent affect click behaviour.

International diagnostics

Map URLs to intended locales and compare country-device-query cohorts. Search Console country shows where the search occurred, not the user’s language or residence. Inspect hreflang, localisation and demand, then verify implementation with the international SEO guide.

Change attribution support

Join deployments, redirects, content edits and incidents to daily performance. An annotation narrows investigation; it does not establish causality. The SEO forecasting framework offers a way to separate measured impact from confidence and implementation effort.

A decision framework for the next implementation

  1. Is the task exploratory or recurring? Keep exploratory work in the UI. Automate only after the dimensions and decision are understood.
  2. Could missing lower-volume rows change the decision? If no, the API may be sufficient. If yes, start bulk export now because history is not retroactive.
  3. Does the analysis need joins, durable history or shared semantic rules? Those requirements favour BigQuery and a governed modelling layer.
  4. Can the team operate it? Name owners for IAM, billing, export monitoring, transformations, data QA and metric definitions. If those roles are absent, narrow the first release rather than building an unattended warehouse.

A durable first increment is small: activate export in the correct location, verify both raw tables and ExportLog, build one partition-aware daily model, reconcile a closed week and publish one analysis with coverage notes. Add classification, URL taxonomy and business joins only after that path works.

Acceptance criteria should be concrete: two successful export records per expected date; no silent mixing of preliminary and final data; partition filters in production queries; byte limits and owners for scheduled jobs; incomplete labels on named-query totals; and a visible last successful data date. Scale means reproducing an SEO decision without rediscovering these rules.

Frequently asked questions

Is the Search Console API more complete than the interface?

It can return more rows and supports repeatable filters, dimensions and pagination, but it is still bounded by Search Console’s internal limits. The Search Analytics API exposes at most 50,000 rows per day per search type and returns top rows rather than a guaranteed complete query set. Bulk export is the better source when you need an ongoing, more complete dataset.

Does the BigQuery bulk export include anonymised queries?

It does not reveal the text of privacy-protected queries. Exported data can contain anonymised rows identified by a flag and an empty query value, so their clicks and impressions can contribute to totals without becoming usable query terms. Do not treat the sum of named queries as total search demand.

Can I backfill old Search Console data into BigQuery?

The native bulk export starts with data from the day the export begins; it does not backfill earlier dates. You can use the Search Analytics API or prior saved exports for historical data, subject to their availability and limits, then keep that backfill separate or normalise it carefully because API and bulk-export coverage can differ.

How do I keep Search Console queries in BigQuery affordable?

Filter the partitioning date column, select only required columns, preview or dry-run the query, cap the bytes billed for on-demand jobs and materialise frequently reused transformations. A LIMIT clause alone does not reduce bytes read from a non-clustered table. Check current BigQuery pricing for the dataset location and billing model instead of relying on a fixed cost estimate.

Which BigQuery table should I use for SEO analysis?

Use searchdata_site_impression for property-level trends and searchdata_url_impression when the landing URL is part of the question. Use ExportLog to verify whether both performance tables were written successfully for each date. Do not sum site-level and URL-level tables together because they are alternative aggregation views of the same search performance.

Start with one closed-week model

Do not begin with a dashboard catalogue. Activate the right source, wait for a closed week, verify the export log and build one daily model with explicit timezone, search type, anonymisation and aggregation rules. Answer one decision question and have another analyst reproduce it. The test will show whether to invest next in API engineering, warehouse modelling or a better saved Search Console view.

Sources and references

  1. Search Analytics: query (developers.google.com)
  2. Getting your performance data (developers.google.com)
  3. Search Console API usage limits (developers.google.com)
  4. About Search Console data (support.google.com)
  5. Start a new bulk data export (support.google.com)
  6. BigQuery locations (cloud.google.com)
  7. Global queries (cloud.google.com)
  8. Run a query (cloud.google.com)
  9. BigQuery pricing (cloud.google.com)

Share this article

If you found this content useful, share it with your colleagues.

Stay updated

Receive the latest articles, tips and strategies about SEO, web performance and digital marketing in your email.

We send a newsletter every week, and you can unsubscribe at any time.

Tags: #Search Console API #BigQuery #SEO Analysis #SEO Data #Technical SEO
EG

Elu Gonzalez

SEO Expert & Web Optimization