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.
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
Send the image
Choose 2x, 3x or 4x, or an exact width or height. You get an image ID back at once.
-
2
Check its status
A typical image is ready in 10 to 40 seconds, depending on its size.
-
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/usageshows 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.