Upscale video to 1080p or 4K
December 6, 2024 (October 10, 2026)
Table of contents
Upscale a video to 1080p or 4K with PixVerse’s own upscaler or one of three Topaz models. The source can be a video you generated on PixVerse (video_id) or any MP4 / MOV you upload with POST /files (video_path), up to 3 minutes long and below 4K. Add "quote": true to get the exact price without spending anything.
For images, see POST images/upscale.
https://api.useapi.net/v2/pixverse/videos/upscale
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"video_id": "Optional video_id",
"video_path": "Optional path from POST /files",
"email": "Optional PixVerse account email",
"model": "topaz-starlight-fast",
"quality": "2160p",
"quote": false,
"replyUrl": "Place your call back URL here",
"replyRef": "Place your reference id here",
"maxJobs": 3
}
-
video_idorvideo_pathis required, provide exactly one.
video_idis a video from GET /videos. The account is taken from the id, soemailis not needed.
video_pathis thepathreturned by POST /files for an MP4 or MOV upload. Any video works, not only PixVerse generations. It must be under 4K and no longer than 3 minutes. -
emailis optional, used only withvideo_path. If not specified, the API selects an account from your accounts. -
modelis optional. Default:pixverse-upscale.modelqualityCredits per second Best for pixverse-upscale2160p6 Balanced enhancement, tuned for AI-generated video topaz-proteus1080p/2160p6 / 10 General-purpose upscaling topaz-starlight-fast1080p/2160p10 / 15 Fast realistic restoration for AI video topaz-starlight-precise1080p/2160p15 / 30 Most realistic restoration, and by far the slowest Billed seconds are the video’s length rounded up, so a 5.2-second clip bills 6 seconds. See Pricing and timing.
-
qualityis optional. Default:2160p(4K). Supported values depend onmodel, see the table above. PixVerse offers 1440p (2K) in its app, but rejects it for every video model. -
quoteis optional. Set it totrueto get the exact price and nothing else — nothing is submitted and no credits are used. See the quote response. Passemailtoo when you have several accounts, so the price andhas_enough_creditsare for the account you will submit to. -
replyUrlis optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the providedreplyUrlonce the PixVerse video is completed or failed. Maximum length 1024 characters. We recommend using sites like webhook.site to test callback URL functionality. Callback body has the same JSON shape as GET /videos/video_idresponse. -
replyRefis optional, place here your reference id which will be stored and returned along with this PixVerse video response / result.
Maximum length 1024 characters. -
maxJobsis optional, if not specified value from selected accounts/email will be used.
Valid range: 1…8
It should not exceed the number of concurrent generations supported by your account subscription plan.
A request with only video_id (no model, quality, video_path or quote) runs PixVerse’s original 4K upscale, exactly as this endpoint always has. Add any of those fields to use the models above.
Pricing and timing
Credits per second of video, with the cost on the $60 Premium plan ($0.004 per credit):
model | 1080p | 2160p | Measured time |
|---|---|---|---|
pixverse-upscale | — | 6 ($0.024/sec) | About 50 seconds for a 5-second clip |
topaz-proteus | 6 ($0.024/sec) | 10 ($0.040/sec) | About 2 minutes for a 9-second clip at 1080p |
topaz-starlight-fast | 10 ($0.040/sec) | 15 ($0.060/sec) | About 2.5 minutes for a 9-second clip at 1080p |
topaz-starlight-precise | 15 ($0.060/sec) | 30 ($0.120/sec) | About 19 minutes for a 6-second clip at 4K |
The Precise run was measured while PixVerse reported it was at full capacity. Time grows with clip length and resolution, so a long clip on Precise can run for hours. These are PixVerse’s list prices, observed on a Pro account. Use "quote": true for the exact figure on your account.
While an upscale runs, GET /videos/video_id reports video_status_name GENERATING. Its model field shows PixVerse’s internal name for the upscaler, for example topaz_proteus. The API keeps tracking topaz-* upscales for up to 6 hours and every other job for 3 hours.
Responses
-
Use the returned
video_idto retrieve video status and results using GET /videos/video_id. Check if the fieldvideo_status_finalistrueorvideo_status_nameisCOMPLETED. The fieldurlwill contain the upscaled video link.If you specify the optional parameter
replyUrl, the API will call the providedreplyUrlwith video progress updates until the video is complete or fails.{ "video_id": "user:<userid>-pixverse:<email>-video:<number>", "model": "topaz-starlight-fast", "quality": "2160p", "cost_credits": 90 }A request with only
video_id(the original PixVerse upscale) returnsvideo_idalone.With
"quote": truenothing is submitted, and the response is the price:{ "quote": true, "model": "topaz-starlight-fast", "quality": "2160p", "billing_unit": "second", "bill_seconds": 6, "credits_per_unit": 15, "cost_credits": 90, "has_enough_credits": true } -
Returned for a
qualitythemodeldoes not support, for both or neither ofvideo_idandvideo_path, and for a source PixVerse refuses — for example one that is already 4K.{ "error": "Already in 4K. Higher enhancement isn’t supported. (500344)" } -
{ "error": "Unauthorized" } -
The account does not have enough credits for this upscale. The price is checked before anything is submitted, so nothing was created.
{ "error": "Not enough credits: this upscale costs 270 credits" } -
Wait in a loop for at least 10..30 seconds and retry again.
There are two possible cases for API response 429:
- API query is full and can not accept new videos/upscale requests. Size of query defined by
maxJobsoptional parameter.{ "error": "Account <email> is busy executing <maxJobs> tasks." "All configured accounts are running at maximum capacity." } - The API received an HTTP response status 429 from PixVerse. Please refer to your subscription plan for the maximum allowed tasks in the queue.
{ "error": "Reached the limit for concurrent generations." }
- API query is full and can not accept new videos/upscale requests. Size of query defined by
-
596 Pending mod message
Your PixVerse.ai account has a pending error. Most likely, you changed your account password or your PixVerse.ai account was placed on hold. Once the issue is resolved, update your account to clear the error by executing POST accounts/email before making any new API calls.
{ "error": "Your PixVerse account has pending error." "Please address this issue at https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email before making any new API calls." }
Model
{ // TypeScript, all fields are optional
video_id: string
model: 'pixverse-upscale' | 'topaz-proteus' | 'topaz-starlight-fast' | 'topaz-starlight-precise'
quality: '1080p' | '2160p'
cost_credits: number
// "quote": true only
quote: boolean
billing_unit: 'second'
bill_seconds: number
credits_per_unit: number
has_enough_credits: boolean
error: string
}
Examples
-
curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -X POST "https://api.useapi.net/v2/pixverse/videos/upscale" \ -d '{"video_path": "upload/….mp4", "model": "topaz-starlight-fast", "quality": "2160p"}' -
const video_path = "path returned by POST /files"; const apiUrl = `https://api.useapi.net/v2/pixverse/videos/upscale`; const token = "API token"; const data = { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }; data.body = JSON.stringify({ video_path, model: 'topaz-starlight-fast', quality: '2160p' }); const response = await fetch(apiUrl, data); const result = await response.json(); console.log("response", {response, result}); -
import requests video_path = "path returned by POST /files" apiUrl = f"https://api.useapi.net/v2/pixverse/videos/upscale" token = "API token" headers = { "Content-Type": "application/json", "Authorization" : f"Bearer {token}" } body = { "video_path": video_path, "model": "topaz-starlight-fast", "quality": "2160p" } response = requests.post(apiUrl, headers=headers, json=body) print(response, response.json())