API errors
Every error returns application/problem+json with a stable error.code and an error.request_id that matches the X-Request-Id response header. The fragment #errors-<code> on this page is the canonical URL referenced by error.doc_url.
Envelope
{
"error": {
"code": "<see table>",
"type": "https://buildgazette.com/developers/errors#errors-<code>",
"title": "<human title>",
"status": <http-status>,
"message": "<actionable detail>",
"doc_url": "https://buildgazette.com/developers/errors#errors-<code>",
"request_id": "<uuid>"
}
}missing_api_keyWhen: The request did not include an Authorization header.
Fix: Add `Authorization: Bearer <bi_...>` (case-sensitive scheme).
invalid_api_keyWhen: The key is malformed, unknown, or revoked.
Fix: Mint a fresh key at /account. If you just rotated, the old key revokes in 24h (or instantly with `?immediate=true`).
origin_not_allowedWhen: The browser `Origin` header is not in the per-key allowlist.
Fix: Add the origin to the key in /account, or call from a server (no Origin header is permitted).
ip_not_allowedWhen: The caller IP is not in the per-key allowlist (supports IPv4 CIDR).
Fix: Whitelist the IP or CIDR block in /account, or remove the allowlist if you call from variable IPs.
insufficient_scopeWhen: The key does not hold any of the scopes required by the endpoint.
Fix: Re-issue the key with the necessary scope(s) — see the Scopes section on the main docs page.
rate_limitedWhen: 60 requests in the past 60 seconds for this key.
Fix: Back off — `Retry-After` says how long. Watch `X-RateLimit-Remaining` to avoid 429s entirely.
daily_quota_exceededWhen: The key reached its `daily_call_limit` for the UTC day.
Fix: Raise the limit on the key in /account (Plus+) or wait until 00:00 UTC.
invalid_queryWhen: A required query parameter is missing or fails validation (e.g. `q` < 2 chars on /search).
Fix: Read the `message` field — it names the bad parameter.
not_foundWhen: The slug or username does not exist, or the resource is unpublished.
Fix: Double-check the path segment. Listing endpoints return only published items, so a private draft will look like a 404.
query_failedWhen: An internal database call failed.
Fix: Retry with exponential backoff. If it persists, send the `request_id` (in `X-Request-Id`) to support.
internal_errorWhen: Unexpected exception inside the handler.
Fix: Quote `X-Request-Id` when contacting support — we can find the matching log line in seconds.
Retries
Retry 5xx with exponential backoff. Do not retry 4xx — they will return the same error. Use Idempotency-Key on non-GET writes to ensure exactly-once semantics if you do retry. The keys 11 listed above are the complete catalog; anything else indicates the spec is out of date — please file an issue.