GA4

GA4 Data API limits and quotas, and when to use BigQuery

The Google Analytics 4 Data API is limited by token quotas per property: 200,000 core tokens a day and 40,000 an hour on a standard property, with at most 250,000 rows per request. This guide gives the quota table from Google's documentation, explains what makes a request expensive, shows how to read your remaining quota, and describes when the BigQuery export is the better source.

GA4Ievgen Krasovytskyi6 min read

GA4 Data API limits and quotas, and when to use BigQuery

The GA4 Data API limits each property by tokens: a standard property gets 200,000 core tokens per day and 40,000 per hour, and one request returns at most 250,000 rows. Every dashboard, connector and script that reads the property through the API draws from the same pool.

This guide gives the quota table from Google’s documentation, explains what makes one request cost more than another, shows how to check what you have left, and describes the point at which the API is the wrong tool and the BigQuery export is the right one.

What the GA4 Data API is

What the GA4 Data API is

The Data API (analyticsdata.googleapis.com, version v1) returns report data from a GA4 property: you send dimensions, metrics, a date range and filters, and it returns rows. It is the programmatic version of a GA4 report. It does not return raw events.

Its methods fall into four quota categories:

Category Methods
Core runReport, runPivotReport, batchRunReports, batchRunPivotReports, runAccessReport, getMetadata, checkCompatibility, createAudienceExports
Realtime runRealtimeReport
Funnel runFunnelReport
Chat properties.chat

Each request consumes only one kind of quota. A realtime dashboard does not eat into the quota of your nightly report job.

GA4 Data API quotas

GA4 Data API quotas

These are the property quotas from Google’s page (Data API limits and quotas, last updated October 2026). Core, Realtime and Funnel each have their own pool with the same sizes.

Quota Standard property Analytics 360 property
Tokens per property per day 200,000 2,000,000
Tokens per property per hour 40,000 400,000
Tokens per project per property per hour 14,000 140,000
Concurrent requests per property 10 50
Server errors per project per property per hour 10 50

Four details decide how these behave in practice:

  • Daily quotas reset at midnight Pacific time. Hourly quotas refresh within an hour, not on the hour.
  • The per-project limit is the one you hit first. One Google Cloud project can spend 14,000 tokens an hour on a property, about a third of the property’s hourly pool. Two tools sharing one project share that limit.
  • Server errors have their own quota. After 10 responses with code 500 or 503 in an hour, all requests from that project to that property are blocked. A retry loop without a pause can lock itself out.
  • Demographic dimensions are rationed separately. A property is allowed 120 potentially thresholded requests per hour, for dimensions such as userAgeBracket, userGender and audienceName.

The Turning Point

OWOX Data Marts

See your first report built in real time. 15 minutes.

  1. Connect your data warehouse
  2. Pick your metrics
  3. Get a live Google Sheets report

In the time it takes to write a ticket. Then imagine never writing that ticket again.

Book a Demo

We'll use your actual use case

What a request costs in tokens

What a request costs in tokens

Google states that most requests cost 10 tokens or fewer, and that the exact cost is determined when the request runs. These raise it:

  • more rows requested
  • more dimensions and metrics
  • complex filter expressions
  • longer date ranges
  • high-cardinality dimensions such as pagePath or custom dimensions
  • a property with a large event volume

The pattern that drains a quota is a dashboard with many charts, each asking for a year of data by page path, opened by several people in the same hour.

Row limits

runReport returns 10,000 rows when no limit is set and “a maximum of 250,000 rows per request, no matter how many you ask for” (runReport reference). Larger results have to be paged with offset, and each page is a request that spends tokens.

Check your remaining quota

Check your remaining quota

Add returnPropertyQuota to the request body. The response then includes a propertyQuota object with the tokens this request consumed and what remains in each pool.

{
  "dateRanges": [
    {"startDate": "2026-09-01", "endDate": "2026-09-30"}
  ],
  "dimensions": [
    {"name": "sessionDefaultChannelGroup"}
  ],
  "metrics": [
    {"name": "sessions"}
  ],
  "returnPropertyQuota": true
}

This is the body of a POST to https://analyticsdata.googleapis.com/v1beta/properties/PROPERTY_ID:runReport. Run your heaviest report once with this flag before you schedule it, so you know what one run costs.

What happens when a quota runs out

What happens when a quota runs out

The API stops answering for that pool until it refreshes. Reports that were half loaded stay half loaded: a scheduled export fails, and a dashboard shows an error instead of a chart. Nothing is lost in GA4 itself, but nothing can be read until the quota is back.

Ways to spend less, all of which follow from the cost factors above:

  • Cache results. Yesterday’s data does not change every time someone opens a dashboard. Fetch it once and store it.
  • Batch. batchRunReports sends several reports in one call.
  • Shorten date ranges and drop high-cardinality dimensions the report does not need.
  • Give heavy consumers their own Google Cloud project, so one tool cannot exhaust another’s per-project allowance.
  • Wait between retries after a 500 or 503.

What the Data API cannot give you

What the Data API cannot give you

Quotas are the limit people meet first. The structural limits matter more, because no quota increase removes them:

  • No raw events. The API returns aggregated rows. You cannot get the events of one session or one user.
  • The same reporting rules as the interface. Results can be sampled, thresholded, or condensed into an (other) row, as described in the guide to data sampling in GA4.
  • Dimension and metric compatibility. Not every combination can be requested together; that is what checkCompatibility is for.
  • Joins happen somewhere else. To put ad spend, orders or CRM data next to GA4 numbers, you have to pull each source separately and join the results yourself.

Looker Studio’s Google Analytics connector reads through the same API, so its charts spend the same property quotas. A report that works for one viewer can fail for the tenth.

When to use the BigQuery export instead

When to use the BigQuery export instead

GA4 has a native export of raw events to BigQuery, available to standard properties. Queries on the export are BigQuery queries: they do not touch Data API quotas at all, and they are not sampled.

Data API BigQuery export
What you get Aggregated report rows Every event, with its parameters
Limit Token quotas per property 1 million events per day in the daily export of a standard property
Sampling and thresholds Apply Do not apply
Joining other data Outside the API In SQL, in the same warehouse
History What GA4 retains From the day the link is created
Skill needed An HTTP client SQL

Use the API for small, fixed reports where GA4’s own definitions are what you want: sessions by channel for a weekly email, a realtime counter. Use the export when several reports, several people or several data sources are involved, because that is where quotas and aggregation start to cost more than they save.

The export is set up in GA4 Admin. The steps, the difference between daily and streaming export and the first queries are in the guide to connecting GA4 to BigQuery.

After the export: who writes the SQL

After the export: who writes the SQL

The export moves the limit from quotas to skills. The events are all there, but they arrive as nested records, and “sessions by channel” is now a query somebody has to write and everybody has to agree on. The patterns are covered in how to query GA4 event data in BigQuery.

OWOX Data Marts covers the step after the query is written. An analyst saves the SQL as a Data Mart on the warehouse that holds the export, with a description and an owner. Reports on that Data Mart are delivered to Google Sheets or Data Studio (the former Looker Studio) on a schedule. The people who used to open an API-backed dashboard now read a table that was computed once, in the warehouse, from all events.

OWOX Data Marts is not a GA4 connector and does not call the Data API. It works on the tables your GA4 property exports to your own warehouse, and the SQL stays the analyst’s. The modeling step between the raw export and a report is described in GA4 export to BigQuery and data modeling.

Your New Normal

Turn your data into decisions.

Governed data marts give you the clean foundation ML needs to actually work.

  • No AI hallucinations
  • Analyst-governed definitions
  • Every number traces to SQL
Get started free

FAQ

Frequently Asked Questions

How can I stay within GA4 API limits?

Cache results instead of requesting the same data on every dashboard load, batch reports with batchRunReports, shorten date ranges, drop high-cardinality dimensions such as page path, give heavy tools their own Google Cloud project and pause between retries. Add returnPropertyQuota to a request to see what it costs.

Why does a Looker Studio report on GA4 show quota errors?

Looker Studio's Google Analytics connector reads through the GA4 Data API, so every chart spends the property's token quotas. A report with many charts, long date ranges or several simultaneous viewers can exhaust the hourly quota. Reading the GA4 BigQuery export instead avoids the Data API quotas.

How many rows can one GA4 Data API request return?

runReport returns 10,000 rows if no limit is set and at most 250,000 rows per request. Larger results are paged with the offset parameter, and each page is a separate request that consumes tokens.

What are the GA4 Data API quotas for a standard property?

For each of the Core, Realtime and Funnel categories: 200,000 tokens per property per day, 40,000 per property per hour, 14,000 per project per property per hour, 10 concurrent requests and 10 server errors per project per hour. Analytics 360 properties get ten times the token quotas and 50 concurrent requests.

What are the GA4 Data API quota categories?

There are four: Core (runReport, runPivotReport, the batch methods and others), Realtime (runRealtimeReport), Funnel (runFunnelReport) and Chat (properties.chat). Each request consumes only one kind of quota.

Does the GA4 BigQuery export use Data API quotas?

No. The export writes raw events to BigQuery, and queries on it are BigQuery queries. Its own limit is 1 million events per day in the daily export of a standard property.

Who wrote this

Ievgen Krasovytskyi

Ievgen Krasovytskyi · Head of Marketing

Ievgen Krasovytskyi is the Head of Marketing at OWOX, leading strategy across content, SEO, product marketing, and AI-powered automation. With deep expertise in analytics infrastructure, data warehouses, and marketing technology, he builds systems that connect marketing performance to business outcomes. Ievgen writes about SaaS growth, analytics workflows, and the future of AI in marketing operations.