curl --request POST \
--url https://www.trybloom.ai/api/v1/reviews \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"brandSessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assets": [
{
"kind": "file",
"url": "<string>",
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>"
}
],
"checks": [],
"references": [],
"context": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/reviews"
payload = {
"brandSessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assets": [
{
"kind": "file",
"url": "<string>",
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>"
}
],
"checks": [],
"references": [],
"context": "<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({
brandSessionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
assets: [
{
kind: 'file',
url: '<string>',
uploadId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
filename: '<string>'
}
],
checks: [],
references: [],
context: '<string>'
})
};
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' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'assets' => [
[
'kind' => 'file',
'url' => '<string>',
'uploadId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'filename' => '<string>'
]
],
'checks' => [
],
'references' => [
],
'context' => '<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/reviews"
payload := strings.NewReader("{\n \"brandSessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<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/reviews")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brandSessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<string>\"\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\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<string>\"\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 has no Brand Skill to review against 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>"
}
}Create a review
Review one asset against a brand’s active Brand Skill for the requested checks. Linked files are downloaded and uploads are copied when the review is created. Each account can have 20 reviews pending or processing at once. Returns 202 with the review ID; then call GET /reviews/{id} with wait=true until the review completes or fails.
curl --request POST \
--url https://www.trybloom.ai/api/v1/reviews \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"brandSessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assets": [
{
"kind": "file",
"url": "<string>",
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>"
}
],
"checks": [],
"references": [],
"context": "<string>"
}
'import requests
url = "https://www.trybloom.ai/api/v1/reviews"
payload = {
"brandSessionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"assets": [
{
"kind": "file",
"url": "<string>",
"uploadId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filename": "<string>"
}
],
"checks": [],
"references": [],
"context": "<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({
brandSessionId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
assets: [
{
kind: 'file',
url: '<string>',
uploadId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
filename: '<string>'
}
],
checks: [],
references: [],
context: '<string>'
})
};
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' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'assets' => [
[
'kind' => 'file',
'url' => '<string>',
'uploadId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'filename' => '<string>'
]
],
'checks' => [
],
'references' => [
],
'context' => '<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/reviews"
payload := strings.NewReader("{\n \"brandSessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<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/reviews")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brandSessionId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<string>\"\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\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"assets\": [\n {\n \"kind\": \"file\",\n \"url\": \"<string>\",\n \"uploadId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filename\": \"<string>\"\n }\n ],\n \"checks\": [],\n \"references\": [],\n \"context\": \"<string>\"\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 has no Brand Skill to review against 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.
The asset to review. Exactly one.
1 elementA file, by link or upload, or a Bloom image.
- File
- Bloom image
Show child attributes
Show child attributes
Checks to run: any of color, typography, logo, and copy.
1color, typography, logo, copy Optional pictures to compare with, such as a logo or product shot. At most 10.
10A file, by link or upload, or a Bloom image.
- File
- Bloom image
Show child attributes
Show child attributes
Optional. What the asset is for, or what was asked for.
1 - 4000Response
OK
Show child attributes
Show child attributes
Was this page helpful?