Create a medium from an upload
Verifies the object stored for the upload (at exactly its signed path, of the signed kind, and within the size limits) and creates the member’s medium, consuming the upload. The kind is the category and media kind of the signed type: an image signed as image/png accepts a stored image/jpeg, while a video or a document in its place is refused. An upload is used once: a repeat returns 409, and error.details.media_id names the medium the first use created while that medium still exists (after it is deleted the details carry upload_id alone). Unknown, another member’s, expired and unverifiable uploads return 422 and stay unconsumed. Tags must be existing company medium tags.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/media \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": [
"wellness"
]
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/media"
payload = {
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": ["wellness"]
}
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({
upload_id: '0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f',
title: 'Morning routine',
description: 'How I start my day with the wellness kit.',
tags: ['wellness']
})
};
fetch('https://api.fluid.app/api/member/v2026-10/media', 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",
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([
'upload_id' => '0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f',
'title' => 'Morning routine',
'description' => 'How I start my day with the wellness kit.',
'tags' => [
'wellness'
]
]),
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"
payload := strings.NewReader("{\n \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/media")
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 \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"id": "0199a3f2-5c1e-7d4b-9a10-3b2c1d4e5f60",
"kind": "video",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": [
"wellness"
],
"url": "https://ik.imagekit.io/fluid/companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos/Xk3p9QaB_morning-routine.mp4",
"thumbnail_url": "https://ik.imagekit.io/fluid/companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos/Xk3p9QaB_morning-routine.mp4/ik-thumbnail.jpg",
"duration": null,
"size_bytes": 48213000,
"status": "processing",
"share_url": "https://primex.fluid.app/riley-kim/media/morning-routine",
"created_at": "2026-09-29T15:02:11.482913Z",
"updated_at": "2026-09-29T15:02:11.482913Z"
},
"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"
}
}{
"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 upload to consume and the medium's details.
The upload_id from POST /media/uploads.
Title containing at least one non-whitespace character.
1 - 255^[^\u0000]*[^\u0000\u0009-\u000D\u0020\u0085\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000][^\u0000]*$Plain-text description.
5000^[^\u0000]*$Names of existing company medium tags.
255^[^\u0000]*$curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/media \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": [
"wellness"
]
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/media"
payload = {
"upload_id": "0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": ["wellness"]
}
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({
upload_id: '0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f',
title: 'Morning routine',
description: 'How I start my day with the wellness kit.',
tags: ['wellness']
})
};
fetch('https://api.fluid.app/api/member/v2026-10/media', 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",
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([
'upload_id' => '0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f',
'title' => 'Morning routine',
'description' => 'How I start my day with the wellness kit.',
'tags' => [
'wellness'
]
]),
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"
payload := strings.NewReader("{\n \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/media")
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 \"upload_id\": \"0199a3f2-5b0d-7c3a-8f09-2a1b0c9d8e7f\",\n \"title\": \"Morning routine\",\n \"description\": \"How I start my day with the wellness kit.\",\n \"tags\": [\n \"wellness\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"id": "0199a3f2-5c1e-7d4b-9a10-3b2c1d4e5f60",
"kind": "video",
"title": "Morning routine",
"description": "How I start my day with the wellness kit.",
"tags": [
"wellness"
],
"url": "https://ik.imagekit.io/fluid/companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos/Xk3p9QaB_morning-routine.mp4",
"thumbnail_url": "https://ik.imagekit.io/fluid/companies/0199a1b2-0000-7000-8000-000000000001/members/0199a1b2-0000-7000-8000-000000000002/uploads/videos/Xk3p9QaB_morning-routine.mp4/ik-thumbnail.jpg",
"duration": null,
"size_bytes": 48213000,
"status": "processing",
"share_url": "https://primex.fluid.app/riley-kim/media/morning-routine",
"created_at": "2026-09-29T15:02:11.482913Z",
"updated_at": "2026-09-29T15:02:11.482913Z"
},
"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"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}