Performance Max image assets: three ratios, 5120 KB cap, 20 each

Performance Max wants landscape 1.91:1, square and 4:5 portrait images up to 5120 KB, 1 to 20 each. How to batch a matrix of images on Sume. Read 2026-10-03.

4 min readSume
All posts

Performance Max image assets come in three ratios: landscape 1.91:1, square 1:1 and portrait 4:5, each file under 5120 KB, with 1 to 20 images per type. Sume's image API covers square and 4:5 directly, and landscape needs the closest listed ratio plus a crop check.

The Google asset table

The Google Ads API page on Performance Max asset requirements lists these sizes. They were read on 2026-10-03.

Performance Max image asset requirements (read 2026-10-03)
AssetRatioRecommendedMinimumCount
Landscape image1.91:11200x628600x3141 to 20
Square image1:11200x1200300x3001 to 20
Portrait image4:5960x1200480x6001 to 20

Limits that apply to every file

The page sets a 5120 KB maximum per image and accepts GIF, JPG and PNG. A photo-like image saved as PNG can exceed that, so export photographic assets as JPEG. Sume's Image API accepts output_format of png, jpeg, webp or svg per model, so request jpeg for photos and leave webp and svg out of this channel.

Where Sume ratios match

Sume lists these normalized aspect ratios: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 4:5, 5:4, 1:2, 2:1, 1:4, 4:1, 1:8, 8:1, 9:21 and 21:9. A given model accepts only the subset in its catalog descriptors. Square (1:1) and portrait (4:5) are on the list. 1.91:1 is not, so for landscape generate at 16:9 or 2:1 and crop to 1.91:1 yourself.

The docs also note that for 4:5 the model's native size can differ from 1080x1350 and that an exact pixel target is a post-step, so measure the files you get back against the minimums in the table.

A batch matrix

A small script can fan one set of prompts across ratios and keep the output grouped by asset type. The version below submits one image per prompt per ratio and prints where each result is, handling both the 200 image response and the 202 job envelope.

import os
import requests

URL = "https://api.sume.com/v1/images"
HEADERS = {
    "Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
    "Content-Type": "application/json",
}
# A ratio only works on models whose catalog descriptor lists it (read supported_parameters).
RATIOS = {"square": "1:1", "portrait": "4:5", "landscape": "16:9"}
PROMPTS = ["Running shoe on a clean studio floor", "Running shoe on wet pavement at dawn"]

for kind, ratio in RATIOS.items():
    for n, prompt in enumerate(PROMPTS, start=1):
        body = {
            "model": "openai/gpt-image-2",
            "prompt": prompt,
            "aspect_ratio": ratio,
            "output_format": "jpeg",
        }
        r = requests.post(URL, headers=HEADERS, json=body, timeout=60)
        if r.status_code == 200:
            print(kind, n, r.json()["data"][0]["url"])
        elif r.status_code == 202:
            print(kind, n, "queued", r.json()["data"]["status_url"])
        else:
            print(kind, n, "error", r.status_code, r.text[:200])

Before upload

Check three things per file: the pixel size against the minimum, the byte size against 5120 KB, and the crop for landscape.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume