Truth Social 450 MB video limit: average bitrate for 15 minutes
A 450 MB cap over a 900-second clip leaves about 4 Mbps for video plus audio. Worked ceilings for 5, 10 and 15 minutes, and a Python check before upload.

A 450 MB file that runs the full 15 minutes has an average ceiling of 4 megabits per second for video and audio together. The arithmetic is 450 megabytes times 8, which is 3,600 megabits, divided by 900 seconds. That is a ceiling for the whole file, not a target, and it assumes 1 MB is 8 megabits as a decimal unit. Truth Social's help page does not say whether MB means decimal or binary, so leave some headroom.
The two numbers on the page
Truth Social's upload page lists the maximum video size as 450 MB and the maximum duration as 15 minutes. The page does not list a bitrate, a codec, a resolution or a frame rate. This post only works with the two numbers it gives.
| Clip length | Seconds | Ceiling for video plus audio |
|---|---|---|
| 5 minutes | 300 | 12 Mbps |
| 10 minutes | 600 | 6 Mbps |
| 15 minutes | 900 | 4 Mbps |
| 60 seconds | 60 | 60 Mbps |
Where the cap actually bites
Short clips almost never reach the cap, so duration is the limit that matters for them. The size gate only bites near the top end, where a high bitrate source or a high resolution render can pass 450 MB before it reaches 15 minutes. Sume video inspect returns size_bytes and duration_seconds in its probe, so you can calculate the real average before upload instead of guessing.
Check a probe before you upload
Run a probe with frames set to false, which returns the probe and no stills. In the probe, read duration_seconds and size_bytes. Note that size_bytes can be null, so treat a null as a failed check and not as a pass.
The function below returns the average megabits per second for the probe and says whether the file fits under 450 MB and 900 seconds. Replace the sample numbers with your own probe values.
LIMIT_BYTES = 450 * 1_000_000
LIMIT_SECONDS = 900
def check(probe):
size = probe.get("size_bytes")
secs = probe.get("duration_seconds")
if size is None or not secs:
return {"ok": False, "reason": "missing size or duration"}
mbps = size * 8 / secs / 1_000_000
ok = size <= LIMIT_BYTES and secs <= LIMIT_SECONDS
return {"ok": ok, "average_mbps": round(mbps, 2)}
print(check({"size_bytes": 380_000_000, "duration_seconds": 840}))
print(check({"size_bytes": 520_000_000, "duration_seconds": 840}))What to change if it is over
If the file is over, shorten it first. Video trim cuts a range of one hosted clip into a new MP4, and for exact precision it accepts an output object with width, height and fps. Width and height run from 256 to 2160, and fps is 24, 25, 30 or 60. Smaller dimensions and a lower frame rate usually reduce the size, but Sume does not expose a bitrate control, so measure the result with another probe and do not assume a number.
Trim also accepts audio set to drop. That removes the soundtrack, which matters if you only need a silent loop, but it is not a good idea for a talking clip.
Reading the average honestly
The 4 Mbps figure is an average over the whole file, and real encodes vary. A talking head with a static background compresses far below the average. A fast-moving scene, film grain or a busy handheld shot can sit far above it for stretches. Because the cap is on total bytes, quiet stretches pay for loud ones, so a file with a 6 Mbps average over 10 minutes lands at 450 MB exactly and has no room left.
Audio counts too. The ceiling above is for the sum of video and audio, so a stereo AAC track at a typical speech rate takes a small slice, but it is not zero. When you plan a render, subtract the audio rate you expect from the ceiling before you set the video side. Sume's audio detach job can produce an mp3 at 128 kbps if you need to measure what an audio track costs on its own.
Finally, remember the units. This post uses 1 MB as 1,000,000 bytes, which is the smaller reading of the two. If the platform counts in binary megabytes the true cap is about 4.9 percent higher, so planning with the decimal reading is the safe side.
Cost of the checks
Sume's trim job costs $0.02 per job at the public rate, and the docs tell you to confirm the live rate in the catalog. A probe is billed by its compute, so skipping stills with frames set to false keeps it small.
Sources
Related posts
More in Integrations
- Typeform webhook auto-disabled: answer 2xx before calling Sume
Typeform disables a webhook that fails every try, and a 404 or 410 stops it at once. Answer 2xx first, then start the Sume job from a queue.
- Upload a local file to Sume from chat: hosted MCP can't read disk
Hosted Sume MCP cannot read your laptop files. The flow is assets_upload_url, a client PUT of the bytes, then assets_complete. What to do in ChatGPT or Claude.
- Veo videos vanish after 2 days: copy to Cloud Storage and expire them
Google keeps Veo output on its server for 2 days. Copy each clip to your own bucket, then let a Cloud Storage lifecycle rule delete old copies on a schedule.
- Webflow Assets API lists no audio types: where a Sume track goes
Webflow's asset docs name image, document and Lottie types, not audio. Keep the Sume mp3 on its media.sume.com URL and store that link in a CMS Link field.
Written by Sume