Image Upscaling API for Sharpening and Restoring Photos
Add unblurring, restoration and 2x or 4x upscaling to your own app, store or workflow with a plain REST API. Send a photo, get a sharper, larger one back, and let a webhook tell you when a whole batch is done.

What the image upscaling API does
The API runs the same processing as the UnblurPicture web app, with the same presets and strength levels. It is part of the Studio plan, so there is no separate contract and no per-call price list: every image you process through the API counts against the 360 full-resolution photos included in Studio each month, together with images processed in the browser by your team.
- Sharpen motion and focus blur, restore old prints, clean compression
- Upscale 2x or 4x, output up to 8,000 px on the long edge
- Presets for Product photo, Real estate interior, Old print, Phone photo and Video still
- Single images or batches of up to 100, with webhooks when a batch is done
- Commercial license for client and product work
Authentication with an API key
Create an API key in your Studio account under Settings, API keys. Send it in the Authorization header of every request as a bearer token. Keys belong to the account, not to a single person, and the owner role can create, rename and revoke them. Every key creation and revocation appears in the audit log. Keep keys on your server and never ship them inside a browser or mobile app.
Base URL is https://api.unblurpicture.com and every request and response uses JSON over HTTPS.
Authorization: Bearer ubp_live_your_key
Content-Type: application/json
Process one image
Create a job with POST /v1/images. Pass a public or signed URL of the photo, or upload the file as multipart form data in the field image. Choose a preset, a strength of gentle, balanced or strong, and an upscale factor of 2 or 4. The response returns a job id and status right away, and the finished image is available from GET /v1/images/{id}.
curl -X POST https://api.unblurpicture.com/v1/images \
-H "Authorization: Bearer ubp_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"source_url": "https://shop.example.com/media/teapot-front.jpg",
"preset": "product_photo",
"strength": "balanced",
"upscale": 4,
"format": "png"
}'
{
"id": "img_8f2c41d7",
"status": "queued",
"preset": "product_photo",
"strength": "balanced",
"upscale": 4,
"created_at": "2026-10-19T14:02:11Z"
}
Check status and download the result
Poll GET /v1/images/{id} or wait for a webhook. When the status is done, the response includes a download URL that stays valid for 24 hours, plus the output size. Images and results are deleted automatically after 30 days, or earlier with DELETE /v1/images/{id}.
Possible status values are queued, processing, done and failed. A failed job includes an error object with a code and a message.
{
"id": "img_8f2c41d7",
"status": "done",
"output": {
"url": "https://api.unblurpicture.com/v1/files/img_8f2c41d7.png",
"width": 6400,
"height": 4800,
"format": "png",
"expires_at": "2026-10-20T14:02:40Z"
}
}
Batches and webhooks
Send up to 100 images in one call with POST /v1/batches. Give each item your own reference so you can match results back to your records, and pass a webhook_url to be notified when the batch is done. We send a POST with the batch id, counts and the result of every item, signed with the webhook secret from your account so you can verify it came from us. If your endpoint does not answer with a 2xx status, we retry with increasing delays for up to 24 hours.
{
"preset": "real_estate_interior",
"strength": "gentle",
"upscale": 2,
"webhook_url": "https://app.example.com/hooks/unblurpicture",
"items": [
{"reference": "listing-2291-kitchen", "source_url": "https://cdn.example.com/2291/kitchen.jpg"},
{"reference": "listing-2291-living", "source_url": "https://cdn.example.com/2291/living.jpg"}
]
}
{
"event": "batch.done",
"batch_id": "bat_51e09a",
"total": 2,
"done": 2,
"failed": 0,
"items": [
{"reference": "listing-2291-kitchen", "image_id": "img_a1093e", "status": "done"},
{"reference": "listing-2291-living", "image_id": "img_a1093f", "status": "done"}
]
}
Usage, allowance and rate limits
Each processed image counts once against the monthly allowance of your Studio plan, whether it came from the API or the browser. Failed jobs do not count. GET /v1/usage returns photos used and remaining in the current billing period. When the allowance runs out, new jobs return the error allowance_exhausted until the next period starts; there are no top-ups.
To keep the queue fair, plan for up to 10 new jobs per second and up to 5 batches in progress per account. Requests above that return 429 with a Retry-After header, so wait the given number of seconds and retry. For steady high volume, batches are more efficient than many single calls.
Error codes
| HTTP status | Error code | Meaning |
|---|---|---|
| 400 | invalid_request | A field is missing or has a wrong value, for example upscale 3 |
| 401 | invalid_api_key | The key is missing, mistyped or revoked |
| 403 | plan_required | The account is not on Studio, the plan with API access |
| 404 | not_found | No image or batch with this id in your account |
| 413 | file_too_large | The source file is larger than 50 MB |
| 415 | unsupported_format | The file is not JPG, PNG, HEIC, WebP or TIFF |
| 422 | allowance_exhausted | The monthly photo allowance is used up |
| 429 | rate_limited | Too many requests, retry after the time in Retry-After |
| 500 | processing_error | Something went wrong on our side, the job did not count |
What the API is for
The API is built for product photos, listings, archives, client photo work and apps that help people with their own pictures. It is not for identifying people, enhancing faces from security or CCTV cameras, reading license plates or restoring blurred or redacted text, and the output is an enhanced image, not evidence. These limits are part of our terms of service, and how we protect the images you send is described on our security page.
API access on the Studio plan
The API is included in Studio. Prices below are billed yearly, which saves 50 percent.
| Plan | Price | Photos per month | API |
|---|---|---|---|
| Personal | $9/month billed yearly ($108/yr) or $19 monthly | 40 | No |
| Pro | $24/month billed yearly ($288/yr) or $49 monthly | 120 | No |
| Studio | $74/month billed yearly ($888/yr) or $149 monthly | 360 | REST API, webhooks, batches of 100 |
If you only need batches in the browser, the bulk image upscaler page shows what Pro covers. Full comparison on the pricing page.
Image upscaling API questions
Which plan includes the API?
Studio. It includes the REST API, webhooks, batches of up to 100 images, 3 team seats and 360 full-resolution photos a month.
Do API calls cost extra?
No. Each processed image counts against the monthly allowance of your Studio plan. Failed jobs do not count, and there are no per-call charges or top-ups.
How long do you keep images sent to the API?
Source images and results are deleted automatically after 30 days. You can delete any image earlier with DELETE /v1/images/{id}.
Can I process images for my clients?
Yes. Studio includes a commercial license, so you can process images for your clients, stores and listings, within the acceptable use rules in our terms.

Put sharp photos into your own product
Choose Studio, create an API key and send your first image in minutes.