Limits & cost
Rows and time
| Rows per API/AI call | 1,000 default, 10,000 maximum |
| Default statement timeout | 60 seconds |
| Background submission | above ~10 seconds of predicted runtime |
| Scratch result retention | 1 day |
| Saved results | until you delete them |
| Export link validity | 1 hour |
The console pages results rather than capping them, so a large result set is browsable there while an API caller sees the cap.
Cost
Every query is planned and priced before execution.
| Limit | Default |
|---|---|
| Per query | $5 |
| Per day, per company | $50 |
The estimate is scan-size based: bytes the plan expects to read, multiplied by a complexity factor for joins and aggregates. Refusals name the estimate, so the fix is usually visible — a filter, fewer columns, or an aggregate instead of raw rows.
Reserved budget is refunded when a query fails or is cancelled.
Unfiltered scans of large tables
Scanning a large external table with no selective predicate is refused regardless of dollar cost. The refusal is about the shape of the query, not its price; a cheaper rewrite of the same shape will not pass. Add a filter on an indexed column.
Container sizing
Queries execute in containers sized from the plan — more scanned bytes and more joins mean more CPU and memory, up to the largest tier. You do not choose a size; the plan does, which is why an unpinned BigQuery catalog or a missing filter shows up as cost rather than as a knob to turn.
Concurrency
Queries run in their own containers, so one heavy query does not slow another. The practical ceiling is your daily budget and your source systems' own capacity — Thunderduck will happily open several connections to the same database.