Data error catalogue — the BigQuery reason strings, which are retryable, and the ones that are a cost model talking
The verbatim BigQuery error reasons with cause, check and fix, the vendor's own list of which are retryable with exponential backoff, and the three rows that are really telling you about billing or capacity rather than about the query.
markdownreferencev1EZ5R-NSZ6stage: operatetrust: officialfamily: dataservice: bigqueryinterface: anyaccessDeniedquotaExceededrateLimitExceedednotFoundbillingNotEnabledbillingTierLimitExceededinvalidQueryresourcesExceededbadRequestduplicatebackendErrorinternalErrortimeouttableUnavailableretryable
Data error catalogue
1. The table
| Reason | HTTP | Means | Fix |
|---|---|---|---|
accessDenied | 403 | insufficient permissions for the resource | guides/identity/fix-permission-denied.md — and note BigQuery permissions are often dataset-level |
quotaExceeded | 403 | the project exceeded a BigQuery quota | read the live quota; back off; request an increase if adjustable |
rateLimitExceeded | 403, 429 | too many requests, too quickly | retryable — exponential backoff |
notFound | 404 | the referenced resource does not exist | check the fully-qualified name, including the project |
billingNotEnabled | 403 | billing is not enabled on the project | not a BigQuery problem at all |
billingTierLimitExceeded | 400 | an on-demand query exceeded tier 100 | see §3 |
invalidQuery | 400 | syntax | fix the SQL |
resourcesExceeded | 400 | the job "consumed excessive resources" | see §4 |
badRequest | 400 | invalid input, or a streaming buffer conflict | see §5 |
duplicate | 409 | the resource already exists | make the create idempotent |
backendError | 500, 502, 503, 504 | service-side | retryable — exponential backoff |
internalError | 500 | service-side | retryable |
timeout | 400 | the job exceeded a time limit | split the job, or raise the limit where one exists |
tableUnavailable | 400 | a third-party table is temporarily unavailable | retry later; this is an external dependency, not your query |
2. The retryable set, as the vendor lists it
backendError, internalError, jobBackendError, jobInternalError, rateLimitExceeded — with
exponential backoff.
Everything else in §1 is a change, not a retry. A client that retries invalidQuery or
billingTierLimitExceeded will do so forever.
3. billingTierLimitExceeded is the cost model talking
It means an on-demand query exceeded tier 100. So it is not a bug in the query and not a quota you ask to raise: it is the on-demand model refusing a query of that size.
Three real answers:
- reduce what the query scans — partitioning, clustering, fewer columns;
- move the workload to capacity-based pricing, where compute is reserved slots rather than per-query
(reference/data/bigquery.md §2);
- split the job.
This row is why reference/data/bigquery.md insists the pricing model is a design decision. It is the only
error in the catalogue whose fix may be "change how you buy compute".
4. resourcesExceeded is about the shape of the query
The job "consumed excessive resources". In practice that is a query doing something that will not distribute —
an enormous ORDER BY over the whole result, a window function without partitioning, an unbounded self-join.
Check whether the query has a stage that must be processed on one worker. Fix by removing it, not by buying more slots: this failure is not usually a capacity shortage.
5. badRequest has two very different causes
"Invalid input or streaming buffer conflict". The second one is the non-obvious half: rows recently streamed into a table sit in a buffer, and some operations against a table with a non-empty streaming buffer are refused.
Check whether the table has had recent streaming inserts before concluding the request itself was malformed.
6. Dataflow and Dataproc
No vendor error table was read for either in this release, so none is invented. Two facts from their own pages carry the most diagnostic weight:
- Dataflow is exactly-once by default, with at-least-once available — so duplicate output from a Dataflow
pipeline is a configuration question first (reference/data/dataflow.md §3);
- a Dataproc cluster create, scale or shutdown takes "90 seconds or less, on average" — so an operation
hanging for much longer than that is not normal slowness
(reference/data/dataproc.md §4).
Recorded as a gap in changelog/2026-10-21-data-family.md.