Topaz upscaling
Topaz Labs image enhancement (Gigapixel / Wonder / Denoise / Sharpen) and video upscaling (Proteus / Starlight / frame interpolation) through the GPUniq media API — credit-metered billing, job-based delivery, pay only for delivered results.
GPUniq serves Topaz Labs production restoration engines — the same models behind Gigapixel AI and Video AI — on a dedicated job-based surface. There is no prompt: you send a source image or video, pick a model, and receive the enhanced result. One API key, the same USD balance, the same job semantics as the rest of the media API.
Topaz is a restoration / upscaling API, not a generator, so it is billed differently from the generative image and video models. Instead of a flat per-image or per-second price, Topaz bills in credits and a job's credit cost scales with output size. GPUniq meters the exact credits each job consumes and charges:
cost_usd = credits_consumed × $0.14 per credit
You are billed only when a job completes — a failed or cancelled job
costs nothing. As a rule of thumb, 1 credit covers up to ~24 MP of
output for the precision (Gigapixel-class) image models, so a typical
4K upscale is 1 credit ($0.14); generative models (Wonder / Redefine)
and video cost proportionally more. The kickoff response returns an
estimated_cost_usd, and the completion response returns the exact
credits and cost_usd charged.
Fetch the live model catalog and the current per-credit rate at any
time from GET /v1/llm/topaz/models — it returns every image and video
model slug plus usd_per_credit.
Image enhancement & upscaling
Two calls: kick off a job, then poll it.
POST /v1/llm/topaz/image/jobs→ returns ajob_idin under a second.GET /v1/llm/topaz/image/jobs/{job_id}→ poll every 2-3 s until the status iscompletedorfailed.
Request
A Topaz image model slug (see the catalog), e.g.
topaz-enhance-standard, topaz-denoise-strong,
topaz-sharpen-super-focus.
The source image: a data: URL, an https:// URL, or a bare base64
string. Dimensions 1–32000 px per side.
Target output width in px. Omit to use the model's default upscale
factor (2×). Paired with output_height.
Target output height in px.
png (default), jpg, or webp.
Enable the face-restoration pass on models that support it.
Optional model-specific Topaz fields (e.g. creativity,
subject_detection) forwarded verbatim.
import time, requests
BASE = "https://api.gpuniq.com/v1/llm"
HEADERS = {"X-API-Key": "gpuniq_your_key"}
# 1. Kickoff
start = requests.post(
f"{BASE}/topaz/image/jobs",
headers=HEADERS,
json={
"model": "topaz-enhance-standard",
"image": "https://example.com/old_photo.jpg",
"output_width": 4096,
"output_height": 4096,
"output_format": "jpg",
"face_recovery": True,
},
).json()["data"]
job_id = start["job_id"]
print("estimated:", start["estimated_cost_usd"])
# 2. Poll
while True:
time.sleep(2.5)
d = requests.get(f"{BASE}/topaz/image/jobs/{job_id}", headers=HEADERS).json()["data"]
if d["status"] == "completed":
image_b64 = d["image"]["b64_json"] # inline base64
download_url = d["image"]["url"] # presigned URL (valid ~7 days)
print(f"credits: {d['credits']} cost: ${d['cost_usd']} balance: ${d['balance_usd']}")
break
if d["status"] == "failed":
print("failed:", d.get("error"))
break
The completed response carries both the inline b64_json and a
short-lived presigned url for the enhanced image.
Image models
Grouped by task. All slugs are stable GPUniq identifiers; call
GET /v1/llm/topaz/models for the authoritative live list.
| Family | Example slugs | Best for |
|---|---|---|
| Enhance (Gigapixel, precision) | topaz-enhance-standard, topaz-enhance-high-fidelity, topaz-enhance-low-res, topaz-enhance-cgi, topaz-enhance-text-refine | General upscale; ~24 MP/credit |
| Enhance (generative) | topaz-enhance-standard-max, topaz-enhance-recovery, topaz-enhance-wonder, topaz-enhance-redefine | Add detail to low-res / degraded; costs more credits |
| Sharpen | topaz-sharpen-standard, topaz-sharpen-strong, topaz-sharpen-lens-blur, topaz-sharpen-motion-blur, topaz-sharpen-refocus, topaz-sharpen-super-focus | Deblur / refocus |
| Denoise | topaz-denoise-normal, topaz-denoise-strong, topaz-denoise-extreme | Noise / grain reduction |
| Restore | topaz-restore-dust-scratch | Film-scan dust & scratch cleanup |
| Lighting / color | topaz-lighting-adjust, topaz-lighting-white-balance, topaz-lighting-colorize | Exposure, white balance, colorize B&W |
Video upscaling
Same kickoff-then-poll shape. Because Topaz needs the source clip's metadata up-front to quote the job, pass the source dimensions, duration and frame rate along with the URL.
POST /v1/llm/topaz/video/jobsGET /v1/llm/topaz/video/jobs/{job_id}
Request
A Topaz video model slug (see the catalog), e.g.
topaz-video-proteus, topaz-video-starlight, topaz-video-apollo.
https URL of the source clip. MP4/MOV/WebM, up to 500 MB / 300 s.
Target frame rate for interpolation models (e.g. 60). Omit to keep
the source rate.
import time, requests
BASE = "https://api.gpuniq.com/v1/llm"
HEADERS = {"X-API-Key": "gpuniq_your_key"}
start = requests.post(
f"{BASE}/topaz/video/jobs",
headers=HEADERS,
json={
"model": "topaz-video-proteus",
"video_url": "https://example.com/clip_720p.mp4",
"source_width": 1280, "source_height": 720,
"source_duration": 8, "source_frame_rate": 30,
"output_width": 3840, "output_height": 2160, # upscale to 4K
},
).json()["data"]
job_id = start["job_id"]
print("estimated:", start["estimated_cost_usd"])
while True:
time.sleep(3)
d = requests.get(f"{BASE}/topaz/video/jobs/{job_id}", headers=HEADERS).json()["data"]
if d["status"] == "completed":
print("video:", d["video"]["url"])
print(f"credits: {d['credits']} cost: ${d['cost_usd']}")
break
if d["status"] == "failed":
print("failed:", d.get("error"))
break
Video models
| Family | Example slugs | Notes |
|---|---|---|
| Proteus (precision upscale) | topaz-video-proteus, topaz-video-proteus-natural, topaz-video-rhea, topaz-video-theia-detail, topaz-video-artemis-hq, topaz-video-dione-td, topaz-video-gaia-hq, topaz-video-iris | Camera / CGI / AI video to 8K+ |
| Starlight (generative) | topaz-video-starlight, topaz-video-starlight-hq, topaz-video-starlight-mini, topaz-video-starlight-fast | Diffusion upscale / restoration |
| Denoise | topaz-video-nyx, topaz-video-nyx-fast, topaz-video-nyx-hifi, topaz-video-nyx-xl | Video denoise |
| Frame interpolation | topaz-video-apollo, topaz-video-chronos, topaz-video-aion (+ -fast tiers) | Slow-motion / fps up-conversion |
| Utilities | topaz-video-themis-deblur, topaz-video-colorize, topaz-video-stabilize, topaz-video-foreground-removal, topaz-video-hdr | Deblur, colorize, stabilize, SDR→HDR |
Pricing
All Topaz jobs are metered on the exact credits consumed and billed at $0.14 per credit. There is no fixed per-job price — cost scales with output size and model tier:
| Model class | Credit cost | Example |
|---|---|---|
| Precision image (Gigapixel, Sharpen, Denoise) | ~1 credit per 24 MP output | 4K (≈8 MP) upscale ≈ $0.14 |
| Generative image (Wonder, Redefine) | ~1 credit per 2–4 MP output | 4K generative ≈ $0.28–$0.56 |
| Video (Proteus / Denoise) | credits scale with duration × resolution | short 720p→4K clip from ~$0.14–$0.28 |
The kickoff estimated_cost_usd is computed from a free upstream
estimate; the completion response returns the exact credits and
cost_usd charged. Query GET /v1/llm/topaz/models for the live
usd_per_credit rate.
Errors
Topaz requests return the same stable error envelope as the rest of the media API — see the error reference. The codes you are most likely to meet:
| Code | Meaning |
|---|---|
model_not_found | Unknown Topaz model slug. Call GET /v1/llm/topaz/models for the valid set. |
invalid_request_error | Missing image / video_url, oversized or unfetchable source, bad dimensions. Rejected up-front, nothing billed. |
insufficient_balance | Balance below the job estimate at kickoff. Top up and retry. |
rate_limit_per_key | 120 req/min sliding window per key — back off and retry. |