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.

Input
Output
Insulated bottle · street interview

~$3 per video·Run it free in the playground, then call it from your app.

What it is, who it's for, what to land. URL works.

Loading…

No inputs handy? Try one of these

Output appears here — run the skill, or pick an example to see a real input/output pair.

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
MCP· recommended for coding agents
claude mcp add --transport http puras https://mcp.puras.co/mcp

OAuth on first call — no key to paste. Then ask the agent to run ugc-video from skill puras/product-ad-studio.

CLI
pip install puras puras login # or set PURAS_API_KEY puras run puras/product-ad-studio/ugc-video -i key=value
Python SDK
import 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})
HTTP API· wait=true blocks until the job finishes
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"
    }
  }
}
SpecDocs

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.