Skip to content

Error Codes

All API errors return a JSON response with a detail field:

json
{
  "detail": "Human-readable error message"
}

Production Mode

When DEBUG=false, internal error messages are masked with: "An internal rendering error occurred." to prevent information leakage.

HTTP Status Codes

Client Errors (4xx)

StatusCodeWhen
400Bad RequestInvalid file extension, empty file, malformed request
401UnauthorizedMissing or invalid webhook X-Signature header
403ForbiddenInvalid artifact prefix (path traversal attempt)
404Not FoundJob or artifact doesn't exist
413Payload Too LargeReplay > 50 MB or skin > 200 MB
415Unsupported Media TypeInvalid replay structure (osrparse failure) or non-ZIP skin
422Unprocessable EntityPydantic validation failure, invalid skin archive structure
429Too Many RequestsRate limit exceeded or per-IP job limit reached

Server Errors (5xx)

StatusCodeWhen
500Internal Server ErrorUnhandled exception, storage upload failure, or webhook misconfiguration
503Service UnavailableRender queue at capacity or infrastructure overloaded

Error Categories

Validation Errors

json
// File extension
{ "detail": "File must be an osu! replay (.osr) file." }

// Empty file
{ "detail": "Uploaded replay file is empty." }

// File too large
{ "detail": "Replay file exceeds maximum size of 50MB." }

// Invalid replay
{ "detail": "Invalid replay file. The structure is corrupted or unsupported." }

// Invalid skin name
{ "detail": "Invalid skin name. Only alphanumeric characters, underscores, hyphens, and spaces are allowed." }

// Invalid resolution
{ "detail": "Resolution must be one of: {'1080p', '4k'}" }

Rate Limiting Errors

json
// SlowApi rate limit
{ "detail": "Rate limit exceeded: 5 per 1 minute" }

// Per-IP concurrency
{ "detail": "You already have 2 active render jobs. Please wait for them to finish before queueing more." }

Capacity Errors

json
// Queue full
{ "detail": "The render queue is currently full. Please try again later." }

// Rendering at capacity
{ "detail": "The render infrastructure is at maximum capacity. Please try again later." }

Built with VitePress