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#
{
"badRequest": {
"code": 400,
"message": "Invalid input for field/attribute name. Value: 123. 'name' must be a string."
}
}Common outer keys by status code#
| HTTP status | Outer key | Example situation |
|---|---|---|
| 400 | badRequest | Malformed request body, invalid parameter type |
| 401 | unauthorized | Expired or missing token |
| 403 | forbidden | Role not authorized, quota exceeded |
| 404 | itemNotFound | Resource ID does not exist |
| 409 | conflictingRequest | Resource in wrong state for the action |
| 413 | overLimit | Resource quota exhausted |
| 500 | computeFault / internalServerError | Platform-side error |
| 503 | serviceUnavailable | Service temporarily overloaded |
Service-specific variations#
Network (Neutron) uses a flat structure with a NeutronError type field:
{
"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:
{
"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#
openstack server show YOUR_INSTANCE_ID -c fault -f jsonOr via the API:
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#
{
"fault": {
"message": "No valid host was found.",
"code": 500,
"created": "2026-04-01T12:00:00Z"
}
}| Field | Type | Meaning |
|---|---|---|
message | string | Human-readable failure description. Use this to search docs and support resources. |
code | integer | HTTP status code associated with the failure (typically 500 for scheduling failures). |
created | string | ISO 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#
<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#
| Field | Meaning |
|---|---|
Code | Machine-readable error identifier. Match against the Object storage error reference. |
Message | Human-readable description. |
RequestId | Unique transaction ID for this request. Include in support tickets. |
Resource | The bucket/object path that triggered the error. |
Common S3 error codes#
| Code | HTTP status | Meaning |
|---|---|---|
AccessDenied | 403 | Credentials valid but not authorized for this operation |
InvalidAccessKeyId | 403 | EC2 access key not recognized |
SignatureDoesNotMatch | 403 | Secret key mismatch or signing algorithm error |
NoSuchBucket | 404 | Bucket does not exist |
NoSuchKey | 404 | Object key does not exist in the bucket |
BucketAlreadyExists | 409 | Bucket name already taken in your project (Quake AI bucket names are project-scoped) |
RequestTimeTooSkewed | 403 | Client 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#
| Field | Where to find it |
|---|---|
X-Openstack-Request-Id | Response header on every API call |
X-Compute-Request-Id | Response header on Compute API calls (redundant with the above for Nova) |
| HTTP status code and response body | The full error JSON |
| Timestamp | UTC time of the request (check your client or proxy logs) |
| Token project ID | openstack token issue -c project_id -f value |
S3 interface#
| Field | Where to find it |
|---|---|
RequestId | In the XML error response body |
x-amz-request-id | Response header |
x-trans-id | Response 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:
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:
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)#
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#
- Compute API error reference: HTTP status codes, fault messages, and resolutions
- Network API error reference: port, router, and security group errors
- Block storage API error reference: volume state machine and delete conflicts
- Object storage API error reference: S3 authentication and upload errors
- Retry and resilience patterns: which errors to retry and how
- API rate limits: quotas vs. rate limits, 429 handling
- Support ticket evidence collection: complete evidence checklist