Supabase cached egress is $0.03/GB: cost of serving a 20 MB AI clip
Supabase lists cached Storage egress at $0.03 per GB. Worked arithmetic for serving generated clips, and when to link a Sume media URL instead of copying.

Supabase's changelog lists cached Storage egress at $0.03 per GB, which the entry describes as three times cheaper than origin egress. For a 20 MB clip that is $0.0006 per cached view, so egress is a small line next to the cost of generating the clip, but it scales with views rather than with renders.
The 20 MB size is an assumption chosen to make the arithmetic easy to check. Replace it with the size of your own exports before drawing a conclusion.
What the Supabase entry says
The figure comes from a Supabase changelog entry dated 2025-08-22, read on 2026-10-03. It is older than most of the items in a fall 2026 review, so confirm it against the live pricing page before you commit a budget to it.
| Item | Value | Note |
|---|---|---|
| Cached egress | $0.03 per GB | Per the changelog entry |
| Relation to origin egress | Three times cheaper | Per the changelog entry |
| Implied origin egress | About $0.09 per GB | Derived: three times $0.03 |
| Changelog entry date | 2025-08-22 | Check for newer pricing |
Worked arithmetic for a 20 MB clip
Egress is size times views. Using 1 GB as 1,000 MB for round numbers, a 20 MB clip is 0.02 GB per full view. The table assumes every view downloads the whole file and every request is served from cache; a cache miss is billed at the origin rate, which is the implied $0.09 per GB above.
| Views | Data served | At cached rate | At implied origin rate |
|---|---|---|---|
| 100 | 2 GB | $0.06 | $0.18 |
| 1,000 | 20 GB | $0.60 | $1.80 |
| 10,000 | 200 GB | $6.00 | $18.00 |
Copy the file, or link to the Sume URL
A completed Sume job returns artifacts whose url is a media.sume.com address, and the docs say to use those Sume media URLs from the result rather than raw provider URLs. If your page only needs to play the clip, you can link that URL and your Storage egress is zero. Copying into your own bucket makes sense when you need your own access rules, your own domain, or a retention policy you control yourself.
If you do copy, copy once, at the moment the job reaches completed, and store the Sume job id beside the stored path. The webhook page recommends using job_id as the idempotency key on your side, so a retried delivery should not trigger a second copy.
A cost estimator you can run
This script turns a file size and a view count into dollars at the cached rate and at the implied origin rate. It takes the rate as an argument so you can change it when Supabase changes the price.
def egress_cost(size_mb, views, usd_per_gb=0.03, cached_share=1.0, origin_multiplier=3.0):
gb = size_mb / 1000 * views
cached = gb * cached_share * usd_per_gb
origin = gb * (1 - cached_share) * usd_per_gb * origin_multiplier
return round(cached + origin, 4)
if __name__ == "__main__":
for views in (100, 1000, 10000):
best = egress_cost(20, views)
mixed = egress_cost(20, views, cached_share=0.8)
print(views, best, mixed)What to do next
- Measure your real clip sizes from finished jobs, not from a guess.
- Estimate views per clip for one campaign, then run the script with a pessimistic cached share.
- Compare the result with the per-clip generation cost you already see in the usage ledger at
GET /v1/usage. - Prefer linking the Sume media URL when you do not need your own domain or retention rules.
What this number leaves out
The $0.03 per GB figure covers egress only. Storage at rest, requests and any CDN or transformation features are separate lines that the entry I read does not price, so a full serving budget needs the live pricing page. The table also assumes a whole-file download per view; a player that streams only part of a clip, or a viewer who leaves early, transfers less than the full file.
A simple discipline helps: log the byte size of each clip when you store it, log the view count from your own analytics, and multiply. If the monthly total is small next to your generation spend, spend your effort elsewhere; if a few clips go viral, the cached share is the number to watch.
Sources
Related posts
More in Developers
- End-user id on jobs: OpenAI safety identifier vs Sume metadata
OpenAI's Realtime guide asks for an OpenAI-Safety-Identifier header. Sume stores caller metadata on the job but does not send it to the provider. Use both.
- Test a faster-and-cheaper claim with your own timings and usage.cost
Luma's news page says Ray3.14 is 4x faster and 3x cheaper. A short Python script turns your own job timings and usage.cost values into two ratios you can trust.
- Text to Dialogue continuity: 100-character context, 3 request IDs
ElevenLabs' Sept 28 changelog adds previous_text and future_text (100 chars max) and request-ID chaining (3 max). A Python limit check.
- VS Code 1.140 shared MCP config files: what goes in the Sume entry
VS Code 1.140 lets MCP servers live in portable config files shared across Copilot tools. For Sume the entry is one URL, and no key belongs in the file.
Written by Sume