PlatformTopaz Upscaling

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 a job_id in under a second.
  • GET /v1/llm/topaz/image/jobs/{job_id} → poll every 2-3 s until the status is completed or failed.

Request

body
model

A Topaz image model slug (see the catalog), e.g. topaz-enhance-standard, topaz-denoise-strong, topaz-sharpen-super-focus.

body
image

The source image: a data: URL, an https:// URL, or a bare base64 string. Dimensions 1–32000 px per side.

body
output_width

Target output width in px. Omit to use the model's default upscale factor (2×). Paired with output_height.

body
output_height

Target output height in px.

body
output_format

png (default), jpg, or webp.

body
face_recovery

Enable the face-restoration pass on models that support it.

body
params

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.

FamilyExample slugsBest for
Enhance (Gigapixel, precision)topaz-enhance-standard, topaz-enhance-high-fidelity, topaz-enhance-low-res, topaz-enhance-cgi, topaz-enhance-text-refineGeneral upscale; ~24 MP/credit
Enhance (generative)topaz-enhance-standard-max, topaz-enhance-recovery, topaz-enhance-wonder, topaz-enhance-redefineAdd detail to low-res / degraded; costs more credits
Sharpentopaz-sharpen-standard, topaz-sharpen-strong, topaz-sharpen-lens-blur, topaz-sharpen-motion-blur, topaz-sharpen-refocus, topaz-sharpen-super-focusDeblur / refocus
Denoisetopaz-denoise-normal, topaz-denoise-strong, topaz-denoise-extremeNoise / grain reduction
Restoretopaz-restore-dust-scratchFilm-scan dust & scratch cleanup
Lighting / colortopaz-lighting-adjust, topaz-lighting-white-balance, topaz-lighting-colorizeExposure, 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/jobs
  • GET /v1/llm/topaz/video/jobs/{job_id}

Request

body
model

A Topaz video model slug (see the catalog), e.g. topaz-video-proteus, topaz-video-starlight, topaz-video-apollo.

body
video_url

https URL of the source clip. MP4/MOV/WebM, up to 500 MB / 300 s.

body
source_width
Source width (px).
body
source_height
Source height (px).
body
source_duration
Source duration (seconds).
body
source_frame_rate
Source frame rate (fps).
body
output_width
Target width. Omit for 2× the source.
body
output_height
Target height.
body
output_frame_rate

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

FamilyExample slugsNotes
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-irisCamera / CGI / AI video to 8K+
Starlight (generative)topaz-video-starlight, topaz-video-starlight-hq, topaz-video-starlight-mini, topaz-video-starlight-fastDiffusion upscale / restoration
Denoisetopaz-video-nyx, topaz-video-nyx-fast, topaz-video-nyx-hifi, topaz-video-nyx-xlVideo denoise
Frame interpolationtopaz-video-apollo, topaz-video-chronos, topaz-video-aion (+ -fast tiers)Slow-motion / fps up-conversion
Utilitiestopaz-video-themis-deblur, topaz-video-colorize, topaz-video-stabilize, topaz-video-foreground-removal, topaz-video-hdrDeblur, 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 classCredit costExample
Precision image (Gigapixel, Sharpen, Denoise)~1 credit per 24 MP output4K (≈8 MP) upscale ≈ $0.14
Generative image (Wonder, Redefine)~1 credit per 2–4 MP output4K generative ≈ $0.28–$0.56
Video (Proteus / Denoise)credits scale with duration × resolutionshort 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:

CodeMeaning
model_not_foundUnknown Topaz model slug. Call GET /v1/llm/topaz/models for the valid set.
invalid_request_errorMissing image / video_url, oversized or unfetchable source, bad dimensions. Rejected up-front, nothing billed.
insufficient_balanceBalance below the job estimate at kickoff. Top up and retry.
rate_limit_per_key120 req/min sliding window per key — back off and retry.