Sync optional product reviews
curl --request POST \
--url https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_id": "<string>",
"provider": "<string>",
"reviews": [
{
"external_review_id": "<string>",
"external_id_scope": "<string>",
"permalink": "<string>",
"title": "<string>",
"body": "<string>",
"rating": 2.5,
"language": "<string>",
"locale": "<string>",
"author_display_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"verified_purchase": true,
"incentivized": true,
"badges": [
"<string>"
],
"helpful_count": 1,
"merchant_response": {},
"purchased_variant": {
"source_variant_id": "<string>",
"sku": "<string>",
"label": "<string>",
"option_values": {},
"size_signature": "<string>"
},
"media": [
{
"url": "<string>",
"external_media_id": "<string>",
"kind": "image",
"caption": "<string>",
"alt_text": "<string>",
"width": 1,
"height": 1,
"position": 1
}
],
"measurements": [
{
"subject_kind": "reviewer",
"basis": "unknown",
"source_key": "<string>",
"source_kind": "public_review",
"capture_method": "<string>",
"size_label": "<string>",
"option_selector": {},
"confidence": 0.5,
"values": [
{
"value": 1,
"min_value": 1,
"max_value": 1,
"raw_label": "<string>",
"raw_value": "<string>",
"raw_unit": "<string>",
"confidence": 0.5
}
]
}
],
"fit_signals": [
{
"score": 0,
"confidence": 0.5,
"evidence": "<string>",
"source_kind": "structured"
}
],
"deleted": false
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_id: '<string>',
provider: '<string>',
reviews: [
{
external_review_id: '<string>',
external_id_scope: '<string>',
permalink: '<string>',
title: '<string>',
body: JSON.stringify('<string>'),
rating: 2.5,
language: '<string>',
locale: '<string>',
author_display_name: '<string>',
created_at: '2023-11-07T05:31:56Z',
updated_at: '2023-11-07T05:31:56Z',
verified_purchase: true,
incentivized: true,
badges: ['<string>'],
helpful_count: 1,
merchant_response: {},
purchased_variant: {
source_variant_id: '<string>',
sku: '<string>',
label: '<string>',
option_values: {},
size_signature: '<string>'
},
media: [
{
url: '<string>',
external_media_id: '<string>',
kind: 'image',
caption: '<string>',
alt_text: '<string>',
width: 1,
height: 1,
position: 1
}
],
measurements: [
{
subject_kind: 'reviewer',
basis: 'unknown',
source_key: '<string>',
source_kind: 'public_review',
capture_method: '<string>',
size_label: '<string>',
option_selector: {},
confidence: 0.5,
values: [
{
value: 1,
min_value: 1,
max_value: 1,
raw_label: '<string>',
raw_value: '<string>',
raw_unit: '<string>',
confidence: 0.5
}
]
}
],
fit_signals: [{score: 0, confidence: 0.5, evidence: '<string>', source_kind: 'structured'}],
deleted: false
}
]
})
};
fetch('https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews"
payload = {
"event_id": "<string>",
"provider": "<string>",
"reviews": [
{
"external_review_id": "<string>",
"external_id_scope": "<string>",
"permalink": "<string>",
"title": "<string>",
"body": "<string>",
"rating": 2.5,
"language": "<string>",
"locale": "<string>",
"author_display_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"verified_purchase": True,
"incentivized": True,
"badges": ["<string>"],
"helpful_count": 1,
"merchant_response": {},
"purchased_variant": {
"source_variant_id": "<string>",
"sku": "<string>",
"label": "<string>",
"option_values": {},
"size_signature": "<string>"
},
"media": [
{
"url": "<string>",
"external_media_id": "<string>",
"kind": "image",
"caption": "<string>",
"alt_text": "<string>",
"width": 1,
"height": 1,
"position": 1
}
],
"measurements": [
{
"subject_kind": "reviewer",
"basis": "unknown",
"source_key": "<string>",
"source_kind": "public_review",
"capture_method": "<string>",
"size_label": "<string>",
"option_selector": {},
"confidence": 0.5,
"values": [
{
"value": 1,
"min_value": 1,
"max_value": 1,
"raw_label": "<string>",
"raw_value": "<string>",
"raw_unit": "<string>",
"confidence": 0.5
}
]
}
],
"fit_signals": [
{
"score": 0,
"confidence": 0.5,
"evidence": "<string>",
"source_kind": "structured"
}
],
"deleted": False
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews"
payload := strings.NewReader("{\n \"event_id\": \"<string>\",\n \"provider\": \"<string>\",\n \"reviews\": [\n {\n \"external_review_id\": \"<string>\",\n \"external_id_scope\": \"<string>\",\n \"permalink\": \"<string>\",\n \"title\": \"<string>\",\n \"body\": \"<string>\",\n \"rating\": 2.5,\n \"language\": \"<string>\",\n \"locale\": \"<string>\",\n \"author_display_name\": \"<string>\",\n \"created_at\": \"2023-11-07T05:31:56Z\",\n \"updated_at\": \"2023-11-07T05:31:56Z\",\n \"verified_purchase\": true,\n \"incentivized\": true,\n \"badges\": [\n \"<string>\"\n ],\n \"helpful_count\": 1,\n \"merchant_response\": {},\n \"purchased_variant\": {\n \"source_variant_id\": \"<string>\",\n \"sku\": \"<string>\",\n \"label\": \"<string>\",\n \"option_values\": {},\n \"size_signature\": \"<string>\"\n },\n \"media\": [\n {\n \"url\": \"<string>\",\n \"external_media_id\": \"<string>\",\n \"kind\": \"image\",\n \"caption\": \"<string>\",\n \"alt_text\": \"<string>\",\n \"width\": 1,\n \"height\": 1,\n \"position\": 1\n }\n ],\n \"measurements\": [\n {\n \"subject_kind\": \"reviewer\",\n \"basis\": \"unknown\",\n \"source_key\": \"<string>\",\n \"source_kind\": \"public_review\",\n \"capture_method\": \"<string>\",\n \"size_label\": \"<string>\",\n \"option_selector\": {},\n \"confidence\": 0.5,\n \"values\": [\n {\n \"value\": 1,\n \"min_value\": 1,\n \"max_value\": 1,\n \"raw_label\": \"<string>\",\n \"raw_value\": \"<string>\",\n \"raw_unit\": \"<string>\",\n \"confidence\": 0.5\n }\n ]\n }\n ],\n \"fit_signals\": [\n {\n \"score\": 0,\n \"confidence\": 0.5,\n \"evidence\": \"<string>\",\n \"source_kind\": \"structured\"\n }\n ],\n \"deleted\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}{
"accepted_count": 123,
"created_count": 123,
"updated_count": 123,
"versioned_count": 123,
"deactivated_count": 123,
"replay": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}API reference
Sync product reviews
Optionally sync complete customer review records and fit evidence.
POST
https://api.virtual.fit
/
vfr
/
manage
/
sites
/
{site_id}
/
products
/
{product_id}
/
reviews
Sync optional product reviews
curl --request POST \
--url https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"event_id": "<string>",
"provider": "<string>",
"reviews": [
{
"external_review_id": "<string>",
"external_id_scope": "<string>",
"permalink": "<string>",
"title": "<string>",
"body": "<string>",
"rating": 2.5,
"language": "<string>",
"locale": "<string>",
"author_display_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"verified_purchase": true,
"incentivized": true,
"badges": [
"<string>"
],
"helpful_count": 1,
"merchant_response": {},
"purchased_variant": {
"source_variant_id": "<string>",
"sku": "<string>",
"label": "<string>",
"option_values": {},
"size_signature": "<string>"
},
"media": [
{
"url": "<string>",
"external_media_id": "<string>",
"kind": "image",
"caption": "<string>",
"alt_text": "<string>",
"width": 1,
"height": 1,
"position": 1
}
],
"measurements": [
{
"subject_kind": "reviewer",
"basis": "unknown",
"source_key": "<string>",
"source_kind": "public_review",
"capture_method": "<string>",
"size_label": "<string>",
"option_selector": {},
"confidence": 0.5,
"values": [
{
"value": 1,
"min_value": 1,
"max_value": 1,
"raw_label": "<string>",
"raw_value": "<string>",
"raw_unit": "<string>",
"confidence": 0.5
}
]
}
],
"fit_signals": [
{
"score": 0,
"confidence": 0.5,
"evidence": "<string>",
"source_kind": "structured"
}
],
"deleted": false
}
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
event_id: '<string>',
provider: '<string>',
reviews: [
{
external_review_id: '<string>',
external_id_scope: '<string>',
permalink: '<string>',
title: '<string>',
body: JSON.stringify('<string>'),
rating: 2.5,
language: '<string>',
locale: '<string>',
author_display_name: '<string>',
created_at: '2023-11-07T05:31:56Z',
updated_at: '2023-11-07T05:31:56Z',
verified_purchase: true,
incentivized: true,
badges: ['<string>'],
helpful_count: 1,
merchant_response: {},
purchased_variant: {
source_variant_id: '<string>',
sku: '<string>',
label: '<string>',
option_values: {},
size_signature: '<string>'
},
media: [
{
url: '<string>',
external_media_id: '<string>',
kind: 'image',
caption: '<string>',
alt_text: '<string>',
width: 1,
height: 1,
position: 1
}
],
measurements: [
{
subject_kind: 'reviewer',
basis: 'unknown',
source_key: '<string>',
source_kind: 'public_review',
capture_method: '<string>',
size_label: '<string>',
option_selector: {},
confidence: 0.5,
values: [
{
value: 1,
min_value: 1,
max_value: 1,
raw_label: '<string>',
raw_value: '<string>',
raw_unit: '<string>',
confidence: 0.5
}
]
}
],
fit_signals: [{score: 0, confidence: 0.5, evidence: '<string>', source_kind: 'structured'}],
deleted: false
}
]
})
};
fetch('https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews"
payload = {
"event_id": "<string>",
"provider": "<string>",
"reviews": [
{
"external_review_id": "<string>",
"external_id_scope": "<string>",
"permalink": "<string>",
"title": "<string>",
"body": "<string>",
"rating": 2.5,
"language": "<string>",
"locale": "<string>",
"author_display_name": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"verified_purchase": True,
"incentivized": True,
"badges": ["<string>"],
"helpful_count": 1,
"merchant_response": {},
"purchased_variant": {
"source_variant_id": "<string>",
"sku": "<string>",
"label": "<string>",
"option_values": {},
"size_signature": "<string>"
},
"media": [
{
"url": "<string>",
"external_media_id": "<string>",
"kind": "image",
"caption": "<string>",
"alt_text": "<string>",
"width": 1,
"height": 1,
"position": 1
}
],
"measurements": [
{
"subject_kind": "reviewer",
"basis": "unknown",
"source_key": "<string>",
"source_kind": "public_review",
"capture_method": "<string>",
"size_label": "<string>",
"option_selector": {},
"confidence": 0.5,
"values": [
{
"value": 1,
"min_value": 1,
"max_value": 1,
"raw_label": "<string>",
"raw_value": "<string>",
"raw_unit": "<string>",
"confidence": 0.5
}
]
}
],
"fit_signals": [
{
"score": 0,
"confidence": 0.5,
"evidence": "<string>",
"source_kind": "structured"
}
],
"deleted": False
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.virtual.fit/vfr/manage/sites/{site_id}/products/{product_id}/reviews"
payload := strings.NewReader("{\n \"event_id\": \"<string>\",\n \"provider\": \"<string>\",\n \"reviews\": [\n {\n \"external_review_id\": \"<string>\",\n \"external_id_scope\": \"<string>\",\n \"permalink\": \"<string>\",\n \"title\": \"<string>\",\n \"body\": \"<string>\",\n \"rating\": 2.5,\n \"language\": \"<string>\",\n \"locale\": \"<string>\",\n \"author_display_name\": \"<string>\",\n \"created_at\": \"2023-11-07T05:31:56Z\",\n \"updated_at\": \"2023-11-07T05:31:56Z\",\n \"verified_purchase\": true,\n \"incentivized\": true,\n \"badges\": [\n \"<string>\"\n ],\n \"helpful_count\": 1,\n \"merchant_response\": {},\n \"purchased_variant\": {\n \"source_variant_id\": \"<string>\",\n \"sku\": \"<string>\",\n \"label\": \"<string>\",\n \"option_values\": {},\n \"size_signature\": \"<string>\"\n },\n \"media\": [\n {\n \"url\": \"<string>\",\n \"external_media_id\": \"<string>\",\n \"kind\": \"image\",\n \"caption\": \"<string>\",\n \"alt_text\": \"<string>\",\n \"width\": 1,\n \"height\": 1,\n \"position\": 1\n }\n ],\n \"measurements\": [\n {\n \"subject_kind\": \"reviewer\",\n \"basis\": \"unknown\",\n \"source_key\": \"<string>\",\n \"source_kind\": \"public_review\",\n \"capture_method\": \"<string>\",\n \"size_label\": \"<string>\",\n \"option_selector\": {},\n \"confidence\": 0.5,\n \"values\": [\n {\n \"value\": 1,\n \"min_value\": 1,\n \"max_value\": 1,\n \"raw_label\": \"<string>\",\n \"raw_value\": \"<string>\",\n \"raw_unit\": \"<string>\",\n \"confidence\": 0.5\n }\n ]\n }\n ],\n \"fit_signals\": [\n {\n \"score\": 0,\n \"confidence\": 0.5,\n \"evidence\": \"<string>\",\n \"source_kind\": \"structured\"\n }\n ],\n \"deleted\": false\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}{
"accepted_count": 123,
"created_count": 123,
"updated_count": 123,
"versioned_count": 123,
"deactivated_count": 123,
"replay": true
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Review sync is optional. Upload the product first, then send review batches
whenever your review source changes.
Prefer a stable
external_review_id. A public permalink is the next-best
identity. If neither exists, virtual.fit derives a conservative identity from
the available author, date, rating, title, and body.
Each item is its complete current review record. Include its current stars,
text, purchased variant, and media on every update. To delete one review, send
its stable ID or permalink with deleted: true.
Use snapshot_complete: true only when the batch contains every current review
in the named partition_key. Omitted reviews become inactive after two
consecutive complete snapshots. Leave it false for pages, partial feeds, and
incremental updates.
virtual.fit extracts fit evidence from review text asynchronously. You only
need to send
fit_signals when the source already provides an explicit
structured vote such as “runs small” or “true to size.”Authorizations
Keep the virtual.fit API key on your server.
Path Parameters
Custom JavaScript site ID from virtual.fit.
Stable, case-sensitive identity that remains unchanged when the product's title, URL, options, variants, price, or media change. URL-encode it in the request path.
Maximum string length:
255Body
application/json
Unique idempotency key. Reusing it with different data is rejected.
Maximum string length:
255Stable lowercase key for the review source.
Maximum string length:
255Maximum array length:
250- Option 1
- Option 2
- Option 3
- Option 4
Show child attributes
Show child attributes
Maximum string length:
255True only when this batch is a complete view of the exact provider, product, and partition.