UGCLabUGCLab

Talking Actor

Create professional UGC videos featuring AI actors speaking your custom script

Create professional UGC videos featuring ultra-realistic AI actors speaking your custom script. Choose between two powerful workflows: UGCL 2.0 for maximum customization or UGCL 1.0 for extended duration support.

Create Talking Actor Video

Generate videos with AI actors speaking your script.

POST /ugc/talking-actor

Request Headers

HeaderRequiredDescription
AuthorizationYesBearer token with your API key
Content-TypeYesapplication/json

Workflows

UGCL 2.0 Workflow

The UGCL 2.0 workflow offers maximum customization with support for custom actors and storyboarding.

Request Body (UGCL 2.0)

{
  "projectId": "clxxx...",
  "workflowType": "ugcl-2.0",
  "actorIds": ["clyyy..."],
  "script": "Hello! Welcome to our product demo...",
  "actions": "Speaking enthusiastically, gesturing with hands",
  "duration": "15s",
  "tier": "standard",
  "variants": 1,
  "refineScript": true,
  "refineActions": true
}

UGCL 2.0 Parameters

ParameterTypeRequiredDefaultDescription
projectIdstringYes-Your project ID (CUID format)
workflowTypestringYes-Must be "ugcl-2.0"
actorIdsstring[]Conditional[]Array of actor IDs (max 20). Required if no customActors
customActorsobject[]Conditional[]Array of custom actor definitions (max 20). Required if no actorIds
scriptstringYes-The script for the actor to speak (10-3000 characters)
actionsstringYes-Actor actions and emotions (10-1000 characters)
durationstringYes-Video duration: "10s", "15s", or "25s" (storyboard)
tierstringNo"standard"Quality tier: "standard" or "pro"
variantsnumberNo1Number of video variants per actor (1-8)
refineScriptbooleanNotrueAI-enhance the script
refineActionsbooleanNotrueAI-enhance the actions
storyboardScenesobject[]NonullStoryboard scenes (2-3 scenes, 25s total). Only for 25s duration

Custom Actor Object

{
  "characterDescription": "A professional woman in her 30s with dark hair",
  "environment": "Modern office with glass windows",
  "sceneContext": "Corporate presentation setting",
  "cinematography": "Medium close-up, soft lighting",
  "audioAmbience": "Quiet office background",
  "ugcKeywords": "professional, trustworthy, confident",
  "refineCharacter": true,
  "refineEnvironment": true,
  "refineSceneContext": true,
  "refineCinematography": true,
  "refineAudioAmbience": true,
  "refineUgcKeywords": true
}

Storyboard Scene Object

{
  "duration": 10,
  "script": "Scene 1 dialogue...",
  "actions": "Actor walks into frame",
  "refineScript": true,
  "refineActions": true
}

UGCL 2.0 Pricing

DurationStandard TierPro Tier
10s63 credits88 credits
15s75 credits125 credits
25s (storyboard)113 credits113 credits

UGCL 1.0 Workflow

The UGCL 1.0 workflow uses cutting-edge video generation with extended duration support.

Request Body (UGCL 1.0)

{
  "projectId": "clxxx...",
  "workflowType": "ugcl-1.0",
  "ugclabActorIds": ["clzzz..."],
  "script": "Hello! Welcome to our product demo...",
  "actions": "Speaking naturally",
  "ugclabMode": "pro",
  "veoDuration": "15s",
  "variants": 1
}

UGCL 1.0 Parameters

ParameterTypeRequiredDefaultDescription
projectIdstringYes-Your project ID (CUID format)
workflowTypestringYes-Must be "ugcl-1.0"
ugclabActorIdsstring[]Yes-Array of UGCLab actor IDs (1-20 required)
scriptstringYes-The script for the actor to speak (10-2000 characters)
actionsstringNo""Actor actions and emotions (max 1000 characters)
ugclabModestringNo"pro"Quality mode: "std" or "pro"
veoDurationstringNo"8s"Video duration: "8s", "15s", "22s", "30s"
variantsnumberNo1Number of video variants per actor (1-8)

UGCL 1.0 Pricing

DurationStandard ModePro Mode
8s32 credits93 credits
15s60 credits133 credits
22s88 credits200 credits
30s120 credits267 credits

Response

Success Response (202 Accepted)

{
  "data": {
    "jobs": [
      {
        "ugcId": "clxxx...",
        "actorId": "clyyy...",
        "variantIndex": 0,
        "status": "PENDING",
        "creditsCharged": 75
      }
    ],
    "totalCreditsCharged": 75,
    "remainingCredits": 4925
  },
  "meta": {
    "requestId": "req_abc123def456",
    "timestamp": "2025-01-15T10:30:00.000Z"
  }
}

Examples

# UGCL 2.0 Workflow
curl -X POST https://api.ugclab.app/api/v1/ugc/talking-actor \
  -H "Authorization: Bearer ugc_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "clxyz123...",
    "workflowType": "ugcl-2.0",
    "actorIds": ["clactor123..."],
    "script": "Hi there! I just tried this amazing product.",
    "actions": "Speaking excitedly, making eye contact with camera",
    "duration": "15s",
    "tier": "standard",
    "variants": 1
  }'

# UGCL 1.0 Workflow
curl -X POST https://api.ugclab.app/api/v1/ugc/talking-actor \
  -H "Authorization: Bearer ugc_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "projectId": "clxyz123...",
    "workflowType": "ugcl-1.0",
    "ugclabActorIds": ["clugcactor123..."],
    "script": "Welcome to my honest review.",
    "ugclabMode": "pro",
    "veoDuration": "15s"
  }'
const response = await fetch('https://api.ugclab.app/api/v1/ugc/talking-actor', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer ugc_your_api_key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    projectId: 'clxyz123...',
    workflowType: 'ugcl-2.0',
    actorIds: ['clactor123...'],
    script: 'Hi there! I just tried this amazing product.',
    actions: 'Speaking excitedly, holding product',
    duration: '15s',
    tier: 'standard',
    variants: 1,
  }),
});

const data = await response.json();

if (response.ok) {
  console.log('Jobs created:', data.data.jobs);
  console.log('Total credits charged:', data.data.totalCreditsCharged);
} else {
  console.error('Error:', data.error.message);
}
import requests

response = requests.post(
    'https://api.ugclab.app/api/v1/ugc/talking-actor',
    headers={
        'Authorization': 'Bearer ugc_your_api_key',
        'Content-Type': 'application/json',
    },
    json={
        'projectId': 'clxyz123...',
        'workflowType': 'ugcl-2.0',
        'actorIds': ['clactor123...'],
        'script': 'Hi there! I just tried this amazing product.',
        'actions': 'Speaking excitedly, holding product',
        'duration': '15s',
        'tier': 'standard',
        'variants': 1,
    }
)

data = response.json()

if response.ok:
    print(f"Jobs created: {len(data['data']['jobs'])}")
    print(f"Total credits: {data['data']['totalCreditsCharged']}")
else:
    print(f"Error: {data['error']['message']}")

Error Codes

CodeHTTP StatusDescription
VALIDATION_ERROR400Invalid request parameters
INVALID_ACTOR_IDS400One or more actor IDs are invalid
INVALID_UGCLAB_ACTOR_IDS400One or more UGCLab actor IDs are invalid
ACTOR_MISSING_IMAGE400Some actors are missing image configuration
INSUFFICIENT_CREDITS402Not enough credits in workspace
PROJECT_NOT_FOUND404Project not found in workspace
IP_RATE_LIMITED429Too many authentication attempts
RATE_LIMIT_EXCEEDED429API rate limit exceeded
INTERNAL_ERROR500Internal server error

Best Practices

Use tier: "standard" for testing to save credits before final production runs.

  1. Use webhooks: Instead of polling for status, configure webhooks to receive real-time updates.
  2. Batch efficiently: Use multiple actors and variants in a single request rather than making multiple requests.
  3. Handle rate limits: Implement exponential backoff when you receive 429 responses.
  4. Script length: For best lip-sync quality, keep scripts concise.
  5. Test with Standard tier: Use tier: "standard" for testing before final production runs.

On this page