Skip to content

Storage API

MethodPathPurpose
POST/storage/{app_id}/uploadRequest a presigned upload URL
GET/storage/{app_id}/objectsList all files for the app
GET/storage/{app_id}/download/{object_id}Request a presigned download URL
DELETE/storage/{app_id}/{object_id}Delete a file
POST /storage/{app_id}/upload
Authorization: Bearer {token}
{
"filename": "profile.jpg",
"contentType": "image/jpeg",
"sizeBytes": 102400
}

Response:

{
"uploadUrl": "https://storage.example.com/...",
"objectKey": "app_id/user_id/uuid_profile.jpg",
"objectId": "uuid",
"expiresIn": 300
}

Then upload the file:

await fetch(uploadUrl, {
method: 'PUT',
headers: { 'Content-Type': 'image/jpeg' },
body: fileBlob
});
GET /storage/{app_id}/download/{object_id}
Authorization: Bearer {token}

Response:

{
"downloadUrl": "https://storage.example.com/...",
"filename": "profile.jpg",
"expiresIn": 3600
}
GET /storage/{app_id}/objects
Authorization: Bearer {token}

Returns array of { id, filename, content_type, size_bytes, created_at }.

URL typeExpiration
Upload5 minutes
Download1 hour
LimitDefault
Max file size10 MB
Total storage1 GB per app
Content typesAll (configurable)
AuthAccess
Service keyAll files, no user association
End-user JWTOwn files only, auto-associated