Guides
Generate from video
Turn a product video into catalog images and a GLB model with video_url.
Pass a video_url and Viewrium extracts frames, selects the most useful ones, and works from them
exactly as it would from stills. This is handy when you have a turntable or walk-around clip
instead of photographs.
Ask for the quote
from viewrium import ModelDimensions, ProductCreateRequest, ProductDraft, ProductOrder, Viewrium
client = Viewrium("sk_live_...")
parked = client.products.create(
ProductCreateRequest(
video_url="https://cdn.example.com/sofa-360.mp4",
draft=ProductDraft(
title="Linen 3-seat sofa",
dimensions=ModelDimensions(height=85, width=220, depth=95), # cm
),
order=ProductOrder(images=True, model=True),
)
)
print(parked.cost.total_credits, parked.model.allowed)import { Viewrium } from "@viewrium/sdk";
const client = new Viewrium({ apiKey: "sk_live_..." });
const parked = await client.products.create({
video_url: "https://cdn.example.com/sofa-360.mp4",
draft: {
title: "Linen 3-seat sofa",
dimensions: { height: 85, width: 220, depth: 95 }, // cm
},
order: { images: true, model: true },
});Tips for good results
- Orbit the product. A slow 360-degree pass that keeps the whole item in frame gives frame
selection the coverage it needs - and coverage is what keeps viewpoints out of
model.unseen_views. - Steady and well-lit clips beat shaky, dark ones - the selected frames are only as good as the video.
- Host a direct video URL (for example
.mp4) that Viewrium can fetch.
Then
As with every source, the quote parks: post resume_token back through products.create to
commit, which returns the product at display_status: "generating". Wait for it to settle by
polling or webhooks, then read
product.model.glb_url and product.images.
product = client.products.create(ProductCreateRequest(resume_token=parked.resume_token))if (parked.status !== "parked") throw new Error("unexpected: already committed");
const product = await client.products.create({ resume_token: parked.resume_token });