Tools / UGC Content Generator
UGC Content Generator icon

UGC Content Generator

UGC videos and photos from product to post

Create authentic UGC-style videos and photos from a product description. Researches audience, writes scripts, generates AI scenes and clips across 16 formats — from product showcase and unboxing to lifestyle stills and flat lays. For marketers, DTC brands, and agencies.

12 skillsv0.06
Research Audience

Step 1: Research audience pain points, language, triggers, and objections. Async (1-3 min). Do NOT skip. Pass full output to generate_creative.

Returns: Structured audience research with pain points, problems, language patterns, emotional triggers, objections, and research summary
Parameters
company_name *stringCompany or brand name
product_name *stringProduct or feature name
product_description *stringDetailed description of the product and what it does
target_audiencestringOptional target audience description (e.g. "busy parents", "fitness beginners")
processorstringResearch depth: "core" (default, 1-3 min) or "pro" (deeper, 5-15 min)
source_domainsarrayOptional domains to focus research on (e.g. ["reddit.com", "trustpilot.com"])
Example
Research audience for an AI meal planning app
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "research_audience",
  "input": {
    "company_name": "NutriPlan",
    "product_name": "MealAI",
    "product_description": "AI-powered meal planning app that creates personalized weekly meal plans based on dietary preferences, budget, and schedule"
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Write Hooks

Generate UGC video hooks using the 3-variable framework (Angle + Aesthetic + Action). Uses RAG from the UGC playbook to apply proven hook patterns targeting 60%+ 3-second view rate. ⏱ Takes ~5 seconds. Step 2 of the UGC workflow — requires research output from step 1.

Returns: Array of hooks, each with text, angle, aesthetic, action, emotional trigger, and target pain point
Parameters
company_name *stringCompany or brand name
product_name *stringProduct or feature name
product_description *stringDetailed product description
research *objectAudience research output from research_audience step
num_hooksnumberNumber of hooks to generate (default 3)
content_archetypestringContent archetype to tailor hooks to (e.g. educational, entertainment)
personaobjectOptional creator persona for hook voice/style
llm_modelstringOpenRouter model ID (default google/gemini-2.5-flash)
Example
Generate 3 hooks from research
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "write_hooks",
  "input": {
    "company_name": "NutriPlan",
    "product_name": "MealAI",
    "product_description": "AI-powered meal planning app",
    "research": {
      "pain_points": [
        "spending too much time deciding what to cook"
      ],
      "emotional_triggers": [
        "overwhelm",
        "guilt"
      ]
    },
    "num_hooks": 3
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Write Scripts

Generate authentic UGC scripts using But/Therefore zigzag structure. Creates script variations for each hook with mini-hooks at key drop-off timestamps. Targets ~20 second duration with conversational, non-salesy tone. ⏱ Takes ~5-10 seconds per hook. Step 3 — requires hooks from step 2.

Returns: Array of scripts, each with hook_id, variation, hook_text, script_body, CTA, duration estimate, and mini-hooks at drop-off timestamps
Parameters
hooks *arrayArray of hooks from write_hooks step
company_name *stringCompany or brand name
product_name *stringProduct or feature name
product_description *stringDetailed product description
research *objectAudience research output from research_audience step
scripts_per_hooknumberNumber of script variations per hook (default 2)
content_archetypestringContent archetype to tailor scripts to
personaobjectOptional creator persona
llm_modelstringOpenRouter model ID (default google/gemini-2.5-flash)
Example
Generate 2 scripts per hook
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "write_scripts",
  "input": {
    "hooks": [
      {
        "id": "hook_1",
        "text": "I used to spend 2 hours deciding what to cook",
        "angle": "time-waste",
        "aesthetic": "selfie-rant",
        "action": "frustrated-face"
      }
    ],
    "company_name": "NutriPlan",
    "product_name": "MealAI",
    "product_description": "AI-powered meal planning app",
    "research": {
      "pain_points": [
        "decision fatigue around meals"
      ]
    },
    "scripts_per_hook": 2
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Generate Scenes

Generate visual scene descriptions for each script, optimized for AI image/video generation. Set "format" for format-specific direction. Takes ~5s per script. Step 4 — requires scripts from step 3.

Returns: Array of scenes, each with scene description, setting, lighting, wardrobe, camera angle, mood, and shot list with visual changes
Parameters
scripts *arrayArray of scripts from write_scripts step
formatstringUGC video format for format-specific scene direction. Omit for default talking-head style.
personaobjectOptional creator persona for visual consistency
familiar_elementsobjectRepetitive brand elements for memorability across videos
wardrobe_image_urlstringOptional URL to a wardrobe/outfit reference image for clothing consistency across scenes.
platformstringTarget platform for framing guidance. Defaults to tiktok.
llm_modelstringOpenRouter model ID (default google/gemini-2.5-flash)
Example
Generate scenes for scripts
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "generate_scenes",
  "input": {
    "scripts": [
      {
        "hook_id": "hook_1",
        "hook_text": "I used to spend 2 hours deciding what to cook",
        "script_body": "But then I found this app that plans my whole week in 30 seconds.",
        "cta": "Link in bio"
      }
    ]
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Generate Creative (Fast)

Generate hooks, scripts, and scene descriptions in one call (~8s). Set "format" for format-specific output (e.g. product_demo, grwm, unboxing, lifestyle_still). Photo formats return compositions instead of hooks/scripts. Step 2 — pass FULL research output from step 1.

Returns: Video: hooks, scripts, scenes arrays. Photo: compositions + scenes. Includes output_type, format_name, persona info, aspect_ratio.
Parameters
company_name *stringCompany or brand name
product_name *stringProduct or feature name
product_description *stringDetailed product description
research *objectAudience research output from research_audience step
formatstringUGC format. Most require persona_image_url. Product formats require product_images. See format docs for requirements.
num_hooksnumberNumber of hooks to generate (video formats, default 3)
num_compositionsnumberNumber of photo compositions to generate (photo formats, default 3)
scripts_per_hooknumberScript variations per hook (default 1)
aspect_ratiostringCustom aspect ratio (e.g. "9:16", "1:1", "4:5", "16:9"). Overrides platform and format defaults.
creative_directionstringOptional script direction, e.g. "focus on Claude not generating images by default" or "clickbaity discovery angle".
content_archetypestringContent archetype to tailor output to
personaobjectCreator persona. With appearance details and a turnaround sheet image URL, generated content depicts this person.
persona_image_urlstringHeadshot or turnaround URL for face consistency. Required for most formats (all except pov, voiceover_broll, lifestyle_still, aesthetic_moment).
wardrobe_image_urlstringURL to a wardrobe/outfit reference image. When provided, scenes emphasize this clothing in generated frames.
product_imagesarrayProduct image URLs (screenshots, photos, packaging). Required for: product_demo, product_showcase, unboxing, reaction, product_flat_lay, in_use_shot.
platformstringTarget platform — determines aspect ratio, duration limits, hook window, and text placement. Defaults to tiktok.
familiar_elementsobjectRepetitive brand elements for memorability
llm_modelstringOpenRouter model ID (default google/gemini-2.5-flash)
Example
Generate 3 hooks with scripts and scenes
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "generate_creative",
  "input": {
    "company_name": "NutriPlan",
    "product_name": "MealAI",
    "product_description": "AI-powered meal planning app",
    "research": {
      "pain_points": [
        "decision fatigue around meals"
      ],
      "emotional_triggers": [
        "overwhelm",
        "guilt"
      ]
    },
    "num_hooks": 3
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Create Voice Profile

Create a reusable voice profile for consistent voice across clips. Provide a voice_sample_url or auto-match from persona + accent. Returns a voice_id for generate_videos. Call after generate_creative.

Returns: Object with voice_id (reusable Kling voice profile ID), source ("user_sample" or "auto_generated"), and optionally elevenlabs_voice_id and elevenlabs_voice_name
Parameters
voice_sample_urlstringURL to a voice sample audio file (mp3/wav/mp4, 5-30s). If provided, skips auto-generation.
personaobjectPersona for auto voice matching. At least one of voice_sample_url or persona is required.
accentstringDesired accent (e.g. "british", "american", "australian"). Used for auto voice matching.
sample_textstringText to speak for the auto-generated voice sample. Defaults to the first hook text.
scriptsarrayScripts array — scripts[0].hook_text used as default sample text if sample_text not provided.
Example
Auto-generate voice profile from persona
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "create_voice_profile",
  "input": {
    "persona": {
      "name": "Chloe",
      "description": "Mixed race woman in her mid-20s from London",
      "tone": "casual and friendly"
    },
    "accent": "british",
    "scripts": [
      {
        "hook_text": "I used to spend 2 hours deciding what to cook"
      }
    ]
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Generate First Frames

Step 3: Generate first-frame images from scenes. Takes ~30s. Async — poll with get_job_result. Pass scenes array directly from generate_creative. Pass persona_image_url for face consistency. Captions added later via assemble_final.

Returns: Array of frames with image URLs and scene descriptions, plus asset paths for auto-upload
Parameters
scenes *arrayArray of scenes from generate_scenes step
persona_descriptionstringVisual description of the persona/creator for image generation
persona_image_urlstringReference image URL for persona. Always pass it — used for image-to-image conditioning to keep the face consistent.
wardrobe_image_urlstringOptional URL to a wardrobe/outfit reference image. When provided, each generated frame will get an edit pass to apply the exact clothing.
platformstringTarget platform — determines default aspect ratio. Defaults to tiktok (9:16).
modelstringfal.ai image model ID
aspect_ratiostringImage aspect ratio (overrides platform default if set)
Example
Generate first frames from scenes
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "generate_frames",
  "input": {
    "scenes": [
      {
        "script_index": 0,
        "scene_description": "Young woman in kitchen, looking frustrated at open fridge, selfie camera angle"
      }
    ]
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Generate Videos

Step 5: Generate video clips from first-frame images. Takes ~30-60s. Async — poll with get_job_result. Pass frames, scripts, and scenes arrays directly. Long scripts auto-split into segments with continuation keyframes.

Returns: Array of video clips with video URLs, script indices, segment indices, and duration. Long scripts are automatically split into multiple clips with consistent continuation keyframes.
Parameters
frames *arrayArray of frames from generate_frames step (objects with image_url, scene_description, script_index)
scripts *arrayArray of scripts from write_scripts step (full script objects with script_body, hook_text, cta)
scenes *arrayArray of scenes from generate_scenes step (scene objects with shot_list, setting, mood)
persona_descriptionstringVisual/behavioral description of the persona for video generation
modelstringVideo model key (default kling-3.0, resolved via model registry)
durationnumberTarget video duration in seconds. Defaults to model maximum. Automatically snapped to the nearest valid duration for the model.
voice_idstringKling voice_id from create_voice_profile. When provided, all clips use this voice with synced lip movement.
Example
Generate videos from frames
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "generate_videos",
  "input": {
    "frames": [
      {
        "image_url": "https://example.com/frame.png",
        "scene_description": "Kitchen selfie scene",
        "script_index": 0
      }
    ],
    "scripts": [
      {
        "hook_text": "I used to spend 2 hours deciding what to cook",
        "script_body": "But then I found this app that plans my whole week in 30 seconds. I just tell it what I like and it gives me a full plan with grocery list.",
        "cta": "Link in bio if you want to try it"
      }
    ],
    "scenes": [
      {
        "shot_list": [
          {
            "timestamp_seconds": 0,
            "description": "Frustrated face at fridge",
            "visual_change": "Close-up to medium shot"
          }
        ],
        "setting": "Modern kitchen",
        "mood": "Relatable frustration to excitement"
      }
    ]
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Check Video Status

Check on a pending video that was still generating when generate_videos returned. Pass the fal_request_id and fal_model_id from the pending_videos array. Returns the video URL if ready, or current status if still generating. You can check back any time — the video stays on fal.ai servers.

Returns: Video URL if completed, or current status (queued/running/failed) with instructions to check again
Parameters
fal_request_id *stringThe fal.ai request ID from pending_videos output
fal_model_idstringThe fal.ai model ID (e.g. fal-ai/kling-video/v3/pro/image-to-video)
Example
Check on a pending video
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "check_video",
  "input": {
    "fal_request_id": "abc123-def456",
    "fal_model_id": "fal-ai/kling-video/v3/pro/image-to-video"
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Regenerate Frame

Re-generate a single frame without re-running the full pipeline. Accepts optional revision notes for targeted edits. Use when a specific frame needs adjustment — much faster than regenerating all frames.

Returns: Single frame object with image URL and scene description, plus asset path
Parameters
frame_index *numberIndex of the frame to regenerate (0-based, must be within scenes array bounds)
scenes *arrayFull scenes array from generate_creative or generate_scenes output
persona_descriptionstringVisual description of the persona for image generation
persona_image_urlstringReference image URL for persona consistency
wardrobe_image_urlstringOptional wardrobe reference image URL
revision_notesstringWhat to change about this frame (e.g. "make her smile more", "change to outdoor setting")
modelstringfal.ai image model ID
aspect_ratiostringImage aspect ratio (overrides platform default)
platformstringTarget platform for default aspect ratio
Example
Regenerate frame 2 with revision notes
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "regenerate_frame",
  "input": {
    "frame_index": 2,
    "scenes": [
      {
        "script_index": 0,
        "scene_description": "Kitchen selfie scene"
      },
      {
        "script_index": 1,
        "scene_description": "Living room couch scene"
      },
      {
        "script_index": 2,
        "scene_description": "Outdoor park scene"
      }
    ],
    "revision_notes": "Make her smile more, change to outdoor setting with better lighting"
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Composite Product

REQUIRED for product_showcase format. Composites real product images (screenshots, photos) into generated frames via inpainting. Call after generate_frames, before generate_videos. Pass composited frames to generate_videos.

Returns: Array of composited frames with product naturally placed in each scene
Parameters
frames *arrayArray of frames from generate_frames (objects with image_url, scene_description, script_index)
product_images *arrayArray of product image URLs — turnaround sheets, hero shots, packaging photos
product_name *stringProduct name for the LLM placement prompt
product_descriptionstringBrief product description to guide natural placement
placement_hintsarrayOptional per-frame placement hints (e.g. "holding in left hand", "visible on desk"). One per frame.
strengthnumberHow much to change the frame (0.0 = no change, 1.0 = full replacement). Default 0.5.
Example
Composite a water bottle into UGC frames
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "composite_product",
  "input": {
    "frames": [
      {
        "image_url": "https://example.com/frame.png",
        "scene_description": "Kitchen selfie scene",
        "script_index": 0
      }
    ],
    "product_images": [
      "https://example.com/bottle-front.png",
      "https://example.com/bottle-side.png"
    ],
    "product_name": "HydroFlask Pro",
    "product_description": "Insulated stainless steel water bottle, matte black",
    "placement_hints": [
      "holding casually in right hand"
    ]
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Assemble Final Video

Stitch video clips into one final video with text overlays and transitions. Last step after generate_videos. Takes ~30-120s. Async — poll with get_job_result.

Returns: Final assembled video file (auto-uploaded via asset system)
Parameters
videos *arrayArray of videos from generate_videos (objects with video_url, script_index, duration_seconds)
scripts *arrayScripts array for text overlays (hook_text on first clip, cta on last clip)
platformstringTarget platform — determines video format and text placement. Defaults to tiktok.
transitionstringTransition effect between clips
transition_durationnumberTransition duration in seconds (0-2)
captionsbooleanWhether to overlay hook text and CTA on the video
styleobjectOptional style overrides for the final video
Example
Assemble TikTok video from clips
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{
  "tool": "ugc-content",
  "skill": "assemble_final",
  "input": {
    "videos": [
      {
        "video_url": "https://example.com/clip1.mp4",
        "script_index": 0,
        "duration_seconds": 10
      },
      {
        "video_url": "https://example.com/clip2.mp4",
        "script_index": 1,
        "duration_seconds": 10
      }
    ],
    "scripts": [
      {
        "hook_text": "I used to spend 2 hours deciding what to cook",
        "cta": "Link in bio"
      },
      {
        "hook_text": "But then I found this app",
        "cta": "Link in bio"
      }
    ],
    "platform": "tiktok"
  }
}' \
  https://api.toolrouter.com/v1/tools/call
Loading reviews...
Loading activity...
v0.062026-03-26
  • Added 16 UGC format templates: 11 video (talking_to_camera, product_demo, product_showcase, grwm, unboxing, before_after, problem_solution, storytime, pov, voiceover_broll, reaction) + 5 photo (lifestyle_still, product_flat_lay, in_use_shot, aesthetic_moment, mirror_selfie)
  • generate_creative now accepts "format" param for format-specific creative direction and scene generation
  • Photo formats produce compositions instead of hooks/scripts, mapped to scenes for generate_frames compatibility
  • Added "aspect_ratio" param for custom aspect ratios independent of platform presets
  • generate_scenes now accepts "format" param for format-specific video scene direction
v0.052026-03-23
  • Added create_voice_profile skill for consistent voice across video clips
  • Wired voice_id into generate_videos for synced lip movement across all clips
v0.042026-03-22
  • Added subtitle, expanded description, and agent instructions
v0.032026-03-21
  • Enhanced realism prompts across all image and video generation skills
v0.022026-03-20
  • Added platform-aware variants (tiktok, instagram_reels, youtube_shorts, instagram_stories, twitter)
  • Added wardrobe reference image support for clothing consistency
  • Added composite_product skill for real product placement via nano-banana-2 edit
  • Added regenerate_frame skill for scene-level iteration
  • Added assemble_final skill for video assembly via Remotion render server
v0.012026-03-20
  • Initial release

Quick Start

MCP (Claude Code)
claude mcp add --transport stdio \
  --env TOOLROUTER_API_KEY=YOUR_API_KEY \
  toolrouter -- npx -y toolrouter-mcp
REST API
curl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
  -d '{"tool":"ugc-content","skill":"research_audience","input":{}}' \
  https://api.toolrouter.com/v1/tools/call

Use Cases

Open Generate UGC-Style Content at Scale

Generate UGC-Style Content at Scale

Create authentic-looking user-generated content for social media ads and organic posts without hiring creators.

UGC Content Generator icon
UGC Content Generator
4 agent guides
Open Create Authentic Product Review Content

Create Authentic Product Review Content

Generate realistic product review content that mimics the honest, conversational tone of genuine customer reviews.

UGC Content Generator icon
UGC Content Generator
4 agent guides
Open Research Competitor Ad Creatives

Research Competitor Ad Creatives

Research what ads your competitors are running across Facebook and Google to understand their messaging and creative strategy.

Ad Library Search icon
Ad Library Search
4 agent guides
View all use cases for UGC Content Generator

Workflows

Open UGC Campaign Launcher

UGC Campaign Launcher

Launch user-generated content campaigns by researching audiences, studying UGC examples, finding creators, and creating supporting visuals.

UGC Content icon
UGC Content
Social Media Content icon
Social Media Content
Trending Social Content icon
Trending Social Content
Generate Image icon
Generate Image
4 steps4 tools
Open UGC Video Pipeline

UGC Video Pipeline

Produce authentic user-generated content videos with AI creative, natural voiceover, trending music, and subtle editing.

UGC Content icon
UGC Content
Video Editor icon
Video Editor
Music Generator icon
Music Generator
Voice Generator icon
Voice Generator
4 steps4 tools

Frequently Asked Questions

What is the fastest way to get a finished UGC ad?

Use the full pipeline when you want speed with structure: research the audience, generate creative, make frames and videos, then assemble the final cut. The tool also has a single-step creative path if you want a quicker draft.

How do I keep the same face or outfit across clips?

Pass a persona plus `persona_image_url` for face consistency, and use `wardrobe_image_url` when you want the outfit to stay the same from scene to scene.

Can I use a real product image in the generated scene?

Yes. `composite_product` is built for placing a real product into generated frames, which is useful when the ad needs to show the actual package or device.

What if one frame or clip looks off?

You do not have to rerun everything. `regenerate_frame` can fix a single scene, and `check_video` lets you inspect clips that are still rendering.