Skip to content
qibdo qibdo
Theme
Book a demo

Errors

Every qibdo Cloud service reports failures in the same canonical shape. This page covers that envelope, the status mapping, and how qibdo error codes are structured.

Errors use the standard google.rpc.Status shape: a numeric gRPC code, a message, and a details array carrying machine-readable ErrorInfo.

{
"code": 5,
"message": "[8300002] Bucket not found",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "BUCKET_NOT_FOUND",
"domain": "com.qibdo.cloud",
"metadata": {
"error_code": "8300002",
"service": "storage",
"status": "NOT_FOUND",
"message": "Bucket not found",
"timestamp": "2026-06-04T12:00:00Z"
}
}
]
}
  • message is prefixed with the qibdo error code in brackets, e.g. [8300002].
  • reason is a stable, machine-readable identifier you can branch on (BUCKET_NOT_FOUND).
  • metadata.service tells you which service raised it; metadata.error_code is the numeric qibdo code; metadata.status is the canonical status name.
  • Unexpected server faults return a generic INTERNAL error with no internal detail; stack traces, SQL, and class names are never exposed.

qibdo maps its domain errors to canonical gRPC status codes, which the gateway renders as the matching HTTP status:

ConditiongRPC statusHTTP
Missing or invalid credentialsUNAUTHENTICATED401
Not allowed to perform the actionPERMISSION_DENIED403
Resource does not existNOT_FOUND404
Resource already existsALREADY_EXISTS409
Conflicting concurrent changeABORTED409
Precondition not metFAILED_PRECONDITION400
Invalid argument (default)INVALID_ARGUMENT400
Quota or capacity exhaustedRESOURCE_EXHAUSTED429
Action not supportedUNIMPLEMENTED501
Upstream/dependency unavailableUNAVAILABLE503
Operation timed outDEADLINE_EXCEEDED504

Each error also carries a stable, globally-unique numeric code in metadata.error_code, for example 8300002. The wire value is a plain positive integer. Internally qibdo composes that integer from three parts (a service number of one or two digits, a three-digit group, and a three-digit error number) which engineers read as 8_300_002 (service, group, specific error) for legibility in Kotlin. The API always returns the flat integer, never the grouped form. Match on error_code, or on the stable reason; both are stable across releases.

The leading digits identify the service. Earlier services took a single digit; newer services take two, starting with Observability at 10:

ServiceService numberServiceService number
Vault2IAM6
Compute3Taxonomy7
Topology4Storage8
Network5Registry9
Observability10

For example 8300002 is a Storage error and 10300001 is an Observability error. Seven-digit codes that begin with 1 are cross-cutting platform codes that can surface from any service; do not confuse them with Observability’s eight-digit codes, which begin with 10.

A handful of codes come from the shared platform layer rather than a single service. They are seven digits and begin with 1. The 1301xxx validation group can appear on create, update, list, and filter calls for any resource. The 1400xxx engine-routing group appears on calls to engine-based services (paths that carry an engines/{engine} segment).

CodeReasonStatusDescription
1301001DATA_UNIT_NOT_EXISTSINVALID_ARGUMENTThe data unit referenced does not exist or is not supported.
1301002PROPERTY_UPDATE_ON_IMMUTABLE_FIELDFAILED_PRECONDITIONCannot update an immutable property.
1301003UPDATE_MASK_CONTAINS_IMMUTABLE_FIELDINVALID_ARGUMENTThe update mask contains one or more immutable fields.
1301004UPDATE_MASK_CONTAINS_UNKNOWN_FIELDINVALID_ARGUMENTThe update mask contains one or more unknown fields.
1400001UNKNOWN_ENGINEINVALID_ARGUMENTUnknown engine: not one of the service’s supported providers.
1400002WILDCARD_ENGINE_NOT_ALLOWEDINVALID_ARGUMENTA concrete engine is required for this operation; the - wildcard is not allowed.
1400003ENGINE_OPERATION_NOT_SUPPORTEDUNIMPLEMENTEDThe engine is not yet supported for this operation.

List and filter requests can also fail with shared validation codes (invalid page token, unsupported filter operator, invalid sort property, and similar), most of which map to INVALID_ARGUMENT (an expired page token is the exception, reported as FAILED_PRECONDITION). See Filtering for the filter and ordering grammar, and Standard responses for the success and pagination shapes.