Skip to content
Developers
API docs / Features

MAKEUGC PLATFORM API · DOCS V2

Motion Control

Transfer motion from a reference video to a character image.

Workflow

  1. Host a character image and a reference motion video at accessible URLs.
  2. Choose WAN Animate, Kling Motion Control or MiniMax Recast and check that model's media limits.
  3. Submit with that model's image and video fields, then poll for the resulting video.
WAN Animate returns a request_id prefixed with wan-animate:. Preserve the full ID when polling.
Motion quality depends on source framing and subject visibility. Input names and duration limits differ by model.
These workflows use the public model generation endpoints. The selected model controls available parameters and billing.
For /enterprise/generate, save request_id and poll /enterprise/status/{request_id}?media=video (or image for image models). Status 0 is processing, 1 is completed and 2 is failed. Video output is video_url; image output is output.output_link.
For /seedance/generate, save data.id and poll /seedance/status?id=ID. Read data.status and the completed data.url. Keep these two response formats separate.

Example IDs and media URLs are placeholders. Replace them with values from your account and accessible media files.

Choose a model

Example request

This example uses WAN Animate. Replace media URLs with your own files. The model reference documents all options and the matching status request.

cURL
curl --fail-with-body --max-time 120 -X POST "https://app.makeugc.ai/api/platform/enterprise/generate" \
  -H "X-Api-Key: $MAKEUGC_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "model": "wan-animate",
  "params": {
    "image_url": "https://your-cdn.example/product.jpg",
    "video_url": "https://your-cdn.example/source.mp4"
  }
}'
JavaScript
// Run on your server with Node.js 20+.
const apiKey = process.env.MAKEUGC_API_KEY;
if (!apiKey) throw new Error("Set MAKEUGC_API_KEY first");

const response = await fetch("https://app.makeugc.ai/api/platform/enterprise/generate", {
  method: "POST",
  headers: {
    "X-Api-Key": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "model": "wan-animate",
  "params": {
    "image_url": "https://your-cdn.example/product.jpg",
    "video_url": "https://your-cdn.example/source.mp4"
  }
}),
  signal: AbortSignal.timeout(120000),
});
const text = await response.text();
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${text} (request ${response.headers.get("x-request-id")})`);
}
const result = JSON.parse(text);
console.log(result);
Python
# Install the requests package before running.
import os
import requests

payload = {
    "model": "wan-animate",
    "params": {
        "image_url": "https://your-cdn.example/product.jpg",
        "video_url": "https://your-cdn.example/source.mp4"
    }
}

response = requests.post(
    "https://app.makeugc.ai/api/platform/enterprise/generate",
    headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
    json=payload,
    timeout=120,
)
if not response.ok:
    raise RuntimeError(f"HTTP {response.status_code}: {response.text} "
                       f"(request {response.headers.get('x-request-id')})")
print(response.json())

See Jobs & status for polling and result formats.