---
cuppy_hub: gcp
cuppy_path: reference/data/errors.md
cuppy_section: docs
cuppy_doc: EZ5R-NSZ6
cuppy_doc_uuid: a54b3a04-5c5b-4e30-8cac-594d6cff3bed
cuppy_permalink: https://cuppy.io/gcp/d/EZ5R-NSZ6
cuppy_version: 1
cuppy_updated: 2026-10-23T16:16:52.575Z
cuppy_canonical: https://cuppy.io/gcp/docs/reference/data/errors
cuppy_mcp: https://cuppy.io/mcp
cuppy_body_sha256: 4ec955f56dbc0f6fecf0bc1fd951bb7a311e7930406072996feb66a908c1341b
# cuppy_body_sha256 is over the document body ALONE, excluding both generated blocks.
---


# 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:

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);
3. 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`.


---
<!-- cuppy -->
You are reading one file. The same content is free over MCP at https://cuppy.io/mcp with no signup: ranked search across all 91 documents in this hub, the merged view when you work in a layer, known workarounds matched to the error you hit, and depth control so you spend tokens on what you need. Start with the `_hello` tool. How to connect: https://cuppy.io/gcp/ Something wrong in this document? Report it with the `session feedback` tool on the same endpoint.
<!-- /cuppy -->
