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.

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
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
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,userGenderandaudienceName.
OWOX Data Marts
See your first report built in real time. 15 minutes.
- Connect your data warehouse
- Pick your metrics
- Get a live Google Sheets report
In the time it takes to write a ticket. Then imagine never writing that ticket again.
Book a DemoWe'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
pagePathor 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
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.
batchRunReportssends 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
checkCompatibilityis 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.
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
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.



