Uploads an image, processes it with Sharp, and stores the original plus all requested variants. Returns proxy URLs for all variants immediately.
This endpoint accepts multipart/form-data. Requires an authenticated user.
Rate limit : 20 requests per 5 minutes.
Body Parameters
The image file to upload. Must be a valid image format recognized by Sharp (JPEG, PNG, WebP, AVIF, TIFF, GIF, SVG). Maximum 50 MB.
Processing mode. One of: exact-dimensions, aspect-ratio-width-based, aspect-ratio-height-based, original-aspect, multi-aspect-ratio.
Required for exact-dimensions mode. An object mapping variant names to { width, height } pairs. { "thumbnail" : { "width" : 64 , "height" : 64 }, "card" : { "width" : 400 , "height" : 300 } }
Required for aspect-ratio-width-based and aspect-ratio-height-based modes. { width, height } ratio.
Required for aspect-ratio-width-based mode. An object mapping variant names to pixel widths.
Required for aspect-ratio-height-based mode. An object mapping variant names to pixel heights.
Required for original-aspect and multi-aspect-ratio modes. An object mapping variant names to longest-edge pixel sizes.
Required for multi-aspect-ratio mode. Array of { width, height } aspect ratio objects.
Sharp fit strategy. Defaults to cover. Valid values depend on the mode:
exact-dimensions, aspect-ratio-width-based, aspect-ratio-height-based, multi-aspect-ratio: cover, contain, inside, or outside
original-aspect: inside or outside only (cover/contain are not valid for this mode)
Output quality (1–100). Applies to JPEG and WebP. Defaults to 85.
Output format: webp, jpeg, png, or original. Defaults to webp.
Remove EXIF metadata from output. Defaults to true.
Storage path segments as a JSON-encoded array. Defaults to ["images", "<fileId>"].
Associates the file with an entity for cascade deletion.
Associates the file with a comment for cascade deletion.
Associates the file with a space.
Response
{
"fileId" : "uuid" ,
"type" : "image" ,
"originalPath" : "/internal/files/..." ,
"originalSize" : 204800 ,
"originalWidth" : 1920 ,
"originalHeight" : 1080 ,
"variants" : {
"thumbnail" : {
"publicPath" : "/internal/files/..." ,
"width" : 64 ,
"height" : 64 ,
"size" : 3200 ,
"format" : "webp"
}
},
"format" : "webp" ,
"quality" : 85 ,
"createdAt" : "2025-01-01T00:00:00.000Z"
}
Error Responses
No File — 400 Bad Request
{ "error" : "No file provided" , "code" : "storage/no-file" }
{ "error" : "File size exceeds the allowed limit of 50MB" , "code" : "storage/file-too-large" }
{ "error" : "Invalid image file" , "code" : "storage/invalid-image" }