Demand Gen logo 150 KB, images 5 MB: check sizes before upload

Demand Gen allows images up to 5 MB but logos only 150 KB. Check bytes on every Sume image before upload, since output compression is not served in v1.

4 min readSume
All posts

Google's Demand Gen image specs cap image assets at 5 MB but cap a logo at 150 KB, a limit more than 30 times smaller. A generated logo at the recommended size can pass the dimension check and still fail on bytes. Sume's image API does not serve output_compression in v1, so you cannot ask it for a smaller file; the dependable fix is to measure every file before upload and regenerate or convert any that are over.

The limits Google lists

The Demand Gen image page, read on 2026-10-03, gives sizes and ratios for each asset type.

Demand Gen image assets (Google Ads Help, read 2026-10-03)
AssetMinimum / recommendedSize limit
Square 1:1300x300 / 1200x12005 MB
Landscape 1.91:1600x314 / 1200x6285 MB
Portrait 4:5480x600 / 960x12005 MB
Vertical 9:16600x1067 / 1080x19205 MB
LogoNot read for this post150 KB

Why a logo is the likely failure

Photographic detail, gradients and noise make files large. A flat logo compresses well, but a model-generated one often carries texture and soft shading that a designer's vector would not. Dimensions and ratio are only half of what Google validates, and the byte limit is the one that does not show up in a preview.

The page also allows up to 20 images per ad and 2 to 10 cards in a carousel, so a batch can contain dozens of files and one oversized logo is easy to miss by eye.

What Sume lets you control

The images docs list output_format as png, jpeg, webp or svg, with each model accepting only what its catalog lists, so read supported_parameters first. They state that output_compression and seed are in the schema but advertised by no model in v1, so sending either returns 400 unsupported_parameter. Aspect ratios include 1:1, 4:5 and 9:16, and the resolution tiers are 512, 1K, 2K and 4K.

Two levers remain: a lower resolution tier, and a different format. The Demand Gen page text read for this post does not list accepted file types, so do not assume webp is accepted for ads without checking the current page.

A byte check that runs before upload

Run this over the URLs a generation batch returned. It reads each file, compares the byte count to the limit for its role, and prints the offenders. It uses only the standard library.

import urllib.request

LIMITS = {"image": 5 * 1024 * 1024, "logo": 150 * 1024}

def check(url, role):
    with urllib.request.urlopen(url, timeout=60) as r:
        body = r.read()
        kind = r.headers.get("Content-Type", "")
    ok = len(body) <= LIMITS[role]
    return ok, len(body), kind

batch = [
    ("https://media.sume.com/img/example/0.png", "image"),
    ("https://media.sume.com/img/example/logo.png", "logo"),
]
for url, role in batch:
    ok, size, kind = check(url, role)
    print(role, "OK" if ok else "TOO BIG", size, kind)

Keep the check in the pipeline

Run the byte check as a gate between generation and upload, not as a manual step at the end. A gate that fails the whole batch on one oversized logo is annoying but cheap, and a rejected asset in an ad account is slower to discover. Log the size next to the job id so you can see which prompts tend to produce heavy files, and adjust the brief for logos accordingly.

If the logo is over

Regenerate at a lower tier before trying anything else, and ask for a flat background and few colors in the prompt, since less detail means fewer bytes. Keep the generation job output, then re-measure. A logo you will use for months is also worth a one-time manual export in a design tool, where file weight can be tuned directly.

Sources

Related posts

More in Use cases

All Use cases posts

Written by Sume