Visual Content Coach: Video Quality Feedback
This section outlines the purpose of the Visual Content Coach: Video Quality Feedback API and provides implementation guidance, including sample requests and responses.
Use the Visual Content Coach: Video Quality Feedback API to provide near real-time, automated feedback messages on user-generated content (UGC) product videos directly on the review submission form. This feedback helps consumers record higher-quality videos with their reviews. High-quality, compliant video improves review quality, influences purchase decisions, and drives conversions.
Note:This feature is a part of the Conversations API; to get started, contact Bazaarvoice Support.
Endpoints included
The Visual Content Coach: Video Quality Feedback API includes two endpoints:
- uploadvideo.json: Accepts the consumer's uploaded video from the review submission form. The
X-Product-Idrequest header, which contains the product ID, initiates the video quality feedback process. - Media-score-status: Returns feedback on the uploaded video in the form of short text messages, with a maximum of three positive and three negative messages. This is the same endpoint used for photo quality feedback..
Implementation requirements
-
Enable Media Quality Feedback in the Portal: Set Media Quality Feedback to Video or All Media in the Ratings & Reviews Configuration. For step by step insurtuctions, refer to Knowledge Base.
-
Submit video: When the consumer uploads a video, send a
POSTrequest to the uploadvideo.json endpoint. Include the product ID in theX-Product-Idrequest header to initiate video analysis. -
Asset ID creation: Bazaarvoice generates a unique video identifier, which is returned to the client as
VideoId. This value is the permanentasset_idfor the uploaded video. -
Validation process: Bazaarvoice automatically evaluates the uploaded video against the following criteria:
-
Frame sampling: Bazaarvoice pick a few sample frames from the video for evaluation.
-
Local heuristics: Verifies frame resolution, file size, and blur.
-
Quality and safety: Assesses brightness, sharpness, and contrast for each frame.
-
Authenticity: Performs product matching, detects action shots, evaluates background clutter and text overlays, and identifies potential policy violations (for example, screen recordings, stock footage, marketing materials, or AI-generated content).
-
Aggregation: Bazaarvoice combines the per-frame results into a single result for the video.
-
-
Retrieve feedback: Send a
GETrequest to the Media-score-status endpoint with theasset_idto retrieve feedback on the uploaded video. The response includes a maximum of three positive and three negative feedback messages.Notes:- Do not request feedback immediately after upload. Wait before the first poll, then follow
poll_interval_seconds. - Implement logic to send the
GETrequest a few seconds after thePOSTcall succeeds. Video analysis takes longer than photo analysis, so keep polling until the status isCOMPLETEDorFAILED.
- Do not request feedback immediately after upload. Wait before the first poll, then follow
-
Display feedback: Present the retrieved feedback messages on the review submission form according to your organization's business requirements.
-
Reupload video: If the consumer reuploads a video based on the feedback received, send a new
POSTrequest to the uploadvideo.json endpoint, passing the originalasset_idin theX-Parent-Asset-Idrequest header. This is used only for analytical purposes. No additional feedback is provided for reuploaded videos.
Initiate video upload analysis
When the consumer uploads a video in the submission form, send a POST request to the uploadvideo.json endpoint. Include the product ID in the X-Product-Id request header to initiate video quality analysis.
The technical specifications are as follows:
Endpoint
POST /data/uploadvideo.json
HTTPS method
POST
URL
https://[stgmedia].api.bazaarvoice.com/data/uploadvideo.json
Parameters
| Parameter | Placement | Data type | Description |
|---|---|---|---|
| X-Product-Id*(conditionally required for feedback) | Header | String | Use the product ID from the Bazaarvoice product catalog for the client instance. If the header is missing, Bazaarvoice does not score the video. Note: Ensure the product ID matches the one saved in the Bazaarvoice product catalog. Example: P-7777-MSD |
| bv-passkey* | Header | String | A Conversations API passkey for authentication. Note: You can also pass this as a query parameter, but sending it in a header is more secure. |
| X-Parent-Asset-Id | Header | String | This is applicable only for video reupload. The asset_id of the previously uploaded video that this new upload replaces. |
Example call
curl --location 'https://[stgmedia].api.bazaarvoice.com/data/uploadvideo.json?displayCode=<DisplayCode>' \
--header 'User-Agent: <USER AGENT>' \
--header 'bv-passkey: <Passkey>' \
--header 'x-product-id: pen1' \
--form 'apiversion="5.4"' \
--form 'contenttype="review"' \
--form 'video=@"movie.mp4"'Example response
{
"Locale": "en_US",
"Errors": [],
"Form": [
{
"Type": "Field",
"Id": "video"
}
],
"FormErrors": {},
"SubmissionId": null,
"Data": {
"Fields": {
"video": {
"Options": [],
"Type": "FileInput",
"Required": null,
"Label": null,
"Value": null,
"MinLength": null,
"Id": "video",
"MaxLength": null,
"Default": null
}
},
"Groups": {},
"FieldsOrder": [
"video"
],
"GroupsOrder": []
},
"TypicalHoursToPost": null,
"AuthorSubmissionToken": null,
"HasErrors": false,
"Video": {
"VideoId": "fc41023b-bdec-4613-a121-0f1f81b04291",
"VideoHost": "BAZAARVOICE",
"VideoThumbnailUrl": "https://stgvideo.api.bazaarvoice.com/fc41023b-bdec-4613-a121-0f1f81b04291/thumbnail/image-00001.png",
"VideoUrl": "https://stgvideo.api.bazaarvoice.com/fc41023b-bdec-4613-a121-0f1f81b04291/video/movie.mp4"
}
}Retrieve feedback
To retrieve feedback on the uploaded video, send a GET request to the Media-score-status endpoint, passing the asset_id as a query parameter. The asset_id is the unique video identifier (VideoId) returned in the upload response. The client must capture this value and include it in the GET request.
Note:Implement logic to send the
GETrequest a few seconds after thePOSTcall completes successfully. Do not send theGETandPOSTrequests simultaneously.
The technical specifications are as follows:
Endpoint
GET/data/content-coach/v1/media-score-status
HTTPS method
GET
URL
https://[stg].api.bazaarvoice.com/data/content-coach/v1/media-score-status?asset_id=<Asset_ID>
Parameters
| Parameter | Placement | Data type | Description |
|---|---|---|---|
| bv-passkey* | Header | String | A Conversations API passkey for authentication. |
| asset_id* | Query | String | The unique identifier(VideoId) returned in the video upload response. The client must capture this value and include it in the GET request. |
Polling behavior
Video analysis is asynchronous. Poll the endpoint until the status is COMPLETED or FAILED.
- While Bazaarvoice is analyzing the video, the endpoint returns HTTP
202withstatusset toPROCESSINGand apoll_interval_secondsvalue. Wait that many seconds before you send the next request. - When analysis finishes, the endpoint returns HTTP
200with thescoring_resultobject. - If analysis fails, the endpoint returns HTTP
500with an error code. Let the consumer continue submitting the review without feedback.
Feedback priority order
Feedback priority ranges from P0 (highest) to P8 (lowest). P0 feedback messages always appear first.
The GET response includes the following:
- The
scoring_resultobject holds the generated feedback for the video. - The
top_positiveandtop_negativearrays surface up to three positive messages (for example,AUTHENTIC_VIDEO,SHARP_AND_CLEAR,CLEAN_VIDEO) and up to three negative messages (for example,PRODUCT_NOT_MATCHING). - The
all_signalsarray provides the full set of detected positive and negative feedback messages.
Feedback priority levels
| Priority | Feedback category | Positive feedback | Negative feedback |
|---|---|---|---|
| P0 | Authenticity | AUTHENTIC_VIDEO | USE_REAL_VIDEO |
| P1 | Sharpness | SHARP_AND_CLEAR | BLURRY |
| P2 | Text overlay | CLEAN_VIDEO | TEXT_ON_VIDEO |
| P3 | Lighting | GREAT_LIGHTING | LOW_LIGHTING |
| P4 | Resolution | HIGH_RESOLUTION | LOW_RESOLUTION |
| P5 | Product match | PERFECT_MATCH | PRODUCT_NOT_MATCHING |
| P6 | Product visible | PRODUCT_VISIBLE | PRODUCT_NOT_VISIBLE |
| P7 | Product in use | PERFECT_ACTION_SHOT | SHOW_PRODUCT_IN_USE |
| P8 | Background | CLEAN_BACKGROUND | DISTRACTING_BACKGROUND |
Example call
curl --location 'https://[stg].api.bazaarvoice.com/data/content-coach/v1/media-score-status?asset_id=<ASSET ID>' \
--header 'bv-passkey:<PASSKEY>'Example response
{
"asset_id": "82849802-7210-456e-b813-4505eafc18e9",
"product_id": "pen1",
"client_name": "test-editreviews",
"status": "COMPLETED",
"scoring_result": {
"top_positive": [
"HIGH_RESOLUTION",
"CLEAN_BACKGROUND"
],
"top_negative": [
"USE_REAL_VIDEO",
"BLURRY",
"TEXT_ON_VIDEO"
],
"all_signals": [
"USE_REAL_VIDEO",
"BLURRY",
"TEXT_ON_VIDEO",
"LOW_LIGHTING",
"HIGH_RESOLUTION",
"PRODUCT_NOT_MATCHING",
"CLEAN_BACKGROUND"
]
},
"created_at": "2026-10-09T09:54:56.822577430Z",
"updated_at": "2026-10-09T09:55:05.520733434Z"
}
Reupload video
If the consumer reuploads a video based on the feedback received, send a new POST request to the uploadvideo.json endpoint, passing the original asset_id in the X-Parent-Asset-Id request header.
This is used only for analytical purposes. No additional feedback is provided for reuploaded videos.
Example call
curl --location 'https://stgmedia.api.bazaarvoice.com/data/uploadvideo.json?displayCode=<DisplayCode>' \
--header 'User-Agent: <USER AGENT>' \
--header 'bv-passkey: <Passkey>' \
--header 'x-parent-asset-id: f1eeb3ef-c75a-405e-b1ba-1d738946d849' \
--form 'apiversion="5.4"' \
--form 'contenttype="review"' \
--form 'video=@"movie.mp4"'Response codes
| Code | Endpoint | Response |
|---|---|---|
| 200 | uploadvideo.json | Returns the uploaded video's unique identifier, which is the asset_id. |
| 200 | Media-score-status | Returns upto three positive and three negative feedback messages, along with all feedback items detected for the video. |
| 202 | Media-score-status | Analysis is in progress. The response includes poll_interval_seconds. Wait that interval and send the request again. |
| 404 | Media-score-status | Not found. Occurs when no record exists for the asset_id. |
| 500 | uploadvideo.json/ Media-score-status | Internal server error. Occurs when the request fails, analysis fails (for example, no frames can be read from the video), or analysis times out. |
| 503 | Media-score-status | Service unavailable. Occurs when a dependency is temporarily unreachable. Retry the request. |
Updated about 12 hours ago
