Skip to content

API Overview ​

The OsuRender API follows RESTful conventions with a versioned endpoint structure. All modern endpoints are prefixed with /v1/.

Base URL ​

http://localhost:8727

In production, the API is served behind Cloudflare at your configured API_BASE_URL.

Versioning ​

PrefixStatusDescription
/v1/ActiveCurrent stable API
/ (root)LegacyBackward-compatible endpoints for the monolithic application

Content Types ​

EndpointRequest TypeResponse Type
POST /v1/rendermultipart/form-dataapplication/json
POST /v1/skins/uploadmultipart/form-dataapplication/json
All other endpoints—application/json

Request IDs ​

Every request is assigned a correlation ID for tracing. You can provide your own:

X-Request-ID: my-custom-id

If omitted, the API generates an 8-character UUID. The ID is returned in the response header:

X-Request-ID: a1b2c3d4

Job creation responses include navigable links:

json
{
  "job_id": "550e8400-...",
  "status": "queued",
  "links": {
    "status": "/v1/jobs/550e8400-..."
  }
}

Interactive Documentation ​

Below is the live Swagger UI playground. You can use it to test endpoints directly from your browser.

You can also view the ReDoc format or download the OpenAPI Spec.

Authentication ​

Currently, the API does not require authentication tokens. Access control is managed through:

  • Rate limiting per IP (via CF-Connecting-IP or remote address)
  • Per-IP concurrency limits (max 2 active jobs)
  • Global queue circuit breakers (max 100 queued, max 20 rendering)

See Rate Limiting for details.

Endpoint Summary ​

MethodEndpointDescriptionRate Limit
GET/healthHealth check—
POST/v1/renderSubmit replay for rendering5/min
GET/v1/jobs/{job_id}Get job status—
GET/v1/jobsList all jobs (paginated)—
POST/v1/jobs/{job_id}/webhookModal completion callback—
GET/v1/skinsList available skins—
POST/v1/skins/uploadUpload a custom skin2/min
GET/v1/artifacts/{key}Download/stream artifacts—

Built with VitePress