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_url audio: 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

JavaScript javascript
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

JSON json
{
  "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.