Upscale video to 1080p or 4K

December 6, 2024 (October 10, 2026)

Table of contents

  1. Request Headers
  2. Request Body
  3. Pricing and timing
  4. Responses
  5. Model
  6. Examples
  7. Try It

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
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_id or video_path is required, provide exactly one.
    video_id is a video from GET /videos. The account is taken from the id, so email is not needed.
    video_path is the path returned 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.

  • email is optional, used only with video_path. If not specified, the API selects an account from your accounts.

  • model is optional. Default: pixverse-upscale.

    model quality Credits per second Best for
    pixverse-upscale 2160p 6 Balanced enhancement, tuned for AI-generated video
    topaz-proteus 1080p / 2160p 6 / 10 General-purpose upscaling
    topaz-starlight-fast 1080p / 2160p 10 / 15 Fast realistic restoration for AI video
    topaz-starlight-precise 1080p / 2160p 15 / 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.

  • quality is optional. Default: 2160p (4K). Supported values depend on model, see the table above. PixVerse offers 1440p (2K) in its app, but rejects it for every video model.

  • quote is optional. Set it to true to get the exact price and nothing else — nothing is submitted and no credits are used. See the quote response. Pass email too when you have several accounts, so the price and has_enough_credits are for the account you will submit to.

  • replyUrl is optional. This is the preferred and most optimal way to receive results quickly — the API polls every 10 seconds and will call the provided replyUrl once 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_id response.

  • replyRef is optional, place here your reference id which will be stored and returned along with this PixVerse video response / result.
    Maximum length 1024 characters.

  • maxJobs is 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
  • 200 OK

    Use the returned video_id to retrieve video status and results using GET /videos/video_id. Check if the field video_status_final is true or video_status_name is COMPLETED. The field url will contain the upscaled video link.

    If you specify the optional parameter replyUrl, the API will call the provided replyUrl with 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) returns video_id alone.

    With "quote": true nothing 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
    }
    
  • 400 Bad Request

    Returned for a quality the model does not support, for both or neither of video_id and video_path, and for a source PixVerse refuses — for example one that is already 4K.

    {
      "error": "Already in 4K. Higher enhancement isn’t supported. (500344)"
    }
    
  • 401 Unauthorized

    {
      "error": "Unauthorized"
    }
    
  • 412 Insufficient credits

    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"
    }
    
  • 429 Too Many Requests

    Wait in a loop for at least 10..30 seconds and retry again.

    There are two possible cases for API response 429:

    1. API query is full and can not accept new videos/upscale requests. Size of query defined by maxJobs optional parameter.
      {
       "error": 
         "Account <email> is busy executing <maxJobs> tasks."
         "All configured accounts are running at maximum capacity."
      }
      
    2. 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."
      }
      
  • 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())
    
Try It