에러가 나면 SDK 는 category(큰 분류)·code(세부 종류)·status·requestId·retryable 를 담은 에러 객체를 줘요. 분기는 code 와 category 로만 해요. message 문구는 예고 없이 바뀌어요. 자세한 약속은 클라이언트 정책에 있어요.
| code | status | retryable |
|---|
action_invalid | 400 | — |
bad_request | 400 | — |
build_env_no_override | 400 | — |
cross_tenant | 400 | — |
duplicate | 400 | — |
empty | 400 | — |
expiry_in_past | 400 | — |
final_visibility_too_wide | 400 | — |
invalid_drive | 400 | — |
invalid_entitlement | 400 | — |
invalid_expiry | 400 | — |
invalid_format | 400 | — |
invalid_oauth_state | 400 | — |
invalid_period | 400 | — |
invalid_seat_count | 400 | — |
invalid_value | 400 | — |
kind_engine_mismatch | 400 | — |
not_allowed | 400 | — |
oauth_denied | 400 | — |
preset_mismatch | 400 | — |
required | 400 | — |
too_long | 400 | — |
| code | status | retryable |
|---|
session_ended | 401 | ✅ |
session_expired | 401 | ✅ |
token_expired | 401 | ✅ |
token_invalid | 401 | ✅ |
token_missing | 401 | ✅ |
| code | status | retryable |
|---|
charge_failed | 402 | — |
no_billing_key | 402 | — |
no_payment_method | 402 | — |
payment_failed | 402 | — |
payment_required | 402 | — |
preset_not_in_plan | 402 | — |
quota_exceeded | 402 | — |
resource_quota_exceeded | 402 | — |
seat_unassigned | 402 | — |
unpaid_balance | 402 | — |
| code | status | retryable |
|---|
action_denied | 403 | — |
connector_inactive | 403 | — |
feature_not_in_plan | 403 | — |
forbidden | 403 | — |
grant_expired | 403 | — |
grant_revoked | 403 | — |
not_admin | 403 | — |
not_member | 403 | — |
version_not_approved | 403 | — |
| code | status | retryable |
|---|
invitation_expired | 410 | — |
link_invalid | 404 | — |
no_active_grant | 404 | — |
not_found | 404 | — |
permanently_deleted | 410 | — |
unknown_plan | 404 | — |
| code | status | retryable |
|---|
already_accessed | 409 | — |
already_active | 409 | — |
already_deleted | 409 | — |
already_exists | 409 | — |
already_inactive | 409 | — |
already_member | 409 | — |
already_promoted | 409 | — |
already_revoked | 409 | — |
already_settled | 409 | — |
already_suspended | 409 | — |
already_terminal | 409 | — |
app_unavailable | 409 | — |
cannot_reactivate | 409 | — |
conflict | 409 | — |
domain_taken | 409 | — |
exceeds_max | 409 | — |
grant_already_terminal | 409 | — |
grant_conflict | 409 | — |
invalid_state_transition | 409 | — |
invalid_target | 409 | — |
last_admin | 409 | — |
no_available_seat | 409 | — |
not_deleted | 409 | — |
not_deployed | 409 | — |
not_suspended | 409 | — |
pending_exists | 409 | — |
plan_version_exists | 409 | — |
preset_in_use | 409 | — |
schema_name_taken | 409 | — |
seat_in_use | 409 | — |
seats_not_supported | 409 | — |
slug_taken | 409 | — |
staging_already_enabled | 409 | — |
static_release_in_use | 409 | — |
unsupported_for_static_app | 409 | — |
visibility_widen_not_allowed | 409 | — |
| code | status | retryable |
|---|
app_archived | 412 | — |
confirm_required | 412 | — |
domain_blocked | 422 | — |
git_connection_required | 412 | — |
not_promotable | 412 | — |
pending_review_exists | 412 | — |
precondition_failed | 412 | — |
prod_deploy_required | 412 | — |
promote_in_progress | 412 | ✅ |
staging_mismatch | 412 | — |
staging_not_enabled | 412 | — |
staging_required | 412 | — |
static_release_not_ready | 412 | — |
subdomain_not_configured | 412 | — |
| code | status | retryable |
|---|
auth_expired | 503 | — |
github_device_flow_disabled | 503 | — |
temporarily_unavailable | 429 | ✅ |
| code | status | retryable |
|---|
internal_error | 500 | — |