Upload files
curl --request POST \
--url https://www.trybloom.ai/api/v1/uploads \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"files": [
{
"filename": "<string>",
"byteLength": -4503599574941696
}
],
"workspaceId": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/uploads"
payload = {
"files": [
{
"filename": "<string>",
"byteLength": -4503599574941696
}
],
"workspaceId": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [{filename: '<string>', byteLength: -4503599574941696}],
workspaceId: '<string>'
})
};
fetch('https://www.trybloom.ai/api/v1/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://www.trybloom.ai/api/v1/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([
'files' => [
[
'filename' => '<string>',
'byteLength' => -4503599574941696
]
],
'workspaceId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://www.trybloom.ai/api/v1/uploads"
payload := strings.NewReader("{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://www.trybloom.ai/api/v1/uploads")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"uploads": [
{
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>",
"byteLength": 0,
"uploadUrl": "<string>",
"method": "PUT",
"headers": {
"content-type": "application/octet-stream",
"cache-control": "max-age=3600",
"x-upsert": "false"
},
"expiresAt": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": {
"code": "INVALID_UPLOAD",
"status": 400,
"message": "Invalid upload request",
"data": "<unknown>"
}
}{
"error": {
"code": "UNAUTHORIZED",
"status": 401,
"message": "Invalid or missing API credentials",
"data": "<unknown>"
}
}{
"error": {
"code": "ACCOUNT_BANNED",
"status": 403,
"message": "This account has been suspended.",
"data": "<unknown>"
}
}{
"error": {
"code": "WORKSPACE_NOT_FOUND",
"status": 404,
"message": "Workspace not found or not accessible",
"data": "<unknown>"
}
}{
"error": {
"code": "TOO_MANY_REQUESTS",
"status": 429,
"message": "Rate limit exceeded",
"data": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"status": 500,
"message": "Failed to create uploads",
"data": "<unknown>"
}
}Uploads
Upload files
Reserve private, temporary storage for local files in your workspace and receive upload instructions. PUT each raw file using the returned upload URL, method, and required headers to stage its bytes, then pass its uploadId to a supported operation before it expires.
For new Brand source evidence, pass the ID to POST /brands. To add an image to a Brand Library, pass it to POST /images/uploads.
Staging alone creates no Brand source, Library image, font asset, or logo. See Upload local files for the full workflow and additional MCP destinations.
POST
/
uploads
Upload files
curl --request POST \
--url https://www.trybloom.ai/api/v1/uploads \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"files": [
{
"filename": "<string>",
"byteLength": -4503599574941696
}
],
"workspaceId": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/uploads"
payload = {
"files": [
{
"filename": "<string>",
"byteLength": -4503599574941696
}
],
"workspaceId": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
files: [{filename: '<string>', byteLength: -4503599574941696}],
workspaceId: '<string>'
})
};
fetch('https://www.trybloom.ai/api/v1/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://www.trybloom.ai/api/v1/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([
'files' => [
[
'filename' => '<string>',
'byteLength' => -4503599574941696
]
],
'workspaceId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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://www.trybloom.ai/api/v1/uploads"
payload := strings.NewReader("{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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://www.trybloom.ai/api/v1/uploads")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"files\": [\n {\n \"filename\": \"<string>\",\n \"byteLength\": -4503599574941696\n }\n ],\n \"workspaceId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"uploads": [
{
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>",
"byteLength": 0,
"uploadUrl": "<string>",
"method": "PUT",
"headers": {
"content-type": "application/octet-stream",
"cache-control": "max-age=3600",
"x-upsert": "false"
},
"expiresAt": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": {
"code": "INVALID_UPLOAD",
"status": 400,
"message": "Invalid upload request",
"data": "<unknown>"
}
}{
"error": {
"code": "UNAUTHORIZED",
"status": 401,
"message": "Invalid or missing API credentials",
"data": "<unknown>"
}
}{
"error": {
"code": "ACCOUNT_BANNED",
"status": 403,
"message": "This account has been suspended.",
"data": "<unknown>"
}
}{
"error": {
"code": "WORKSPACE_NOT_FOUND",
"status": 404,
"message": "Workspace not found or not accessible",
"data": "<unknown>"
}
}{
"error": {
"code": "TOO_MANY_REQUESTS",
"status": 429,
"message": "Rate limit exceeded",
"data": "<unknown>"
}
}{
"error": {
"code": "INTERNAL_ERROR",
"status": 500,
"message": "Failed to create uploads",
"data": "<unknown>"
}
}Authorizations
apiKeybearer
Bloom API key, for example x-api-key: bloom_sk_....
Body
application/json
Response
OK
Show child attributes
Show child attributes
Was this page helpful?