API documentation
View as Markdown

Errors

The Demarky API uses a consistent error envelope across all endpoints.

Error envelope

{
  "error": "error_code",
  "message": "Human-readable description",
  "request_id": "cce50960-a535-4472-a7a7-5b4f9719aa42",
  "details": {}
}
FieldTypeDescription
errorstringMachine-readable error code
messagestringHuman-readable description
request_idstring (uuid)Correlation ID for debugging (always present on error responses)
detailsobjectAdditional context (varies by error type)

Error codes

StatusCodeDescription
400bad_requestMalformed request syntax
401invalid_tokenMissing, invalid, expired, or revoked access token
403insufficient_scopeMissing required scope
403account_suspendedAccount access is suspended
403quota_exceededAccount quota limit reached
404not_foundResource not found
409conflictResource state conflict or idempotency conflict
413payload_too_largeRequest body exceeds 1 MB limit
422validation_errorRequest body or query validation failed
429rate_limit_exceededRate limit exceeded
500internal_errorUnexpected server error
501not_implementedFeature not yet implemented

Validation errors

Validation errors include a details.issues array with per-field information:

{
  "error": "validation_error",
  "message": "Request body validation failed",
  "request_id": "cce50960-a535-4472-a7a7-5b4f9719aa42",
  "details": {
    "issues": [
      {
        "path": "product.price",
        "message": "Number must be greater than 0",
        "code": "too_small"
      }
    ]
  }
}

Rate limit errors

Rate limit errors include a retry_after_seconds value and a Retry-After header:

{
  "error": "rate_limit_exceeded",
  "message": "Too many requests",
  "request_id": "cce50960-a535-4472-a7a7-5b4f9719aa42",
  "details": {
    "retry_after_seconds": 43
  }
}