---
title: "Submit an image upscale job"
method: POST
path: "/v2/images/upscale"
tags: ["Images"]
---

# Submit an image upscale job

`POST /v2/images/upscale`

## Request

- Base URL: `https://api.apiframe.ai`
- URL: `https://api.apiframe.ai/v2/images/upscale`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Creates an upscale job. Topaz is priced by output megapixels; Clarity is flat. The route probes the input image to compute pricing — failures return 400 before any credits are deducted.

## Headers

- `Idempotency-Key` string

## Request body

- union: Image upscale via Topaz (per-megapixel) or Clarity (flat).
  - object
    - `model` 'topaz-image-upscale', required
    - `webhookUrl` string, uri
    - `webhookEvents` string[]
    - `topazUpscaleParams` object, required
      - `image` string, required
      - `model_type` 'standard-v2' | 'low-res-v2' | 'cgi' | 'high-fidelity-v2' | 'text-refine' | 'redefine'
      - `upscale_factor` union
        - 1
        - 2
        - 4
        - 6
      - `face_enhance` boolean
      - `face_enhance_strength` number
      - `face_enhance_creativity` number
      - `output_format` 'jpg' | 'png'
      - `seed` integer
  - object
    - `model` 'clarity-upscale', required
    - `webhookUrl` string, uri
    - `webhookEvents` string[]
    - `clarityUpscaleParams` object, required
      - `image` string, required
      - `prompt` string
      - `negative_prompt` string
      - `scale_factor` union
        - 1
        - 2
        - 4
        - 8
      - `creativity` number
      - `resemblance` number
      - `dynamic` number
      - `num_inference_steps` integer
      - `seed` integer
      - `output_format` 'png' | 'jpg' | 'webp'
      - `sharpen` number

## Response `202`

Job accepted and queued. Track via `GET /v2/jobs/{id}` or webhook.

- JobAccepted: Returned by every successful job submission.
  - `jobId` string, uuid, required
  - `status` 'QUEUED' | 'PROCESSING' | 'COMPLETED' | 'FAILED', required: Status at the moment the job record was persisted. Almost always `QUEUED`; idempotent replays may return the original status.

## Other responses

- `400`: Request body failed validation.
- `401`: Authentication failed (missing / invalid API key).
- `402`: Team has insufficient credits to run this model.
- `403`: Authenticated but the API key is inactive or lacks permission.
- `429`: Rate limit exceeded. Retry after the `Retry-After` seconds.
- `503`: Service temporarily unavailable (queue / DB outage). Retry with backoff.

---

[API](https://skmtc.dev/apiframe/apis/apiframe-api.md) · [All operations](https://skmtc.dev/apiframe/apis/apiframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/apiframe/apis/apiframe-api/revisions/ba1a4c26c86a?raw)
