Remove backgrounds, upscale to 4x, and turn product photos into
lifestyle shots — with a single POST. No ML infrastructure to run,
no model churn to chase. We absorb the chaos; you keep a stable contract.
$ curl -X POST https://api.ezphoto.ai/v1/remove-background \
-H "Authorization: Bearer ez_live_…" \
-d '{"image_url": "https://your.app/photo.jpg"}'
# ~1 second later
{
"request_id": "0f04c41c-…",
"op": "remove-background",
"result_url": "https://…/0f04c41c.png",
"expires_at": "2026-08-14T22:28:13Z"
}
Send JSON with an image_url, or upload the file directly. Fast ops answer inline; heavy ops return a job you can poll or get webhooked about.
Clean cutouts with refined edges, hair included. Synchronous — the response is the result, typically around a second.
POST /v1/remove-background
2x or 4x upscaling that adds detail instead of blur. Async with webhooks, usually done in a few seconds.
POST /v1/upscale
Turn a plain product photo into a styled scene — studio white, marble table, outdoor lifestyle — or write your own prompt.
POST /v1/product-shot
Sign up with an email. 50 free operations a month, no card required.
A URL or a file — your call. Idempotency keys make retries safe.
Results live on our CDN for 24 hours, then they're gone. We never keep your users' images.
Copy, paste, ship. Same shape on every endpoint — full reference here, plus an OpenAPI spec and LLM-ready docs your AI assistant can read directly.
curl -X POST https://api.ezphoto.ai/v1/upscale \
-H "Authorization: Bearer $EZPHOTO_KEY" \
-H "Idempotency-Key: order-4812-hero" \
-d '{"image_url": "https://your.app/photo.jpg", "factor": 4,
"webhook_url": "https://your.app/hooks/ezphoto"}'
import requests
r = requests.post(
"https://api.ezphoto.ai/v1/upscale",
headers={"Authorization": f"Bearer {EZPHOTO_KEY}"},
json={"image_url": "https://your.app/photo.jpg", "factor": 4},
)
job = r.json() # 202 -> {"id": "...", "status": "queued"}
const res = await fetch("https://api.ezphoto.ai/v1/upscale", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.EZPHOTO_KEY}` },
body: JSON.stringify({ image_url: "https://your.app/photo.jpg", factor: 4 }),
});
const job = await res.json(); // 202 -> { id, status: "queued" }
50 operations / month
Card on file, billed monthly on usage
Volume plans with pooled credits are coming. Every image has real inference cost — nothing here is "unlimited", and nothing is subsidized by selling your data.
Uploads are processed, delivered, and deleted — results expire after 24 hours and originals are never stored at all. That's not a settings toggle; the storage for anything else simply doesn't exist.