Restaurant promo video for TikTok Ads: check size before upload
A restaurant promo made with a Sume Format can fail TikTok's non-Spark minimums. Read width, height and size_bytes from the run receipt before you upload.

Yes, you can make a restaurant promo with one Format call, but check the file before you upload it as a TikTok ad. TikTok's help page sets minimums for non-Spark ads: 540x960 pixels for 9:16, 960x540 for 16:9 and 640x640 for 1:1, a file at or under 500 MB, and a bitrate of at least 516 kbps (read 2026-10-09). The run receipt from Sume already carries the numbers you need for the first three checks.
What the receipt gives you
A completed Format run lists each durable file in artifacts[] with id, type, url, content_type, size_bytes, width, height, duration_ms and checksum_sha256. You do not have to download the file and probe it to learn its pixel size. You read the receipt at GET /v1/format-runs/{run_id}/result, which returns 409 run_not_completed until the run is terminal.
The receipt has no bitrate field. You can compute a rough average yourself: size_bytes * 8 / (duration_ms / 1000). A 20-second file of 6,000,000 bytes gives 48,000,000 bits over 20 seconds, which is 2,400 kbps, far above the 516 kbps floor. Treat that as an estimate, not as TikTok's own measurement.
The pre-upload checklist
The table maps each TikTok limit to the receipt field that answers it. Both columns are as of 2026-10-09.
| TikTok limit (read 2026-10-09) | Value | Receipt field |
|---|---|---|
| 9:16 minimum | 540x960 px | width, height |
| 16:9 minimum | 960x540 px | width, height |
| 1:1 minimum | 640x640 px | width, height |
| File size | 500 MB or less | size_bytes |
| Duration | Up to 10 minutes | duration_ms |
| Bitrate | 516 kbps or more | Estimate from size_bytes and duration_ms |
| File formats | .mp4, .mov, .mpeg, .3gp, .avi | content_type |
A short check script
This script reads the result of one finished run and prints one line for each video file. It treats a file as acceptable only if it is vertical, at least 540x960 and at most 500 MB. It needs SUME_API_KEY with formats:read.
import json, os, urllib.request
def get(url):
req = urllib.request.Request(url, headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"]})
with urllib.request.urlopen(req) as r:
return json.load(r)["data"]
def tiktok_ok(run_id):
run = get("https://api.sume.com/v1/format-runs/" + run_id + "/result")
for a in run["artifacts"]:
if a["type"] != "video":
continue
w, h = a["width"], a["height"]
mb = a["size_bytes"] / 1e6
ok = w >= 540 and h >= 960 and h > w and mb <= 500
print(a["url"], w, h, round(mb, 1), "MB", "ok" if ok else "REJECT")
Where the promo itself comes from
For the promo, call a Format at POST /v1/formats/{handle}/{slug}/runs. The catalog lists slugs such as sume-product-commercial and sume-slideshow at the sume handle. Read the Format with GET /v1/formats/sume/{slug} first: its io profile tells you whether it takes text, an image or a URL. Put the menu copy and the address in input, and state the aspect ratio in instruction. If the check fails, start a new run with a changed instruction and a new Idempotency-Key. Reusing a key with a different body returns 409 idempotency_conflict.
Pricing for the run is metered against the cap you set in generation_spend_cap_usd, so give a restaurant promo a small cap such as 20 and read usage.billable_amount_usd_micros on the receipt afterward.
Limits this check does not cover
The check above covers size, shape and length. It does not cover everything TikTok asks for. The same help page describes ad captions, safe zones and, for Spark Ads, different rules, and We did not verify those against a Sume run, so read the page before you submit a campaign. Safe zones matter for a restaurant promo because the price or address often sits near the edge of the frame.
If a file fails the size check, the cheapest fix is usually in the instruction of the next run: say that the video is vertical 9:16 and give the pixel size you need. Then read the new receipt, not the instruction, to see what you got. Keep each attempt under its own idempotency key and a small generation_spend_cap_usd, so two or three retries stay inside a budget you chose.
Finally, store the run id with the ad id. If TikTok rejects the file later, you can read the original receipt and compare width, height and size_bytes with the rejection message.
Sources
Related posts
More in Use cases
- Retro TV bumper in 4:3: 11 s of Seedance 2.5 costs less at 480p
An 11-second 4:3 Seedance 2.5 clip costs $2.90 at 480p and $6.40 at 720p on Sume. At 480p, 4:3 is cheaper than 16:9.
- Rightmove listing video: host it online and check for personal data
Rightmove takes a video as a URL plus caption, and you become the data controller. Review stills and the transcript with Sume video inspect before you share.
- Rough-cut an imported Reel: the $0.15 import is the biggest line
Importing a Reel costs $0.15, more than the cuts. A 6-trim rough cut totals $0.38; one Timeline render over the same ranges totals $0.27.
- SaaS demo from a 48-second recording: trim, crop and cues for $0.24
Turn a 48-second screen recording into a tighter SaaS demo clip on Sume: trim the lead-in $0.02, crop to the UI $0.02, burn caption cues $0.20. Total $0.24.
Written by Sume