AI vintage travel poster via API: 3:4 art with the headline in code
Vintage travel poster art at 3:4 from any Sume row, then the place name set in code. From $0.025; Ideogram rows if the model draws the lettering.

A vintage travel poster is flat color, bold shapes and a headline. On the Sume image API, 3:4 is listed by every catalog row, read 2026-10-03, so you are free to choose by price and by whether you need references. Two ways to handle the headline: let the model draw it (best on a row you have tested for lettering, like Ideogram V3 or 4.5) or leave a blank band and set it in code.
Setting it in code removes spelling risk and lets you change the place name for a series. Drawing it with the model is one step, but you must proofread each image.
Prompt skeleton
- Style: "mid-century travel poster, flat shapes, limited palette of four colors, grain".
- Scene: one landmark, one sun or moon shape, one layer of hills.
- Layout: "empty band across the bottom third, no text" for the code route.
- For the model-drawn route, quote the exact headline in double quotes and keep it to one to three words.
Which row
| Route | Row | Per image |
|---|---|---|
| Cheapest art | Qwen Image or Grok Imagine | $0.025 |
| Art plus references (your own sketch) | Flux 2 Pro | $0.0375 |
| Model draws headline | Ideogram 4.5 (default medium) or V3 | $0.075 |
Generate and add the headline
Generate four options for four times the price, pick one, then add the 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": "qwen/qwen-image",
"prompt": "mid-century travel poster of a lighthouse on a cliff, flat shapes, four-color palette, grain, empty band across the bottom third, no text",
"aspect_ratio": "3:4",
"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"])Then set the type
Draw the headline in the empty band with Pillow, as in the book-cover recipe. Keep the poster file name the same as the place so batches stay organized.
from PIL import Image, ImageDraw, ImageFont
img = Image.open("poster.png").convert("RGB")
d = ImageDraw.Draw(img)
font = ImageFont.load_default(size=img.width // 8)
w = d.textlength("PORTO", font=font)
d.text(((img.width - w) / 2, img.height * 0.78), "PORTO", font=font, fill="#f4e8c8")
img.save("poster-porto.png")Sources
Related posts
More in Use cases
- AI virtual try-on looks fake? A QC checklist for print and hands
AI try-on can drift from the real garment. Check print, colour, sleeves and hands, and pull exact frames from a clip with Sume's video frames endpoint.
- AI voice reading news articles on YouTube Shorts: allowed?
YouTube lists readings of websites or news feeds as unoriginal material. How to turn a news story into an original Short with your own analysis.
- AI voiceover for Shorts in order: TTS, then captions, then timeline
Best order for an AI voiceover Short: TTS with word timestamps, captions from those words, then a timeline render. Documented Sume limits and prices.
- AI wedding invitation image: quote names and date so they render
Make an invitation card picture with an image API: quote every line, pick a portrait ratio, check the spelling, and add real print text in layout.
Written by Sume