Take a product page URL and produce a vertical promo video that pulls the
product image(s), name, key features, and price.
any storefront with crawlable HTML (most stores).
hand you a script instead, use revid-script-to-video.
revid-product-description-to-ad.
| Field | Required | Notes |
|---|---|---|
| --- | --- | --- |
url | yes | Public product page URL |
aspectRatio | no | Defaults to 9:16 |
targetDuration | no | Defaults to 35 (s) |
voiceId | no | Default voice if omitted |
webhookUrl | no | Skip polling if you can receive webhooks |
http(s)://. Reject obvious non-product paths (/cart, /blog, /collections/all).
HEAD to confirm itreturns 200. If 4xx, ask the user to confirm the link.
high density, dynamic animation, captions ON, music ON.
/api/public/v3/render — capture the returned pid./status?pid=… with the canonical loop (see Polling sectionbelow) or wait for the webhook.
{ pid, status, videoUrl, thumbnailUrl, durationSeconds, creditsUsed }.POST /api/public/v3/render
Host: www.revid.ai
Content-Type: application/json
key: $REVID_API_KEY
{
"workflow": "article-to-video",
"source": {
"url": "{PRODUCT_URL}",
"scrapingPrompt": "Extract the product name, hero image, 3 key features, and price. Ignore reviews, related products, footer, and navigation."
},
"aspectRatio": "9:16",
"voice": { "enabled": true, "stability": 0.55, "speed": 1.05, "language": "en-US" },
"captions": { "enabled": true, "position": "middle", "autoCrop": true },
"music": { "enabled": true, "syncWith": "beats", "trackName": "uplifting-pop" },
"media": {
"type": "stock-video",
"density": "high",
"animation": "dynamic",
"quality": "pro",
"imageModel": "good",
"videoModel": "pro",
"turnImagesIntoVideos": true,
"applyStyleTransfer": false
},
"options": {
"targetDuration": 35,
"summarizationPreference": "summarize",
"hasToGenerateCover": true,
"coverTextType": "product-name",
"soundEffects": true,
"addStickers": false
},
"render": { "resolution": "1080p", "frameRate": 30 }
}
scrapingPrompt is the most important knob — it stops Revid from picking up
header/footer junk. Customize it per storefront if you find a recurring noise
pattern.
examples/shopify-aeropods.json — payload.examples/run.sh — end-to-end curl.URL="https://your-shop.myshopify.com/products/your-product"
curl -s https://www.revid.ai/api/public/v3/render \
-H "Content-Type: application/json" \
-H "key: $REVID_API_KEY" \
-d "$(jq --arg url "$URL" '.source.url=$url' \
examples/shopify-aeropods.json)"
After POST /render, poll until status === "ready":
PID="<pid-from-render>"
while :; do
R=$(curl -fsSL "https://www.revid.ai/api/public/v3/status?pid=$PID" \
-H "key: $REVID_API_KEY")
S=$(echo "$R" | jq -r .status)
case "$S" in
ready) echo "$R" | jq .; break ;;
failed) echo "FAILED: $R"; exit 1 ;;
*) sleep 5 ;;
esac
done
In production prefer setting webhookUrl in the request body and skip polling.
| Symptom | Fix |
|---|---|
| --- | --- |
scrape failed / 403 from the URL | Storefront blocks bots. Open the page in a real browser, copy the title + 3 bullet features + price into a script, and switch to revid-script-to-video. |
| Video shows wrong product image | Storefront serves SSR via JS only. Pass media.useOnlyProvided: true and media.provided: [{ url: " to force the right asset. |
| Voice sounds robotic | Increase voice.stability to 0.7 and pick a specific voice.voiceId. Default voice varies. |
| Duration overshoots target | Set options.summarizationPreference: "summarize" (already in the template) and lower targetDuration. |
| Captions cover product | captions.position: "top" (or "bottom"). |
if you don't have a live URL.
if you want to control every visual.
revid-api-foundations for the contract.共 1 个版本