AI UGC Video Generator
An AI UGC video generator: turn a product brief or URL (plus optional product photos) into an authentic, handheld talk-to-camera UGC ad with a cast creator, naturally paced dialogue, and a full soundtrack — ambient room sound, a subtle music bed, and product foley — featuring your real product, no filming. Works for a physical product, an app, or a service.
~$3 per video·Run it free in the playground, then call it from your app.
No inputs handy? Try one of these
For developers
Run it from your own stack.
This skill is an API. One call runs the whole pipeline server-side as a long-running job and returns the result — from Python, plain HTTP, or an MCP-connected coding agent.
API access — MCP · Python SDK · cURL · JSON schemas
claude mcp add --transport http puras https://mcp.puras.co/mcpOAuth on first call — no key to paste. Then ask the agent to run ugc-video from skill puras/product-ad-studio.
pip install puras
puras login # or set PURAS_API_KEY
puras run puras/product-ad-studio/ugc-video -i key=valueimport puras
client = puras.Client() # PURAS_API_KEY from env
result = client.run("puras/product-ad-studio/ugc-video", {"brief":"A stainless insulated water bottle that keeps drinks cold for 24h. For gym regulars and hikers. Tone: confident, no-nonsense.","aspect_ratio":"9:16","ugc_template":"interview","product_images":["https://images.unsplash.com/photo-1602143407151-7111542de6e8?w=1200&q=80"],"duration_seconds":10})curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/product-ad-studio&wait=true" \
-H "Authorization: Bearer $PURAS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"skill":"ugc-video","inputs":{"brief":"A stainless insulated water bottle that keeps drinks cold for 24h. For gym regulars and hikers. Tone: confident, no-nonsense.","aspect_ratio":"9:16","ugc_template":"interview","product_images":["https://images.unsplash.com/photo-1602143407151-7111542de6e8?w=1200&q=80"],"duration_seconds":10}}'Input schema (JSON Schema)
{
"type": "object",
"required": [
"brief"
],
"properties": {
"brief": {
"type": "text",
"maxLength": 2000,
"minLength": 10,
"description": "What it is, who it's for, what to land. URL works."
},
"music": {
"type": "string",
"default": "auto",
"maxLength": 120,
"description": "Background music for the clip's native soundtrack. `auto` usually picks a quiet instrumental bed matching your brand's tone (lo-fi, soft acoustic, or light upbeat — always under the voice); raw-phone concepts like ASMR stay music-free. `none` always skips music for a raw phone-recording feel. Or type a style hint (e.g. \"lo-fi chill\", \"upbeat electronic\").\n"
},
"captions": {
"type": "boolean",
"default": true,
"description": "Burn word-synced karaoke captions onto the finished clip — the retention look for muted TikTok/Reels/Shorts feeds. Caption colors and styling are picked automatically to match the product's brand identity. Turn off for a clean, caption-free clip.\n"
},
"last_frame": {
"type": "image",
"description": "Optional. A still the clip should end on (tail keyframe). When set, the render lands on this exact frame — e.g. an end card, or the last frame of a gameplay recording so the clip flows seamlessly into the next shot when stitched. Pairs with `first_frame` to interpolate from open to close.\n"
},
"first_frame": {
"type": "image",
"description": "Optional. A still the clip should open on (image-to-video). When set, the render starts from this exact frame — e.g. the first frame of a gameplay recording so the clip flows seamlessly into the real footage when stitched.\n"
},
"aspect_ratio": {
"enum": [
"9:16",
"1:1",
"16:9"
],
"type": "string",
"default": "9:16",
"description": "Output frame for the clip."
},
"ugc_template": {
"enum": [
"auto",
"unboxing",
"tryout",
"interview",
"tutorial",
"product_review",
"problem_solution",
"grwm",
"asmr_demo",
"pov",
"before_after",
"listicle",
"reaction",
"storytime"
],
"type": "string",
"default": "auto",
"description": "Which UGC format to shoot. `auto` picks the best fit."
},
"creator_image": {
"type": "image",
"description": "Optional photo of the on-camera person, for a consistent creator."
},
"product_images": {
"type": "array",
"items": {
"type": "image"
},
"maxItems": 5,
"minItems": 0,
"description": "Optional. Product photos that anchor the real product. Sharp, well-lit shots work best. If omitted, the product is rendered from the brief/research description."
},
"creator_persona": {
"type": "text",
"maxLength": 300,
"description": "Optional. Who's on camera and where. Empty = auto-cast."
},
"duration_seconds": {
"type": "integer",
"default": 8,
"maximum": 15,
"minimum": 4,
"description": "Target clip length. 8 s is the sweet spot; up to 15 s supported. Longer clips buy more action, not more talking — spoken lines stay short either way, so pick longer durations for demos and reactions, not bigger scripts.\n"
}
}
}Output schema (JSON Schema)
{
"type": "object",
"properties": {
"video": {
"type": "video",
"description": "The rendered UGC clip (with native audio) — the playable video. The playground renders it with a <video> player.\n"
}
}
}Call AI UGC Video Generator from your app.
Run it free in the playground above, then wire it in with one call — from Python, TypeScript, or your coding agent over MCP. Every run returns an exact cost receipt.
Every run is billed to the cent — see pricing.