Public v2 errors are application/json. The type field is a bare token,
not a URI — it groups related codes, and several codes deliberately share one.
Branch on code, which is unique.
| Code | Type | Shares type with | Also an auth code |
|---|---|---|---|
cancellation_conflict | conflict | conflict | no |
conflict | conflict | cancellation_conflict | yes |
event_history_expired | gone | — | no |
forbidden | forbidden | workspace_suspended | yes |
internal_error | internal_error | — | no |
invalid_request | invalid_request | — | yes |
not_found | not_found | — | yes |
payload_too_large | payload_too_large | — | no |
rate_limited | rate_limited | — | yes |
service_unavailable | service_unavailable | — | no |
unauthorized | unauthorized | — | no |
unsupported_media_type | unsupported_media_type | — | no |
workspace_suspended | forbidden | forbidden | no |
Response shape
{
"type": "conflict",
"code": "cancellation_conflict",
"message": "a human-readable explanation",
"request_id": "01JQ...",
"details": null
}Treat code as an open enumeration: new codes may be added without a major
version, so always keep a default branch. The 33 authentication
codes are documented separately under problem codes.