Cloudflare Stream MP4 downloads need enabling; Sume returns the file
Cloudflare Stream makes an MP4 download only after you enable it and poll. A Sume media tool result already gives you a finished MP4 artifact URL.

On Cloudflare Stream an MP4 download does not exist until you ask for one: you POST to the downloads endpoint, then poll until its status is ready. A finished Sume media job works the other way: its result carries a video_url for a durable MP4 on media.sume.com, so there is no enabling step, though you still poll the job until the result is ready.
Cloudflare's steps are from its MP4 downloads page, read 2026-10-03. Sume's come from video trim and Timeline 1.0.
The two flows
Both end with a file URL, but the waiting happens in different places.
| Step | Cloudflare Stream | Sume media tool |
|---|---|---|
| Create | POST to /downloads or /downloads/default | POST to a tool such as /v1/video-trim |
| Wait | Poll /downloads until status is ready | Poll /v1/jobs/:id/status until result_ready |
| Read | MP4 download URL | video_url in /v1/jobs/:id/result |
| Filename | Up to 120 characters from letters, digits, - and _ | Not described in the docs |
Why the difference exists
Stream stores videos for adaptive playback, so a plain MP4 is an extra product made on request. The page does not state the resolution of the generated MP4, so check the file you get. Sume's tools run ffmpeg to produce a file as the job output, so the MP4 is the product.
Sume gives you a new artifact URL each time and never overwrites the source.
Waiting for a Sume result
Trim, filter and detach default to async mode. Pass mode: "sync" to wait up to 30 seconds for a finished job, or you get 202 and poll. A timeline render has the same pattern. When result_ready, the result is kind: video_trim, video_filter or timeline_render with video_url and duration_seconds.
Send an Idempotency-Key on each write so that a retry returns the same job rather than starting a second paid one.
- Trim is $0.02 a job.
- Timeline is $0.10 per rounded-up output minute.
- Timeline output defaults to 1080 by 1920.
Moving the file on
If the next stop is Cloudflare, give Stream the Sume URL with its upload-via-link route, as long as the URL is a direct file. Cloudflare's limits and its fetch behavior are in its own docs, so read them for your plan.
What to store
Keep the artifact URL from the Sume result rather than a provider URL, as Sume's media docs advise for integrations. For Cloudflare, keep the video id and the download URL once its status is ready.
Storing both lets you tell which file came from which system when a customer asks where a clip came from.
Checking what you received
After either flow, open the file and read its properties: dimensions, frame rate and length. Cloudflare's page does not state the resolution of its generated MP4. Sume's trim result gives duration_seconds and actual_start_seconds, and the timeline result gives duration_seconds and segment_count.
Put those fields in your logs so you can tell, later, what each file was meant to be.
Sources
Related posts
More in Media tools
- Cloudflare Stream thumbnail fit modes vs Sume Timeline fit modes
Cloudflare Stream fit: crop, clip, scale, fill. Sume Timeline 1.0 fit: cover, contain, stretch, blur. Which names map and where they differ.
- Cloudflare Stream link upload: no Drive links, plus Sume's import
Cloudflare Stream can fetch a video from a URL but warns against Google Drive share links. Sume media tools need the file imported to media.sume.com first.
- Cloudinary ar_9:16,c_fill,g_auto vs Sume per-shot crop fractions
Cloudinary reframes video with ar_9:16,c_fill,g_auto. On Sume you pick crop x per shot (left, centre, right), with a runnable Python script.
- Sale banner compose errors: not a still, wrong axis, clamped duration
Fix the stable Sume Timeline compose refusals for a sale banner: compose_image_not_still, compose_image_region_wrong_axis and a clamped duration warning.
Written by Sume