Skip to content

Error response format

Reference · Updated Apr 2026

Coming from another cloud?

▸AWS·Error Responses

This Quake AI feature maps to AWS’s Error Responses.

▸DigitalOcean·API Errors

This Quake AI feature maps to DigitalOcean’s API Errors.

Error response format

Quake AI APIs return structured error details in every non-2xx response. The exact format depends on the service: OpenStack APIs return JSON, the S3-compatible interface returns XML, and compute instances expose fault objects for ERROR-state diagnostics. This page documents each format so you can parse errors programmatically and collect the right evidence for support.

OpenStack JSON error format#

All OpenStack APIs (Compute, Network, Block Storage) return errors as JSON objects. The outer key is a camelCase name derived from the HTTP status reason phrase, wrapping code and message fields.

Standard format#

JSON
{
  "badRequest": {
    "code": 400,
    "message": "Invalid input for field/attribute name. Value: 123. 'name' must be a string."
  }
}

Common outer keys by status code#

HTTP statusOuter keyExample situation
400badRequestMalformed request body, invalid parameter type
401unauthorizedExpired or missing token
403forbiddenRole not authorized, quota exceeded
404itemNotFoundResource ID does not exist
409conflictingRequestResource in wrong state for the action
413overLimitResource quota exhausted
500computeFault / internalServerErrorPlatform-side error
503serviceUnavailableService temporarily overloaded

Service-specific variations#

Network (Neutron) uses a flat structure with a NeutronError type field:

JSON
{
  "NeutronError": {
    "type": "IpAddressGenerationFailure",
    "message": "No more IP addresses available on network ...",
    "detail": ""
  }
}

Block Storage (Cinder) follows the standard format but may include retryAfter on 413 responses:

JSON
{
  "overLimit": {
    "code": 413,
    "message": "VolumeLimitExceeded: Maximum number of volumes allowed (500) exceeded.",
    "retryAfter": 0
  }
}

Compute fault object#

When a compute instance enters the ERROR state, the server response includes a fault object that persists until the instance is rebuilt or deleted. This is separate from the HTTP error response; it is part of the instance's data.

Retrieving the fault#

bash
openstack server show YOUR_INSTANCE_ID -c fault -f json

Or via the API:

bash
curl -s -H "X-Auth-Token: $OS_TOKEN" \
  "$OS_COMPUTE_URL/v2.1/servers/YOUR_INSTANCE_ID" \
  | python3 -c "import sys,json; print(json.dumps(json.load(sys.stdin)['server'].get('fault',{}), indent=2))"

Fault object structure#

JSON
{
  "fault": {
    "message": "No valid host was found.",
    "code": 500,
    "created": "2026-04-01T12:00:00Z"
  }
}
FieldTypeMeaning
messagestringHuman-readable failure description. Use this to search docs and support resources.
codeintegerHTTP status code associated with the failure (typically 500 for scheduling failures).
createdstringISO 8601 timestamp of when the fault occurred. Include in support tickets.

The fault message field is the single most useful diagnostic artifact for ERROR-state instances. See the Compute API error reference for a table of common fault messages and resolutions.

S3 XML error format#

The S3-compatible Object Storage interface (Swift with S3 middleware) returns errors as XML, following the AWS S3 error convention.

Standard format#

xml
<Error>
  <Code>InvalidAccessKeyId</Code>
  <Message>The access key does not exist</Message>
  <RequestId>tx00000abc123def456-00661234-default</RequestId>
  <Resource>/my-bucket/my-key</Resource>
</Error>

Key fields#

FieldMeaning
CodeMachine-readable error identifier. Match against the Object storage error reference.
MessageHuman-readable description.
RequestIdUnique transaction ID for this request. Include in support tickets.
ResourceThe bucket/object path that triggered the error.

Common S3 error codes#

CodeHTTP statusMeaning
AccessDenied403Credentials valid but not authorized for this operation
InvalidAccessKeyId403EC2 access key not recognized
SignatureDoesNotMatch403Secret key mismatch or signing algorithm error
NoSuchBucket404Bucket does not exist
NoSuchKey404Object key does not exist in the bucket
BucketAlreadyExists409Bucket name already taken in your project (Quake AI bucket names are project-scoped)
RequestTimeTooSkewed403Client clock drift exceeds tolerance (check NTP sync)

Request correlation fields#

When an API error is not self-resolvable, collect these correlation fields before filing a support ticket. They allow support to trace your exact request through platform logs.

OpenStack APIs#

FieldWhere to find it
X-Openstack-Request-IdResponse header on every API call
X-Compute-Request-IdResponse header on Compute API calls (redundant with the above for Nova)
HTTP status code and response bodyThe full error JSON
TimestampUTC time of the request (check your client or proxy logs)
Token project IDopenstack token issue -c project_id -f value

S3 interface#

FieldWhere to find it
RequestIdIn the XML error response body
x-amz-request-idResponse header
x-trans-idResponse header (Swift transaction ID, more specific than x-amz-request-id)
Access key (not secret)Your EC2 credentials: openstack ec2 credentials list -c Access

Parsing errors in common tools#

curl + jq#

Read the error message from any OpenStack JSON error:

bash
curl -s -w "\n%{http_code}" -H "X-Auth-Token: $OS_TOKEN" \
  "$OS_COMPUTE_URL/v2.1/servers/INVALID_ID" \
  | jq -r 'to_entries[0].value.message // "Unknown error"'

Python#

Parse the error from an openstacksdk or requests response:

Python
import json

def parse_openstack_error(response):
    try:
        body = response.json()
        error_key = next(iter(body))
        return {
            "status": response.status_code,
            "message": body[error_key].get("message", "No message"),
            "request_id": response.headers.get("X-Openstack-Request-Id", ""),
        }
    except (json.JSONDecodeError, StopIteration):
        return {
            "status": response.status_code,
            "message": response.text[:200],
            "request_id": response.headers.get("X-Openstack-Request-Id", ""),
        }

S3 XML parsing (Python)#

Python
import xml.etree.ElementTree as ET

def parse_s3_error(response):
    root = ET.fromstring(response.text)
    return {
        "code": root.findtext("Code", ""),
        "message": root.findtext("Message", ""),
        "request_id": root.findtext("RequestId", ""),
        "resource": root.findtext("Resource", ""),
    }

See also#

Was this page helpful?