---
title: "Create an upscale job"
method: POST
path: "/jobs"
---

# Create an upscale job

`POST /jobs`

Submit a file for upscaling. Accepts either:
- **JSON** body with `image_url` (publicly accessible URL)
- **multipart/form-data** with an `image` file field

One credit is deducted from your monthly quota.

## Request body

- JobCreateRequest — Submit a job via URL (JSON). For file upload, use multipart/form-data with an 'image' field.
  - `image_url` string, uri — Publicly accessible URL of the image to upscale.
  - `mime_type` string — Content type of the linked file. Only read on the image_url path.
  - `model` 'flare' | 'prism' | 'lumen' | 'mirage' | 'motion' | 'motion-x' — What to upscale with. - `flare`: everyday photos, fastest and cheapest, up to 4x. - `prism`: text, logos and product shots. Adds no detail that was not in the original. Up to 4x. - `lumen`: maximum real detail recovery, for print. Up to 8x. - `mirage`: invents plausible new detail. Most dramatic, least faithful. Up to 8x. - `motion`: standard video upscale, up to 4x. - `motion-x`: cinema-grade video, slower and dearer, up to 4x.
  - `scale` integer — Upscaling factor. Rejected when it exceeds the chosen model's ceiling.

## Response `201`

Job created successfully.

- Job
  - `id` string, uuid, required
  - `status` 'pending' | 'uploading' | 'processing' | 'downloading' | 'completed' | 'failed' | 'canceled', required
  - `model` 'flare' | 'prism' | 'lumen' | 'mirage' | 'motion' | 'motion-x', required — What to upscale with. - `flare`: everyday photos, fastest and cheapest, up to 4x. - `prism`: text, logos and product shots. Adds no detail that was not in the original. Up to 4x. - `lumen`: maximum real detail recovery, for print. Up to 8x. - `mirage`: invents plausible new detail. Most dramatic, least faithful. Up to 8x. - `motion`: standard video upscale, up to 4x. - `motion-x`: cinema-grade video, slower and dearer, up to 4x.
  - `scale` integer, required
  - `original_filename` string, nullable, required
  - `result_url` string, uri, nullable, required — Presigned URL to the upscaled file. Valid for 1 hour.
  - `error` string, nullable, required — Why the job failed. Null unless status is 'failed'.
  - `frames_total` integer, nullable, required — Video only. Frames the job has to process.
  - `frames_done` integer, nullable, required — Video only. Frames processed so far.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required

## Other responses

- `400` — The request did not validate. `issues` names each field that failed; a retired model id is answered with the model that replaced it.
- `401` — Invalid or missing API key.
- `402` — Monthly quota exceeded.
- `429` — Rate limit exceeded (60 req/min per key).

---

[API](https://skmtc.net/upres/apis/upres-ai-api.md) · [All operations](https://skmtc.net/upres/apis/upres-ai-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/upres/upres-ai-api/revisions/a1a5f505549c/schema)
