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

Created 21 Oct 2026 · Modified 23 Oct 2026 · 1 version

Data error catalogue

1. The table

ReasonHTTPMeansFix
accessDenied403insufficient permissions for the resourceguides/identity/fix-permission-denied.md — and note BigQuery permissions are often dataset-level
quotaExceeded403the project exceeded a BigQuery quotaread the live quota; back off; request an increase if adjustable
rateLimitExceeded403, 429too many requests, too quicklyretryable — exponential backoff
notFound404the referenced resource does not existcheck the fully-qualified name, including the project
billingNotEnabled403billing is not enabled on the projectnot a BigQuery problem at all
billingTierLimitExceeded400an on-demand query exceeded tier 100see §3
invalidQuery400syntaxfix the SQL
resourcesExceeded400the job "consumed excessive resources"see §4
badRequest400invalid input, or a streaming buffer conflictsee §5
duplicate409the resource already existsmake the create idempotent
backendError500, 502, 503, 504service-sideretryable — exponential backoff
internalError500service-sideretryable
timeout400the job exceeded a time limitsplit the job, or raise the limit where one exists
tableUnavailable400a third-party table is temporarily unavailableretry 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:

  1. reduce what the query scans — partitioning, clustering, fewer columns;
  2. move the workload to capacity-based pricing, where compute is reserved slots rather than per-query

(reference/data/bigquery.md §2);

  1. 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.

Read this document as markdown — the same bytes an agent receives.