AI app icon via API: generate 1:1, add a transparent option, resize

App icon art from the Sume image API: 1:1 text-free art, ChatGPT Image 2.5 for a transparent background, and a Pillow loop that exports the sizes you need.

5 min readSume
All posts

An app icon is a square image with no text, so the Sume image API handles it with aspect_ratio: "1:1", which every catalog row lists, read 2026-10-03. Generate a large square, pick one, and make every smaller size yourself in code. If you want the symbol on a transparent background, ChatGPT Image 2.5 (openai/gpt-image-2.5) is the row that lists background: "transparent", per the Image API page.

Store requirements differ by platform and change, so this post does not state any. Check the platform's current icon page and export the sizes it lists.

Pick the row

Rows for an icon concept pass at 1:1, read 2026-10-03.
NeedRowPer image
Cheapest concept draftsQwen Image or Grok Imagine$0.025
Transparent backgroundChatGPT Image 2.5 (background: transparent)$0.06588 at high/1024
Larger tierNano Banana 2 (resolution up to 4K)$0.10 at 1K

Generate a transparent symbol

background is only valid on ChatGPT Image 2.5; other rows return 400 for it. Ask for a simple centered symbol, flat colors and no text. 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": "openai/gpt-image-2.5",
        "prompt": "simple flat symbol of a paper airplane made of two folded triangles, centered, no text",
        "aspect_ratio": "1:1",
        "background": "transparent",
        "output_format": "png",
    },
    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"])

Export the sizes

Resize from the largest source, never from a smaller export. LANCZOS keeps edges clean.

from PIL import Image

src = Image.open("icon.png").convert("RGBA")
for size in (1024, 512, 180, 120, 60):
    src.resize((size, size), Image.LANCZOS).save(f"icon-{size}.png")

Checks before you ship

  • View the 60-pixel export: fine detail disappears at small sizes.
  • Confirm the alpha channel if you asked for a transparent background.
  • Keep the prompt and the model id with the file so you can regenerate it.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume