5-Minute Quickstart

The upscaling step you don't want to build.

POST a job. Poll for status. Download the result. UpRes handles the GPU pool, the 14 model menu, and the queue — you get a flat-rate API and a stable surface to ship against.

Business plan $49/mo · 500 images, 150 videos · 60 req/min per key

“I don't want to own a GPU pool just to ship one feature.”

Engineering teams keep asking the same question: how do we add upscaling to a pipeline without inheriting a model-update treadmill, a queue runner, or a vendor we'll have to migrate off in six months? UpRes is the boring answer — flat-rate billing, 14 public aliases behind one endpoint, OpenAPI 3.1 you can codegen against.

Three calls. That's the API.

  1. 1

    POST /v1/jobs

    Submit an image URL or signed S3 key + a model id. Returns a job id immediately.

  2. 2

    GET /v1/jobs/:id

    Poll every 2-5 seconds. Status moves through pending → processing → completed.

  3. 3

    Fetch result_url

    Signed S3 URL valid for 7 days. Stream straight into your CDN or storage.

Drop-in snippets

curl — submit + poll

bash
curl -X POST https://api.upres.ai/v1/jobs \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/photo.jpg",
    "model": "flare",
    "scale": 4
  }'
bash
curl https://api.upres.ai/v1/jobs/JOB_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

Node 20+ (no SDK)

typescript
// Node 20+ (built-in fetch). No SDK needed.
const KEY = process.env.UPRES_API_KEY;

async function upscale(imageUrl) {
  const submit = await fetch('https://api.upres.ai/v1/jobs', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      image_url: imageUrl,
      model: 'flare',
      scale: 4,
    }),
  });
  const { id } = await submit.json();

  // Poll every 2s up to 60s
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 2000));
    const r = await fetch(`https://api.upres.ai/v1/jobs/${id}`, {
      headers: { Authorization: `Bearer ${KEY}` },
    });
    const job = await r.json();
    if (job.status === 'completed') return job.result_url;
    if (job.status === 'failed') throw new Error(job.error);
  }
  throw new Error('timeout');
}

Python 3.10+

python
# Python 3.10+ — pip install requests
import os, time, requests

KEY = os.environ['UPRES_API_KEY']
BASE = 'https://api.upres.ai/v1'

def upscale(image_url):
    r = requests.post(
        f'{BASE}/jobs',
        headers={'Authorization': f'Bearer {KEY}'},
        json={'image_url': image_url, 'model': 'flare', 'scale': 4},
    )
    job_id = r.json()['id']

    for _ in range(30):
        time.sleep(2)
        s = requests.get(f'{BASE}/jobs/{job_id}',
                         headers={'Authorization': f'Bearer {KEY}'}).json()
        if s['status'] == 'completed':
            return s['result_url']
        if s['status'] == 'failed':
            raise RuntimeError(s.get('error'))
    raise TimeoutError()

Free trial key

Get a 50-image trial key by email

We'll send a starter key, the snippets on this page as runnable files, and a short note on rate limits and webhooks. No credit card.

What rolling your own upscaling step costs you

  • A GPU pool you have to keep paid up, patched, and on-call.
  • A model treadmill — re-evaluating every six months as new SOTA ships.
  • Glue code between your queue, retries, and signed-URL storage that no one wants to own.

FAQ

How do I add AI image upscaling to my app?

POST a job to https://api.upres.ai/v1/jobs with Bearer auth, an image URL, and a model id. Poll GET /v1/jobs/{id} until status=completed; the response includes a signed S3 URL for the result. UpRes API access is on the Business plan ($49/month) with 60 requests/minute per key and full OpenAPI 3.1 spec at upres.ai/v1/openapi.json.

Does the UpRes API support webhooks?

The current public API is poll-based — submit a job, poll status, fetch the signed result URL. Webhook support is on the roadmap; for now the typical integration polls every 2-5 seconds with exponential backoff.

How long do API calls take?

Image jobs typically complete in 5-30 seconds depending on model and source resolution. Video jobs scale roughly linearly with clip length. The job status endpoint returns progress and an ETA so polling can be efficient.

Can I try the UpRes API before committing to Business?

Yes. Drop your email below and we follow up with a 50-image trial key plus runnable curl/Node/Python snippets. No credit card required for the trial.

Free tier available

Generate an API key — Business plan, $49/mo, cancel any time.

5 free upscales per month. Creator from $9/mo. No watermarks on paid plans.