AI Video Generation API for Watch Brands — Showcase Clip Costs
A watch brand has a sharp studio photo of its new automatic — sunburst dial, polished bezel, crown at three o'clock — but the product page and paid social creative need short clips: the second hand sweeping, light rolling across the bezel as the case tilts, the crown being wound. Macro watch video needs a specialist shooter, lighting rigs, and a rented lens, and that overhead repeats for every dial color or strap launch. Turning the existing studio photo into a short motion clip via API answers "what does this watch look like in motion" without booking a shoot.
Direct answer: GenRelay's image-to-video models animate an existing watch photo into a short clip with described motion — a case tilting through light, a rotating turntable shot, a wrist-turn — billed per second or per generation, and a 5-second clip costs between $0.05 and $0.90 depending on model and resolution.
How Much Does a Watch Showcase Clip Cost?
Cost depends on billing model and resolution, not on how elaborate the described motion is. As of October 2026, GenRelay video pricing is: Grok Imagine 1.0 (text-to-video) $0.010/second, Grok Imagine 1.5 (image-to-video) $0.022/second, Veo 3.1 Lite $0.060/second at 720p, $0.120/second at 1080p, and $0.180/second at 4K, and Gemini Omni Flash a flat $0.10 per generation at 720p or $0.15 at 1080p.
| Model | Billing | 5s clip cost | 8s clip cost | Best for |
|---|---|---|---|---|
| Grok Imagine 1.5 (i2v) | Per second | $0.11 | $0.176 | Animating an existing watch photo into a tilt or rotation clip |
| Grok Imagine 1.0 (t2v) | Per second | $0.05 | $0.08 | Generic lifestyle B-roll from text, no source photo |
| Veo 3.1 Lite, 720p | Per second | $0.30 | $0.48 | Finer dial and bezel detail, macro-style shots |
| Veo 3.1 Lite, 1080p | Per second | $0.60 | $0.96 | Hero clips for the product page or a paid ad |
| Omni Flash, 720p | Per generation | $0.10 | $0.10 | Fixed-price clips regardless of duration |
For a watch that needs a tilting or turntable clip, Grok Imagine 1.5 is the practical default: it takes the studio photo as input and keeps the dial layout, case shape, and strap consistent while generating the motion and reflections, at a fraction of Veo 3.1 Lite's per-second cost. Veo 3.1 Lite earns its price for a few hero clips where reflection realism and camera quality matter more than cost per clip, such as a homepage banner.
How Do I Animate a Watch Photo Into a Showcase Clip?
Submit the source photo with a prompt describing both the product motion and the camera movement. Image-to-video jobs are asynchronous, so the response returns a job ID to poll:
import requests
import time
API_KEY = "YOUR_KEY"
BASE = "https://genrelay.ai/v1"
with open("watch_studio.jpg", "rb") as f:
r = requests.post(
f"{BASE}/videos/generations",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"image": f},
data={
"model": "grok-imagine-1.5",
"prompt": (
"A luxury automatic watch slowly tilting so light "
"rolls across the polished bezel and sunburst dial, "
"dark studio background, slow macro camera push-in."
),
"duration": 5,
},
)
job_id = r.json()["id"]
while True:
status = requests.get(
f"{BASE}/videos/generations/{job_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
).json()
if status["state"] == "completed":
video_url = status["output_url"]
break
if status["state"] == "failed":
raise RuntimeError(status.get("error"))
time.sleep(3)
How Do I Generate Clips Across a Full Dial Lineup?
Submit jobs concurrently and poll each one, rather than waiting on each clip before sending the next:
import concurrent.futures
variants = [
"watch slowly tilting, light sweeping across the bezel",
"watch rotating 360 degrees on a turntable, studio lighting",
"close-up push-in on the dial as the second hand sweeps",
]
def submit_and_wait(prompt):
with open("watch_studio.jpg", "rb") as f:
r = requests.post(
f"{BASE}/videos/generations",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"image": f},
data={"model": "grok-imagine-1.5", "prompt": prompt, "duration": 5},
)
job_id = r.json()["id"]
while True:
status = requests.get(
f"{BASE}/videos/generations/{job_id}",
headers={"Authorization": f"Bearer {API_KEY}"},
).json()
if status["state"] == "completed":
return status["output_url"]
if status["state"] == "failed":
raise RuntimeError(status.get("error"))
time.sleep(3)
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as pool:
clips = list(pool.map(submit_and_wait, variants))
Three 5-second clips at Grok Imagine 1.5's $0.022/second cost $0.33 in total, for clips that show the actual watch and dial shipping to customers.
What Does a Full Dial-Color Launch Cost?
A watch brand with 4 dial colors needing one tilt or rotation clip each — 4 clips — pays $0.44 at Grok Imagine 1.5's 5-second rate. The same 4 clips on Veo 3.1 Lite at 720p cost $1.20; 2 hero dial colors at 1080p cost $1.20 as well, reserved for the highest-traffic pages.
| Scope | Clips | Model | Total cost |
|---|---|---|---|
| 4 dial colors × 1 tilt/rotation clip | 4 | Grok Imagine 1.5, 5s | $0.44 |
| Same line, higher fidelity | 4 | Veo 3.1 Lite 720p, 5s | $1.20 |
| 2 hero dials, 1080p hero clip | 2 | Veo 3.1 Lite 1080p, 5s | $1.20 |
| 4 dial colors, 1 clip each | 4 | Omni Flash 720p (flat) | $0.40 |
Omni Flash's flat rate fits when one representative clip per dial color is enough, while per-second models earn their cost when a color needs a longer hero clip or more elaborate motion.
FAQ
Can I generate watch B-roll from text only, without a product photo?
Yes. Grok Imagine 1.0 generates from a text prompt at $0.010/second, but with no source photo it can't match your exact dial, so it suits general lifestyle footage rather than clips of your actual SKU.
Does the API support longer clips for a hero video?
Duration is set per request up to each model's maximum. Check the /videos/generations docs for current per-model limits; per-second model cost scales linearly with duration.
Does the video include audio, like a ticking sound?
Veo 3.1 supports synchronized audio on some modes; see the Veo 3.1 audio API guide. Grok Imagine and Omni Flash clips are silent.
How do I handle a failed generation job?
Check the state field in the polling response. A failed state includes an error field; retry with a simplified prompt if the cause is prompt content rather than a transient server error.
Can I make dial-color photos first, then animate them?
Yes. Generate the variant photo with the watch photography API, then pass that image as the source for an image-to-video job.
See the image-to-video pipeline guide for the full async pattern, or the Veo model page for parameter docs.