AI book cover art API: 2:3 models on Sume and adding the title in code

Fourteen Sume image rows list 2:3. Generate the cover art without text, then set the title and author name yourself so every letter is right.

5 min readSume
All posts

For a portrait book cover, 14 Sume image rows list aspect_ratio: "2:3", read 2026-10-03: Soul (Higgsfield), Nano Banana 2, Nano Banana Pro, Seedream 5.0 Lite, Seedream 4.5, Seedream 4.0, Grok Imagine, Qwen Image, Qwen Image Max, Flux 2 Pro, Flux 2 Flex, Ideogram V3, Recraft V4, Ideogram 4.5. The rows that do not are the three ChatGPT Image ids (they list 3:4 and 4:5 instead) and the two Imagen 4 rows (3:4). The cheapest 2:3 row is Soul (Higgsfield) at $0.005 per image.

A cover has two jobs, art and lettering, and they fail differently. Misspelled title text means a re-run, so the dependable pattern is to ask for text-free artwork with space left for type, then add the title and author name in code. That also lets you try ten fonts without ten generations.

Which 2:3 rows take references

If you have a series, a reference image keeps the look consistent from volume to volume. Rows with input_references above zero can take the previous cover as a style frame.

2:3 rows in the Sume image catalog, read 2026-10-03.
ModelPer imageReferences
Soul (Higgsfield)$0.005text only
Grok Imagine$0.02510
Qwen Image$0.02510
Seedream 4.0$0.032510
Flux 2 Pro$0.037510
Seedream 5.0 Lite$0.0437510
Seedream 4.5$0.0510
Recraft V4$0.05text only
Flux 2 Flex$0.062510
Ideogram V3$0.07510
Ideogram 4.5$0.0755
Qwen Image Max$0.09375text only
Nano Banana 2$0.1010
Nano Banana Pro$0.187510

Step 1: text-free art with room for the title

Name the empty area in the prompt ("empty sky in the top third for a title") and ask for no lettering. Request n: 4 so you can pick, which costs four times the per-image price. A call that is still running after the 30-second wait returns 202 with a job envelope instead of 200, so check the status code before reading data; see Jobs and results.

import os
import requests

resp = requests.post(
    "https://api.sume.com/v1/images",
    headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
    json={
        "model": "black-forest-labs/flux.2-pro",
        "prompt": "moody lighthouse on a cliff at dusk, painted book cover art, empty sky in the top third, no text, no lettering",
        "aspect_ratio": "2:3",
        "n": 4,
    },
    timeout=60,
)
resp.raise_for_status()
if resp.status_code == 202:
    print("still running:", resp.json()["data"]["status_url"])
else:
    for image in resp.json()["data"]:
        print(image["url"])

Step 2: set the type yourself

Download the chosen image and draw the title with Pillow. Use a font file you are licensed to use; the default bitmap font below is only for a quick check.

from PIL import Image, ImageDraw, ImageFont

img = Image.open("cover.png").convert("RGB")
draw = ImageDraw.Draw(img)
font = ImageFont.load_default(size=img.width // 10)
w = draw.textlength("THE LAST LIGHT", font=font)
draw.text(((img.width - w) / 2, img.height * 0.08), "THE LAST LIGHT", font=font, fill="white")
img.save("cover-titled.png")

When you do want text in the image

If you want the model to draw the title, Ideogram V3 and Ideogram 4.5 both list 2:3, so you can test them against the others on your own title. Quote the exact title in the prompt, run a low-priced draft first, and check every letter before you spend on a final. Sume publishes no accuracy figure, so check yourself.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume