Runway Ad Localization in 20 languages vs a Sume bulk run

Runway Ad Localization turns one ad image into one language at up to 21 credits. A Sume bulk queue runs one Format per language, 1 to 100 items at a time.

6 min readSume
All posts

Runway's Ad Localization app takes one ad image and one target language and returns a localized image that keeps the layout, at up to 21 credits per generation, with 20 supported languages listed. At the 21-credit ceiling, 19 languages from an English source is 19 x 21 = 399 credits, and all 20 would be 420. On Sume you build the same set as a bulk queue: one run per language, each with the ad image attached and the language named in the instruction.

What the Runway app does

Runway Ad Localization (read 2026-10-04)
SpecValue
InputOne image: ad, poster or campaign creative
OutputLocalized image matching the input aspect ratio
LanguagesArabic, Chinese (Simplified), Chinese (Traditional), Dutch, English, French, German, Hindi, Indonesian, Italian, Japanese, Korean, Portuguese, Russian, Spanish, Swedish, Thai, Turkish, Ukrainian, Vietnamese
Credit costUp to 21 credits per generation
Review adviceHave a native speaker check copy where nuance matters

The Sume version

A bulk request is a server-side queue of ordinary Format runs. The envelope has two keys: concurrency, an integer from 1 to 16, and items, 1 to 100 entries, each the same body as a single run. Each item can carry its own attachments, instruction and webhook. Mint a fresh Idempotency-Key per batch, because replaying a spent key returns the old queue.

The script below builds 19 items for a Format you own, here called acme/ad-localize, and prints the body size. It sends nothing.

import json

LANGS = ["Arabic", "Chinese (Simplified)", "Chinese (Traditional)", "Dutch", "French",
         "German", "Hindi", "Indonesian", "Italian", "Japanese", "Korean", "Portuguese",
         "Russian", "Spanish", "Swedish", "Thai", "Turkish", "Ukrainian", "Vietnamese"]
AD = "https://cdn.example.com/ads/spring.png"

items = [
    {
        "instruction": f"Translate all visible text to {lang}. Keep layout and style.",
        "attachments": [{"type": "input_image", "image_url": AD}],
        "generation_spend_cap_usd": 3,
    }
    for lang in LANGS
]
body = {"concurrency": 4, "items": items}
assert 1 <= len(items) <= 100
print(len(items), "items;", len(json.dumps(body)), "bytes")
# POST to /v1/formats/acme/ad-localize/bulk-runs with an Idempotency-Key header.

Read the queue honestly

The queue status completed means every item is terminal, not that all succeeded: branch on counts.failed. The queue has no webhook, so poll GET /v1/format-run-queues/{id} or register a webhook per item.

Before you scale a batch

Run one item first and read the receipt, including usage and the spend cap, then queue the rest. A bulk queue is complete when every item is terminal, so check counts.failed rather than assuming success.

Sources

Related posts

More in Comparisons

All Comparisons posts

Written by Sume