Ideogram 4.5 with n=4 on Sume: one write, four times the price

A POST /v1/images with n=4 spends one request from the write budget but bills cost_usd x n. Worst-case table for low, medium and high quality.

4 min readSume
All posts

Two budgets apply to an image call and they count different things. The rate limit counts requests: a POST /v1/images is one write whether n is 1 or 10. The wallet counts images: the image docs say endpoint pricing lines already include the Sume margin, so you pay cost_usd x n. Ideogram 4.5 (ideogram/ideogram-v4.5) accepts n from 1 to 10.

So a loop that raises n to save requests saves nothing on cost and only trims the write count.

Worst case by quality

The docs list Ideogram 4.5 at $0.03, $0.06 or $0.22 per image for quality low, medium or high (medium is the default), at 1K or 2K. Treat these as the ceiling for planning and read the live number from GET /v1/images/models/ideogram/ideogram-v4.5/endpoints, where pricing[].cost_usd is the billed rate.

Ideogram 4.5 per-image list price from the Sume image docs, read 2026-10-06; totals are price x n
QualityPer imagen=1n=4n=10
low$0.03$0.03$0.12$0.30
medium$0.06$0.06$0.24$0.60
high$0.22$0.22$0.88$2.20

Sample

The key includes quality and n, so changing either is a deliberate new job rather than an idempotency_conflict.

import json, os, urllib.request

PRICE = {"low": 0.03, "medium": 0.06, "high": 0.22}  # per image, from the Sume docs

def worst_case(quality: str, n: int) -> float:
    return round(PRICE[quality] * n, 4)  # one request, cost_usd x n

def generate(prompt: str, quality: str, n: int) -> dict:
    req = urllib.request.Request(
        "https://api.sume.com/v1/images",
        data=json.dumps({"model": "ideogram/ideogram-v4.5", "prompt": prompt,
                         "quality": quality, "n": n}).encode(),
        headers={"x-api-key": os.environ["SUME_API_KEY"],
                 "content-type": "application/json",
                 "idempotency-key": f"poster-v1-{quality}-n{n}"},
    )
    with urllib.request.urlopen(req, timeout=40) as res:
        return {"status": res.status, "body": json.load(res)}

for quality in PRICE:
    print(quality, "n=4 ->", worst_case(quality, 4), "USD, 1 write against the rate limit")

What else changes with n

  • The route waits up to 30 seconds and returns 200 with data[].url. Large n and high quality are the configurations most likely to come back as 202 with a job envelope, so branch on the status code.
  • The response usage.cost is the billed amount, which you can add to your own ledger.
  • Failed or canceled generations are not billed.

Sources

Related posts

More in Pricing

All Pricing posts

Written by Sume