All errors share one shape:
Branch on error_code, not message.
On 429, honor exponential backoff. On FORBIDDEN_SCOPE, surface errors.missing to whoever manages the key so they can widen its scopes.