Errors
Errors use application/problem+json with a fixed code, detail, status and retryability. Preserve request and resource IDs for support, but redact credentials and secret URLs. A network failure is not evidence that a mutation did not run.
Choose a recovery path
Retry only where the error and operation contract permit it, honoring Retry-After. For an accepted operation, poll its retained ID; for keyed process replay, attach to the original process. A local WaitTimeout does not cancel remote work. Scope, restriction, legal-hold and invalid-state refusals need a changed authorized condition, not repeated identical requests.
409 invalid_state with retryable false is used when destructive customer actions would destroy held data. Refusal leaves the existing billing state unchanged. Non-destructive pause/stop remain available only where the lifecycle permits and held bytes can be preserved. Failures to preserve held data stay failures, with no invented successful deletion.
Code reference
The codes below come from the Problem.code enumeration in the API reference.
| Code | Status | Meaning |
|---|---|---|
invalid_request |
400 | Malformed JSON, bad query, header or path input, or a missing required body. |
unauthenticated |
401 | Missing, expired or revoked credential. The data API refuses API keys. |
token_expired |
401 | The access token or connect token has expired. Mint a new one. |
token_revoked |
401 | The credential was revoked. Obtain new authority. |
insufficient_balance |
402 | Your balance does not cover the action (for example a start or resume). |
spend_limit_reached |
402 | Your monthly spend limit has been reached. |
forbidden_scope |
403 | The key lacks the scope, or the change would weaken a spend policy without fresh console verification. |
key_restricted |
403 | A key restriction (computers, labels, source network, key hierarchy) forbids the action. |
key_cost_limit |
403 | The key's hourly cost limit would be exceeded. |
tier_limit |
403 | Your trust tier does not allow this size, or a tier cap was reached. |
account_suspended |
403 | The account is suspended. |
email_unverified |
403 | Verify your email address first. |
verification_required |
403 | Additional verification is required. |
region_blocked |
403 | Not available from this region. |
permission_denied |
403 | The guest refused a file or command because of Unix permissions; errno, path and user describe it. |
not_found |
404 | No such resource, or it belongs to another account. |
invalid_state |
409 | The current state or a legal hold forbids the action. See current_state and allowed_actions. |
not_supported |
409 | The capability is not supported (see capability). |
idempotency_mismatch |
409 | The same idempotency key was reused with a different request. |
idempotency_in_progress |
409 | The first request with this key is still running. Wait for Retry-After. |
confirmation_required |
409 | A confirmation header (for example CE-Confirm-Delete) is required. |
desktop_disabled |
409 | The computer is headless and has no desktop. |
agent_outdated |
409 | The in-guest agent is older than the supported versions (see min_agent_version). |
human_in_control |
409 | A person holds exclusive desktop control. Do not use force to bypass it. |
output_gap |
409 | Requested output offsets precede the retained output; see the earliest offsets in the problem. |
gone |
410 | The computer was deleted within the last 30 days. |
output_expired |
410 | Retained process output has expired. |
payload_too_large |
413 | The body is over the limit. |
unprocessable |
422 | Valid JSON that breaks a rule. |
topup_limit |
422 | A top-up rule (minimum, maximum, headroom) was broken. |
rate_limited |
429 | A request budget was exceeded. Wait for Retry-After. |
internal |
500 | An internal error. |
agent_unreachable |
502 | The in-guest agent did not answer. Not safe to retry blindly. |
capacity_unavailable |
503 | No capacity is available right now. Wait for Retry-After. |
host_busy |
503 | The platform is limiting new work. Wait for Retry-After. |
frozen |
503 | Temporarily unavailable. Wait for Retry-After. |
maintenance |
503 | Temporarily unavailable. Wait for Retry-After. |
guest_timeout |
504 | The guest did not finish in time. Not safe to retry blindly. |
secret_already_returned |
- | Not an error status: an idempotent replay returns metadata with the secret field null and secret_already_returned: true. Mint, create or rotate a new one. |
Dory is in development; these pages describe the planned service and may change. Questions: support@computeengines.com.