Upscale image to 1080p, 2K or 4K
October 10, 2026
Table of contents
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
API tokenis required, see Setup useapi.net for details.
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_idorimage_pathis required, provide exactly one.
image_idis an image from GET /images. The account is taken from the id, soemailis not needed.
image_pathis thepathreturned by POST /files for a JPG, PNG or WebP upload. Any image works, not only PixVerse generations. It must be under 4K. -
emailis optional, used only withimage_path. If not specified, the API selects an account from your accounts. -
modelis optional. Default:pixverse-upscale.modelqualityCredits per image Cost on Premium pixverse-upscale2160p8 $0.032 topaz-gigapixel1080p/1440p/2160p15 $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.
-
qualityis optional. Default:2160p(4K).1440pis PixVerse’s 2K. Supported values depend onmodel, see the table above. -
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 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_idresponse. -
replyRefis optional, place here your reference id which will be stored and returned along with this PixVerse image 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.
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
-
Use the returned
image_idto retrieve the result using GET /images/image_id. Check if the fieldimage_status_finalistrueorimage_status_nameisCOMPLETED. The fieldimage_urlwill contain the upscaled image link.If you specify the optional parameter
replyUrl, the API will call the providedreplyUrlwith 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": truenothing 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 } -
Returned for a
qualitythemodeldoes not support, for both or neither ofimage_idandimage_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 15 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 images/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 images/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
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())