UGC video generation

01What is it?
Generate authentic user-generated content (UGC) style videos using the each::sense API. It stands out by giving content production a defined shape, so the agent asks for better context and returns a more usable result.
02Inputs
Context for content production: your goals, audience, constraints, and any source material the skill asks for.
03Output
A ready-to-use result for content production: the analysis, copy, or recommendations the agent produces.
Install-only

Install as a package

Installs this one skill package for your coding agent, including any supporting files that skill ships with — not every skill in the repository. Read the tutorial.

Terminal
$ npx skills add eachlabs/skills --skill "UGC Video Generation"

Skill instructions

The instruction file for this skill. The skill also includes other files you need to install to use it.

SKILL.md

UGC Video Generation

Generate authentic user-generated content (UGC) style videos using the each::sense API. Create testimonials, unboxing videos, product reviews, tutorials, and selfie-style content that feels natural and relatable.

Overview

UGC videos are characterized by their authentic, casual feel - as if recorded by a real person on their phone. This skill enables you to generate:

  • Testimonial Videos: Talking head style content with genuine-feeling endorsements
  • Unboxing Videos: First impressions and product reveals
  • Product Reviews: Honest-feeling assessments and demonstrations
  • Before/After Content: Transformation reveals and comparisons
  • Tutorial Videos: How-to and instructional content
  • Day-in-Life: Lifestyle content featuring products naturally
  • Get Ready With Me (GRWM): Personal routine content
  • Reaction Videos: Authentic responses and first impressions

Quick Start

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a UGC testimonial video of a woman in her 30s talking about how this skincare product changed her skin. Casual iPhone footage look, natural lighting, filmed in her bathroom. She should be excited but genuine."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

UGC Video Formats

FormatDescriptionBest For
TestimonialTalking head, direct to cameraProduct endorsements, service reviews
UnboxingFirst-time product revealE-commerce, subscription boxes, tech
TutorialStep-by-step demonstrationBeauty, DIY, software, cooking
ReviewIn-depth product assessmentElectronics, apps, services
Before/AfterTransformation revealFitness, beauty, home improvement
Day-in-LifeLifestyle integrationWellness, productivity, fashion
GRWMPersonal routine showcaseBeauty, fashion, lifestyle
ReactionFirst impression responseEntertainment, products, reveals

Use Case Examples

1. Testimonial Video (Talking Head)

Generate a genuine-feeling customer testimonial.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a UGC testimonial video. A young professional man in his late 20s sits on his couch, talking directly to camera. He shares how the meal prep service saved him hours every week. iPhone selfie camera angle, living room setting with natural window light. Casual clothes, authentic delivery - not scripted feeling. He should occasionally look away thinking, then back at camera. 15-20 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

2. Product Unboxing

Create an authentic unboxing experience video.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Generate an unboxing video UGC style. A college-age woman opens a subscription beauty box on her bed. POV angle showing her hands and reactions. She pulls items out one by one, showing genuine excitement and surprise. Natural bedroom lighting, casual setting with some clutter visible. She comments on each product as she discovers it. iPhone footage aesthetic, 20-25 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

3. Before/After Transformation

Show a transformation with authentic reveal moment.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a before/after UGC video for a fitness app. Split format or transition style. Person films themselves in mirror - first clip shows them at the start of their journey (tired, unsure), then cut/transition to 3 months later (confident, energetic, visible progress). Bathroom or bedroom mirror, natural phone recording style. Include authentic facial expressions - nervous in before, proud in after. 15 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

4. Tutorial/How-To

Generate step-by-step instructional content.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a UGC tutorial video showing how to use a face serum. POV hands-on demonstration. Woman applies product step by step - cleanser first, then serum application technique, gentle patting motions. Bathroom counter setup, ring light visible in reflection for authenticity. She explains each step casually like talking to a friend. Some minor mistakes are okay - keeps it real. 25-30 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

5. Review Style

Create an honest-feeling product review.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Generate a UGC product review video. Man in his 40s reviews wireless earbuds from his home office. He shows the product, tests features, shares honest pros and cons. Webcam quality footage, casual home office background with some personalization visible. He demonstrates the fit, tests the sound, mentions battery life from his experience. Conversational tone, not overly polished. 30 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

6. Day in the Life

Show natural product integration into daily routine.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a day-in-the-life UGC video featuring a productivity app. Quick montage style - morning routine checking the app with coffee, using it during commute, referencing it during work, end of day review. Young professional woman, various locations throughout her day. iPhone footage, some clips handheld, some propped up. Natural lighting varies by scene. Lifestyle content feel, 20-25 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

7. Get Ready With Me (GRWM)

Generate personal routine content.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a GRWM (Get Ready With Me) UGC video. Woman does her morning skincare and makeup routine while casually chatting to camera. Bathroom vanity setup, phone propped against mirror. She applies each product naturally, mentioning what she uses and why. Soft morning light, slightly messy counter with various products. Relaxed, friendly vibe like catching up with a friend. 30-35 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

8. Reaction Video

Capture authentic first impression responses.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Generate a reaction video UGC style. Teen reacts to trying a new snack for the first time. Selfie angle, bedroom background with posters visible. Initial skepticism, first bite, genuine surprise at the taste, enthusiastic recommendation. Raw, unfiltered reactions - could be positive or comically disgusted. Natural facial expressions, authentic Gen-Z energy. 15 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "mode": "max"
  }'

9. Consistent Character with Image Reference

Use image_urls to maintain consistent presenter across videos.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a UGC testimonial video using the person in the reference image. They should be in their kitchen, talking about their experience with a cooking app. Natural morning light, casual pajamas, coffee in hand. Genuine enthusiasm about how the app helped them learn to cook. iPhone front camera angle, 20 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "image_urls": ["https://example.com/your-presenter-reference.jpg"],
    "mode": "max"
  }'

10. Product-Focused UGC with Visual Reference

Include product images for consistent product appearance.

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create an unboxing and first impressions UGC video featuring this product. Young woman opens the package at her desk, examines the product from the reference image, tests it out, shares initial thoughts. Home office setting, afternoon light from window, laptop visible in background. Authentic excitement, genuine reactions. 25 seconds."}],
    "model": "eachsense/beta",
    "stream": true,
    "image_urls": ["https://example.com/your-product-image.jpg"],
    "mode": "max"
  }'

Best Practices for Authentic UGC Feel

Visual Authenticity

  • Request "iPhone footage" or "phone camera quality" in prompts
  • Include natural lighting variations (window light, bathroom lighting)
  • Allow for slight camera shake or imperfect framing
  • Show real environments with some clutter or personalization

Performance Authenticity

  • Ask for "genuine" or "authentic" reactions
  • Include natural pauses, thinking moments, looking away
  • Request conversational, not scripted-sounding delivery
  • Allow for minor imperfections - they add credibility

Setting Authenticity

  • Use real-life locations: bedrooms, bathrooms, kitchens, offices
  • Include background elements that feel lived-in
  • Match lighting to location (ring light for beauty, natural for lifestyle)
  • Show products in natural use contexts

Prompt Tips

For iPhone Footage Look

Include phrases like:

  • "iPhone selfie camera angle"
  • "Front-facing camera perspective"
  • "Phone propped up on surface"
  • "Handheld phone footage"
  • "Vertical video format"

For Natural Lighting

Specify:

  • "Natural window light"
  • "Morning bathroom lighting"
  • "Soft afternoon light"
  • "Ring light visible in background" (for beauty content)

For Casual Settings

Describe:

  • "Bedroom with unmade bed visible"
  • "Bathroom counter with products scattered"
  • "Living room couch, relaxed setting"
  • "Kitchen counter, morning routine"

For Authentic Delivery

Request:

  • "Conversational tone, like talking to a friend"
  • "Genuine reactions, not over-performed"
  • "Natural pauses and thinking moments"
  • "Casual speech with some filler words"

Mode Selection

ModeBest ForQuality
maxFinal content, campaign assetsHighest quality, longer processing
ecoDrafts, testing concepts, iterationsFaster, lower cost
# High quality for final assets
"mode": "max"

# Quick draft for concept testing
"mode": "eco"

Multi-Turn Iteration with Session ID

Use session_id to maintain context and create consistent content across a series.

Initial Video

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a UGC testimonial. Young woman talks about discovering a new vitamin brand. Casual, in her kitchen, morning light. She explains why she decided to try it."}],
    "model": "eachsense/beta",
    "stream": true,
    "session_id": "ugc-campaign-001",
    "mode": "max"
  }'

Follow-Up Video (Same Presenter)

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Create a follow-up video with the same presenter. Now she has been using the vitamins for 2 weeks. Same kitchen setting but different outfit. She shares her experience so far - more energy, better sleep. Still casual and genuine."}],
    "model": "eachsense/beta",
    "stream": true,
    "session_id": "ugc-campaign-001",
    "mode": "max"
  }'

Series Conclusion

curl -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $EACHLABS_API_KEY" \
  -H "Accept: text/event-stream" \
  -d '{
    "messages": [{"role": "user", "content": "Final video in the series with our presenter. One month update. She gives her honest final review, would she recommend it? Kitchen setting, but this time shes making her morning smoothie while talking. Natural integration of the product into her routine."}],
    "model": "eachsense/beta",
    "stream": true,
    "session_id": "ugc-campaign-001",
    "mode": "max"
  }'

Error Handling

ErrorCauseSolution
401 UnauthorizedInvalid or missing API keyVerify EACHLABS_API_KEY is set correctly
400 Bad RequestMalformed request bodyCheck JSON syntax and required parameters
413 Payload Too LargeImage files too largeCompress images or use smaller files
429 Rate LimitedToo many requestsImplement backoff, reduce request frequency
500 Server ErrorProcessing failureRetry with exponential backoff

Retry Example

# Simple retry with delay
for i in 1 2 3; do
  response=$(curl -s -w "%{http_code}" -X POST "https://eachsense-agent.core.eachlabs.run/v1/chat/completions" \
    -H "Content-Type: application/json" \
    -H "X-API-Key: $EACHLABS_API_KEY" \
    -H "Accept: text/event-stream" \
    -d '{
      "messages": [{"role": "user", "content": "Create a quick UGC testimonial video, casual selfie style, 10 seconds."}],
      "model": "eachsense/beta",
    "stream": true,
      "mode": "eco"
    }')

  http_code="${response: -3}"
  if [ "$http_code" = "200" ]; then
    echo "Success"
    break
  fi

  echo "Attempt $i failed with code $http_code, retrying..."
  sleep $((i * 2))
done

Related Skills

  • Video Generation: General video creation capabilities
  • Image Generation: Create reference images for consistent characters
  • Voice Audio: Generate voiceovers for UGC content
  • Video Edit: Post-process and edit generated UGC videos

Supporting file: references/SSE-EVENTS.md

SSE Event Reference

Detailed documentation for all Server-Sent Events (SSE) returned by the each::sense /v1/chat/completions endpoint.

Event Format

Events are wrapped in OpenAI chat.completion.chunk format with an eachlabs extension field:

data: {"id":"chatcmpl-123","object":"chat.completion.chunk","choices":[{"delta":{"content":""}}],"eachlabs":{"type":"event_type",...}}\n\n

Stream ends with:

data: [DONE]\n\n

Event Types (18 Total)

thinking_delta

AI reasoning streamed in real-time. Use this to show users what the AI is thinking.

{
  "type": "thinking_delta",
  "content": "Let me find the best model for portrait generation..."
}
FieldTypeDescription
contentstringIncremental thinking text

text_response

Assistant message content (explanations, answers, plans).

{
  "type": "text_response",
  "content": "I'll create a stunning portrait for you with cinematic lighting and a warm mood."
}
FieldTypeDescription
contentstringText response content

status

Current operation being executed. Shows tool usage and parameters.

{
  "type": "status",
  "message": "Searching for image generation models...",
  "tool_name": "search_models",
  "parameters": {"use_case": "text to image portrait"}
}
FieldTypeDescription
messagestringHuman-readable status message
tool_namestringInternal tool being used
parametersobjectTool parameters (optional)

tool_call

Details of a tool being called. Useful for debugging and transparency.

{
  "type": "tool_call",
  "name": "execute_model",
  "input": {
    "model_name": "flux-2-max",
    "inputs": {
      "prompt": "A beautiful woman portrait...",
      "aspect_ratio": "1:1"
    }
  }
}
FieldTypeDescription
namestringTool name
inputobjectTool input parameters

message

Informational message from the agent.

{
  "type": "message",
  "content": "Your video is being processed. This typically takes 2-3 minutes."
}
FieldTypeDescription
contentstringMessage content

progress

Progress update with percentage completion.

{
  "type": "progress",
  "message": "Generating image...",
  "percent": 65
}
FieldTypeDescription
messagestringProgress description
percentnumberCompletion percentage

generation_response

Generated media URL (image, video, audio). This is the primary output event.

{
  "type": "generation_response",
  "url": "https://storage.eachlabs.ai/outputs/abc123.png",
  "generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
  "model": "flux-2-max",
  "execution_time_ms": 8500
}
FieldTypeDescription
urlstringPrimary output URL
generationsarrayAll generated URLs
modelstringModel used for generation
execution_time_msnumberProcessing time in milliseconds

clarification_needed

AI needs more information to proceed. Present options to the user.

{
  "type": "clarification_needed",
  "question": "What type of edit would you like to make to this image?",
  "options": [
    "Remove the background",
    "Apply a style transfer",
    "Upscale to higher resolution",
    "Add or modify elements"
  ],
  "context": "I can see you've uploaded an image, but I need to understand what changes you'd like.",
  "requires_response": true
}
FieldTypeDescription
questionstringThe question to ask the user
optionsarraySuggested options (can be displayed as buttons)
contextstringAdditional context about the clarification
requires_responsebooleanWhether a response is required to proceed

Handling: Display the question and options to the user. Send their response in a follow-up request with the same session_id.


web_search_query

Web search being executed.

{
  "type": "web_search_query",
  "query": "best AI video generation models 2024",
  "recency": "month"
}
FieldTypeDescription
querystringSearch query
recencystringTime filter (day, week, month, year)

web_search_citations

Citations from web search results.

{
  "type": "web_search_citations",
  "citations": [
    {"title": "AI Video Comparison", "url": "https://example.com/ai-video", "snippet": "..."}
  ]
}
FieldTypeDescription
citationsarrayArray of objects with title, url, snippet

workflow_created

New workflow was created for complex multi-step generation.

{
  "type": "workflow_created",
  "workflow_id": "wf_abc123",
  "version_id": "v1",
  "steps_count": 5
}
FieldTypeDescription
workflow_idstringUnique workflow identifier
version_idstringWorkflow version
steps_countnumberNumber of steps in workflow

workflow_fetched

Existing workflow was loaded (when workflow_id is provided in request).

{
  "type": "workflow_fetched",
  "workflow_name": "Product Video Generator",
  "existing_steps": 3,
  "existing_definition": {}
}
FieldTypeDescription
workflow_namestringName of the workflow
existing_stepsnumberNumber of existing steps
existing_definitionobjectCurrent workflow definition

workflow_built

Workflow definition was constructed.

{
  "type": "workflow_built",
  "steps_count": 4,
  "definition": {
    "version": "v1",
    "input_schema": {},
    "steps": []
  }
}
FieldTypeDescription
steps_countnumberNumber of steps
definitionobjectFull workflow definition

workflow_updated

Workflow was pushed to the EachLabs API.

{
  "type": "workflow_updated",
  "success": true,
  "workflow_id": "wf_abc123",
  "version_id": "v1",
  "definition": {}
}
FieldTypeDescription
successbooleanWhether update succeeded
workflow_idstringWorkflow identifier
version_idstringVersion identifier
definitionobjectUpdated definition

execution_started

Workflow execution has begun.

{
  "type": "execution_started",
  "execution_id": "exec_xyz789",
  "workflow_id": "wf_abc123"
}
FieldTypeDescription
execution_idstringUnique execution identifier
workflow_idstringWorkflow being executed

execution_progress

Progress update during workflow execution.

{
  "type": "execution_progress",
  "step_id": "step2",
  "completed_steps": 2,
  "total_steps": 5
}
FieldTypeDescription
step_idstringCurrent step identifier
completed_stepsnumberSteps completed so far
total_stepsnumberTotal steps in workflow

execution_completed

Workflow execution finished.

{
  "type": "execution_completed",
  "execution_id": "exec_xyz789",
  "output": "https://storage.eachlabs.ai/outputs/final.mp4",
  "all_outputs": {
    "step1": "https://storage.eachlabs.ai/outputs/step1.png",
    "step2": "https://storage.eachlabs.ai/outputs/step2.png",
    "step3": "https://storage.eachlabs.ai/outputs/final.mp4"
  },
  "total_time_ms": 45000
}
FieldTypeDescription
execution_idstringExecution identifier
outputstringFinal output URL
all_outputsobjectAll step outputs keyed by step_id
total_time_msnumberTotal execution time in milliseconds

complete

Final event with summary. Always sent when stream completes.

{
  "type": "complete",
  "task_id": "chat_1708345678901",
  "status": "ok",
  "generations": ["https://storage.eachlabs.ai/outputs/abc123.png"],
  "model": "flux-2-max"
}
FieldTypeDescription
task_idstringUnique task identifier
statusstringFinal status (ok, error, clarification_needed)
generationsarrayAll generated output URLs
modelstringPrimary model used

Status values:

  • ok - Completed successfully
  • clarification_needed - Waiting for user clarification
  • error - An error occurred

error

An error occurred during processing.

{
  "type": "error",
  "message": "Failed to generate image: Invalid aspect ratio",
  "error_code": "INVALID_INPUT",
  "details": {}
}
FieldTypeDescription
messagestringError message
error_codestringError code identifier
detailsobjectAdditional error details

Event Flow Examples

Simple Image Generation

thinking_delta → "I'll create a beautiful portrait..."
status → "Searching for models..."
status → "Getting model details..."
text_response → "Here's your generated image..."
generation_response → {url: "https://...", model: "flux-2-max", execution_time_ms: 8500}
complete → {status: "ok", generations: [...]}
[DONE]

Clarification Flow

thinking_delta → "I see an image, but need to know what edit..."
clarification_needed → {question: "What edit?", options: [...]}
complete → {status: "clarification_needed"}
[DONE]

Workflow Execution

thinking_delta → "Creating a multi-step workflow..."
status → "Searching for models..."
workflow_created → {workflow_id: "wf_123", steps_count: 5}
execution_started → {execution_id: "exec_456"}
execution_progress → {completed_steps: 1, total_steps: 5}
execution_progress → {completed_steps: 2, total_steps: 5}
execution_progress → {completed_steps: 3, total_steps: 5}
execution_progress → {completed_steps: 4, total_steps: 5}
execution_completed → {output: "https://...", all_outputs: {...}, total_time_ms: 45000}
complete → {status: "ok"}
[DONE]

Web Search

thinking_delta → "Let me search for current information..."
web_search_query → {query: "best AI models 2024"}
status → "Searching the web..."
web_search_citations → {citations: [{title, url, snippet}, ...]}
text_response → "Based on current information..."
complete → {status: "ok"}
[DONE]

How do I install UGC video generation in Cursor, Claude Code, or Codex?

Run npx skills add eachlabs/skills --skill "UGC Video Generation" in the project where you want it, then ask your agent for the skill by name. The --skill flag installs only UGC video generation, not every skill in the repository.

Where does UGC video generation come from and what license is it under?

UGC video generation comes from the eachlabs/skills repository on GitHub. That repository has 18 GitHub stars. No license was detected on the source repository, so check with the author before redistributing it.

Prefer plain text? Read the UGC video generation guide as markdown.