LinkedIn Lead Gen Form image 552x200: make it from a 3:1 render
LinkedIn recommends a 552px by 200px form image. Sume has no 552:200 ratio, so ask Ideogram for 3:1, center-crop about 8% of the width, and resize.

LinkedIn's Lead Gen Form specifications say the recommended form image size is 552px by 200px, which is 2.76:1. Sume's Image API takes a named aspect_ratio per model and has no 2.76:1 value, so generate at 3:1 with an Ideogram model, center-crop about 8% of the width, and resize to 552x200.
The LinkedIn page is a recommendation, not a hard limit, and the text I read gives no file type or file-size rule for this image. Check Campaign Manager's own upload message before you build a batch around it.
Which Sume ratio is closest to 552x200?
The cheapest crop is the ratio nearest 2.76. The ratio lists come from Sume's image catalog, so confirm them with GET /v1/images/models for the model you pick, because every model publishes its own aspect_ratio values.
| Sume ratio | Width / height | Crop needed to reach 2.76:1 | Listed for |
|---|---|---|---|
| 3:1 | 3.00 | About 8% of the width | Ideogram V3 and Ideogram 4.5 |
| 4:1 | 4.00 | About 31% of the width | Nano Banana 2 |
| 2:1 | 2.00 | About 28% of the height | Ideogram models and Grok image |
| 21:9 | 2.33 | About 15% of the height | Nano Banana 2 and Nano Banana Pro |
Render at 3:1, then crop to 552x200
The request below uses the documented POST /v1/images body. On this route the default mode is sync with a 30-second wait, so a slow job returns 202 instead of 200; the script stops in that case and you read the finished job from the jobs result endpoint. The crop is computed from the returned size, so it works at 1K or 2K.
import io, os, requests
from PIL import Image
API = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
body = {"model": "ideogram/ideogram-v4.5", "aspect_ratio": "3:1", "quality": "low",
"prompt": "Clean wide banner, a laptop on a desk, soft daylight, subject centered"}
r = requests.post(f"{API}/v1/images", headers=H, json=body, timeout=60)
r.raise_for_status()
if r.status_code != 200:
raise SystemExit("202: job still running, read /v1/jobs/{id}/result")
url = r.json()["data"][0]["url"]
img = Image.open(io.BytesIO(requests.get(url, timeout=60).content)).convert("RGB")
w, h = img.size
new_w = round(h * 552 / 200)
left = (w - new_w) // 2
img.crop((left, 0, left + new_w, h)).resize((552, 200), Image.LANCZOS).save("form-image.png")
print(w, h, "->", 552, 200)What to check before you upload
Ideogram 4.5 sets its price by quality, and the Image API docs list $0.03, $0.06 and $0.22 per image at low, medium and high before Sume's pricing, so low is a sensible draft setting. Read the billed amount from usage.cost on the response.
- Keep logos and any words in the middle 90% of the frame, because the crop removes the outer edges.
- Look at the 552x200 result at its real size; a wide banner shrunk this far hides small text.
- Generate a few drafts with
nbefore you spend onhigh; the per-modelncap is in the catalog.
Sources
Related posts
More in Use cases
- LinkedIn video ad intro text 150 characters, headline 70: test copy
LinkedIn video ads show 150 characters of intro text and a 70-character headline. Test copy on one rendered clip and save Sume jobs for hook variants.
- Two listing photos, one room transition: first and last frame
Use two listing photos as first and last frame of a 6-second Gemini Omni Flash 1.1 clip on Sume: $0.75 at 720p, $1.125 at 1080p. Call and checks.
- Live captions for a 90-minute match: streaming STT, then Sume replay
A 90-minute match costs about $0.81 on MAI-Transcribe-2-Streaming. Sume STT works on recordings: $0.91 after the match for replay captions.
- Live-selling replay: 12 clips in 3 languages, captions for $7.68
Trim 12 product clips from a live-selling replay and caption them in three languages on Sume for $7.68: $0.04 a clip to prepare, $0.20 per caption job.
Written by Sume