Skip to content

Skins API ​

GET /v1/skins — List Available Skins ​

GET /v1/skins

Returns a list of all available osu! skins stored in object storage.

Example ​

bash
curl http://localhost:8727/v1/skins

Response (200 OK) ​

json
{
  "skins": [
    "Default",
    "WhiteCat 1.0",
    "Rafis HDDT",
    "mrekk skin v3"
  ]
}

POST /v1/skins/upload — Upload a Custom Skin ​

POST /v1/skins/upload

Upload a .osk skin file to make it available for rendering jobs.

Rate Limit: 2 requests per minute per IP

Request ​

Content-Type: multipart/form-data

FieldTypeRequiredDescription
skinFileThe .osk skin file (ZIP archive)

Example ​

bash
curl -X POST http://localhost:8727/v1/skins/upload \
  -F "skin=@WhiteCat 1.0.osk"

Response (200 OK) ​

json
{
  "success": true,
  "skin_name": "WhiteCat 1.0",
  "message": "Skin 'WhiteCat 1.0' uploaded successfully."
}

Validation Rules ​

The skin upload undergoes extensive security validation:

CheckLimitError
File extensionMust be .osk400
File size≤ MAX_SKIN_SIZE_MB (200 MB)413
Magic bytesMust start with PK (ZIP header)415
ZIP entry count≤ 10,000 entries422
Compression ratio≤ 100x (zip bomb protection)422
Nesting depth≤ 3 levels422
Nested archivesNo .zip or .osk inside422
Corruptiontestzip() must pass422
FilenameAlphanumeric, spaces, hyphens, underscores only422

Zip Bomb Protection

The system validates both compression ratio and total uncompressed size to prevent decompression bomb attacks that could exhaust disk or memory resources.

Built with VitePress