{
"success": false,
"message": "Missing required scope(s): ['ads:write']",
"error_code": "FORBIDDEN_SCOPE",
"errors": { "required": ["ads:write"], "missing": ["ads:write"] }
}
error_code, not message.
error_code | HTTP | Meaning / fix |
|---|---|---|
AUTHENTICATION_ERROR | 401 | Missing/invalid/expired key or JWT. |
FORBIDDEN_SCOPE | 403 | Key lacks a required scope — see errors.missing. |
AUTHORIZATION_ERROR | 403 | Key not authorized for the requested store. |
NOT_FOUND | 404 | Resource doesn’t exist or isn’t yours. |
VALIDATION_ERROR | 422 | Bad request body/params. |
IDEMPOTENCY_CONFLICT | 409 | Idempotency-Key reused with a different body. |
BAD_REQUEST | 400 | Precondition not met (e.g. missing X-Store-ID). |
RATE_LIMIT_ERROR | 429 | Per-key rate limit exceeded — back off and retry. |
On
429, honor exponential backoff. On FORBIDDEN_SCOPE, surface errors.missing to whoever
manages the key so they can widen its scopes.