Submit Review With Media (Merchant, one-call)
curl --request POST \
--url https://cdn.tailoredd.com/apiV2/reviews/with-media \
--header 'Content-Type: multipart/form-data' \
--form 'productId=<string>' \
--form 'title=<string>' \
--form 'text=<string>' \
--form 'authorName=<string>' \
--form authorEmail=jsmith@example.com \
--form 'orderId=<string>' \
--form 'pros=<string>' \
--form 'cons=<string>' \
--form 'attributes=<string>' \
--form 'file=<string>' \
--form file.items='@example-file'import requests
url = "https://cdn.tailoredd.com/apiV2/reviews/with-media"
files = { "file.items": ("example-file", open("example-file", "rb")) }
payload = {
"productId": "<string>",
"title": "<string>",
"text": "<string>",
"authorName": "<string>",
"authorEmail": "jsmith@example.com",
"orderId": "<string>",
"pros": "<string>",
"cons": "<string>",
"attributes": "<string>",
"file": "<string>"
}
response = requests.post(url, data=payload, files=files)
print(response.text)const form = new FormData();
form.append('productId', '<string>');
form.append('title', '<string>');
form.append('text', '<string>');
form.append('authorName', '<string>');
form.append('authorEmail', 'jsmith@example.com');
form.append('orderId', '<string>');
form.append('pros', '<string>');
form.append('cons', '<string>');
form.append('attributes', '<string>');
form.append('file', '<string>');
form.append('file.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST'};
options.body = form;
fetch('https://cdn.tailoredd.com/apiV2/reviews/with-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://cdn.tailoredd.com/apiV2/reviews/with-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 => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$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://cdn.tailoredd.com/apiV2/reviews/with-media"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cdn.tailoredd.com/apiV2/reviews/with-media")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://cdn.tailoredd.com/apiV2/reviews/with-media")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {}
}{
"success": false,
"error": {
"code": "INVALID_FILE_TYPE",
"message": "Supported media types are JPEG, PNG, WebP, GIF, MP4, WebM, and QuickTime"
}
}Reviews
Submit review with media
Submit a customer review and attach images or videos in a single multipart request, with media processed asynchronously.
POST
/
reviews
/
with-media
Submit Review With Media (Merchant, one-call)
curl --request POST \
--url https://cdn.tailoredd.com/apiV2/reviews/with-media \
--header 'Content-Type: multipart/form-data' \
--form 'productId=<string>' \
--form 'title=<string>' \
--form 'text=<string>' \
--form 'authorName=<string>' \
--form authorEmail=jsmith@example.com \
--form 'orderId=<string>' \
--form 'pros=<string>' \
--form 'cons=<string>' \
--form 'attributes=<string>' \
--form 'file=<string>' \
--form file.items='@example-file'import requests
url = "https://cdn.tailoredd.com/apiV2/reviews/with-media"
files = { "file.items": ("example-file", open("example-file", "rb")) }
payload = {
"productId": "<string>",
"title": "<string>",
"text": "<string>",
"authorName": "<string>",
"authorEmail": "jsmith@example.com",
"orderId": "<string>",
"pros": "<string>",
"cons": "<string>",
"attributes": "<string>",
"file": "<string>"
}
response = requests.post(url, data=payload, files=files)
print(response.text)const form = new FormData();
form.append('productId', '<string>');
form.append('title', '<string>');
form.append('text', '<string>');
form.append('authorName', '<string>');
form.append('authorEmail', 'jsmith@example.com');
form.append('orderId', '<string>');
form.append('pros', '<string>');
form.append('cons', '<string>');
form.append('attributes', '<string>');
form.append('file', '<string>');
form.append('file.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST'};
options.body = form;
fetch('https://cdn.tailoredd.com/apiV2/reviews/with-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://cdn.tailoredd.com/apiV2/reviews/with-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 => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$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://cdn.tailoredd.com/apiV2/reviews/with-media"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://cdn.tailoredd.com/apiV2/reviews/with-media")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://cdn.tailoredd.com/apiV2/reviews/with-media")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"productId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"title\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"text\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorName\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"authorEmail\"\r\n\r\njsmith@example.com\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"orderId\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pros\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"cons\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"attributes\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {}
}{
"success": false,
"error": {
"code": "INVALID_FILE_TYPE",
"message": "Supported media types are JPEG, PNG, WebP, GIF, MP4, WebM, and QuickTime"
}
}POST {BASE_URL}/reviews/with-media
The API validates the form and file signatures, creates the review, and waits for each media upload to be
accepted before responding. Final Cloudinary webhook processing remains asynchronous, so a successful response
normally starts with
mediaStatus: "processing". A later media failure does not roll back the review; the
terminal status is partial or failed.Body parameters
This endpoint uses
multipart/form-data encoding. Send all fields as form values, not JSON.string
required
Product ID.
string
required
1–5.
string
required
Customer display name.
string
required
Customer email.
file
JPEG, PNG, WebP, GIF, MP4, WebM, or QuickTime media. Repeat the key for up to three files, max 50 MB each.
File signatures are validated; a declared type that does not match the bytes returns
400 INVALID_FILE_TYPE
before the review is created. Generic application/octet-stream uploads are accepted only when the bytes identify
one of these supported formats.string
Review headline.
string
Review body.
string
Order ID for verified purchase.
string
Incentive claim ID.
string
"true" to confirm FTC disclosure.string
"true" or "false".string
Free-text pros.
string
Free-text cons.
string
Custom attributes as a JSON-stringified string, e.g.,
'{"fit":"true_to_size"}'.Example
curl -X POST "${RF_BASE_URL}/reviews/with-media" \
-H "X-Merchant-Id: YOUR_MERCHANT_ID" \
-H "X-API-Key: YOUR_API_KEY" \
-F "productId=SKU-001" -F "rating=5" \
-F "authorName=Jane Doe" -F "authorEmail=jane@example.com" \
-F "file=@/path/to/photo.jpg"
Body
multipart/form-data
Available options:
1, 2, 3, 4, 5 Available options:
true, false JSON-stringified custom attributes.
Repeat the field for each file. Maximum 50 MB per file.
Maximum array length:
3Was this page helpful?
⌘I