TikTok upload chunk rules: 5 MB to 64 MB, up to 1,000 chunks
TikTok FILE_UPLOAD chunks must be 5 to 64 MB, the last up to 128 MB, 1,000 chunks max. A short planner computes the Content-Range for each PUT.

For a FILE_UPLOAD post, TikTok wants the video split into chunks of at least 5 MB and at most 64 MB, except the final chunk, which may run up to 128 MB. You may send at most 1,000 chunks, strictly in order, for a file of at most 4 GB. A fixed 32 MB chunk size with the remainder folded into the last chunk satisfies every rule, and the planner below shows how. A 64 MB size would not: TikTok requires a file over 64 MB to go in more than one chunk, so a 70 MB file at 64 MB would be a single illegal chunk.
Rules on the page
| Rule | Value |
|---|---|
| Minimum chunk | 5 MB |
| Maximum chunk | 64 MB, except the final chunk (up to 128 MB) |
| Chunk count | 1 to 1,000 |
| Order | Chunks must be uploaded sequentially |
| Maximum video | 4 GB |
| Per-chunk request | PUT with Content-Type, Content-Length and Content-Range: bytes first-last/total |
| Responses | 201 when all chunks are in; 206 while more are expected |
A chunk planner
Use a 32 MB size, then fold the remainder into the last chunk. A 150 MB file becomes four chunks: three of 32 MB and a last one of 54 MB. The planner returns the exact byte range for each Content-Range header and refuses files that break the 1,000-chunk or 4 GB limit. We use 4,000,000,000 bytes as the cap to stay on the safe side of GB versus GiB.
CHUNK = 32 * 1024 * 1024
MAX_BYTES = 4_000_000_000
def plan(total):
if total <= 0 or total > MAX_BYTES:
raise ValueError("size out of range")
n = max(1, total // CHUNK)
if n > 1000:
raise ValueError("more than 1000 chunks")
spans = [(i * CHUNK, (i + 1) * CHUNK - 1) for i in range(n - 1)]
spans.append(((n - 1) * CHUNK, total - 1))
return [f"bytes {a}-{b}/{total}" for a, b in spans]
for header in plan(150 * 1024 * 1024):
print(header)
Where Sume fits
Most short-form posts never get near 64 MB. When a source is too long or too large, cut it with video trim: start plus end or duration, up to 900 seconds per output, $0.02 per job. Optional output sets width, height and fps. Sume does not expose a bitrate control, so measure the file you get back rather than predicting its size.
Limits
A file under 5 MB is not addressed by the page; send it as one chunk and confirm in TikTok's sandbox. The page also offers PULL_FROM_URL, where TikTok downloads the file itself, but it does not say here which hosts are accepted, so check the TikTok docs for URL ownership rules before pointing it at a media.sume.com link. Review the AI-label flag separately: see TikTok AI-generated content labels.
Sources
Related posts
More in Developers
- TikTok Direct Post post_info fields: title, is_aigc, duet, stitch
A checked list of TikTok post_info fields as of October 2026, with a validator for title length in UTF-16 units, privacy level and the is_aigc AI label.
- Timeline 1.0 warnings after stitching shots: which need a fix
Timeline 1.0 returns soft warnings, not failures. A list of the codes you will see on a stitched AI film, what each means, and which ones are worth acting on.
- TTS boundary_lead_ms: why sentence slices end 70 ms after a word
Sume TTS sentence segments cut boundary_lead_ms after a sentence's last word: 70 ms by default, 0 to 500. The next segment absorbs the pause, and no gap opens.
- tts_duration_exceeded: split long scripts for Sume TTS
Sume TTS fails with tts_duration_exceeded when audio would pass 1,200 seconds, and takes at most 20,000 characters. Split rules and how to join the parts.
Written by Sume