MegaPotato AI Upscaler

Upscale photos ×2, ×4 or ×8 with the MegaPotato AI upscaler (megapotato.app), then compare every pixel with the original. It reconstructs fine detail and is the cheapest of the top-quality upscalers on the market.

Upscale by
Choose a photo to start.

Up to 3 upscales a day per network address. Output up to 16 400 px. How images are handled

Use the MegaPotato API

The same upscaler from your own code: a REST API with three calls. Create an API key (free test keys right away; live keys as described in the docs), keep it on your server and send it as a Bearer token. Full documentation: megapotato.app/developers · OpenAPI.

import os, time, uuid, requests

API = "https://megapotato.app"
AUTH = {"Authorization": f"Bearer {os.environ['MEGAPOTATO_API_KEY']}"}


def upscale(path, key, factor=4, out=None, timeout=600):
    """Upscale one photo. Retrying with the same `key` is never charged twice."""
    with open(path, "rb") as f:
        r = requests.post(f"{API}/v1/upscale", files={"file": f}, data={"upscale": factor},
                          headers={**AUTH, "Idempotency-Key": key}, timeout=120)
    r.raise_for_status()
    job, deadline = r.json(), time.monotonic() + timeout

    while job["status"] != "completed" or not job.get("result_url"):
        if job["status"] == "failed":
            raise RuntimeError(job["error"])  # the chips are refunded
        if time.monotonic() > deadline:
            raise TimeoutError(f"job {job['id']} is still running; poll it again later")
        try:
            r = requests.get(f"{API}/v1/jobs/{job['id']}", params={"wait": 55}, headers=AUTH, timeout=90)
        except requests.RequestException:
            time.sleep(5)  # transient network error: polling is always safe to repeat
            continue
        if r.status_code == 429 or r.status_code >= 500:
            time.sleep(int(r.headers.get("Retry-After", 5)))
            continue
        r.raise_for_status()
        job = r.json()

    png = requests.get(job["result_url"], timeout=300)  # the link is valid for about an hour
    png.raise_for_status()
    with open(out or f"{os.path.splitext(path)[0]}_x{factor}.png", "wb") as f:
        f.write(png.content)


# Free price check first: chips for a 1024 x 768 photo at x4
print(requests.post(f"{API}/v1/quote", headers=AUTH,
                    json={"width": 1024, "height": 768, "upscale": 4}).json())
key = str(uuid.uuid4())  # keep it, e.g. next to the file name, to retry safely
upscale("photo.jpg", key, factor=4)

How it works

  1. Price POST /v1/quote returns the chips for any size, free.
  2. Submit POST /v1/upscale holds the chips and queues the job.
  3. Poll GET /v1/jobs/{id}?wait=55 waits for the result; failed jobs are refunded.

Limits

Scale×1 (refine at the same size), ×2, ×4, ×8
Inputup to 6 000 px per side, 20.25 MP, 40 MB; PNG, JPEG, WebP, HEIC
Outputup to 16 400 px per side, 269 MP, 8-bit PNG
Resultsdownloadable for 90 days
Priceper photo, quoted in chips by /v1/quote · Pricing

Also: the ComfyUI node (search “MegaPotato” in ComfyUI Manager) and more examples on GitHub.

What this demo is

A free demo of the MegaPotato AI upscaler, an image super-resolution model for photos. This page is a thin client: your image goes to the MegaPotato API, is upscaled on MegaPotato's GPUs and comes back here. The model weights are not published.

In our October 2026 benchmark of 18 AI upscalers (blind AI judges and image metrics, open data under CC BY 4.0) the model came first and was the cheapest of the leaders. MegaPotato is one of the products compared; the method is published.

Your images and privacy

Images you upscale are sent through a small MegaPotato service on Cloudflare to the MegaPotato API and handled under its Privacy Policy and Terms. Every image is reviewed automatically before processing, and images that may not meet our content rules are refused. The original is deleted once the upscale finishes and the result about an hour after the upload. The demo asks the Hugging Face page only whether you are logged in (not who you are) and counts runs per network address, stored only as a keyed hash; Cloudflare processes it to run the service and the Turnstile check that helps limit automated abuse. Results open only inside this demo page. Please upload only images you have the right to use.

Example image credits

All public domain, reduced in size for the demo and upscaled once:

    Demo code: MIT license. Fonts: Bricolage Grotesque, Hanken Grotesk, JetBrains Mono (SIL Open Font License).