MAKEUGC PLATFORM API · DOCS V2
Motion Control
Transfer motion from a reference video to a character image.
Workflow
- Host a character image and a reference motion video at accessible URLs.
- Choose WAN Animate, Kling Motion Control or MiniMax Recast and check that model's media limits.
- 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
WAN Animate
Animate a character image using a source performance video.
wan-animate Kling 3.0 Motion Control · StandardTransfer a performer's motion to a character image.
kling-3-motion-control-standard Kling 3.0 Motion Control · ProTransfer a performer's motion to a character image.
kling-3-motion-control-pro MiniMax H3 Max · RecastRecast with MiniMax H3 Max.
minimax-h3-max-recastExample 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 --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"
}
}'
// 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);
# 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.