Sign a direct upload
Signs an upload of one image, video, PDF or presentation to a path in the member’s own storage namespace and records its receipt. The signature expires after 15 minutes. Declared sizes over the type’s limit (images 10 MB, videos 100 MB, documents 25 MB) are refused. Responses are never stored.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/media/uploads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content_type": "video/mp4",
"filename": "morning-routine.mp4",
"byte_size": 48213000
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/media/uploads"
payload = {
"content_type": "video/mp4",
"filename": "morning-routine.mp4",
"byte_size": 48213000
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content_type: 'video/mp4',
filename: 'morning-routine.mp4',
byte_size: 48213000
})
};
fetch('https://api.fluid.app/api/member/v2026-10/media/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/member/v2026-10/media/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'content_type' => 'video/mp4',
'filename' => 'morning-routine.mp4',
'byte_size' => 48213000
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/member/v2026-10/media/uploads"
payload := strings.NewReader("{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/member/v2026-10/media/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/media/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"url": "https://upload.imagekit.io/api/v2/files/upload",
"fields": {
"token": "eyJhbGciOiJIUzI1NiJ9.eyJmb2xkZXIiOiJjb21wYW5pZXMvLi4uIn0.signature",
"fileName": "Xk3p9QaB_morning-routine.mp4",
"folder": "companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos",
"useUniqueFileName": "false",
"overwriteFile": "false"
},
"expires_at": "2026-09-30T18:39:05Z"
},
"meta": {
"request_uuid": "0199a3f2-7a10-7c3e-8f21-4d5e6f708192",
"timestamp": "2026-09-30T18:24:05Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
A member credential in the Authorization: Bearer header: a member
session JWT, a portal JWT whose login is linked to a membership in
that company, or an opaque member token. The credential alone
identifies the member and company.
Body
The file about to be uploaded.
MIME type of the file, containing at least one non-whitespace character and no NUL.
1 - 255^[^\u0000]*[^\u0000\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000][^\u0000]*$Original file name, containing at least one non-whitespace character and no NUL; it is sanitized and prefixed to keep paths unique.
1 - 255^[^\u0000]*[^\u0000\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000][^\u0000]*$Size in bytes. When given, the stored file must match it exactly.
x >= 1Response
The signed upload.
One signed upload.
HTTP response status.
A signed direct upload. POST the file as multipart form data to url, sending every entry of fields unchanged plus the file as file, before expires_at. Then create the medium with upload_id.
Show child attributes
Show child attributes
Envelope metadata present on every response.
Show child attributes
Show child attributes
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/media/uploads \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"content_type": "video/mp4",
"filename": "morning-routine.mp4",
"byte_size": 48213000
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/media/uploads"
payload = {
"content_type": "video/mp4",
"filename": "morning-routine.mp4",
"byte_size": 48213000
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
content_type: 'video/mp4',
filename: 'morning-routine.mp4',
byte_size: 48213000
})
};
fetch('https://api.fluid.app/api/member/v2026-10/media/uploads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/member/v2026-10/media/uploads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'content_type' => 'video/mp4',
'filename' => 'morning-routine.mp4',
'byte_size' => 48213000
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/member/v2026-10/media/uploads"
payload := strings.NewReader("{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/member/v2026-10/media/uploads")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/media/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"content_type\": \"video/mp4\",\n \"filename\": \"morning-routine.mp4\",\n \"byte_size\": 48213000\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"url": "https://upload.imagekit.io/api/v2/files/upload",
"fields": {
"token": "eyJhbGciOiJIUzI1NiJ9.eyJmb2xkZXIiOiJjb21wYW5pZXMvLi4uIn0.signature",
"fileName": "Xk3p9QaB_morning-routine.mp4",
"folder": "companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos",
"useUniqueFileName": "false",
"overwriteFile": "false"
},
"expires_at": "2026-09-30T18:39:05Z"
},
"meta": {
"request_uuid": "0199a3f2-7a10-7c3e-8f21-4d5e6f708192",
"timestamp": "2026-09-30T18:24:05Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}