For businesses and developers

Image upscaling API

Send an image, get it back up to 4x larger with real detail rebuilt, not stretched pixels. A simple REST API on monthly plans, from $0.046 per image at volume.

  • Included in every paid plan
  • No watermark
  • Transparent backgrounds kept
  • Monthly, no contract

Try it on one of your images

No account needed. Up to 5 MB and 4,096 pixels on the longest side.

Uploading...
Enhancing your image...

Three calls, start to finish

Upload an image, check on it, download the result. Uploads answer straight away, so your code never waits on an open connection.

  1. 1

    Send the image

    Choose 2x, 3x or 4x, or an exact width or height. You get an image ID back at once.

  2. 2

    Check its status

    A typical image is ready in 10 to 40 seconds, depending on its size.

  3. 3

    Download the result

    Fetch it from a private, time-limited link, then delete it through the API if you don't want us to keep it.

import fs from "node:fs";

const api = "https://www.upscale-media.ai/api";
const headers = { Authorization: `Bearer ${process.env.UPSCALE_TOKEN}` };

// 1. Send the image
const form = new FormData();
form.append("image", new Blob([fs.readFileSync("photo.jpg")]), "photo.jpg");
form.append("scale_factor", "4");
const upload = await fetch(`${api}/images/upscale`, { method: "POST", headers, body: form });
const { data: image } = await upload.json();

// 2. Check until it is done
let status = image.status;
while (status !== "completed" && status !== "failed") {
  await new Promise((resolve) => setTimeout(resolve, 3000));
  const check = await fetch(`${api}/images/${image.id}`, { headers });
  status = (await check.json()).data.status;
}

// 3. Download the result
const result = await fetch(`${api}/images/${image.id}/download`, { headers });
console.log((await result.json()).data.download_url);
import os, time, requests

api = "https://www.upscale-media.ai/api"
headers = {"Authorization": f"Bearer {os.environ['UPSCALE_TOKEN']}"}

# 1. Send the image
with open("photo.jpg", "rb") as f:
    image = requests.post(f"{api}/images/upscale", headers=headers,
                          files={"image": f}, data={"scale_factor": 4}).json()["data"]

# 2. Check until it is done
status = image["status"]
while status not in ("completed", "failed"):
    time.sleep(3)
    status = requests.get(f"{api}/images/{image['id']}", headers=headers).json()["data"]["status"]

# 3. Download the result
result = requests.get(f"{api}/images/{image['id']}/download", headers=headers).json()
print(result["data"]["download_url"])
# 1. Send the image (answers 202 with data.id)
curl -X POST https://www.upscale-media.ai/api/images/upscale \
  -H "Authorization: Bearer $UPSCALE_TOKEN" \
  -F "image=@photo.jpg" -F "scale_factor=4"

# 2. Check until data.status is "completed"
curl https://www.upscale-media.ai/api/images/IMAGE_ID \
  -H "Authorization: Bearer $UPSCALE_TOKEN"

# 3. Get the download link
curl https://www.upscale-media.ai/api/images/IMAGE_ID/download \
  -H "Authorization: Bearer $UPSCALE_TOKEN"

What each image costs

Every paid plan includes the API, and every image costs the same whatever its size. Pick the monthly allowance you need; move up or down whenever you like.

Plan Images a month Price a month Per image Processing at once Batches
Starter 25 $4 $0.160 10 —
Professional 250 $19 $0.076 25 Yes
Enterprise 1K 1,000 $60 $0.060 50 Yes
Enterprise 2.5K 2,500 $135 $0.054 75 Yes
Enterprise 5K 5,000 $250 $0.050 100 Yes
Enterprise 7.5K 7,500 $350 $0.047 150 Yes
Enterprise 12.5K 12,500 $575 $0.046 200 Yes

Prices in US dollars. Paying annually saves 10%. Going over your allowance is never charged: new uploads are refused until it renews or you move to a larger plan. Need more than 12,500 a month? Tell us your volume.

Built for catalogs, not one-offs

When you have thousands of images that are too small, run them through the API instead of a browser.

Image archives and libraries

Turn small scans and old thumbnails into files large enough to view, download or print.

Print-on-demand and wall art

Bring artwork and customer uploads up to print size before they reach production.

Marketplaces and online stores

Meet listing size requirements without asking sellers to reshoot their photos.

Apps and platforms

Add an upscale button to your own product. Nothing to host and no GPUs to run.

The details that matter in production

Asynchronous jobs
Uploads answer with an image ID straight away. Check the status whenever suits your code.
Batches
Send up to 20 images in one request on Professional and Enterprise, and follow the batch as a whole.
One price per image
A large photo costs the same as a small icon. No charges by megapixel or output size, so your monthly bill is the plan price.
Exact sizes
Ask for 2x, 3x or 4x, or for an exact width or height; the other side keeps the proportions.
Predictable limits
Past your plan's images-in-progress limit you get a 429 with a Retry-After header. Past the monthly allowance, a clear error and never a surprise charge.
Usage you can check
GET /api/usage shows what is left of the month, and we email you at 80% and 90%.
Your images stay yours
Stored privately, deleted automatically after your plan's retention period or whenever you delete them, and never used to train AI models.

Questions businesses ask

How much does the API cost per image?
Every paid plan includes the API. Starter is $4 a month for 25 images; at volume, Enterprise 12.5K works out to $0.046 an image ($575 a month for 12,500). Paying annually saves 10%.
What happens when we reach our monthly allowance?
We email you at 80% and 90%. Once the allowance is used, new uploads are refused with a clear error until it renews; nothing is charged for going over. Images already uploaded still finish, and reading, downloading and deleting keep working. You can move to a larger plan at any time from the Billing page: the difference is charged straight away and the larger allowance applies at once.
How fast is it, and how many images can we send at once?
An upload answers straight away with an image ID, and you check its status until it is done. A typical image takes 10 to 40 seconds, depending on its size. Each plan can have a number of images processing at once (from 10 to 200); an upload past that gets a 429 with a Retry-After header, so your code can wait and send it again.
Which images can we send?
JPEG, PNG, WebP, BMP, TIFF and GIF, up to 10 MB each and up to 4,096 pixels on the longest side. Results can be up to 4x larger in each direction, or an exact target width or height. Transparent backgrounds are kept.
What happens to our images?
They are stored privately and deleted automatically after your plan's retention period (30 days on Starter, up to 180 days on Enterprise). You can delete any image through the API as soon as you have downloaded it, and we do not use your images to train AI models.
Can we try it before committing?
Yes. Upscale an image on the homepage without an account to judge the quality, then start on any paid plan; Starter at $4 a month includes the API. Plans are monthly with no contract, and you can change or cancel at any time.
We need more than 12,500 images a month. Can you help?
Yes. Tell us roughly how many images you expect each month through the contact page, and we will set up a plan that fits.

Start with a plan, change it any time

Starter is $4 a month and includes the API, so you can wire it up before choosing a volume.