Upscale image to 1080p, 2K or 4K
October 10, 2026 (October 18, 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
The account has a pending error, and the API does not use it until you add it again with POST accounts/email. You receive an email when this happens. There are two causes.
PixVerse could not sign the account in, most often because its password was changed. Add the account again with the current password.
{ "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.", "code": 596 }Or PixVerse suspended the account. PixVerse suspends accounts that break its content rules and does not say which generation caused it. The first response carries PixVerse’s own details in
account_moderation, and later calls return the sameerror. Add the account again afterreinstatement_at. To ask PixVerse to lift the suspension earlier, write to thesupport_emailit gives.{ "error": "PixVerse suspended account [email protected] for 30 days, from 2026-10-16 09:26 UTC until 2026-11-15 09:26 UTC. PixVerse suspends accounts that break its content rules and does not say which generation caused it. Add the account again at https://useapi.net/docs/api-pixverse-v2/post-pixverse-accounts-email after 2026-11-15 09:26 UTC. To ask PixVerse to lift it earlier, write to [email protected].", "code": 596, "account_moderation": { "ban_level": "suspend_30d", "action": "temporary_suspend", "duration_days": 30, "suspended_at": "2026-10-16 09:26:25 (UTC)", "reinstatement_at": "2026-11-15 09:26:25 (UTC)", "support_email": "[email protected]" } }If every account you have is in this state, a request without
emailreturns 596 as well.
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())