curl --request POST \
--url https://www.trybloom.ai/api/v1/reviews \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"brandSessionId": "e6220a5e-4a68-4d39-8bb9-5105e9a3a164",
"assets": [
{
"kind": "file",
"url": "https://assets.example.com/campaign.png"
}
],
"checks": [
"color"
]
}
'import requests
url = "https://www.trybloom.ai/api/v1/reviews"
payload = {
"brandSessionId": "e6220a5e-4a68-4d39-8bb9-5105e9a3a164",
"assets": [
{
"kind": "file",
"url": "https://assets.example.com/campaign.png"
}
],
"checks": ["color"]
}
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({
brandSessionId: 'e6220a5e-4a68-4d39-8bb9-5105e9a3a164',
assets: [{kind: 'file', url: 'https://assets.example.com/campaign.png'}],
checks: ['color']
})
};
fetch('https://www.trybloom.ai/api/v1/reviews', 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/reviews",
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([
'brandSessionId' => 'e6220a5e-4a68-4d39-8bb9-5105e9a3a164',
'assets' => [
[
'kind' => 'file',
'url' => 'https://assets.example.com/campaign.png'
]
],
'checks' => [
'color'
]
]),
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/reviews"
payload := strings.NewReader("{\n \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\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/reviews")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/reviews")
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 \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending"
}
}{
"error": {
"code": "INVALID_INPUT",
"status": 400,
"message": "Invalid review input",
"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": "BRAND_NOT_FOUND",
"status": 404,
"message": "Brand not found.",
"data": "<unknown>"
}
}{
"error": {
"code": "BRAND_SKILL_UNAVAILABLE",
"status": 409,
"message": "This brand is not ready for reviews yet",
"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 review",
"data": "<unknown>"
}
}Request a review
Review one asset against a brand. Returns HTTP 202 with the review ID and status. Get the review by ID to retrieve its results.
curl --request POST \
--url https://www.trybloom.ai/api/v1/reviews \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"brandSessionId": "e6220a5e-4a68-4d39-8bb9-5105e9a3a164",
"assets": [
{
"kind": "file",
"url": "https://assets.example.com/campaign.png"
}
],
"checks": [
"color"
]
}
'import requests
url = "https://www.trybloom.ai/api/v1/reviews"
payload = {
"brandSessionId": "e6220a5e-4a68-4d39-8bb9-5105e9a3a164",
"assets": [
{
"kind": "file",
"url": "https://assets.example.com/campaign.png"
}
],
"checks": ["color"]
}
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({
brandSessionId: 'e6220a5e-4a68-4d39-8bb9-5105e9a3a164',
assets: [{kind: 'file', url: 'https://assets.example.com/campaign.png'}],
checks: ['color']
})
};
fetch('https://www.trybloom.ai/api/v1/reviews', 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/reviews",
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([
'brandSessionId' => 'e6220a5e-4a68-4d39-8bb9-5105e9a3a164',
'assets' => [
[
'kind' => 'file',
'url' => 'https://assets.example.com/campaign.png'
]
],
'checks' => [
'color'
]
]),
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/reviews"
payload := strings.NewReader("{\n \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\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/reviews")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.trybloom.ai/api/v1/reviews")
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 \"brandSessionId\": \"e6220a5e-4a68-4d39-8bb9-5105e9a3a164\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"https://assets.example.com/campaign.png\"\n }\n ],\n \"checks\": [\n \"color\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "pending"
}
}{
"error": {
"code": "INVALID_INPUT",
"status": 400,
"message": "Invalid review input",
"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": "BRAND_NOT_FOUND",
"status": 404,
"message": "Brand not found.",
"data": "<unknown>"
}
}{
"error": {
"code": "BRAND_SKILL_UNAVAILABLE",
"status": 409,
"message": "This brand is not ready for reviews yet",
"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 review",
"data": "<unknown>"
}
}Authorizations
Bloom API key, for example x-api-key: bloom_sk_....
Headers
Optional key for safely retrying this request. Reuse it only with the same body.
1 - 255Body
Brand to review against.
Exactly one image to review: a completed temporary upload (kind=file, uploadId), a public HTTPS image URL (kind=file, url), or a Bloom image ID (kind=image, imageId). Supported formats: PNG, JPEG, WebP, GIF, and SVG. Documents such as PDFs are not supported.
1 elementAn image supplied by a completed temporary uploadId or a public HTTPS url. Provide exactly one, never both. Supported formats: PNG, JPEG, WebP, GIF, and SVG.
- Upload or public URL
- Bloom image ID
Show child attributes
Show child attributes
Choose which checks to run: color, typography, logo, or copy, without duplicates. Completed outcomes are returned under results.
1color, typography, logo, copy Optional reviewer guidance and up to 10 supporting images. If you include context, provide nonblank notes, at least one image, or both. Empty context objects, blank notes, and the old description key are rejected.
Show child attributes
Show child attributes
Response
OK
Show child attributes
Show child attributes
Was this page helpful?