API ReferenceMedia
Upload a file
Upload a file using multipart/form-data. The file part must declare a
Content-Type header - the server validates it against the actual file bytes
via magic-byte sniffing. Mismatches are rejected.
Size limits by content type:
| Type | Limit |
|---|---|
| Images | 50 MB |
| Video | 500 MB |
| Audio | 100 MB |
| Documents | 50 MB |
Requires media:write scope.
Authorization
bearerAuth media:writeAuthorizationBearer <token>
API token from your dashboard.
Format: so_live_... (production) or so_test_... (test mode).
Tokens carry one or more scopes. Request only the scopes your integration needs:
| Scope | Grants |
|---|---|
media:read | List and retrieve files |
media:write | Upload and delete files |
logs:read | Read log entries |
logs:write | Ingest log entries |
cases:read | Read cases |
cases:write | Create and update cases |
apps:read | Read apps |
apps:write | Submit apps |
usage:read | Read quota usage |
members:read | List organisation members |
members:write | Invite and remove members |
billing:read | Read billing and subscription info |
tokens:write | Create and revoke API tokens |
In: header
Scope: media:write
Request Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/media" \ -F file="string"{
"id": "f_01HZXXXXXXXXXXXXXXXXXXXXX",
"url": "https://media.serverops.gg/p_01HZ.../screenshot.png",
"key": "string",
"size": 2097152,
"content_type": "image/png",
"sha256": "string",
"original_name": "screenshot.png",
"tags": [
"string"
],
"folder": "string",
"abuse_status": "clean",
"visibility": "public",
"storage_class": "standard",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}{
"error": {
"code": "bad_request",
"message": "missing required field"
}
}{
"error": {
"code": "unauthorized",
"message": "missing or invalid authorization token"
}
}{
"error": {
"code": "forbidden",
"message": "token does not have the required scope"
}
}{
"error": {
"code": "too_large",
"message": "file exceeds maximum allowed size"
}
}{
"error": {
"code": "quota_exceeded",
"message": "tier quota exceeded for storage_bytes",
"metric": "storage_bytes",
"quotas": [
{
"metric": "storage_bytes",
"used": 10737418240,
"limit": 10737418240,
"cumulative": true
}
]
}
}{
"error": {
"code": "internal",
"message": "an unexpected error occurred"
}
}{
"error": {
"code": "storage_error",
"message": "failed to write to storage"
}
}