Skip to content
Developers
API docs / Models

MAKEUGC PLATFORM API · DOCS V2

Kling 3.0 Motion Control · Pro

Transfer a performer's motion to a character image.

VIDEO OUTPUT

Request

POST /enterprise/generate

Model ID: kling-3-motion-control-pro. Put model inputs inside params; keep model and project_id at the top level.

Unknown parameters are rejected. Send model inputs inside params; project_id belongs in the request envelope.
This model uses status polling. webhook_url is not supported and is rejected before a job is submitted.
Performer video must be 3–30 seconds, at most 100 MiB. Character image must be at most 10 MiB, aspect ratio 0.4–2.5, and dimensions 340–3850 pixels. The worker validates media and calculates the charge.
Duration is rounded up to whole seconds; the total charge is rounded up to 0.1 API credit units.

Request envelope

Parameter Description
model
string
Required
Exact public model ID from the model catalog.
params
object
Required
Model-specific input fields. See the individual model page for required fields, types, defaults and limits.
project_id
string
Optional
Existing project belonging to your account. Omit to create a project automatically.

Model parameters

Parameter Description
image_url
string
Required
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.
video_url
string
Required
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.

Code examples

Set MAKEUGC_API_KEY on your server. Replace example media URLs with files you host and keep accessible during processing.

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": "kling-3-motion-control-pro",
  "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": "kling-3-motion-control-pro",
  "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": "kling-3-motion-control-pro",
    "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())

200 · Job accepted

Generation response
{
  "request_id": "request_123",
  "project_id": "project_123",
  "media": "video",
  "model": "kling-3-motion-control-pro",
  "status": "queued",
  "message": "Enterprise API job queued"
}

Retrieve the result

Save request_id, then poll every 5–10 seconds. A successful generation request does not mean the output is ready.

cURL
curl --fail-with-body --max-time 120 -X GET "https://app.makeugc.ai/api/platform/enterprise/status/request_123?media=video" \
  -H "X-Api-Key: $MAKEUGC_API_KEY"
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/status/request_123?media=video", {
  method: "GET",
  headers: {
    "X-Api-Key": apiKey,
  },
  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

response = requests.get(
    "https://app.makeugc.ai/api/platform/enterprise/status/request_123?media=video",
    headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
    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())

200 · Completed

Status response
{
  "request_id": "request_123",
  "media": "video",
  "status": 1,
  "video_url": "https://your-cdn.example/result.mp4",
  "created_at": "2026-10-13T00:00:00.000Z",
  "updated_at": "2026-10-13T00:00:30.000Z"
}

Read status: 0 is processing, 1 is completed and 2 is failed. Video status can also be a string. Output is in video_url . If completed has no output URL yet, continue polling within your timeout. See jobs & webhooks.

Credits & errors

Cost: 0.20 per billable second. Read returned credit fields when available. See credit units and limits.

Invalid inputs return 400; insufficient credits can return 400 or 402 depending on the generation path. Access restrictions return 403 and temporary model unavailability can return 503. See error handling. Each POST can start a billable job; do not automatically resubmit after a timeout.

Related models

Browse all models →