Hosting video on Cloudflare R2, end to end.
R2 stores and serves the files. It does not transcode, package or protect them. This page covers what R2 gives you, what you still have to build, and what the combination costs.
Short answer
R2 can host video, but it will not prepare it.
R2 is S3-compatible object storage with $0 internet egress. It will serve an HLS manifest and its segments to a player exactly like any other object, so it works as a video origin once the streaming files exist. What it will not do is create them: there is no transcoding, no packaging and no signed-playback layer in R2 itself.
So a working setup is R2 plus something that produces the renditions and issues playback URLs. That is either a pipeline you run yourself, or a service like NULX that writes its output into your bucket.
Estimate this workload in the calculator See how BYO storage works
What you still need
Three gaps between a bucket and a player.
These are the pieces R2 does not include. Every R2 video setup solves them somehow.
Transcoding and packaging
A source MP4 is not streamable. It has to be encoded into a rendition ladder and packaged into HLS or DASH before adaptive playback works.
A domain in front
Serving from the bucket's default endpoint is not intended for production traffic. A custom domain on the bucket is what makes playback cacheable and stable.
Access control
Objects are public or private. Members-only video needs expiring signed URLs, which means something has to sign them per request.
Cost shape
What an R2 video month actually contains.
| Line | Who bills it | Rate |
|---|---|---|
| Storage | Cloudflare | $0.015 per GB-month |
| Internet egress (playback) | Cloudflare | $0 |
| Class A operations (writes) | Cloudflare | $4.50 per million |
| Class B operations (reads) | Cloudflare | $0.36 per million |
| Transcoding | You or a vendor | Not included in R2 |
| NULX platform (if used) | NULX | $19/mo, 60 encoding hours included |
R2 rates are Cloudflare's published list prices. The $0 egress line is what makes R2 unusual for video: delivery volume does not move this bill, but operations and storage do.
Common questions
What people ask before moving video to R2.
Can a browser play video directly from an R2 bucket?
Yes, if the bucket holds a valid HLS manifest and segments and a custom domain is in front of it. The player fetches the manifest and the segments over HTTPS like any other static files.
Does R2 transcode uploaded video?
No. R2 stores exactly the bytes you put in it. Transcoding is a separate step you run before or after upload.
Is $0 egress real for video delivery?
Yes for standard internet egress, which is where video delivery cost normally lands. Storage and per-operation charges still apply, so a very large library with heavy request volume is not free.
How does this differ from Cloudflare Stream?
Stream is the managed product: it transcodes, stores and delivers, billed per stored and delivered minute. R2 is raw storage you assemble a pipeline around.
Sources
Rates checked September 10, 2026 · Page updated September 10, 2026
Next step
Price your own library.
Put your storage volume and monthly viewing into the calculator and compare the assembled cost against managed alternatives.