Generate UGC-Style Content at Scale
Create authentic-looking user-generated content for social media ads and organic posts without hiring creators.
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.
Product demo format — developer at home office desk speaking to selfie camera about ToolRouterStep 1: Research audience pain points, language, triggers, and objections. Async (1-3 min). Do NOT skip. Pass full output to generate_creative.
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/callGenerate 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.
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/callGenerate 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.
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/callGenerate 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.
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/callGenerate 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.
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/callCreate 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.
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/callStep 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.
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/callStep 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.
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/callCheck 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.
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/callRe-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.
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/callREQUIRED 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.
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/callStitch 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.
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/callclaude mcp add --transport stdio \
--env TOOLROUTER_API_KEY=YOUR_API_KEY \
toolrouter -- npx -y toolrouter-mcpcurl -H "Authorization: Bearer $TOOLROUTER_API_KEY" \
-d '{"tool":"ugc-content","skill":"research_audience","input":{}}' \
https://api.toolrouter.com/v1/tools/callCreate authentic-looking user-generated content for social media ads and organic posts without hiring creators.
Generate realistic product review content that mimics the honest, conversational tone of genuine customer reviews.
Research what ads your competitors are running across Facebook and Google to understand their messaging and creative strategy.
Craft high-performing app titles and subtitles that maximize keyword visibility and conversion in the App Store.
Launch user-generated content campaigns by researching audiences, studying UGC examples, finding creators, and creating supporting visuals.
Produce authentic user-generated content videos with AI creative, natural voiceover, trending music, and subtle editing.
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.
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.
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.
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.