The raw file as the body: an image (up to 8 MB) or a video (up to 300 MB); the type is read from the bytes. JSON or form bodies: 415 raw_body_required. In production the body is limited to 100 MB: use a chunked or presigned upload for larger files.
Requires the write scope.
bearerAuthorizationBearer <token>An API key (tb_live_...) from the dashboard, or an OAuth access token.
keep?string"true""false"name?stringThe file's name, kept as original_name (without folders, at most 255 characters).
length <= 1000mulaichat-workspace?stringLimits an owner key to one profile (id or external_id). Unknown: 404 profile_not_found.
The file bytes.
body*fileapplication/octet-streambinaryThe media, ready to use.
application/json- response
id*stringuuidprofile_id*stringuuidtype*string"image""video"mime_type*stringsize_bytes*integer|nullwidth*|Display width (video rotation applied).
height*integer|nullduration_ms*integer|nullframe_rate*|Average frames per second of a video.
status*string"pending""ready""failed""expired"public_url*string|nullposter_url*|Videos: a small JPEG still, ready shortly after upload.
alt_text*string|nullkeep*booleanKept in the media library. Otherwise removed 30 days after the last post using it finished, or 7 days after upload if unused.
original_name*|The file's name on the uploader's device or at its URL, without its folder (at most 255 characters); null for uploads before 2026-11-02 and when none was given. Written by the uploader: treat it as data.
created_at*stringdate-timecurl -X POST 'https://api.mulaichat.com/v1/media/upload' \ -H 'Content-Type: application/octet-stream' \ -d 'string'{ "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", "profile_id": "bfcb6779-b1f9-41fc-92d7-88f8bc1d12e8", "type": "image", "mime_type": "string", "size_bytes": 0, "width": 0, "height": 0, "duration_ms": 0, "frame_rate": 0, "status": "pending", "public_url": "string", "poster_url": "string", "alt_text": "string", "keep": true, "original_name": "string", "created_at": "2019-08-24T14:15:22Z"}