TikTok FILE_UPLOAD vs PULL_FROM_URL for a Sume video file
Use PULL_FROM_URL for server-side files on a domain you verified, FILE_UPLOAD for device files. A media.sume.com link is not your domain, so re-host or upload.

Pick PULL_FROM_URL when your server holds the file and the URL sits on a domain or URL prefix you have verified in TikTok's developer dashboard. Pick FILE_UPLOAD when you have the bytes and want to send them in chunks. A Sume result link on media.sume.com is not a domain you verified, so download the file first and use one of those two paths.
The two methods differ in who moves the bytes, which limits apply, and what can go wrong.
What do the TikTok pages say about each?
The upload guide lists FILE_UPLOAD for local video files (MP4 with H.264) and PULL_FROM_URL for video on your verified domain. Photos only support URL-based upload. The Content Sharing Guidelines add: use PULL_FROM_URL for server-side content, and FILE_UPLOAD for content from the user's device only.
The Media Transfer Guide adds the rules for each.
| Question | FILE_UPLOAD | PULL_FROM_URL |
|---|---|---|
| Intended for | Content from the user's device | Server-side content |
| Where the file lives | You send the bytes in chunks | HTTPS URL on a verified domain or prefix |
| Chunks | 5 to 64 MB each, final up to 128 MB, 1 to 1000 | Not applicable |
| Time limit | Upload URL valid for 1 hour | URL must stay reachable up to one hour |
Why can't I pull directly from media.sume.com?
You must verify ownership of the domain or URL prefix in the TikTok developer dashboard before using PULL_FROM_URL. You do not own media.sume.com, so you cannot verify it, and a pull pointing there fails the ownership check. Our post on the ownership error shows the symptom.
The way out is a copy step: when a Sume job finishes, read the result through jobs and results, download the MP4 on your server, and either serve it from your own verified host or push it with FILE_UPLOAD.
How do I plan the chunks for FILE_UPLOAD?
Sizes under 5 MB go as a single chunk. Otherwise each chunk is at least 5 MB and at most 64 MB, and the last one may reach 128 MB. The helper below takes 64 MB chunks and lets the final one absorb the remainder, which keeps it inside the 128 MB allowance. It returns the numbers you then place in TikTok's init request under the names its reference uses.
MB = 1024 * 1024
def chunk_plan(size):
if size < 5 * MB:
return size, 1
n = max(1, size // (64 * MB))
if n > 1000:
raise ValueError("more than 1000 chunks")
return 64 * MB, n
for s in (3 * MB, 40 * MB, 200 * MB):
print(s // MB, "MB ->", chunk_plan(s))Which should I choose for an AI-video pipeline?
If you already host files on a verified domain, PULL_FROM_URL is simpler: no chunking, and TikTok fetches the file. If you only have a worker with a downloaded MP4, FILE_UPLOAD avoids standing up a public host. Both keep Sume out of the TikTok conversation: Sume produces the file and your app owns the rest.
Remember the one-hour windows. Start the upload promptly after you create it, and keep a pulled URL alive for at least that long.
Checklist
Before choosing a method:
- Is the file on a domain you verified? Then consider PULL_FROM_URL.
- Is it only on media.sume.com? Download it first.
- Is it a photo? Only URL-based upload is supported.
- Is it larger than 64 MB? Plan multiple chunks.
Sources
Related posts
More in Integrations
- TikTok inbox upload vs Direct Post: which API for an AI video?
Inbox upload makes a draft the creator finishes in TikTok; Direct Post publishes with title, privacy and consent set in your app. Compare scope and audit.
- TikTok photo post limits: 20 MB per image, 1080p max, JPEG or WebP
TikTok's media guide caps photo-post images at 1080p and 20 MB each, in WebP or JPEG. Set Sume image output and video stills to match before you upload.
- TikTok publish webhooks vs Sume run webhooks: wire both safely
TikTok sends webhooks for failed, complete, inbox, public and removed posts. Sume signs its own run webhook separately. Keep two receivers and verify Sume's.
- Val Town free 1-minute timeout: a Sume webhook receiver val
Val Town's free plan stops a val at 1 minute and runs crons every 15 minutes at best. Submit Sume jobs async, then take the result by webhook or a slow cron.
Written by Sume