MAKEUGC PLATFORM API · DOCS V2
Video Upscale
Quote and upscale owned videos with Topaz, with billing tracked per attempt.
Workflow
- Identify the source video's id, project_id and video_type.
- Request a quote and review data.quote.credits.
- Submit the same model and source options and save billing_id.
- Poll the billing attempt until completed, failed or refunded.
Example IDs and media URLs are placeholders. Replace them with values from your account and accessible media files.
Quote an upscale #
/upscale/quote
Probe an owned video and estimate the credit cost without submitting an upscale job.
Request body
| Parameter | Description |
|---|---|
video_id
string
Required
|
video id input.
Allowed: |
project_id
string
Required
|
project id input.
Allowed: |
video_type
string
Required
|
video type input.
Allowed: |
model_family
string
Required
|
model family input.
Allowed: |
model
string
Required
|
model input.
Allowed: |
target_resolution
string
Required
|
target resolution input.
Allowed: |
Request example
curl --fail-with-body --max-time 420 -X POST "https://app.makeugc.ai/api/platform/upscale/quote" \
-H "X-Api-Key: $MAKEUGC_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}'
// 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/upscale/quote", {
method: "POST",
headers: {
"X-Api-Key": apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}),
signal: AbortSignal.timeout(420000),
});
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 = {
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}
response = requests.post(
"https://app.makeugc.ai/api/platform/upscale/quote",
headers={"X-Api-Key": os.environ["MAKEUGC_API_KEY"]},
json=payload,
timeout=420,
)
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
{
"status": true,
"data": {
"success": true,
"videoId": "video_123",
"modelFamily": "precision",
"model": "Proteus",
"upscaleFactor": 1.5,
"metadata": {
"width": 720,
"height": 1280,
"duration": 10,
"fps": 30,
"frames": 300
},
"quote": {
"credits": 1.25
}
}
}
All requests require X-Api-Key. See
errors & retries for unsuccessful
responses.
Submit an upscale #
/upscale/generate
Upscale an existing video owned by your account and save data.billing_id for this attempt.
Request body
| Parameter | Description |
|---|---|
video_id
string
Required
|
video id input.
Allowed: |
project_id
string
Required
|
project id input.
Allowed: |
video_type
string
Required
|
video type input.
Allowed: |
model_family
string
Required
|
model family input.
Allowed: |
model
string
Required
|
model input.
Allowed: |
target_resolution
string
Required
|
target resolution input.
Allowed: |
Request example
curl --fail-with-body --max-time 120 -X POST "https://app.makeugc.ai/api/platform/upscale/generate" \
-H "X-Api-Key: $MAKEUGC_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}'
// 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/upscale/generate", {
method: "POST",
headers: {
"X-Api-Key": apiKey,
"Content-Type": "application/json",
},
body: JSON.stringify({
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}),
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 = {
"video_id": "video_123",
"project_id": "project_123",
"video_type": "seedance_25_video",
"model_family": "precision",
"model": "Proteus",
"target_resolution": "1080p"
}
response = requests.post(
"https://app.makeugc.ai/api/platform/upscale/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
{
"status": true,
"data": {
"id": "video_123",
"billing_id": "billing_123",
"project_id": "project_123",
"status": "processing"
}
}
All requests require X-Api-Key. See
errors & retries for unsuccessful
responses.
Get upscale attempt status #
/upscale/status
Poll using billing_id and the same source video identifiers. video_url is returned only after this billing attempt completes.
Parameters
| Parameter | Description |
|---|---|
video_id
string · query
Required
|
video id input.
Allowed: |
project_id
string · query
Required
|
project id input.
Allowed: |
video_type
string · query
Required
|
video type input.
Allowed: |
billing_id
string · query
Required
|
billing id input.
Allowed: |
Request example
curl --fail-with-body --max-time 120 -X GET "https://app.makeugc.ai/api/platform/upscale/status?video_id=VIDEO_ID&project_id=PROJECT_ID&video_type=VIDEO_TYPE&billing_id=BILLING_ID" \
-H "X-Api-Key: $MAKEUGC_API_KEY"
// 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/upscale/status?video_id=VIDEO_ID&project_id=PROJECT_ID&video_type=VIDEO_TYPE&billing_id=BILLING_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);
# Install the requests package before running.
import os
import requests
response = requests.get(
"https://app.makeugc.ai/api/platform/upscale/status?video_id=VIDEO_ID&project_id=PROJECT_ID&video_type=VIDEO_TYPE&billing_id=BILLING_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
{
"status": true,
"data": {
"id": "video_123",
"billing_id": "billing_123",
"status": "completed",
"video_url": "https://your-cdn.example/upscaled.mp4",
"credits_charged": 1.25,
"credits_refunded": 0,
"error": null
}
}
All requests require X-Api-Key. See
errors & retries for unsuccessful
responses.