Upscale image to 1080p, 2K or 4K

October 10, 2026

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Model
  5. Examples
  6. Try It

Upscale an image with PixVerse’s own upscaler or Topaz Gigapixel. The source can be an image you generated on PixVerse (image_id) or any JPG / PNG / WebP you upload with POST /files (image_path), below 4K. Add "quote": true to get the exact price without spending anything.

For videos, see POST videos/upscale.

https://api.useapi.net/v2/pixverse/images/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
{
    "image_id": "Optional image_id",
    "image_path": "Optional path from POST /files",
    "email": "Optional PixVerse account email",
    "model": "topaz-gigapixel",
    "quality": "2160p",
    "quote": false,
    "replyUrl": "Place your call back URL here",
    "replyRef": "Place your reference id here",
    "maxJobs": 3
}
  • image_id or image_path is required, provide exactly one.
    image_id is an image from GET /images. The account is taken from the id, so email is not needed.
    image_path is the path returned by POST /files for a JPG, PNG or WebP upload. Any image works, not only PixVerse generations. It must be under 4K.

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

  • model is optional. Default: pixverse-upscale.

    model quality Credits per image Cost on Premium
    pixverse-upscale 2160p 8 $0.032
    topaz-gigapixel 1080p / 1440p / 2160p 15 $0.060

    Gigapixel costs the same at every resolution. Premium is the $60 plan at $0.004 per credit. These are PixVerse’s list prices, observed on a Pro account.

  • quality is optional. Default: 2160p (4K). 1440p is PixVerse’s 2K. Supported values depend on model, see the table above.

  • 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 image 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 /images/image_id response.

  • replyRef is optional, place here your reference id which will be stored and returned along with this PixVerse image 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.

An image upscale usually finishes in 15 to 40 seconds. In GET /images/image_id the model field shows PixVerse’s internal name for the upscaler — fvsr_image for pixverse-upscale, topaz_gigapixel_standard_2 for topaz-gigapixel.

Responses
  • 200 OK

    Use the returned image_id to retrieve the result using GET /images/image_id. Check if the field image_status_final is true or image_status_name is COMPLETED. The field image_url will contain the upscaled image link.

    If you specify the optional parameter replyUrl, the API will call the provided replyUrl with progress updates until the image is complete or fails.

    {
        "image_id": "user:<userid>-pixverse:<email>-image:<number>",
        "model": "topaz-gigapixel",
        "quality": "2160p",
        "cost_credits": 15
    }
    

    With "quote": true nothing is submitted, and the response is the price:

    {
        "quote": true,
        "model": "topaz-gigapixel",
        "quality": "2160p",
        "billing_unit": "image",
        "credits_per_unit": 15,
        "cost_credits": 15,
        "has_enough_credits": true
    }
    
  • 400 Bad Request

    Returned for a quality the model does not support, for both or neither of image_id and image_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 15 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 images/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
    image_id: string
    model: 'pixverse-upscale' | 'topaz-gigapixel'
    quality: '1080p' | '1440p' | '2160p'
    cost_credits: number
    // "quote": true only
    quote: boolean
    billing_unit: 'image'
    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/images/upscale" \
         -d '{"image_path": "upload/….jpeg", "model": "topaz-gigapixel", "quality": "2160p"}'
    
  • const image_path = "path returned by POST /files";
    const apiUrl = `https://api.useapi.net/v2/pixverse/images/upscale`; 
    const token = "API token";
    const data = { 
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json' }
    };
    data.body = JSON.stringify({ 
      image_path,
      model: 'topaz-gigapixel',
      quality: '2160p'
    });
    const response = await fetch(apiUrl, data);
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    image_path = "path returned by POST /files"
    apiUrl = f"https://api.useapi.net/v2/pixverse/images/upscale" 
    token = "API token"
    headers = {
        "Content-Type": "application/json", 
        "Authorization" : f"Bearer {token}"
    }
    body = {
        "image_path": image_path,
        "model": "topaz-gigapixel",
        "quality": "2160p"
    }
    response = requests.post(apiUrl, headers=headers, json=body)
    print(response, response.json())
    
Try It