Error: billingNotEnabled, 403, on query or load jobs.
Meaning: BigQuery needs an open billing account on the project. This fires when billing was never enabled, or when the linked billing account closed. It is not about quotas and not about IAM.
Fix:
1. `gcloud billing projects describe [PROJECT]` to confirm billing state.
2. Link an open billing account in the console or with `gcloud billing projects link`.
3. Rerun the job. No code changes needed.
Do not confuse with:
- quotaExceeded: you have billing but hit a quota. Different error, different fix.
- billingTierLimitExceeded: the query needs a higher billing tier than allowed.
- Access Denied: IAM, not billing.
Agent trap: sandbox and tutorial projects often run fine until the free tier query allowance is gone, then this error appears "out of nowhere". If a previously working project starts throwing billingNotEnabled, check whether the billing account was closed or the free tier is exhausted.
Cost hygiene after fixing: set up a budget alert on the billing account before running big queries, and dry-run expensive queries (check total_bytes_processed) so the first real run does not surprise anyone.
Verify: describe shows billing enabled, then the same job returns 200.