Docs · v1
Rate limits
Generation is metered in credits and input limits. Stay within script, audio, and file caps, and poll status instead of opening parallel generate calls for the same job.
Credit costs
Parameters
| Action | Cost |
|---|---|
| POST /video/generate | 100 per video |
| POST /custom-avatar/generate | 100 per avatar |
| Product-in-Hand Nova V2 | 100 per generation |
| Product-in-Hand Omi-Human | Under 15s: 100. 15–30s: 200. |
| Product-in-Hand Veo | scenes.length × (100 fast or 200 pro) |
| Content Library generate | Template credit value |
Input limits
- Voice script on video generate: max 1,500 characters
- Existing
voice_urlaudio: max 120 seconds - Custom avatar image or voice file: max 10MB each
- Product-in-Hand Nova V2 audio: max 90 seconds
- Product-in-Hand Omi-Human audio: max 30 seconds
- Veo scenes array: 1–4 scenes
Polling
Video processing time varies. Use the matching status endpoint and wait 5–10 seconds between
polls until completed or failed.
JavaScript polling loop
async function waitForVideo(id) {
for (;;) {
const response = await fetch(
`https://app.makeugc.ai/api/platform/video/status?id=${id}`,
{ headers: { "X-Api-Key": process.env.MAKEUGC_API_KEY } },
);
const payload = await response.json();
const state = payload.data?.status;
if (state === "completed" || state === "failed") return payload;
await new Promise((resolve) => setTimeout(resolve, 8000));
}
}
Insufficient credits
400 response
{
"status": false,
"message": "Missing image, invalid file type, file too large, or insufficient credits"
}
Questions
How many credits does video generation use?
Talking-actor video generation uses 100 per video. Custom avatars use 100 per avatar. Product-in-Hand and Content Library costs depend on the model or template.
What is the maximum voice script length?
Voice scripts are limited to 1,500 characters on POST /video/generate. Content Library templates may set a lower per-field max in require_fields.
How often should I poll job status?
Poll GET status endpoints every 5–10 seconds. Processing time varies with video length. Prefer webhooks when the endpoint accepts webhook_url, and keep polling as a fallback.
