Cost to remove backgrounds and upscale 500 product photos by API

Sume bills background removal at $0.0225 an image and upscale at $0.20, both flat. 500 photos through both steps cost $111.25; the table and a submit loop.

5 min readSume
All posts

Cutting out and upscaling a product photo on Sume costs $0.2225 per image: $0.0225 for the background removal and $0.20 for the upscale. Both prices are flat per image, so 100 photos cost $22.25, 500 cost $111.25 and 1,000 cost $222.50, and the order of the two steps does not change the total. The amounts come from Sume's rate card at /pricing/api.

What does change is how long the batch takes. A catalog of 500 photos is 1,000 paid jobs, and your plan's concurrency decides how fast they drain. This post gives the cost table, the part of the bill that is easy to miscount, and a loop that submits the first step without exceeding your balance.

What are the two prices?

Background removal (POST /v1/rmbg-1.0/remove) is $0.0225 per image: Sume's catalog lists the basis as the provider's $0.018 per image at the standard margin. It returns a PNG with alpha. Image upscale (POST /v1/image-upscale-1.0/upscale) is $0.20 per image, described as reserving about 16 megapixels of generative output, with upscale_factor defaulting to 2 and output_format defaulting to png.

Because the upscale price is flat, there is no cheaper tier for a small input and no surcharge for a larger factor in the published rate. The catalog band for each is a single number: 3 cents for removal and 20 cents for upscale, at minimum, estimate and maximum alike.

What does a catalog cost?

Each row multiplies the photo count by the flat rates. The totals assume every photo goes through both steps once and no job fails.

Cutout plus upscale at Sume's flat per-image rates, USD, read 2026-10-03
PhotosRemove background ($0.0225)Upscale ($0.20)Both steps
10$0.225$2.00$2.225
100$2.25$20.00$22.25
500$11.25$100.00$111.25
1,000$22.50$200.00$222.50
5,000$112.50$1,000.00$1,112.50

What is easy to miscount?

Three things move the real bill away from the table. First, retries: a failed job releases its reservation, but a job you resubmit by hand is a new paid job, so send an Idempotency-Key per photo and reuse it only for an exact retry. Second, the upscale line dominates, at 90 percent of the per-photo price, so skipping the upscale for photos that are already large enough saves more than any other choice. Third, an input that already has transparent pixels is flattened onto mid-gray before removal; the docs state this is still one billed removal, so a re-cutout of an old PNG costs the same $0.0225.

None of this depends on step order. Whether you cut out first and upscale the PNG, or upscale first and cut out, the rate card gives the same $0.2225.

  • Filter out photos that are already large enough before the upscale step.
  • Use one idempotency key per photo and step, for example rmbg-sku-1042.
  • Reserve before you submit: the amount held is the flat price, so multiply count by rate.
  • Check GET /v1/usage?job_id=... after a run to see captured, held and refunded amounts.

What if only some photos need the upscale?

Run the numbers on your own mix before you commit. Say 500 photos all need a cutout but only 300 are small enough to need an upscale: that is 500 x $0.0225 = $11.25 plus 300 x $0.20 = $60.00, so $71.25 instead of $111.25, a saving of $40. A catalog of 1,500 photos, three angles for each of 500 products, costs $33.75 for the cutouts and $300.00 for the upscales if every image is enlarged, which is $333.75 in total.

Because every price is flat, you can total a run before it starts and compare the figure with GET /v1/balance. If the wallet is short, the cheapest saving is to drop the upscale step for images that already meet your marketplace's minimum size, not to lower quality.

How long will 1,000 jobs take?

Concurrency sets the pace. The docs list Free at 1 concurrent job, Pro at 4, Startup at 8 and Scale at 20, each with a queue of five times that, never less than three. A Pro workspace holds 24 accepted jobs at once, so a script that fires 1,000 submits can hit 429 queue_full once about 24 are waiting or running. Wait for jobs to finish, then continue with the same idempotency key. The Generation admission docs describe that pattern; the loop below stops at the first refusal so you can retry from where it stopped.

Before you start, check the balance against the full figure for both steps, not just the first. A run that stops halfway on a 402 leaves cut-out files you paid for and no upscales, which is a fine place to resume from but a poor place to discover that the wallet was short. Keep the list of finished image ids so a restart skips them rather than paying twice.

import os, requests

H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
     "Content-Type": "application/json"}
photos = ["https://example.com/p1.jpg", "https://example.com/p2.jpg"]

for i, url in enumerate(photos):
    r = requests.post(
        "https://api.sume.com/v1/rmbg-1.0/remove",
        headers={**H, "Idempotency-Key": f"rmbg-photo-{i}"},
        json={"image_url": url, "mode": "async"},
        timeout=60,
    )
    print(i, r.status_code)
    if r.status_code in (402, 429):
        print(r.json()["error"]["code"], "stop and retry later")
        break
    r.raise_for_status()

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume