curl --request POST \
--url https://www.trybloom.ai/api/v1/brands \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "<string>",
"workspaceId": "<string>",
"logoUrl": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/brands"
payload = {
"url": "<string>",
"workspaceId": "<string>",
"logoUrl": "<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({url: '<string>', workspaceId: '<string>', logoUrl: '<string>'})
};
fetch('https://www.trybloom.ai/api/v1/brands', 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/brands",
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([
'url' => '<string>',
'workspaceId' => '<string>',
'logoUrl' => '<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/brands"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<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/brands")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/brands")
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 \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "analyzing"
}
}{
"error": {
"code": "INVALID_URL",
"status": 400,
"message": "Invalid URL",
"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 start brand creation",
"data": "<unknown>"
}
}{
"error": {
"code": "SCRAPE_FAILED",
"status": 503,
"message": "Couldn't reach that URL. Please try again.",
"data": "<unknown>"
}
}Create a brand
Queue brand creation from either the single website/Instagram url input retained for existing integrations or an ordered sources array containing a website, Instagram account, and files. Both inputs build a Brand Skill unless logoUrl is supplied with url; that explicit-logo compatibility option uses the older Visual DNA onboarding workflow. Bloom determines the brand name from the supplied evidence. Returns 202 with the stable Brand ID and status: analyzing; call GET /brands/{id}?wait=true with that ID and generate only when status is ready. Temporary file URLs must use HTTPS; Bloom copies their bytes into private storage before processing. Defaults to the caller’s personal workspace; pass workspaceId to create in a team workspace.
curl --request POST \
--url https://www.trybloom.ai/api/v1/brands \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"url": "<string>",
"workspaceId": "<string>",
"logoUrl": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/brands"
payload = {
"url": "<string>",
"workspaceId": "<string>",
"logoUrl": "<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({url: '<string>', workspaceId: '<string>', logoUrl: '<string>'})
};
fetch('https://www.trybloom.ai/api/v1/brands', 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/brands",
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([
'url' => '<string>',
'workspaceId' => '<string>',
'logoUrl' => '<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/brands"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<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/brands")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/brands")
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 \"url\": \"<string>\",\n \"workspaceId\": \"<string>\",\n \"logoUrl\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "analyzing"
}
}{
"error": {
"code": "INVALID_URL",
"status": 400,
"message": "Invalid URL",
"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 start brand creation",
"data": "<unknown>"
}
}{
"error": {
"code": "SCRAPE_FAILED",
"status": 503,
"message": "Couldn't reach that URL. Please try again.",
"data": "<unknown>"
}
}Authorizations
Bloom API key, for example x-api-key: bloom_sk_....
Body
- Website or Instagram URL
- One or more sources
Website or Instagram profile URL to analyze (e.g. https://acme.com or https://instagram.com/acme)
Team workspace ID. The brand is created in that workspace and billed to its customer. Omit to create in the caller's personal workspace.
1Explicit-logo compatibility option. If provided with url, uses the older Visual DNA onboarding workflow and skips automatic logo extraction.
Response
OK
Show child attributes
Show child attributes
Was this page helpful?