REST API - Storage#
S3-compatible object storage.
Buckets#
| Endpoint | Method | Description |
|---|---|---|
/projects/{id}/storage/buckets | GET | List buckets |
/projects/{id}/storage/buckets | POST | Create a bucket |
/projects/{id}/storage/buckets/{bucketID} | GET | Get one bucket |
/projects/{id}/storage/buckets/{bucketID} | DELETE | Delete a bucket |
Create:
{
"name": "Avatars",
"slug": "avatars",
"is_public": true,
"file_size_limit": 5000000,
"allowed_mime_types": ["image/png", "image/jpeg"]
}
JSONObjects#
| Endpoint | Method | Description |
|---|---|---|
/projects/{id}/storage/buckets/{bucketID}/objects | GET | List objects |
/projects/{id}/storage/buckets/{bucketID}/folders | POST | Create a folder |
/projects/{id}/storage/objects/{objectID} | DELETE | Delete an object |
Signed URLs#
| Endpoint | Method | Description |
|---|---|---|
/projects/{id}/storage/signed-upload-url | POST | Presigned PUT URL (5 min) |
/projects/{id}/storage/signed-download-url | POST | Presigned GET URL (1 hour) |
/projects/{id}/storage/public/{bucketID}/{objectID} | GET | Public download (no auth) |
Signed upload:
{
"bucket_id": "uuid",
"object_name": "user-1.png",
"content_length": 20480
}
JSON{
"url": "http://localhost:8333/afb-5c73dab0/avatars/user-1.png?X-Amz-..."
}
JSONThen PUT the file bytes to the returned URL.
Security#
- Storage accepts the project API key (or a project-user session)
- Scoped keys:
storage:read,storage:write - API keys are authorized only to their own project