Docs · v1
Video
List avatars and voices, start a talking-actor generation job, then poll until the MP4 URL is ready.
GET/video/avatars
Retrieve template and custom avatars available to the authenticated account.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
gender |
query | No | Male or Female |
curl -X GET "https://app.makeugc.ai/api/platform/video/avatars" \
-H "X-Api-Key: YOUR_API_KEY"
const response = await fetch("https://app.makeugc.ai/api/platform/video/avatars", {
headers: { "X-Api-Key": "YOUR_API_KEY" },
});
const payload = await response.json();
import requests
response = requests.get(
"https://app.makeugc.ai/api/platform/video/avatars",
headers={"X-Api-Key": "YOUR_API_KEY"},
)
print(response.json())
200 response
{
"status": true,
"message": "Avatars fetched",
"data": [
{
"id": "avatar_123",
"name": "Avatar Name",
"thumbnail": "https://...",
"gender": "Male"
}
]
}
GET/video/voices
Retrieve template voices and the current user’s custom voices.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
language |
query | No | Filter by language name |
gender |
query | No | For example Male or Female |
200 response
{
"status": true,
"message": "Voices fetched",
"data": [
{
"id": "voice_123",
"name": "Voice Name",
"language": "English",
"gender": "Female",
"templateUrl": "https://...",
"thumbnail": "https://...",
"voiceId": "internal_tts_voice_id",
"accent": "US",
"country": "United States",
"isCustom": false
}
]
}
POST/video/generate
Create a talking-actor video. Keep scripts concise; max 1,500 characters.
Parameters
| Name | Required | Description |
|---|---|---|
avatar_id |
Yes | Avatar to render |
voice_script |
Yes | Spoken script, max 1,500 characters |
video_name |
No | Defaults to “API Generated Video” |
voice_url |
No | Existing audio URL; skips TTS; max 120s |
voice_id |
No | Voice actor; otherwise the avatar default |
voice_settings |
No | stability, similarity_boost, style (0–1), use_speaker_boost |
webhook_url |
No | HTTPS callback for status updates |
Request body
{
"avatar_id": "string",
"voice_script": "string",
"video_name": "string",
"voice_url": "string",
"voice_id": "string",
"voice_settings": {
"stability": 0.75,
"similarity_boost": 0.4,
"style": 0,
"use_speaker_boost": true
},
"webhook_url": "string"
}
curl -X POST "https://app.makeugc.ai/api/platform/video/generate" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"avatar_id": "avatar_123",
"voice_script": "Here is a 15-second product hook.",
"voice_id": "voice_123",
"webhook_url": "https://example.com/webhooks/makeugc"
}'
const response = await fetch("https://app.makeugc.ai/api/platform/video/generate", {
method: "POST",
headers: {
"X-Api-Key": process.env.MAKEUGC_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
avatar_id: "avatar_123",
voice_script: "Here is a 15-second product hook.",
voice_id: "voice_123",
}),
});
import os
import requests
response = requests.post(
"https://app.makeugc.ai/api/platform/video/generate",
headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
json={
"avatar_id": "avatar_123",
"voice_script": "Here is a 15-second product hook.",
"voice_id": "voice_123",
},
)
200 response
{
"status": true,
"message": "Video generation started",
"data": {
"id": "video_123"
}
}
Status codes
- 200 Success
- 400 Missing required fields or invalid input
- 401 Not authenticated
- 404 Avatar or voice not found
- 500 Server error
GET/video/status
Check a generation job. url is present when status is completed.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
id |
query | Yes | Video id returned from generate |
200 response
{
"status": true,
"message": "Video is processing",
"data": {
"status": "processing",
"url": "https://..."
}
}
Questions
Which audio source does generate use?
Priority is voice_url, then voice_id, then the avatar’s default voice. An inaccessible voice_url or audio longer than 120 seconds is rejected.
How do I know when a video is ready?
POST /video/generate returns a job id. Poll GET /video/status?id={id} every 5–10 seconds until data.status is completed (url present) or failed.
