Skip to content
Developers
API docs / Features

MAKEUGC PLATFORM API · DOCS V2

Ad Remake

Analyze a reference ad, review a generated prompt and create a new video for your product.

Workflow

  1. Analyze a public reference video, or provide your own context and product image.
  2. Call suggest to review a prompt without generating video.
  3. Call generate with that prompt or the original reference inputs.
  4. Poll status with data.id to retrieve video_url.
seedance-2.0-fast: duration 10, 15 seconds (default 10); ratios 9:16, 16:9, 21:9, 4:3, 3:4, 1:1; image_url optional. Resolution 720p.
seedance-2.5: duration 10, 20, 30 seconds (default 10); ratios 9:16, 16:9, 21:9, 4:3, 3:4, 1:1; image_url optional. Resolution 720p.
kling-video-o3-pro: duration 10, 15 seconds (default 10); ratios 9:16; image_url required. Resolution 720p.
veo-3.1: duration 8 seconds (default 8); ratios 9:16, 16:9; image_url required. Resolution is 720p with an image and 1080p without one.
Send X-Api-Key on every MakeUGC request. POST operations require an active paid subscription and a positive credit balance; custom voice creation also requires a plan with custom voices.
Requests are strict JSON: unknown fields, user_id and webhook_url are rejected. Use polling for jobs; these endpoints do not send webhooks.
The outer status boolean indicates request success. Most jobs use data.status: processing, completed or failed; Upscale documents its own statuses. Poll every 5–10 seconds and require a non-empty result URL (or voice_id) before using output.
API credit units × 100 = website display credits. A timeout, network error or 5xx may occur after acceptance: do not automatically resubmit a paid operation. If submission_unknown is true, check the project or contact support with x-request-id; reserved credits remain held until the result is resolved.

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

Analyze a reference ad #

POST /ad-remake/analyze

Extract a structured analysis from a reference video without generating a video.

This operation does not start or charge for video generation. Analysis fields can vary; tolerate additional properties.

Request body

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

Allowed: Up to 4000 characters

analysis_depth
string
Optional
analysis depth input.

Allowed: quick | standard | detailed

Default: standard

Request example

cURL
curl --fail-with-body --max-time 120 -X POST "https://app.makeugc.ai/api/platform/ad-remake/analyze" \
  -H "X-Api-Key: $MAKEUGC_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "video_url": "https://your-cdn.example/reference.mp4",
  "analysis_depth": "standard"
}'
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/ad-remake/analyze", {
  method: "POST",
  headers: {
    "X-Api-Key": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "video_url": "https://your-cdn.example/reference.mp4",
  "analysis_depth": "standard"
}),
  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 = {
    "video_url": "https://your-cdn.example/reference.mp4",
    "analysis_depth": "standard"
}

response = requests.post(
    "https://app.makeugc.ai/api/platform/ad-remake/analyze",
    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 response example

JSON response
{
  "status": true,
  "data": {
    "source": "url",
    "analysis_depth": "standard",
    "analysis": {
      "summary": "A creator demonstrates a product, then ends with a call to action."
    }
  }
}

All requests require X-Api-Key. See errors & retries for unsuccessful responses.

Suggest a remake prompt #

POST /ad-remake/suggest

Analyze your references and return a reusable prompt without starting video generation.

This operation does not charge for video generation. Save the returned prompt and pass it to /ad-remake/generate after review.

Request body

Parameter Description
project_id
string
Optional
Existing project owned by your account. Omit to create one.

Allowed: At least 1 characters; Up to 256 characters

model
string
Optional
model input.

Allowed: seedance-2.0-fast | seedance-2.5 | kling-video-o3-pro | veo-3.1

Default: seedance-2.5

video_url
string
Optional
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.
image_url
string
Optional
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.
context
string
Optional
context input.

Allowed: Up to 4000 characters

prompt
string
Optional
prompt input.

Allowed: At least 1 characters; Up to 1800 characters

analysis_depth
string
Optional
analysis depth input.

Allowed: quick | standard | detailed

Default: standard

duration
integer
Optional
duration input.
aspect_ratio
string
Optional
aspect ratio input.

Allowed: Up to 20 characters

resolution
string
Optional
resolution input.

Allowed: Up to 20 characters

Request example

cURL
curl --fail-with-body --max-time 120 -X POST "https://app.makeugc.ai/api/platform/ad-remake/suggest" \
  -H "X-Api-Key: $MAKEUGC_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "project_id": "project_123",
  "model": "seedance-2.5",
  "video_url": "https://your-cdn.example/reference.mp4",
  "image_url": "https://your-cdn.example/product.jpg",
  "context": "Recreate the reference ad for our ceramic coffee cup.",
  "duration": 10,
  "aspect_ratio": "9:16"
}'
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/ad-remake/suggest", {
  method: "POST",
  headers: {
    "X-Api-Key": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "project_id": "project_123",
  "model": "seedance-2.5",
  "video_url": "https://your-cdn.example/reference.mp4",
  "image_url": "https://your-cdn.example/product.jpg",
  "context": "Recreate the reference ad for our ceramic coffee cup.",
  "duration": 10,
  "aspect_ratio": "9:16"
}),
  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 = {
    "project_id": "project_123",
    "model": "seedance-2.5",
    "video_url": "https://your-cdn.example/reference.mp4",
    "image_url": "https://your-cdn.example/product.jpg",
    "context": "Recreate the reference ad for our ceramic coffee cup.",
    "duration": 10,
    "aspect_ratio": "9:16"
}

response = requests.post(
    "https://app.makeugc.ai/api/platform/ad-remake/suggest",
    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 response example

JSON response
{
  "status": true,
  "data": {
    "project_id": "project_123",
    "prompt": "A creator demonstrates the ceramic cup in a sunlit kitchen.",
    "negative_prompt": "",
    "model": "seedance-2.5",
    "video_job": null
  }
}

All requests require X-Api-Key. See errors & retries for unsuccessful responses.

Generate an ad remake #

POST /ad-remake/generate

Generate from reference media or submit a reviewed prompt directly. Save data.id for polling.

When prompt is supplied, reference-video analysis and context are skipped; image_url can still guide the output.
Video generation is charged by the selected model. data.video_job.credits_used reports the submitted job's charge.

Request body

Parameter Description
project_id
string
Optional
Existing project owned by your account. Omit to create one.

Allowed: At least 1 characters; Up to 256 characters

model
string
Optional
model input.

Allowed: seedance-2.0-fast | seedance-2.5 | kling-video-o3-pro | veo-3.1

Default: seedance-2.5

video_url
string
Optional
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.
image_url
string
Optional
Public HTTP(S) media URL. Private addresses, credentials and data URIs are not accepted.
context
string
Optional
context input.

Allowed: Up to 4000 characters

prompt
string
Optional
prompt input.

Allowed: At least 1 characters; Up to 1800 characters

analysis_depth
string
Optional
analysis depth input.

Allowed: quick | standard | detailed

Default: standard

duration
integer
Optional
duration input.
aspect_ratio
string
Optional
aspect ratio input.

Allowed: Up to 20 characters

resolution
string
Optional
resolution input.

Allowed: Up to 20 characters

Request example

cURL
curl --fail-with-body --max-time 120 -X POST "https://app.makeugc.ai/api/platform/ad-remake/generate" \
  -H "X-Api-Key: $MAKEUGC_API_KEY" \
  -H "Content-Type: application/json" \
  --data '{
  "project_id": "project_123",
  "model": "seedance-2.5",
  "video_url": "https://your-cdn.example/reference.mp4",
  "image_url": "https://your-cdn.example/product.jpg",
  "context": "Recreate the reference ad for our ceramic coffee cup.",
  "duration": 10,
  "aspect_ratio": "9:16"
}'
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/ad-remake/generate", {
  method: "POST",
  headers: {
    "X-Api-Key": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "project_id": "project_123",
  "model": "seedance-2.5",
  "video_url": "https://your-cdn.example/reference.mp4",
  "image_url": "https://your-cdn.example/product.jpg",
  "context": "Recreate the reference ad for our ceramic coffee cup.",
  "duration": 10,
  "aspect_ratio": "9:16"
}),
  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 = {
    "project_id": "project_123",
    "model": "seedance-2.5",
    "video_url": "https://your-cdn.example/reference.mp4",
    "image_url": "https://your-cdn.example/product.jpg",
    "context": "Recreate the reference ad for our ceramic coffee cup.",
    "duration": 10,
    "aspect_ratio": "9:16"
}

response = requests.post(
    "https://app.makeugc.ai/api/platform/ad-remake/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 response example

JSON response
{
  "status": true,
  "data": {
    "id": "job_123",
    "project_id": "project_123",
    "status": "processing",
    "prompt": "A creator demonstrates the ceramic cup in a sunlit kitchen.",
    "model": "seedance-2.5",
    "video_job": {
      "id": "job_123",
      "status": "processing",
      "credits_used": 1.5
    }
  }
}

All requests require X-Api-Key. See errors & retries for unsuccessful responses.

Get remake status #

GET /ad-remake/status

Poll with the data.id returned by /ad-remake/generate.

Parameters

Parameter Description
id
string · query
Required
id input.

Allowed: At least 1 characters; Up to 256 characters

Request example

cURL
curl --fail-with-body --max-time 120 -X GET "https://app.makeugc.ai/api/platform/ad-remake/status?id=ID" \
  -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/ad-remake/status?id=ID", {
  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/ad-remake/status?id=ID",
    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 response example

JSON response
{
  "status": true,
  "data": {
    "id": "job_123",
    "project_id": "project_123",
    "status": "completed",
    "video_url": "https://your-cdn.example/result.mp4"
  }
}

All requests require X-Api-Key. See errors & retries for unsuccessful responses.