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
POST /v1/jobs
Submit an image URL or signed S3 key + a model id. Returns a job id immediately.
- 2
GET /v1/jobs/:id
Poll every 2-5 seconds. Status moves through pending → processing → completed.
- 3
Fetch result_url
Signed S3 URL valid for 7 days. Stream straight into your CDN or storage.
Drop-in snippets
curl — submit + poll
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
}'curl https://api.upres.ai/v1/jobs/JOB_ID \
-H "Authorization: Bearer YOUR_API_KEY"Node 20+ (no SDK)
// 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 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.