---
title: "S3-compatible storage compared: true cost at 1 TB + 5 TB egress"
slug: s3-compatible-storage
url: "https://toolweight.dev/compare/s3-compatible-storage"
question: Which S3-compatible object storage provider is actually cheapest once egress is counted?
tools: 12
fields: 28
last_verified: 2026-07-23
freshness: 35%
verify_cadence: 30d
license: CC-BY-4.0
---

# S3-compatible object storage providers

> **Which S3-compatible object storage provider is actually cheapest once egress is counted?**
>
> Hetzner Object Storage is cheapest at USD 12.47/mo for 1 TB stored plus 5 TB egress plus 10 M requests, then Cloudflare R2 at 22.74 and Backblaze B2 at 26.95. AWS S3 is 472.60 — thirty-eight times Hetzner — and 93% of that is bandwidth. If you need Sydney, R2, Tigris and DigitalOcean Spaces are the realistic shortlist.

## At a glance

|  |  |
| --- | --- |
| Canonical | https://toolweight.dev/compare/s3-compatible-storage |
| Tools compared | 12 |
| Fields compared | 28 |
| Last verified | 2026-07-23 (today) |
| Verify cadence | 30d |
| Freshness | 35% (mean cell confidence) |
| Killer field | true_cost_usd |
| Scoring | Weighted, re-rankable |
| Licence | CC-BY-4.0 — https://creativecommons.org/licenses/by/4.0/ |

## Ranking — default weights

| # | Tool | Score | Coverage | One-liner |
| --- | --- | --- | --- | --- |
| 1 | [MinIO](https://toolweight.dev/tools/minio) | 85.6 | 68% | The self-hosted S3 reference implementation — your hardware, your bandwidth, your SLA. |
| 2 | [Tigris](https://toolweight.dev/tools/tigris) | 80.2 | 88% | Globally distributed S3-compatible storage that caches objects near readers. |
| 3 | [Storj](https://toolweight.dev/tools/storj) | 78.4 | 92% | Decentralised erasure-coded storage: USD 4/TB stored, USD 7/TB egress, no regions. |
| 4 | [Backblaze B2](https://toolweight.dev/tools/backblaze-b2) | 75.9 | 100% | Cheap US and EU object storage with free egress up to three times stored volume. |
| 5 | [Cloudflare R2](https://toolweight.dev/tools/cloudflare-r2) | 75.0 | 96% | S3-compatible object storage with zero egress fees, on Cloudflare's network. |
| 6 | [Wasabi](https://toolweight.dev/tools/wasabi) | 74.0 | 92% | Flat-rate hot storage with no egress or API fees, bounded by a fair-use cap. |
| 7 | [iDrive e2](https://toolweight.dev/tools/idrive-e2) | 73.2 | 80% | USD 4/TB S3-compatible storage with zero-egress marketing and a fair-use cap. |
| 8 | [Scaleway Object Storage](https://toolweight.dev/tools/scaleway-object-storage) | 71.3 | 92% | European-sovereign S3 storage with multi-AZ classes and a real IAM system. |
| 9 | [DigitalOcean Spaces](https://toolweight.dev/tools/digitalocean-spaces) | 69.7 | 88% | Bundled object storage plus free CDN, priced as a flat base fee with overages. |
| 10 | [AWS S3](https://toolweight.dev/tools/aws-s3) | 65.3 | 96% | The API everything else copies, and by far the most expensive egress in this roster. |
| 11 | [Bunny Storage](https://toolweight.dev/tools/bunny-storage) | 61.8 | 88% | Edge storage built as a CDN origin, with its own API rather than a faithful S3 one. |
| 12 | [Hetzner Object Storage](https://toolweight.dev/tools/hetzner-object-storage) | 60.9 | 88% | The cheapest credible S3 endpoint in Europe, with a deliberately thin feature set. |

Re-rank against your own priorities by appending `?w=field_id:weight,…` to the canonical URL, or call `score_tools` on the MCP server at `https://toolweight.dev/mcp`.

## Comparison

### Pricing

| Tool | True cost /mo (USD) (/mo) | True cost /mo (AUD) (/mo) | True cost from Sydney (AUD) (/mo) | Storage $/TB/mo (/TB/mo) | Egress $/TB (/TB) | Egress cap (x stored) (x stored) | Class A $/M ops (/M ops) | Class B $/M ops (/M ops) | Min retention | Min billed object |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| MinIO | — | — | — | — | — | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| Tigris | $29.5 /mo | A$44.84 /mo | A$44.84 /mo | $20 /TB/mo | $0 /TB | — | $5 /M ops | $0.5 /M ops | 0 ms | 0 B |
| Storj | $39 /mo | A$59.28 /mo | A$59.28 /mo | $4 /TB/mo | $7 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| Backblaze B2 | $26.95 /mo | A$40.96 /mo | — | $6.95 /TB/mo | $10 /TB | 3 x stored | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| Cloudflare R2 | $22.74 /mo | A$34.56 /mo | A$34.56 /mo | $15 /TB/mo | $0 /TB | — | $4.5 /M ops | $0.36 /M ops | 0 ms | 0 B |
| Wasabi | — | — | — | $6.99 /TB/mo | $0 /TB | 1 x stored | $0 /M ops | $0 /M ops | 129600 min | 4 KB |
| iDrive e2 | — | — | — | $4 /TB/mo | $0 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| Scaleway Object Storage | $72.8 /mo | A$110.66 /mo | — | $16.94 /TB/mo | $11.6 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| DigitalOcean Spaces | $60 /mo | A$91.2 /mo | A$91.2 /mo | $20 /TB/mo | $10 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| AWS S3 | $472.6 /mo | A$718.35 /mo | A$900.14 /mo | $23 /TB/mo | $90 /TB | — | $5 /M ops | $0.4 /M ops | 0 ms | 0 B |
| Bunny Storage | $60 /mo | A$91.2 /mo | A$243.2 /mo | $10 /TB/mo | $10 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |
| Hetzner Object Storage | $12.47 /mo | A$18.95 /mo | — | $6.95 /TB/mo | $1.38 /TB | — | $0 /M ops | $0 /M ops | 0 ms | 0 B |

### Features & API

| Tool | S3 API coverage (%) | Presigned URLs | Multipart upload | Versioning | Lifecycle rules | Event notifications | CDN integration | Max object size | IAM granularity | Sydney region | TTFB from Sydney |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| MinIO | 98 % | ● | ● | ● | ● | ● | diy | 5 TB | 5 | ● | — |
| Tigris | 90 % | ● | ● | ● | ● | ● | free-bundled | 5 TB | 3 | ● | 60 ms |
| Storj | 80 % | ● | ● | ● | — | ○ | partner | 5 TB | 4 | ◐ | 150 ms |
| Backblaze B2 | 85 % | ● | ● | ● | ● | ● | partner | 9.1 TB | 3 | ○ | 180 ms |
| Cloudflare R2 | 82 % | ● | ● | ○ | ● | ● | free-bundled | 5 TB | 3 | ◐ | 45 ms |
| Wasabi | 90 % | ● | ● | ● | ◐ | ○ | partner | 5 TB | 4 | ● | 30 ms |
| iDrive e2 | 80 % | ● | ● | ● | ◐ | ○ | none | 5 TB | 3 | — | — |
| Scaleway Object Storage | 85 % | ● | ● | ● | ● | — | first-party-paid | 5 TB | 4 | ○ | 300 ms |
| DigitalOcean Spaces | 78 % | ● | ● | ○ | ◐ | ○ | free-bundled | 5 TB | 3 | ● | 25 ms |
| AWS S3 | 100 % | ● | ● | ● | ● | ● | first-party-paid | 45.5 TB | 5 | ● | 25 ms |
| Bunny Storage | 30 % | ◐ | ○ | ○ | ○ | ○ | free-bundled | — | 2 | ● | 20 ms |
| Hetzner Object Storage | 70 % | ● | ● | — | ◐ | ○ | diy | 5 TB | 2 | ○ | 300 ms |

### Durability & Retention

| Tool | Durability (nines) ( nines) | Uptime SLA (%) | Object lock / WORM | Replication model |
| --- | --- | --- | --- | --- |
| MinIO | — | — | ● | erasure-coded |
| Tigris | 11  nines | — | — | multi-region |
| Storj | 11  nines | 99.95 % | ● | erasure-coded |
| Backblaze B2 | 11  nines | 99.9 % | ● | single-az |
| Cloudflare R2 | 11  nines | 99.9 % | ◐ | multi-az |
| Wasabi | 11  nines | 99.9 % | ● | single-az |
| iDrive e2 | 11  nines | 99.9 % | ● | single-az |
| Scaleway Object Storage | 11  nines | 99.9 % | ● | multi-az |
| DigitalOcean Spaces | — | — | ○ | single-az |
| AWS S3 | 11  nines | 99.9 % | ● | multi-az |
| Bunny Storage | — | 99.99 % | ○ | multi-region |
| Hetzner Object Storage | — | 99.9 % | ○ | single-az |

### Agentic

| Tool | Official MCP server |
| --- | --- |
| MinIO | ● |
| Tigris | ○ |
| Storj | ○ |
| Backblaze B2 | ○ |
| Cloudflare R2 | ● |
| Wasabi | ○ |
| iDrive e2 | ○ |
| Scaleway Object Storage | ○ |
| DigitalOcean Spaces | ◐ |
| AWS S3 | ● |
| Bunny Storage | ○ |
| Hetzner Object Storage | ○ |

### Traction

| Tool | GA year |
| --- | --- |
| MinIO | 2,015 |
| Tigris | 2,024 |
| Storj | 2,020 |
| Backblaze B2 | 2,015 |
| Cloudflare R2 | 2,022 |
| Wasabi | 2,017 |
| iDrive e2 | 2,021 |
| Scaleway Object Storage | 2,019 |
| DigitalOcean Spaces | 2,017 |
| AWS S3 | 2,006 |
| Bunny Storage | 2,019 |
| Hetzner Object Storage | 2,024 |

### Positioning

| Tool | Positioning |
| --- | --- |
| MinIO | The self-hosted S3 baseline — full API fidelity in exchange for operating it. |
| Tigris | Object storage that behaves like a CDN, for globally distributed apps. |
| Storj | Decentralised storage sold on price and on surviving whole-facility failure. |
| Backblaze B2 | Commodity bulk storage for backup targets and media archives. |
| Cloudflare R2 | Zero-egress object storage for teams already on Cloudflare's edge. |
| Wasabi | Flat-rate hot storage sold against S3's egress bill, for steady archives. |
| iDrive e2 | Lowest headline storage price, sold into the backup and MSP market. |
| Scaleway Object Storage | EU-sovereign object storage with AWS-shaped IAM, priced in euros. |
| DigitalOcean Spaces | Predictable bundled storage plus CDN for teams already on DigitalOcean. |
| AWS S3 | The reference implementation, priced for customers who are not leaving. |
| Bunny Storage | A CDN company's origin store, sold on edge delivery rather than API fidelity. |
| Hetzner Object Storage | European bulk storage at hardware-vendor prices, with hardware-vendor features. |

## Field registry

| Field | id | Group | Type | Unit | Better | Default weight | Definition |
| --- | --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | `true_cost_usd` | pricing | currency | /mo | lower | 10 | Computed by toolweight, not vendor-quoted: published pay-as-you-go list price for 1 TB (1,000 GB) stored for a full month, plus 5 TB (5,000 GB) egressed to the public internet, plus 10 M requests split 1 M Class A (PUT/POST/LIST) and 9 M Class B (GET/HEAD). Base fees are included and rate-card allowances deducted before overage rates apply; separately branded free plans are not netted off. No committed-use discounts. Euro list prices are converted at 1 EUR = 1.16 USD, struck 2026-07-23. Null where the provider's model cannot serve this scenario at a list price, or where the rate that would price it is not published — an estimate dressed as a quote is worse than an empty cell. The arithmetic for each provider is in that cell's note and reconstructs from the other cells in the same row. |
| True cost /mo (AUD) | `true_cost_aud` | pricing | currency | /mo | lower | 5 | The same computed scenario as the USD column, converted at a fixed 1 USD = 1.52 AUD, struck 2026-07-23. Providers listing in euros are converted to USD at 1 EUR = 1.16 USD first, struck the same day. Both rates are held fixed so the column is reproducible; check the dates before trusting the digits, because a stale euro rate is what previously understated Hetzner and Scaleway here. This is a currency conversion of a list price, not an AUD-denominated tariff — no provider in this roster publishes an AUD price list for object storage — and it is a conversion of the provider's cheapest region, not of what it costs to serve Australia. For that, read the next column. |
| True cost from Sydney (AUD) | `sydney_cost_aud` | pricing | currency | /mo | lower | 0 | The same fixed scenario again — 1 TB stored, 5 TB egressed, 10 M requests — but priced at the provider's Australian or Oceania rates and served from its nearest Australian-capable location, then converted at 1 USD = 1.52 AUD. This is not the AUD column: it differs wherever a provider charges more for APAC transfer or runs a dearer Sydney region, which is Bunny (0.03/GB into Oceania rather than 0.01) and AWS (ap-southeast-2 rather than us-east-1). Null where the provider has no Australian or Oceania location, so the scenario cannot be served from Australia at any price, or where its cost is null in the USD column for the same reasons stated there. It is unweighted in the default profile and carries the cost weight in the Best from Australia preset, where it is the honest input. |
| Storage $/TB/mo | `storage_price` | pricing | currency | /TB/mo | lower | 6 | Marginal list price to store one terabyte (1,000 GB) in the provider's standard or hot class for one month, at pay-as-you-go rates with no commitment. Where a provider sells a base bundle, this is the overage rate charged beyond the included capacity. Euro prices are converted at 1 EUR = 1.16 USD, struck 2026-07-23. |
| Egress $/TB | `egress_price` | pricing | currency | /TB | lower | 9 | Marginal list price to transfer one terabyte (1,000 GB) out to the public internet, beyond any free allowance, excluding intra-provider and CDN origin-fetch transfer. Euro prices are converted at 1 EUR = 1.16 USD, struck 2026-07-23. Zero means the provider charges nothing per gigabyte, but two providers here advertise zero and enforce a ceiling behind it — read this column together with the egress cap column, which is the one that separates an open promise from a bounded one. |
| Egress cap (x stored) | `egress_cap_multiple` | pricing | number | x stored | higher | 3 | How much you may download in a month, as a multiple of what you store, before the provider's free-egress arrangement stops applying — either because it starts billing an overage or because it reviews and restricts the account. It exists because a zero in the egress column with a 1x ceiling behind it and a zero with no ceiling at all are not the same product, and nothing else on this page tells them apart. No provider publishes an unlimited figure, so this column can only penalise a bounded promise, never reward an open one: a provider that simply meters egress per gigabyte has no ceiling to hit and is null here, as is a zero-egress provider that publishes no ceiling. It is scored against a 1-10x range, so a 3x allowance reads as only slightly better than a 1x one, and neither is what R2 and Tigris are offering. |
| Class A $/M ops | `class_a_price` | pricing | currency | /M ops | lower | 3 | List price per million mutating or listing operations — PUT, POST, COPY, LIST and multipart part uploads. Zero means the provider does not meter requests at all. Vendors disagree on which verbs are Class A; where a provider uses its own taxonomy we map its most expensive metered request class here. |
| Class B $/M ops | `class_b_price` | pricing | currency | /M ops | lower | 3 | List price per million read operations — GET, HEAD and equivalents — excluding the bandwidth those reads generate. Zero means requests are not metered. |
| Min retention | `min_retention` | pricing | duration | — | lower | 5 | Shortest period an object is billed for regardless of when it is deleted, in the provider's standard class. Zero means true proration. A 90-day floor multiplies the effective storage price on any workload whose objects live for days rather than months. |
| Min billed object | `min_billed_object` | pricing | bytes | — | lower | 2 | Smallest size an individual object is billed at in the standard class, regardless of its real size. Zero means objects are billed at actual bytes. Only matters when you store very large numbers of very small objects — thumbnails, map tiles, telemetry blobs. |
| S3 API coverage | `s3_api_coverage` | features | number | % | higher | 8 | Our estimate of the share of commonly used S3 REST operations, and their AWS-documented semantics, that the provider implements faithfully — weighted toward what real applications call: object CRUD, multipart, presigned URLs, versioning, lifecycle, object lock, bucket notifications, CORS and policy handling. AWS S3 is 100 by definition. Estimated from documentation rather than by running a conformance suite, so treat it as an ordering, not a measurement. |
| Presigned URLs | `presigned_urls` | features | tristate | — | higher | 4 | Whether AWS SigV4 presigned URLs work for both GET and PUT, generated by a standard AWS SDK without a provider-specific library. Partial means a proprietary token or signed-URL scheme exists but is not SigV4-compatible. |
| Multipart upload | `multipart_upload` | features | tristate | — | higher | 3 | Whether the S3 multipart upload API (CreateMultipartUpload, UploadPart, CompleteMultipartUpload, including UploadPartCopy and abort) is implemented well enough for the AWS SDK's transfer manager to work unmodified. |
| Versioning | `versioning` | features | tristate | — | higher | 5 | Whether bucket-level object versioning is available with S3 semantics — version IDs, delete markers and GET by version. Partial means versions exist but with a reduced API, no delete markers, or no per-bucket toggle. |
| Lifecycle rules | `lifecycle_rules` | features | tristate | — | higher | 4 | Whether PutBucketLifecycleConfiguration is supported for prefix- and tag-scoped expiration, noncurrent-version expiration and abandoned-multipart cleanup. Partial means expiration works but storage-class transitions or tag filters do not. |
| Event notifications | `event_notifications` | features | tristate | — | higher | 4 | Whether object create and delete events can be pushed to a queue, function or webhook without you polling the bucket. Partial means events exist but only into the provider's own proprietary sink, or only for a subset of event types. |
| CDN integration | `cdn_integration` | features | enum | — | higher | 5 | How you get cached edge delivery in front of the bucket. free-bundled: the provider's own CDN sits in front at no extra transfer cost. first-party-paid: same vendor, metered separately. partner: a documented zero-cost or discounted origin-fetch arrangement with a third-party CDN. diy: point any CDN at it and pay full origin egress on misses. none: no practical caching layer. |
| Max object size | `max_object_size` | features | bytes | — | higher | 2 | Largest single object the provider accepts, using multipart upload where required. Most of the roster still sits on the 5 TiB ceiling S3 itself once imposed; AWS has since raised its own limit to 50 TB and Backblaze allows 10 TB, so the ceiling every clone inherited is now the one place AWS is the outlier. Matters if you store disk images, database dumps or model checkpoints. Scoring is clamped at 5 TiB: past that the difference is real but almost never the reason anyone picks a provider, and left unclamped a single vendor's 50 TB ceiling would drag every other row's score down on a dimension nobody chose on. |
| IAM granularity | `iam_granularity` | features | score | — | higher | 4 | 1–5 on how finely you can scope credentials. 1 = one account-wide key. 2 = per-bucket credentials with read/write only. 3 = per-bucket-and-prefix tokens with a fixed verb set and optional expiry. 4 = a real policy document matching on resources and actions. 5 = full policy language with condition keys, plus assumable roles or STS and external identity federation. |
| Sydney region | `sydney_region` | features | tristate | — | higher | 7 | Whether you can pin bucket data to a named Sydney or Australian location at creation time and have it stay there. Partial means an Oceania or APAC hint, best-effort placement rather than a contractual region, or placement only available on higher plans. |
| TTFB from Sydney | `ttfb_sydney` | features | duration | — | lower | 6 | Typical time to first byte for an uncached GET of a small object from a client in Sydney, using the provider's nearest available location. Inferred from network topology and community reports, not measured by toolweight — read the buckets rather than the digits: under 50 ms is in-metro, 50–150 ms regional, over 150 ms transpacific or further. |
| Durability (nines) | `durability_nines` | durability | number | nines | higher | 5 | Number of nines in the provider's published annual object durability figure — 11 means 99.999999999%. This is a design claim, not a warranty; almost nobody underwrites it financially. Null where the provider publishes no figure at all, which is itself informative for a backup target. |
| Uptime SLA | `uptime_sla` | durability | number | % | higher | 4 | Contractual monthly availability target for the standard object storage tier, as published in the provider's SLA and backed by service credits. Marketing uptime claims with no credit remedy are not counted. Null where no object-storage-specific SLA is published. |
| Object lock / WORM | `object_lock` | durability | tristate | — | higher | 5 | Whether S3 Object Lock is supported with both governance and compliance retention modes plus legal holds, such that a ransomware-resistant immutable backup target is possible. Partial means a bucket- or vendor-specific retention lock exists but not the full S3 Object Lock API surface. |
| Replication model | `replication_model` | durability | enum | — | higher | 4 | The default failure domain a single bucket survives without you configuring cross-region replication. multi-region: copies in separate geographies by default. erasure-coded: shards spread across many independent hosts or operators. multi-az: separate facilities within one metro. single-az: one facility. single-node: whatever you built. |
| Official MCP server | `mcp_server` | agentic | tristate | — | higher | 2 | Whether the vendor ships and maintains a Model Context Protocol server exposing bucket and object operations to coding agents. Partial means an MCP server exists for the vendor's wider platform but object storage coverage within it is incidental or read-only. |
| GA year | `ga_year` | traction | number | — | n/a | 0 | Calendar year the object storage product reached general availability — not the year the company was founded or the private beta opened. Context only; it does not contribute to the score. |
| Positioning | `positioning` | marketing | text | — | n/a | 0 | Our one-line summary of who the vendor is actually selling to, paraphrased from its own marketing rather than quoted from it. Not scored. |

## Presets

| Preset | id | What it optimises for | Weights | Ranked URL |
| --- | --- | --- | --- | --- |
| Cheapest egress | `cheapest-egress` | For read-heavy workloads where bandwidth, not capacity, is the bill. Ranks only providers that publish a price for this scenario: a zero-egress promise you cannot buy five terabytes of is not the cheapest egress, it is no egress. | egress_price:10, true_cost_usd:9, egress_cap_multiple:7, cdn_integration:5, class_b_price:4, storage_price:2, ttfb_sydney:2 | https://toolweight.dev/compare/s3-compatible-storage?w=egress_price:10,true_cost_usd:9,egress_cap_multiple:7,cdn_integration:5,class_b_price:4,storage_price:2,ttfb_sydney:2 |
| Cheapest storage | `cheapest-storage` | For cold archives and backups written once and rarely read back. | storage_price:10, min_retention:7, min_billed_object:5, durability_nines:5, object_lock:4, true_cost_usd:4, egress_price:2 | https://toolweight.dev/compare/s3-compatible-storage?w=storage_price:10,min_retention:7,min_billed_object:5,durability_nines:5,object_lock:4,true_cost_usd:4,egress_price:2 |
| Most S3-faithful | `most-s3-faithful` | For lifting an existing AWS SDK codebase without touching application code. | s3_api_coverage:10, versioning:7, object_lock:7, iam_granularity:7, lifecycle_rules:6, event_notifications:6, presigned_urls:5, multipart_upload:5, egress_price:1 | https://toolweight.dev/compare/s3-compatible-storage?w=s3_api_coverage:10,versioning:7,object_lock:7,iam_granularity:7,lifecycle_rules:6,event_notifications:6,presigned_urls:5,multipart_upload:5,egress_price:1 |
| Best from Australia | `best-from-australia` | For serving Australian users, weighted on Sydney presence and the cost of delivering this scenario from Australia. It deliberately ignores the headline AUD column, which is a currency conversion of a Europe-or-US-priced bill: that column understates Bunny by nearly two-thirds and AWS by a fifth. Providers with no Australian location are ranked separately rather than scored, because there is no price at which they can serve this workload from Australia. | sydney_region:10, ttfb_sydney:9, sydney_cost_aud:8, egress_price:6, cdn_integration:5, s3_api_coverage:4, uptime_sla:3 | https://toolweight.dev/compare/s3-compatible-storage?w=sydney_region:10,ttfb_sydney:9,sydney_cost_aud:8,true_cost_aud:0,egress_price:6,cdn_integration:5,s3_api_coverage:4,uptime_sla:3 |

## Verdict

Egress is the only number that matters and almost nobody puts it on the front of the pricing page. Storage is a commodity: every provider here sits between USD 4 and USD 23 per terabyte per month, a spread of under twenty dollars on our scenario. Egress spans zero to ninety dollars per terabyte, so on a workload that serves five times what it stores — which is every image host, every media API, every model-weights mirror — egress decides the bill by an order of magnitude. AWS S3 costs 472.60 a month here and 441 of that is bandwidth.

For most teams the answer is Cloudflare R2 and it is not close. Zero egress, no minimum retention, no minimum billable object size, lifecycle rules, event notifications into Queues, and a Workers binding that skips the HTTP round trip entirely. There are three catches. The free egress is Cloudflare's network, so R2 is at its best when Cloudflare is already your edge. R2 tokens are bucket-and-verb scoped rather than a policy language, which will annoy anyone who has built real multi-tenant isolation on AWS IAM conditions. And R2 has no object versioning at all — Cloudflare's own S3 compatibility table lists GetBucketVersioning and PutBucketVersioning as unimplemented — so if you were relying on version IDs and delete markers to undo a bad write, that has to move into your application or your lifecycle policy.

Hetzner wins the raw number and deserves the attention it gets, but read the feature columns before you move. It is a Ceph deployment with a thin S3 face: no object lock, versioning that its own docs have never been clear about, partial lifecycle support, no event notifications, no APAC location, and roughly 300 ms of round trip from Australia. That is fine for backups and build caches and dreadful for a user-facing asset pipeline. The same reasoning applies to Bunny Storage from the opposite direction — superb edge delivery from Sydney, but it is not an S3 clone and treating it as one will break your SDK.

Three providers refuse the question. Wasabi's headline is 6.99/TB with no egress fee, but its acceptable-use policy caps monthly egress at roughly your stored volume; 5 TB out of 1 TB stored is five times over, so there is no honest price to quote and we have left the cell empty rather than invent one. Add the 90-day minimum retention and the 4 KB minimum billable object and Wasabi becomes a bad fit for anything churny. iDrive e2 sells the same shape of promise — zero egress up to a fair-use multiple of what you store — and does not publish either the multiple or what it charges above it, so it gets the same empty cell for the same reason. MinIO is the self-host baseline and its price is your hardware — but note that the community AGPL build lost its admin console in 2025, which changed the calculus for a lot of people who were running it precisely because it was free and complete.

For Australian workloads the field narrows hard. Wasabi, DigitalOcean Spaces, Bunny and AWS all have Sydney presence, and Tigris reaches it through Fly.io. Backblaze, Hetzner and Scaleway do not, and 200–300 ms of first-byte latency is not something a CDN in front of them fully hides on cache misses. R2's Oceania location hint is best-effort rather than a contractual region, which is usually good enough and occasionally isn't. If your users are in Australia and your objects are hot, price the Sydney-capable options in AUD and accept that you will pay more than the Hetzner headline.

## Where the bodies are buried in object storage pricing

Four line items reliably cost more than the storage rate you were quoted.

Egress is the obvious one. AWS charges USD 0.09/GB up to 10 TB with only the first 100 GB free, which is 441 dollars of our 472.60 total. DigitalOcean charges 0.01/GB, Scaleway EUR 0.01 (about 0.0116) and Storj 0.007/GB — an order of magnitude better than AWS but not zero, and on a 50 TB month that gap is real money. Only R2 and Tigris charge nothing with no ceiling attached. Wasabi and iDrive e2 also print a zero, and both bound it with a fair-use multiple of what you store, which is a different product sold with the same number; the "egress cap" column is there so you can tell the two kinds of zero apart.

Class A operations are the second. R2's 4.50 per million looks trivial until you run a workload that lists a bucket in a loop or writes a million small objects an hour. AWS is 5.00 per million for the same class. Backblaze, DigitalOcean, Scaleway, Hetzner, Storj, Bunny and iDrive charge nothing per request at all, which is a genuine advantage that none of their pricing pages leads with — Backblaze went furthest and made Class A, B and C calls all free on pay-as-you-go, leaving only outbound event-notification callbacks metered.

Minimum retention is the third, and it is a storage price multiplier in disguise. Wasabi's 90 days means a workload with a seven-day object lifetime pays roughly thirteen times the headline rate. Minimum billable object size is the fourth: Wasabi bills every object at at least 4 KB, and AWS applies a 128 KB floor on its infrequent-access classes, which is how the cheap tier ends up more expensive for thumbnails. Store ten million 1.5 KB objects behind a 4 KB floor and you pay for 40 GB where you stored 15.

## Migrating off AWS S3 without a rewrite

The application change is usually one line — a custom endpoint URL and, on some providers, forcing path-style addressing on the S3 client. That part is genuinely easy, and it is what every provider's landing page shows you.

The hard part is everything around the bucket. Bucket policies do not port: R2, Hetzner and Bunny have no IAM policy language, so any authorisation you expressed as a condition on a principal has to move into your application. Versioning does not port to R2 at all — GetBucketVersioning and PutBucketVersioning are unimplemented — so if S3 versioning is part of how you recover from bad writes, budget for replacing it. Lifecycle transitions between storage classes mostly do not port, because most providers have exactly one class. S3 event notifications become provider-specific — R2 fires into Cloudflare Queues, Backblaze uses its own event payload — so anything wired to Lambda needs rebuilding rather than repointing. Object Lock in compliance mode, if you rely on it for a retention obligation, exists on Backblaze, Wasabi, Scaleway, iDrive, Storj, MinIO and AWS, and not on Hetzner, DigitalOcean or Bunny at all.

For the copy itself, do not pull data through your own machines. Cloudflare's Super Slurper, and rclone with server-side copy where it is supported, will move a terabyte far faster. On AWS the one-time egress to leave is often the single largest line on the migration budget: getting 50 TB out of S3 costs roughly USD 4,300 in bandwidth before you have stored a byte anywhere else. Price that exit charge before you commit to the move, and consider draining gradually behind a read-through cache if the number is uncomfortable.

## How to actually decide

Work out your egress-to-storage ratio first, because it selects the shortlist before any feature comparison does.

Below about 1:1 — backups, archives, data lakes read by a handful of jobs — storage price dominates and Storj (USD 4/TB), iDrive e2 (4), and Backblaze and Hetzner (6.95 each) are the field. Check the minimum retention and minimum billable object columns, confirm object lock if this is a ransomware-resistant backup target, and stop there.

Above about 3:1 — public assets, media, model weights, package registries — egress dominates absolutely and the shortlist collapses to R2 and Tigris, the only two providers charging nothing per gigabyte with no ceiling behind it, with Hetzner as the value option if a European origin is acceptable. Bunny is often named in the same breath and does not belong there on this axis: its egress is 0.01/GB in Europe and North America, the same as DigitalOcean and Scaleway, and 0.03 into Oceania. Shortlist Bunny for its edge, not for its bandwidth rate. At 10:1 nothing else is worth evaluating; the gap between R2 at 22.74 and AWS at 472.60 will not be closed by any feature.

Then apply two filters. If you need Sydney, drop Backblaze, Hetzner and Scaleway, which have no Australian or Oceania location at all. If you need object lock, versioning and event notifications all three with AWS semantics, almost nothing survives: AWS, Backblaze and MinIO, and that is the list. Tigris has the versioning and the notifications but we could not confirm object lock; R2 has notifications but no versioning and only a bucket-level retention lock; Scaleway has the lock and the versioning but we could not confirm notifications; Hetzner, DigitalOcean and Bunny fail on two of the three. What survives both filters is usually a two-horse race, and at that point pick on the API surface you will actually touch rather than on a dollar figure that differs by less than one engineer-hour a month.

## Provenance — every cell, every source

### MinIO {#minio}

The self-hosted S3 reference implementation — your hardware, your bandwidth, your SLA.

|  |  |
| --- | --- |
| Site | https://min.io/ |
| Docs | https://min.io/docs/minio/linux/index.html |
| Repo | https://github.com/minio/minio |
| Company | MinIO |
| Founded | 2014 |
| Open source | Yes (AGPL-3.0) |
| Profile | https://toolweight.dev/tools/minio |
| Score (default weights) | 85.6 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | — | Unknown | — | — | Not applicable — MinIO is software, not a service, so there is no published rate to compute against. For scale: a dedicated server with enough disk for a terabyte of erasure-coded capacity and traffic included lands somewhere around $50–70 a month, plus your time for erasure-coding configuration, upgrades, monitoring and on-call. That is not a like-for-like comparison with a managed provider and we will not present it as one — which also means MinIO is ranked separately from, rather than above, the providers in any preset that turns on cost. | #minio-true_cost_usd |
| True cost /mo (AUD) | — | Unknown | — | — | Null for the same reason. | #minio-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | — | — | Null for the same reason. You can certainly run MinIO in Sydney; what it costs there is a hardware and transit question, not a list price. | #minio-sydney_cost_aud |
| Storage $/TB/mo | — | Unknown | — | — | Your hardware. | #minio-storage_price |
| Egress $/TB | — | Unknown | — | — | Your transit. | #minio-egress_price |
| Egress cap (x stored) | — | Unknown | — | — | Not applicable: whatever your transit contract says. | #minio-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Inferred | — | — | Nobody is metering you. | #minio-class_a_price |
| Class B $/M ops | $0 /M ops | Inferred | — | — | — | #minio-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #minio-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #minio-min_billed_object |
| S3 API coverage | 98 % | Inferred | — | — | The most faithful reimplementation of the S3 API that exists, and the thing other providers test against. The gaps are AWS-specific services rather than storage semantics. | #minio-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #minio-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #minio-multipart_upload |
| Versioning | ● | Inferred | — | — | — | #minio-versioning |
| Lifecycle rules | ● | Inferred | — | — | Including tiering to a remote S3-compatible target, which is a neat way to run hot-local and cold-cloud. | #minio-lifecycle_rules |
| Event notifications | ● | Inferred | — | — | To Kafka, NATS, AMQP, Redis, Postgres, webhooks and more — a wider set of sinks than any managed provider here offers. | #minio-event_notifications |
| CDN integration | diy | Inferred | — | — | — | #minio-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #minio-max_object_size |
| IAM granularity | 5 | Inferred | — | — | Full AWS-style policy documents with conditions, plus STS, service accounts, OIDC and LDAP federation. Nothing else here matches it except AWS itself. | #minio-iam_granularity |
| Sydney region | ● | Inferred | — | — | Any location you can rent a machine in, which for Australia means anywhere with a Sydney or Melbourne facility. | #minio-sydney_region |
| TTFB from Sydney | — | Unknown | — | — | Entirely a function of where you put it and how you network it. | #minio-ttfb_sydney |
| Durability (nines) | — | Unknown | — | — | Depends on your erasure set size, drive count and failure-domain layout. MinIO gives you the tools; the number is yours to earn. | #minio-durability_nines |
| Uptime SLA | — | Unknown | — | — | You are the SLA. | #minio-uptime_sla |
| Object lock / WORM | ● | Inferred | — | — | — | #minio-object_lock |
| Replication model | erasure-coded | Inferred | — | — | Reed-Solomon erasure coding across drives and nodes, plus optional active-active site replication. | #minio-replication_model |
| Official MCP server | ● | Inferred | — | — | MinIO ships an MCP server for bucket and object administration. | #minio-mcp_server |
| GA year | 2,015 | Inferred | — | — | — | #minio-ga_year |
| Positioning | The self-hosted S3 baseline — full API fidelity in exchange for operating it. | Inferred | — | — | — | #minio-positioning |

**Verdict.** The reference point rather than a competitor: it shows you what full S3 fidelity looks like and therefore what you are giving up when you buy cheap. Worth running only if you already operate storage hardware — and note the community build lost its admin console in 2025, which changed a lot of people's assumptions about what 'free and complete' meant.

**Pick it when**

- On-premises or air-gapped deployments where data cannot leave your control
- Teams that need AWS-grade IAM semantics without AWS
- A local development target that behaves like production S3

### Tigris {#tigris}

Globally distributed S3-compatible storage that caches objects near readers.

|  |  |
| --- | --- |
| Site | https://www.tigrisdata.com/ |
| Docs | https://www.tigrisdata.com/docs/ |
| Company | Tigris Data |
| Founded | 2022 |
| Profile | https://toolweight.dev/tools/tigris |
| Score (default weights) | 80.2 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $29.5 /mo | Inferred | 2026-07-23 | https://www.tigrisdata.com/docs/pricing/ | Storage 1,000 GB x $0.02 = $20.00. Class A 1 M x $5.00 = $5.00. Class B 9 M x $0.50 = $4.50. Egress $0. Total $29.50. The two operation rates are the least certain inputs on this row; if they are wrong the total still lands between $20 and $35. | #tigris-true_cost_usd |
| True cost /mo (AUD) | A$44.84 /mo | Inferred | 2026-07-23 | — | $29.50 x 1.52. | #tigris-true_cost_aud |
| True cost from Sydney (AUD) | A$44.84 /mo | Inferred | 2026-07-23 | — | Unchanged from the headline figure: Tigris prices storage and operations the same in every region and charges nothing for transfer anywhere, so Sydney delivery through Fly.io's syd footprint costs what any other region costs. | #tigris-sydney_cost_aud |
| Storage $/TB/mo | $20 /TB/mo | Vendor-claimed | 2026-07-23 | https://www.tigrisdata.com/docs/pricing/ | $0.02/GB-month for the standard tier. Infrequent-access and archive tiers are cheaper at rest. | #tigris-storage_price |
| Egress $/TB | $0 /TB | Vendor-claimed | 2026-07-23 | https://www.tigrisdata.com/docs/pricing/ | No data-transfer charges, which is the point of the product alongside its automatic edge caching. | #tigris-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.tigrisdata.com/docs/pricing/ | No ceiling published on the zero-egress rate. Along with R2, this is the unbounded kind of zero. | #tigris-egress_cap_multiple |
| Class A $/M ops | $5 /M ops | Inferred | — | — | — | #tigris-class_a_price |
| Class B $/M ops | $0.5 /M ops | Inferred | — | — | — | #tigris-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #tigris-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #tigris-min_billed_object |
| S3 API coverage | 90 % | Inferred | — | — | Built S3-first: CRUD, multipart, presigning, versioning, conditional writes and lifecycle rules are all present. | #tigris-s3_api_coverage |
| Presigned URLs | ● | Vendor-claimed | 2026-07-23 | https://www.tigrisdata.com/docs/objects/presigned/ | — | #tigris-presigned_urls |
| Multipart upload | ● | Inferred | 2026-07-23 | — | — | #tigris-multipart_upload |
| Versioning | ● | Inferred | 2026-07-23 | — | — | #tigris-versioning |
| Lifecycle rules | ● | Inferred | — | — | — | #tigris-lifecycle_rules |
| Event notifications | ● | Inferred | — | — | Object notifications to a webhook are documented; the payload shape is Tigris-specific. | #tigris-event_notifications |
| CDN integration | free-bundled | Inferred | — | — | Caching and replication toward reading regions is default behaviour, not a separate CDN product you configure. | #tigris-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #tigris-max_object_size |
| IAM granularity | 3 | Inferred | — | — | Access keys scoped by bucket and permission, plus shareable presigned access. Not a full policy language. | #tigris-iam_granularity |
| Sydney region | ● | Inferred | — | — | Runs on Fly.io's footprint, which includes syd. Placement is expressed as a region constraint rather than a distinct endpoint hostname. | #tigris-sydney_region |
| TTFB from Sydney | 60 ms | Inferred | — | — | Local once an object has been pulled into the Sydney region; the first uncached read of a globally-placed object is slower. | #tigris-ttfb_sydney |
| Durability (nines) | 11  nines | Inferred | 2026-07-23 | — | — | #tigris-durability_nines |
| Uptime SLA | — | Unknown | — | — | No credit-backed object storage SLA that we can point at. | #tigris-uptime_sla |
| Object lock / WORM | — | Unknown | — | — | We could not confirm S3 Object Lock support either way. Assume no until you have verified it. | #tigris-object_lock |
| Replication model | multi-region | Vendor-claimed | 2026-07-23 | https://www.tigrisdata.com/docs/overview/ | Objects replicate toward the regions reading them; this is the product's core design rather than an add-on. | #tigris-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #tigris-mcp_server |
| GA year | 2,024 | Inferred | — | — | — | #tigris-ga_year |
| Positioning | Object storage that behaves like a CDN, for globally distributed apps. | Inferred | — | — | — | #tigris-positioning |

**Verdict.** The most interesting design here — data gravity handled for you, no egress bill, and a Sydney presence via Fly. It is also the youngest and smallest vendor in the roster with no published SLA, so weigh the operational track record before it becomes your system of record.

**Pick it when**

- Apps already deployed on Fly.io, where the integration is native
- Globally distributed reads without running a CDN yourself
- Zero egress without committing to Cloudflare's ecosystem

### Storj {#storj}

Decentralised erasure-coded storage: USD 4/TB stored, USD 7/TB egress, no regions.

|  |  |
| --- | --- |
| Site | https://www.storj.io/ |
| Docs | https://docs.storj.io/ |
| Company | Storj Labs |
| Founded | 2014 |
| Profile | https://toolweight.dev/tools/storj |
| Score (default weights) | 78.4 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $39 /mo | Inferred | 2026-07-23 | https://www.storj.io/pricing | Storage 1 TB x $4 = $4.00. Egress 5 TB x $7 = $35.00. No per-request charges. Total $39.00. Excludes Storj's per-segment fee (about $0.0000088 per segment per month), because it scales with object count and shape rather than with anything this scenario fixes — but do not read that as negligible: the scenario's 1 M writes, if they are roughly 1 MB objects, are about 1 M segments, which is around $8.80 a month, a fifth of the total again. | #storj-true_cost_usd |
| True cost /mo (AUD) | A$59.28 /mo | Inferred | 2026-07-23 | — | $39.00 x 1.52. | #storj-true_cost_aud |
| True cost from Sydney (AUD) | A$59.28 /mo | Inferred | 2026-07-23 | — | Unchanged from the headline figure: Storj has one global price and no regions, so there is no Australian tariff to apply. Read it alongside the 150 ms first-byte figure — the price is the same from Sydney, the latency is not. | #storj-sydney_cost_aud |
| Storage $/TB/mo | $4 /TB/mo | Vendor-claimed | 2026-07-23 | https://www.storj.io/pricing | Joint-cheapest storage rate on this page, alongside iDrive e2. | #storj-storage_price |
| Egress $/TB | $7 /TB | Vendor-claimed | 2026-07-23 | https://www.storj.io/pricing | $0.007/GB — an order of magnitude under AWS but not free, so Storj loses to R2 on read-heavy work despite the cheaper storage. | #storj-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.storj.io/pricing | Not applicable: egress is metered at $0.007/GB from the first byte, so there is no free-egress ceiling to exceed. | #storj-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.storj.io/pricing | No request metering. Storj bills a per-segment fee instead, which scales with object count and size rather than with API calls. | #storj-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.storj.io/pricing | — | #storj-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #storj-min_retention |
| Min billed object | 0 B | Inferred | — | — | No size floor, but the per-segment fee means very small objects carry disproportionate overhead. | #storj-min_billed_object |
| S3 API coverage | 80 % | Inferred | — | — | Delivered through an S3 gateway rather than natively. CRUD, multipart, presigning, versioning and object lock work; the more exotic bucket-level APIs generally do not. | #storj-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #storj-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #storj-multipart_upload |
| Versioning | ● | Vendor-claimed | 2026-07-23 | https://storj.dev/dcs/api/s3/object-versioning | — | #storj-versioning |
| Lifecycle rules | — | Unknown | — | — | We could not confirm the state of lifecycle configuration support through the S3 gateway. | #storj-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | — | #storj-event_notifications |
| CDN integration | partner | Inferred | — | — | Linksharing serves objects publicly and there are documented CDN partnerships, but no bundled edge cache. | #storj-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #storj-max_object_size |
| IAM granularity | 4 | Inferred | — | — | Access grants are macaroon-derived: scope by bucket, prefix, permission and expiry, and delegate further without contacting the server. Genuinely more granular than most vendors' key models, just shaped differently from IAM. | #storj-iam_granularity |
| Sydney region | ◐ | Inferred | — | — | Storj has no regions — objects are erasure-coded across globally distributed operator nodes. Geographic placement constraints exist for compliance use cases, but that is not a Sydney region in the ordinary sense. | #storj-sydney_region |
| TTFB from Sydney | 150 ms | Inferred | — | — | Reads require fetching enough erasure shards from enough independent nodes to reconstruct the object, so first-byte latency is structurally higher and more variable than a conventional store. Throughput on large objects is good; small-object latency is not. | #storj-ttfb_sydney |
| Durability (nines) | 11  nines | Inferred | 2026-07-23 | — | — | #storj-durability_nines |
| Uptime SLA | 99.95 % | Inferred | 2026-07-23 | — | — | #storj-uptime_sla |
| Object lock / WORM | ● | Vendor-claimed | 2026-07-23 | https://storj.dev/dcs/api/s3/object-lock | — | #storj-object_lock |
| Replication model | erasure-coded | Vendor-claimed | 2026-07-23 | https://storj.dev/learn/concepts/data-structure | Each object is split into shards spread across thousands of independent nodes; losing whole facilities is a design assumption rather than an incident. | #storj-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #storj-mcp_server |
| GA year | 2,020 | Inferred | — | — | — | #storj-ga_year |
| Positioning | Decentralised storage sold on price and on surviving whole-facility failure. | Inferred | — | — | — | #storj-positioning |

**Verdict.** The cheapest storage on the page and a genuinely different durability model, undercut by first-byte latency the architecture cannot fix. Strong for large-object distribution and backups; poor for a hot path serving many small files.

**Pick it when**

- Large-object distribution — datasets, model weights, video masters
- Backups where surviving a whole-region failure matters more than latency
- Workloads that benefit from delegatable, expiring, prefix-scoped access grants

### Backblaze B2 {#backblaze-b2}

Cheap US and EU object storage with free egress up to three times stored volume.

|  |  |
| --- | --- |
| Site | https://www.backblaze.com/cloud-storage |
| Docs | https://www.backblaze.com/docs/cloud-storage |
| Company | Backblaze |
| Founded | 2007 |
| Profile | https://toolweight.dev/tools/backblaze-b2 |
| Score (default weights) | 75.9 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $26.95 /mo | Inferred | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | Storage 1 TB x $6.95 = $6.95. Free egress allowance is 3x stored = 3 TB, so 2,000 GB billable x $0.01 = $20.00. Requests $0.00: B2 now makes Class A, B and C calls free on pay-as-you-go, which covers all 10 M of this scenario's uploads, downloads and listings. Total $26.95. Serving through Cloudflare instead would zero the $20 under the Bandwidth Alliance, leaving $6.95. | #backblaze-b2-true_cost_usd |
| True cost /mo (AUD) | A$40.96 /mo | Inferred | 2026-07-23 | — | $26.95 x 1.52. | #backblaze-b2-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-data-regions | Not priceable from Australia at any figure: B2's regions are US West, US East and Amsterdam, so there is no Australian or Oceania location to serve this scenario from. Null here is a statement about geography, not about our research. | #backblaze-b2-sydney_cost_aud |
| Storage $/TB/mo | $6.95 /TB/mo | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | $6.95/TB/month pay-as-you-go. This page previously carried $6.00, which is the older rate. | #backblaze-b2-storage_price |
| Egress $/TB | $10 /TB | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | $0.01/GB, but only after a free allowance of three times your average stored volume. Transfer to Cloudflare and Fastly is free under the Bandwidth Alliance regardless of volume. | #backblaze-b2-egress_price |
| Egress cap (x stored) | 3 x stored | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | Egress is free up to three times your average monthly stored data, then billed at $0.01/GB. Unlike Wasabi and iDrive, exceeding it produces an invoice rather than an account review, which is why this row has a computable total and theirs do not. | #backblaze-b2-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | Class A, B and C API calls are all free for pay-as-you-go customers, so uploads, downloads and listings alike cost nothing per request. The only metered transactions left are Class D — outbound event-notification callbacks — at $0.004 per 10,000 beyond 2,500 a day, which this scenario does not generate. | #backblaze-b2-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/transaction-pricing | Free. This cell previously carried $0.40 per million from the old Class B rate, which no longer applies on pay-as-you-go. | #backblaze-b2-class_b_price |
| Min retention | 0 ms | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | — | #backblaze-b2-min_retention |
| Min billed object | 0 B | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/pricing | — | #backblaze-b2-min_billed_object |
| S3 API coverage | 85 % | Inferred | — | — | The S3-compatible endpoint covers CRUD, multipart, presigned URLs, versioning, lifecycle and object lock. The native B2 API remains the fuller surface. | #backblaze-b2-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #backblaze-b2-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #backblaze-b2-multipart_upload |
| Versioning | ● | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-file-versions | Versioning is on by default, which surprises people migrating from S3 — lifecycle rules are how you stop paying for old versions. | #backblaze-b2-versioning |
| Lifecycle rules | ● | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-lifecycle-rules | — | #backblaze-b2-lifecycle_rules |
| Event notifications | ● | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-event-notifications | Backblaze's own event notification format to a webhook, not S3 event JSON. | #backblaze-b2-event_notifications |
| CDN integration | partner | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/cloud-storage/integrations/cloudflare | Bandwidth Alliance: free origin egress to Cloudflare and Fastly, which effectively zeroes bandwidth if you already run one of those. | #backblaze-b2-cdn_integration |
| Max object size | 9.1 TB | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-large-files | 10 TB, above the S3-inherited 5 TiB ceiling most providers stop at. | #backblaze-b2-max_object_size |
| IAM granularity | 3 | Inferred | — | — | Application keys scoped to a bucket and optionally a name prefix, with a fixed capability list and optional expiry. | #backblaze-b2-iam_granularity |
| Sydney region | ○ | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-data-regions | Regions are US West, US East and Amsterdam. Nothing in APAC. | #backblaze-b2-sydney_region |
| TTFB from Sydney | 180 ms | Inferred | — | — | US West to Sydney is a transpacific round trip; 160–200 ms is typical for an uncached small-object GET. | #backblaze-b2-ttfb_sydney |
| Durability (nines) | 11  nines | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/blog/cloud-storage-durability/ | — | #backblaze-b2-durability_nines |
| Uptime SLA | 99.9 % | Inferred | — | — | Credit-backed SLAs are published for B2 Reserve; the pay-as-you-go tier's commitment is weaker. | #backblaze-b2-uptime_sla |
| Object lock / WORM | ● | Vendor-claimed | 2026-07-23 | https://www.backblaze.com/docs/cloud-storage-object-lock | — | #backblaze-b2-object_lock |
| Replication model | single-az | Inferred | — | — | One region per bucket. Cross-region cloud replication exists but is a separate, separately billed feature. | #backblaze-b2-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #backblaze-b2-mcp_server |
| GA year | 2,015 | Inferred | — | — | — | #backblaze-b2-ga_year |
| Positioning | Commodity bulk storage for backup targets and media archives. | Inferred | — | — | — | #backblaze-b2-positioning |

**Verdict.** The sensible middle: cheap, boring, feature-complete enough, and the Bandwidth Alliance makes egress free outright if Cloudflare or Fastly is already in your stack. The absence of any APAC region is the single reason to rule it out for Australian workloads.

**Pick it when**

- Backup and archive targets where object lock matters and latency does not
- Anyone already serving through Cloudflare or Fastly — egress becomes free
- Workloads whose egress genuinely stays under three times stored volume

### Cloudflare R2 {#cloudflare-r2}

S3-compatible object storage with zero egress fees, on Cloudflare's network.

|  |  |
| --- | --- |
| Site | https://www.cloudflare.com/developer-platform/products/r2/ |
| Docs | https://developers.cloudflare.com/r2/ |
| Company | Cloudflare |
| Founded | 2009 |
| Profile | https://toolweight.dev/tools/cloudflare-r2 |
| Score (default weights) | 75.0 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $22.74 /mo | Inferred | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | Storage 1,000 GB x $0.015 = $15.00. Class A 1 M x $4.50 = $4.50. Class B 9 M x $0.36 = $3.24. Egress $0. Total $22.74. R2's free tier (10 GB storage, 1 M Class A, 10 M Class B monthly) is deliberately not netted off, per the methodology's netting rule; applying it would zero the Class A and Class B lines entirely and take 10 GB off storage, giving $22.74 - $0.15 - $4.50 - $3.24 = $14.85. | #cloudflare-r2-true_cost_usd |
| True cost /mo (AUD) | A$34.56 /mo | Inferred | 2026-07-23 | — | $22.74 x 1.52. | #cloudflare-r2-true_cost_aud |
| True cost from Sydney (AUD) | A$34.56 /mo | Inferred | 2026-07-23 | — | Unchanged from the headline figure: R2's storage and operation rates are the same worldwide and egress is zero everywhere, so serving Australia costs what serving anywhere costs. The caveat is placement rather than price — 'Oceania' is a best-effort location hint, not a contractual region. | #cloudflare-r2-sydney_cost_aud |
| Storage $/TB/mo | $15 /TB/mo | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | $0.015/GB-month, Standard class. Infrequent Access is cheaper at rest but adds a retrieval fee. | #cloudflare-r2-storage_price |
| Egress $/TB | $0 /TB | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | No per-gigabyte charge for reads over the public internet, and no published fair-use ceiling on it. This is the product's entire pitch. | #cloudflare-r2-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | No ceiling published, and none applied in practice that we can find. This is the open promise the column exists to distinguish from the bounded ones; null here means unbounded, not unresearched. | #cloudflare-r2-egress_cap_multiple |
| Class A $/M ops | $4.5 /M ops | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | — | #cloudflare-r2-class_a_price |
| Class B $/M ops | $0.36 /M ops | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | — | #cloudflare-r2-class_b_price |
| Min retention | 0 ms | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/pricing/ | — | #cloudflare-r2-min_retention |
| Min billed object | 0 B | Inferred | 2026-07-23 | — | — | #cloudflare-r2-min_billed_object |
| S3 API coverage | 82 % | Inferred | 2026-07-23 | https://developers.cloudflare.com/r2/api/s3/api/ | Object CRUD, multipart, SigV4 presigning, PutBucketLifecycleConfiguration and CORS all behave. Marked down from the 90 this row previously carried because Cloudflare's own compatibility table lists GetBucketVersioning and PutBucketVersioning as unimplemented — versioning is absent, not partial — alongside bucket policies, ACLs, the S3 notification API and the object-lock configuration APIs. | #cloudflare-r2-s3_api_coverage |
| Presigned URLs | ● | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/api/s3/presigned-urls/ | — | #cloudflare-r2-presigned_urls |
| Multipart upload | ● | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/objects/multipart-objects/ | — | #cloudflare-r2-multipart_upload |
| Versioning | ○ | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/api/s3/api/ | Cloudflare's S3 API compatibility table marks both GetBucketVersioning and PutBucketVersioning unimplemented. There are no version IDs and no delete markers: an overwrite is destructive. This cell previously read 'yes' and was wrong. | #cloudflare-r2-versioning |
| Lifecycle rules | ● | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/buckets/object-lifecycles/ | Expiration and abandoned-multipart cleanup; transitions only to Infrequent Access. | #cloudflare-r2-lifecycle_rules |
| Event notifications | ● | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/buckets/event-notifications/ | Delivered into Cloudflare Queues, not as an S3-shaped notification payload — anything wired to SQS or Lambda needs rewriting. | #cloudflare-r2-event_notifications |
| CDN integration | free-bundled | Inferred | — | — | Cloudflare's CDN sits natively in front and the transfer is free either way. | #cloudflare-r2-cdn_integration |
| Max object size | 5 TB | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/platform/limits/ | — | #cloudflare-r2-max_object_size |
| IAM granularity | 3 | Inferred | — | — | API tokens scoped by bucket and permission set, with optional TTL and IP filters. No policy conditions, no assumable roles. | #cloudflare-r2-iam_granularity |
| Sydney region | ◐ | Inferred | — | — | The Oceania ('oc') location hint biases placement toward the region but is explicitly best-effort, not a contractual region. Hard jurisdictional restrictions exist for the EU, not for Australia. | #cloudflare-r2-sydney_region |
| TTFB from Sydney | 45 ms | Inferred | — | — | Cloudflare has Sydney PoPs; a cold read against an Oceania-hinted bucket typically lands in the 30–60 ms band. | #cloudflare-r2-ttfb_sydney |
| Durability (nines) | 11  nines | Vendor-claimed | 2026-07-23 | https://developers.cloudflare.com/r2/reference/durability/ | — | #cloudflare-r2-durability_nines |
| Uptime SLA | 99.9 % | Inferred | 2026-07-23 | — | — | #cloudflare-r2-uptime_sla |
| Object lock / WORM | ◐ | Inferred | — | — | Bucket-level retention locks exist; the full S3 Object Lock surface including compliance mode and per-object legal holds is not equivalent. | #cloudflare-r2-object_lock |
| Replication model | multi-az | Inferred | — | — | Cloudflare does not publish its erasure-coding scheme or facility layout for R2, so this is an assumption from its durability claim. | #cloudflare-r2-replication_model |
| Official MCP server | ● | Inferred | — | — | Cloudflare ships a family of remote MCP servers covering the developer platform, including bucket operations. | #cloudflare-r2-mcp_server |
| GA year | 2,022 | Vendor-claimed | — | https://blog.cloudflare.com/r2-ga/ | — | #cloudflare-r2-ga_year |
| Positioning | Zero-egress object storage for teams already on Cloudflare's edge. | Inferred | — | — | — | #cloudflare-r2-positioning |

**Verdict.** The default answer for anything read-heavy, and the only provider here where egress genuinely stops being a line item you have to model. Watch the $4.50 per million Class A charge on write-heavy workloads, remember that 'Oceania' is a hint rather than a region, and check that you are not quietly depending on versioning — R2 does not implement it, which is a bigger gap than the zero-egress headline lets people notice.

**Pick it when**

- Public assets, media and package registries where egress dwarfs storage
- Anything already fronted by Cloudflare Workers or the Cloudflare CDN
- Escaping an AWS bill that is mostly bandwidth

### Wasabi {#wasabi}

Flat-rate hot storage with no egress or API fees, bounded by a fair-use cap.

|  |  |
| --- | --- |
| Site | https://wasabi.com/cloud-object-storage |
| Docs | https://docs.wasabi.com/ |
| Company | Wasabi Technologies |
| Founded | 2015 |
| Profile | https://toolweight.dev/tools/wasabi |
| Score (default weights) | 74.0 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | — | Unknown | 2026-07-23 | https://wasabi.com/cloud-storage-pricing | No honest figure exists for this scenario. Wasabi charges no egress fee, but its acceptable-use policy limits monthly egress to roughly your stored volume; 5 TB out against 1 TB stored is five times over, and Wasabi's remedy is to review or restrict the account rather than bill an overage. Storage alone would be $6.99 (1 TB at the $6.99/TB list rate, which is also the account minimum). We have left this null rather than quote $6.99 for a workload Wasabi would not accept. | #wasabi-true_cost_usd |
| True cost /mo (AUD) | — | Unknown | — | — | Null for the same reason as the USD figure. | #wasabi-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | 2026-07-23 | — | Wasabi does run a Sydney region, so the geography is not the problem — the terms are. This scenario egresses five times stored volume, which is outside the acceptable-use policy in Sydney exactly as it is everywhere else, so there is no Australian list price either. | #wasabi-sydney_cost_aud |
| Storage $/TB/mo | $6.99 /TB/mo | Vendor-claimed | 2026-07-23 | https://wasabi.com/cloud-storage-pricing | Pay-as-you-go list rate with a 1 TB monthly minimum. Reserved capacity contracts are cheaper. | #wasabi-storage_price |
| Egress $/TB | $0 /TB | Vendor-claimed | 2026-07-23 | https://wasabi.com/cloud-storage-pricing | Zero per gigabyte, but bounded: the acceptable-use policy expects monthly egress not to exceed stored volume. Treat Wasabi as free egress up to about 1x storage and unavailable above it. | #wasabi-egress_price |
| Egress cap (x stored) | 1 x stored | Inferred | 2026-07-23 | — | Wasabi's acceptable-use policy expects monthly downloads not to exceed roughly the volume you store, and the remedy above it is account review or restriction rather than an overage invoice. The '1' is our reading of 'roughly your stored volume'; Wasabi publishes no exact multiple, which is itself the point. This cell is why Wasabi's zero in the egress column should not be read as R2's zero. | #wasabi-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://wasabi.com/cloud-storage-pricing | — | #wasabi-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://wasabi.com/cloud-storage-pricing | — | #wasabi-class_b_price |
| Min retention | 129600 min | Vendor-claimed | 2026-07-23 | https://docs.wasabi.com/ | 90 days. An object written and deleted after two days is still billed for 90. On a workload with a one-week object lifetime this multiplies the effective storage rate roughly thirteenfold. | #wasabi-min_retention |
| Min billed object | 4 KB | Inferred | 2026-07-23 | — | Every object bills at a minimum of 4 KB. Ten million 1.5 KB objects bill as 40 GB rather than 15 GB. | #wasabi-min_billed_object |
| S3 API coverage | 90 % | Inferred | — | — | Close to a drop-in replacement for standard-class workloads; the gaps are storage-class transitions (there is only one class) and the notification and analytics APIs. | #wasabi-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #wasabi-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #wasabi-multipart_upload |
| Versioning | ● | Vendor-claimed | 2026-07-23 | https://docs.wasabi.com/docs/versioning | — | #wasabi-versioning |
| Lifecycle rules | ◐ | Inferred | — | — | Expiration rules work; there are no storage classes to transition between. | #wasabi-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | No S3-equivalent bucket notification API. Poll, or trigger from your own write path. | #wasabi-event_notifications |
| CDN integration | partner | Inferred | — | — | No first-party CDN; Wasabi promotes third-party partners and its own content-delivery bundles. | #wasabi-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #wasabi-max_object_size |
| IAM granularity | 4 | Inferred | — | — | IAM users, groups and JSON policies closely modelled on AWS, without the condition-key depth or STS federation. | #wasabi-iam_granularity |
| Sydney region | ● | Inferred | 2026-07-23 | — | Wasabi operates an ap-southeast-2 Sydney region. Confirm current availability before committing — Wasabi's region list has changed more than once. | #wasabi-sydney_region |
| TTFB from Sydney | 30 ms | Inferred | — | — | In-metro read from the Sydney region. | #wasabi-ttfb_sydney |
| Durability (nines) | 11  nines | Inferred | 2026-07-23 | — | — | #wasabi-durability_nines |
| Uptime SLA | 99.9 % | Inferred | 2026-07-23 | — | — | #wasabi-uptime_sla |
| Object lock / WORM | ● | Inferred | 2026-07-23 | — | — | #wasabi-object_lock |
| Replication model | single-az | Inferred | — | — | One region per bucket by default; cross-region replication is opt-in and billed as a second copy. | #wasabi-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #wasabi-mcp_server |
| GA year | 2,017 | Inferred | — | — | — | #wasabi-ga_year |
| Positioning | Flat-rate hot storage sold against S3's egress bill, for steady archives. | Inferred | — | — | — | #wasabi-positioning |

**Verdict.** Excellent if your read volume is modest and your objects are large and long-lived — the 90-day minimum retention and 4 KB billing floor punish everything else. The egress fair-use cap means Wasabi's 'no egress fees' and R2's are not the same promise, and this page's scenario is exactly where the difference shows.

**Pick it when**

- Media archives and backup vaults with predictable, low read volume
- Australian workloads that need in-country storage at a flat rate
- Teams that want AWS-shaped IAM policies without the AWS bill

### iDrive e2 {#idrive-e2}

USD 4/TB S3-compatible storage with zero-egress marketing and a fair-use cap.

|  |  |
| --- | --- |
| Site | https://www.idrive.com/e2/ |
| Docs | https://www.idrive.com/e2/guides/ |
| Company | iDrive |
| Founded | 1995 |
| Profile | https://toolweight.dev/tools/idrive-e2 |
| Score (default weights) | 73.2 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | — | Unknown | 2026-07-23 | https://www.idrive.com/e2/pricing | No honest figure exists for this scenario. Storage alone is 1 TB x $4 = $4.00, and that much reconstructs from this row. The other $20 does not: e2's zero-egress promise is bounded by a fair-use multiple of stored data, and e2 publishes neither the multiple nor the rate it charges above it. This page previously quoted $24.00 by assuming a 3x free allowance and a $0.01/GB overage — two numbers that appear nowhere on e2's rate card and could not be checked against any other cell in this row, which is exactly what this column promises you can do. If e2's remedy above the cap is to restrict the account rather than to bill, as Wasabi's is, then there is no price here at all rather than an uncertain one. Withdrawn until the overage rate is published or measured. | #idrive-e2-true_cost_usd |
| True cost /mo (AUD) | — | Unknown | 2026-07-23 | — | Null for the same reason as the USD figure. | #idrive-e2-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | 2026-07-23 | — | Null twice over: there is no price for this scenario, and we could not confirm that e2 has an Australian location to serve it from. | #idrive-e2-sydney_cost_aud |
| Storage $/TB/mo | $4 /TB/mo | Vendor-claimed | 2026-07-23 | https://www.idrive.com/e2/pricing | $0.004/GB-month at pay-as-you-go. Annual prepay is cheaper again. | #idrive-e2-storage_price |
| Egress $/TB | $0 /TB | Vendor-claimed | 2026-07-23 | https://www.idrive.com/e2/pricing | Marketed as zero egress, capped by a fair-use policy expressed as a multiple of stored data. Behaviour above the cap is not clearly documented. | #idrive-e2-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.idrive.com/e2/pricing | e2 states that free egress is bounded by a fair-use multiple of stored data but does not publish the multiple. We could not establish whether it is 1x, as Wasabi's is, or 3x, as Backblaze's is — a difference that decides whether this scenario is merely dear or outside the terms entirely. This page previously modelled 3x; that was an assumption, not a source, and it has been withdrawn. | #idrive-e2-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.idrive.com/e2/pricing | — | #idrive-e2-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.idrive.com/e2/pricing | — | #idrive-e2-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #idrive-e2-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #idrive-e2-min_billed_object |
| S3 API coverage | 80 % | Inferred | — | — | Standard operations plus versioning and object lock. Documentation is thinner than competitors', so edge-case behaviour is harder to predict without testing. | #idrive-e2-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #idrive-e2-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #idrive-e2-multipart_upload |
| Versioning | ● | Inferred | 2026-07-23 | — | — | #idrive-e2-versioning |
| Lifecycle rules | ◐ | Inferred | — | — | — | #idrive-e2-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | — | #idrive-e2-event_notifications |
| CDN integration | none | Inferred | — | — | — | #idrive-e2-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #idrive-e2-max_object_size |
| IAM granularity | 3 | Inferred | — | — | Access keys scoped per bucket with read/write control. | #idrive-e2-iam_granularity |
| Sydney region | — | Unknown | — | — | e2 advertises a long region list and we could not confirm whether an Australian location is currently among them. Treat as no until you have seen the endpoint. | #idrive-e2-sydney_region |
| TTFB from Sydney | — | Unknown | — | — | Depends entirely on whether an APAC region is available to you. | #idrive-e2-ttfb_sydney |
| Durability (nines) | 11  nines | Inferred | — | — | — | #idrive-e2-durability_nines |
| Uptime SLA | 99.9 % | Inferred | — | — | — | #idrive-e2-uptime_sla |
| Object lock / WORM | ● | Vendor-claimed | 2026-07-23 | https://www.idrive.com/e2/object-lock | — | #idrive-e2-object_lock |
| Replication model | single-az | Inferred | — | — | — | #idrive-e2-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #idrive-e2-mcp_server |
| GA year | 2,021 | Inferred | — | — | — | #idrive-e2-ga_year |
| Positioning | Lowest headline storage price, sold into the backup and MSP market. | Inferred | — | — | — | #idrive-e2-positioning |

**Verdict.** The cheapest storage rate here alongside Storj, with object lock included, and the least legible egress terms in the roster — legible enough that we will not put a number in the cost column for it. Fine as a backup target, where you store far more than you read; do not build a public asset pipeline on a fair-use cap you cannot find written down.

**Pick it when**

- Backup and MSP workloads where storage volume dominates and reads are rare
- Object-lock immutability at the lowest price on this page
- Teams comfortable verifying terms directly with a vendor before committing

### Scaleway Object Storage {#scaleway-object-storage}

European-sovereign S3 storage with multi-AZ classes and a real IAM system.

|  |  |
| --- | --- |
| Site | https://www.scaleway.com/en/object-storage/ |
| Docs | https://www.scaleway.com/en/docs/object-storage/ |
| Company | Scaleway |
| Founded | 1999 |
| Profile | https://toolweight.dev/tools/scaleway-object-storage |
| Score (default weights) | 71.3 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $72.8 /mo | Inferred | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | Storage (1,000 - 75 free) GB x EUR 0.0146 = EUR 13.505. Egress (5,000 - 75 free) GB x EUR 0.01 = EUR 49.25. Requests unmetered. Total EUR 62.755 x 1.16 = $72.80. Both of Scaleway's free 75 GB allowances are now netted; this row previously netted the egress one and not the storage one, which was the only inconsistent netting on the page. Sensitive to FX — at the 1.08 this page used to carry, the same bill is $67.78. | #scaleway-object-storage-true_cost_usd |
| True cost /mo (AUD) | A$110.66 /mo | Inferred | 2026-07-23 | — | $72.80 x 1.52. | #scaleway-object-storage-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | 2026-07-23 | — | Not priceable from Australia: Scaleway's regions are Paris, Amsterdam and Warsaw, so there is no location that can serve this scenario from Australia at any price. | #scaleway-object-storage-sydney_cost_aud |
| Storage $/TB/mo | $16.94 /TB/mo | Inferred | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | EUR 0.0146/GB-month for the Standard multi-AZ class, converted at 1.16. One Zone IA and Glacier are materially cheaper. The euro rate itself is the input we are least able to re-verify on this row — check it against the pricing page before budgeting. | #scaleway-object-storage-storage_price |
| Egress $/TB | $11.6 /TB | Inferred | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | EUR 0.01/GB after the first 75 GB each month, converted at 1.16. | #scaleway-object-storage-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | Not applicable: egress is metered per gigabyte beyond a flat 75 GB, not granted as a multiple of stored volume, so there is no fair-use ceiling to exceed. | #scaleway-object-storage-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | — | #scaleway-object-storage-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/pricing/storage/ | — | #scaleway-object-storage-class_b_price |
| Min retention | 0 ms | Inferred | — | — | None on the Standard class. The Glacier tier has its own minimum. | #scaleway-object-storage-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #scaleway-object-storage-min_billed_object |
| S3 API coverage | 85 % | Inferred | — | — | Versioning, object lock, lifecycle, multipart and presigned URLs are all present, and transitions work between Scaleway's own storage classes. | #scaleway-object-storage-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #scaleway-object-storage-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #scaleway-object-storage-multipart_upload |
| Versioning | ● | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/docs/object-storage/how-to/use-bucket-versioning/ | — | #scaleway-object-storage-versioning |
| Lifecycle rules | ● | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/docs/object-storage/how-to/manage-lifecycle-rules/ | — | #scaleway-object-storage-lifecycle_rules |
| Event notifications | — | Unknown | — | — | We could not confirm a bucket notification API equivalent to S3 events. | #scaleway-object-storage-event_notifications |
| CDN integration | first-party-paid | Inferred | — | — | Scaleway's Edge Services can front an Object Storage bucket, billed separately. | #scaleway-object-storage-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #scaleway-object-storage-max_object_size |
| IAM granularity | 4 | Inferred | — | — | A real IAM system with applications, groups, policies and API keys — closer to AWS than anything else in the cheap tier. | #scaleway-object-storage-iam_granularity |
| Sydney region | ○ | Inferred | 2026-07-23 | — | Paris, Amsterdam and Warsaw only. | #scaleway-object-storage-sydney_region |
| TTFB from Sydney | 300 ms | Inferred | — | — | Europe to Sydney; 280–320 ms is the realistic band for an uncached read. | #scaleway-object-storage-ttfb_sydney |
| Durability (nines) | 11  nines | Inferred | 2026-07-23 | — | — | #scaleway-object-storage-durability_nines |
| Uptime SLA | 99.9 % | Inferred | 2026-07-23 | — | — | #scaleway-object-storage-uptime_sla |
| Object lock / WORM | ● | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/docs/object-storage/how-to/use-object-lock/ | — | #scaleway-object-storage-object_lock |
| Replication model | multi-az | Vendor-claimed | 2026-07-23 | https://www.scaleway.com/en/docs/object-storage/concepts/ | The Standard class spreads across availability zones in the Paris region; One Zone IA does not. | #scaleway-object-storage-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #scaleway-object-storage-mcp_server |
| GA year | 2,019 | Inferred | — | — | — | #scaleway-object-storage-ga_year |
| Positioning | EU-sovereign object storage with AWS-shaped IAM, priced in euros. | Inferred | — | — | — | #scaleway-object-storage-positioning |

**Verdict.** The most feature-complete of the non-hyperscalers — genuine IAM, multi-AZ placement, object lock, real lifecycle rules — and irrelevant for Australian traffic at 300 ms away. Pick it when EU data residency is a requirement rather than a preference.

**Pick it when**

- EU data residency obligations with a European legal entity behind them
- Workloads needing real IAM policies rather than scoped access keys
- Multi-AZ durability without hyperscaler pricing

### DigitalOcean Spaces {#digitalocean-spaces}

Bundled object storage plus free CDN, priced as a flat base fee with overages.

|  |  |
| --- | --- |
| Site | https://www.digitalocean.com/products/spaces |
| Docs | https://docs.digitalocean.com/products/spaces/ |
| Company | DigitalOcean |
| Founded | 2011 |
| Profile | https://toolweight.dev/tools/digitalocean-spaces |
| Score (default weights) | 69.7 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $60 /mo | Inferred | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | Base $5.00 includes 250 GB storage and 1 TB transfer. Extra storage 750 GB x $0.02 = $15.00. Extra transfer 4,000 GB x $0.01 = $40.00. Requests unmetered. Total $60.00. | #digitalocean-spaces-true_cost_usd |
| True cost /mo (AUD) | A$91.2 /mo | Inferred | 2026-07-23 | — | $60.00 x 1.52. | #digitalocean-spaces-true_cost_aud |
| True cost from Sydney (AUD) | A$91.2 /mo | Inferred | 2026-07-23 | — | Unchanged from the headline figure: Spaces is priced identically in every region including syd1, so the Sydney bill is the same $60.00 x 1.52. | #digitalocean-spaces-sydney_cost_aud |
| Storage $/TB/mo | $20 /TB/mo | Vendor-claimed | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | $0.02/GB overage rate. The first 250 GB sits inside the $5 base fee, so the effective rate is lower at small scale and exactly this above it. | #digitalocean-spaces-storage_price |
| Egress $/TB | $10 /TB | Vendor-claimed | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | $0.01/GB beyond the 1 TB bundled with the base fee. Transfer through the included CDN draws on the same pool. | #digitalocean-spaces-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | Not applicable rather than unknown: the 1 TB bundled with the base fee is an absolute allowance, not a multiple of stored volume, and transfer above it is simply billed at $0.01/GB. There is no ceiling to breach. | #digitalocean-spaces-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | Spaces does not meter requests at all. | #digitalocean-spaces-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.digitalocean.com/pricing/spaces-object-storage | — | #digitalocean-spaces-class_b_price |
| Min retention | 0 ms | Inferred | 2026-07-23 | — | — | #digitalocean-spaces-min_retention |
| Min billed object | 0 B | Inferred | 2026-07-23 | — | — | #digitalocean-spaces-min_billed_object |
| S3 API coverage | 78 % | Inferred | — | — | Core operations are solid; the missing pieces are versioning, object lock, bucket notifications and storage classes. | #digitalocean-spaces-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #digitalocean-spaces-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #digitalocean-spaces-multipart_upload |
| Versioning | ○ | Inferred | 2026-07-23 | — | No object versioning. This is the biggest functional gap versus every other managed provider in this roster. | #digitalocean-spaces-versioning |
| Lifecycle rules | ◐ | Inferred | — | — | Expiration and incomplete-multipart cleanup only. | #digitalocean-spaces-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | — | #digitalocean-spaces-event_notifications |
| CDN integration | free-bundled | Vendor-claimed | 2026-07-23 | https://docs.digitalocean.com/products/spaces/how-to/enable-cdn/ | The Spaces CDN costs nothing extra; you pay only the transfer, from the same bundled pool. | #digitalocean-spaces-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | — | #digitalocean-spaces-max_object_size |
| IAM granularity | 3 | Inferred | — | — | Per-bucket access keys with read/write or read-only scoping. No policy documents, no conditions. | #digitalocean-spaces-iam_granularity |
| Sydney region | ● | Vendor-claimed | 2026-07-23 | https://docs.digitalocean.com/platform/regional-availability/ | syd1. | #digitalocean-spaces-sydney_region |
| TTFB from Sydney | 25 ms | Inferred | — | — | In-metro from syd1. | #digitalocean-spaces-ttfb_sydney |
| Durability (nines) | — | Unknown | — | — | DigitalOcean publishes no annual durability figure for Spaces. | #digitalocean-spaces-durability_nines |
| Uptime SLA | — | Unknown | — | — | No Spaces-specific credit-backed SLA distinct from DigitalOcean's general terms. | #digitalocean-spaces-uptime_sla |
| Object lock / WORM | ○ | Inferred | — | — | — | #digitalocean-spaces-object_lock |
| Replication model | single-az | Inferred | — | — | — | #digitalocean-spaces-replication_model |
| Official MCP server | ◐ | Inferred | — | — | DigitalOcean ships an MCP server for its platform; Spaces coverage within it is incidental. | #digitalocean-spaces-mcp_server |
| GA year | 2,017 | Inferred | — | — | — | #digitalocean-spaces-ga_year |
| Positioning | Predictable bundled storage plus CDN for teams already on DigitalOcean. | Inferred | — | — | — | #digitalocean-spaces-positioning |

**Verdict.** Buy it for the bundling and the Sydney region, not the feature set. No versioning and no bucket events rules it out as a system of record; as a CDN-fronted asset bucket sitting next to your Droplets it is genuinely convenient and hard to misbudget.

**Pick it when**

- Static assets and user uploads served from Sydney with a bundled CDN
- Teams who want one predictable line item instead of five metered ones
- Existing DigitalOcean deployments where traffic stays on the internal network

### AWS S3 {#aws-s3}

The API everything else copies, and by far the most expensive egress in this roster.

|  |  |
| --- | --- |
| Site | https://aws.amazon.com/s3/ |
| Docs | https://docs.aws.amazon.com/s3/ |
| Company | Amazon Web Services |
| Founded | 2006 |
| Profile | https://toolweight.dev/tools/aws-s3 |
| Score (default weights) | 65.3 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $472.6 /mo | Inferred | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | us-east-1, S3 Standard. Storage 1,000 GB x $0.023 = $23.00. Egress (5,000 - 100 free) GB x $0.09 = $441.00. PUT/LIST 1 M at $0.005/1,000 = $5.00. GET 9 M at $0.0004/1,000 = $3.60. Total $472.60, of which 93% is bandwidth. Egress stays inside AWS's first 10 TB band at 5 TB, so no tiering applies. In ap-southeast-2 (Sydney) the same workload is $592.20 — see the Sydney column for that arithmetic. | #aws-s3-true_cost_usd |
| True cost /mo (AUD) | A$718.35 /mo | Inferred | 2026-07-23 | — | $472.60 x 1.52 — a conversion of the us-east-1 bill. Run from Sydney it is a quarter higher again; the Sydney column has it. | #aws-s3-true_cost_aud |
| True cost from Sydney (AUD) | A$900.14 /mo | Inferred | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | ap-southeast-2, S3 Standard. Storage 1,000 GB x $0.025 = $25.00. Egress (5,000 - 100 free) GB x $0.114 = $558.60. PUT/LIST 1 M at $0.005/1,000 = $5.00. GET 9 M at $0.0004/1,000 = $3.60. Total $592.20 x 1.52 = A$900.14. Sydney egress is 27% dearer per gigabyte than us-east-1, which on this workload is most of the difference. | #aws-s3-sydney_cost_aud |
| Storage $/TB/mo | $23 /TB/mo | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | $0.023/GB-month for S3 Standard, first 50 TB, us-east-1. Sydney is $0.025. | #aws-s3-storage_price |
| Egress $/TB | $90 /TB | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | $0.09/GB to the internet for the first 10 TB per month, with only the first 100 GB free across the whole account. Sydney is $0.114/GB. Origin fetch from S3 to CloudFront is free, which is the only real mitigation inside AWS. | #aws-s3-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | Not applicable: egress is metered per gigabyte beyond a flat 100 GB a month, not granted as a multiple of stored volume. | #aws-s3-egress_cap_multiple |
| Class A $/M ops | $5 /M ops | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | $0.005 per 1,000 PUT/COPY/POST/LIST. | #aws-s3-class_a_price |
| Class B $/M ops | $0.4 /M ops | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | $0.0004 per 1,000 GET/SELECT. | #aws-s3-class_b_price |
| Min retention | 0 ms | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | None on S3 Standard. Standard-IA and One Zone-IA carry 30 days, the Glacier classes 90 or 180. | #aws-s3-min_retention |
| Min billed object | 0 B | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/pricing/ | None on S3 Standard. The infrequent-access classes apply a 128 KB floor, which is how small objects end up costing more in the cheaper tier. | #aws-s3-min_billed_object |
| S3 API coverage | 100 % | Inferred | 2026-07-23 | — | By definition — this is the specification everything else is measured against. | #aws-s3-s3_api_coverage |
| Presigned URLs | ● | Inferred | — | — | — | #aws-s3-presigned_urls |
| Multipart upload | ● | Inferred | — | — | — | #aws-s3-multipart_upload |
| Versioning | ● | Inferred | — | — | — | #aws-s3-versioning |
| Lifecycle rules | ● | Inferred | — | — | — | #aws-s3-lifecycle_rules |
| Event notifications | ● | Inferred | — | — | — | #aws-s3-event_notifications |
| CDN integration | first-party-paid | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/cloudfront/pricing/ | CloudFront, billed separately at around $0.085/GB, but origin fetch from S3 is free so it replaces S3 egress rather than stacking on it. | #aws-s3-cdn_integration |
| Max object size | 45.5 TB | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/faqs/ | 50 TB. AWS raised its own ceiling well above the 5 TiB limit every S3 clone in this roster inherited from it, so the specification and the implementations have diverged here. The largest single PUT is still 5 GB; anything above 100 MB wants multipart. | #aws-s3-max_object_size |
| IAM granularity | 5 | Vendor-claimed | 2026-07-23 | https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html | Policy documents with condition keys, resource policies, assumable roles, STS, Access Points and Access Grants. Nothing else in this roster is close. | #aws-s3-iam_granularity |
| Sydney region | ● | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/about-aws/global-infrastructure/regions_az/ | ap-southeast-2, with three availability zones, and a Melbourne region alongside it. | #aws-s3-sydney_region |
| TTFB from Sydney | 25 ms | Inferred | — | — | In-metro from ap-southeast-2. | #aws-s3-ttfb_sydney |
| Durability (nines) | 11  nines | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/storage-classes/ | — | #aws-s3-durability_nines |
| Uptime SLA | 99.9 % | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/sla/ | Credit-backed monthly availability for S3 Standard. | #aws-s3-uptime_sla |
| Object lock / WORM | ● | Vendor-claimed | 2026-07-23 | https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html | Governance and compliance modes plus legal holds — the implementation everyone else's is compared against. | #aws-s3-object_lock |
| Replication model | multi-az | Vendor-claimed | 2026-07-23 | https://aws.amazon.com/s3/storage-classes/ | S3 Standard spans at least three availability zones within a region by default. Cross-region replication is a separate, separately billed feature. | #aws-s3-replication_model |
| Official MCP server | ● | Inferred | — | — | AWS maintains a set of official MCP servers covering its APIs, including S3 operations. | #aws-s3-mcp_server |
| GA year | 2,006 | Inferred | — | — | — | #aws-s3-ga_year |
| Positioning | The reference implementation, priced for customers who are not leaving. | Inferred | — | — | — | #aws-s3-positioning |

**Verdict.** Still the most capable object store by a wide margin, and thirty-eight times the cost of Hetzner on this scenario almost entirely because of bandwidth. Stay on S3 if you genuinely use Object Lock compliance mode, Access Points, cross-region replication or IAM condition keys; otherwise you are paying $441 a month for an API you can get elsewhere.

**Pick it when**

- Workloads already inside AWS where traffic stays on the internal network
- Regulatory requirements needing Object Lock compliance mode with a real SLA
- Anything depending on IAM condition keys, Access Points or S3 Tables

### Bunny Storage {#bunny-storage}

Edge storage built as a CDN origin, with its own API rather than a faithful S3 one.

|  |  |
| --- | --- |
| Site | https://bunny.net/storage/ |
| Docs | https://docs.bunny.net/docs/storage-api |
| Company | bunny.net |
| Founded | 2014 |
| Profile | https://toolweight.dev/tools/bunny-storage |
| Score (default weights) | 61.8 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $60 /mo | Inferred | 2026-07-23 | https://bunny.net/pricing/ | Storage 1,000 GB x $0.01 = $10.00 (HDD tier, single region). Egress 5,000 GB x $0.01 = $50.00 at European and North American CDN rates. Requests unmetered. Total $60.00. Bunny is the only provider here whose egress rate depends on where your users are, so this figure is genuinely regional — for the Australian number, read the Sydney column, not this one converted. | #bunny-storage-true_cost_usd |
| True cost /mo (AUD) | A$91.2 /mo | Inferred | 2026-07-23 | — | $60.00 x 1.52 — a conversion of the Europe/North America bill, and therefore about a third of what serving Australian users actually costs. The Sydney column carries the real figure. | #bunny-storage-true_cost_aud |
| True cost from Sydney (AUD) | A$243.2 /mo | Inferred | 2026-07-23 | https://bunny.net/pricing/ | Storage 1,000 GB x $0.01 = $10.00 in the Sydney storage region. Egress 5,000 GB x $0.03 = $150.00 at Oceania delivery rates. Requests unmetered. Total $160.00 x 1.52 = A$243.20 — two and a half times the headline AUD figure, and the number to use if your users are Australian. | #bunny-storage-sydney_cost_aud |
| Storage $/TB/mo | $10 /TB/mo | Vendor-claimed | 2026-07-23 | https://bunny.net/pricing/storage/ | $0.01/GB-month for the HDD tier in a single region; the SSD tier and each additional replica region are charged separately. | #bunny-storage-storage_price |
| Egress $/TB | $10 /TB | Vendor-claimed | 2026-07-23 | https://bunny.net/pricing/ | $0.01/GB for Europe and North America. Asia and Oceania are $0.03/GB, South America and Africa higher again — Bunny is the only provider here whose egress price depends on where your users are. | #bunny-storage-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://bunny.net/pricing/ | Not applicable: transfer is metered per gigabyte at a regional rate, with no free-egress allowance to exceed. | #bunny-storage-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://bunny.net/pricing/storage/ | — | #bunny-storage-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://bunny.net/pricing/storage/ | — | #bunny-storage-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #bunny-storage-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #bunny-storage-min_billed_object |
| S3 API coverage | 30 % | Inferred | — | — | Bunny Storage is not an S3 clone. Its native interface is a simple REST API plus FTP, and S3 compatibility has never been the design goal. Do not plan on pointing an AWS SDK at it without testing every call you make. | #bunny-storage-s3_api_coverage |
| Presigned URLs | ◐ | Inferred | — | — | Token-authenticated URLs with expiry exist, but they use Bunny's scheme, not SigV4 presigning. | #bunny-storage-presigned_urls |
| Multipart upload | ○ | Inferred | — | — | — | #bunny-storage-multipart_upload |
| Versioning | ○ | Inferred | — | — | — | #bunny-storage-versioning |
| Lifecycle rules | ○ | Inferred | — | — | — | #bunny-storage-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | — | #bunny-storage-event_notifications |
| CDN integration | free-bundled | Inferred | 2026-07-23 | — | The storage zone is designed as a pull zone origin; origin-to-edge transfer is not separately billed. | #bunny-storage-cdn_integration |
| Max object size | — | Unknown | — | — | — | #bunny-storage-max_object_size |
| IAM granularity | 2 | Inferred | — | — | Storage zone passwords, with a separate read-only password. That is the whole model. | #bunny-storage-iam_granularity |
| Sydney region | ● | Vendor-claimed | 2026-07-23 | https://bunny.net/storage/ | Sydney is available both as a storage region and as an edge location. | #bunny-storage-sydney_region |
| TTFB from Sydney | 20 ms | Inferred | — | — | Bunny's edge performance from Sydney is the best in this roster; that is what the product is for. | #bunny-storage-ttfb_sydney |
| Durability (nines) | — | Unknown | — | — | No published annual durability figure. Geo-replication across storage regions is the answer bunny.net gives instead, and it is billed per region. | #bunny-storage-durability_nines |
| Uptime SLA | 99.99 % | Inferred | — | — | bunny.net advertises a very high availability commitment on the CDN; the storage-specific credit terms are less clear. | #bunny-storage-uptime_sla |
| Object lock / WORM | ○ | Inferred | — | — | — | #bunny-storage-object_lock |
| Replication model | multi-region | Inferred | 2026-07-23 | — | Opt-in geo-replication across chosen storage regions, billed as an additional copy per region. | #bunny-storage-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #bunny-storage-mcp_server |
| GA year | 2,019 | Inferred | — | — | — | #bunny-storage-ga_year |
| Positioning | A CDN company's origin store, sold on edge delivery rather than API fidelity. | Inferred | — | — | — | #bunny-storage-positioning |

**Verdict.** Included because people shortlist it against S3 providers, but it is a CDN origin with storage attached rather than an object store with a CDN attached. Superb Sydney delivery; do not expect S3 semantics, and read the regional egress table before modelling the cost.

**Pick it when**

- Static sites, images and video served to a global audience through Bunny's CDN
- Australian delivery where edge latency matters more than API compatibility
- Replacing a CDN plus origin bucket with a single bill

### Hetzner Object Storage {#hetzner-object-storage}

The cheapest credible S3 endpoint in Europe, with a deliberately thin feature set.

|  |  |
| --- | --- |
| Site | https://www.hetzner.com/storage/object-storage/ |
| Docs | https://docs.hetzner.com/storage/object-storage/ |
| Company | Hetzner Online |
| Founded | 1997 |
| Profile | https://toolweight.dev/tools/hetzner-object-storage |
| Score (default weights) | 60.9 / 100 |

| Field | Value | Confidence | Verified | Source | Note | Anchor |
| --- | --- | --- | --- | --- | --- | --- |
| True cost /mo (USD) | $12.47 /mo | Inferred | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | Base EUR 5.99 includes 1 TB storage and 1 TB traffic, so the terabyte stored is covered by the subscription. Extra traffic 4 TB x EUR 1.19 = EUR 4.76. Requests unmetered. Total EUR 10.75 x 1.16 = $12.47 — cheapest on this page by roughly half. This row read $11.61 while the page carried the euro at 1.08. | #hetzner-object-storage-true_cost_usd |
| True cost /mo (AUD) | A$18.95 /mo | Inferred | 2026-07-23 | — | $12.47 x 1.52. | #hetzner-object-storage-true_cost_aud |
| True cost from Sydney (AUD) | — | Unknown | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | Not priceable from Australia: Germany and Finland only. The cheapest bill on this page is also the one you cannot buy for Australian users, which is the whole argument of the Best from Australia preset. | #hetzner-object-storage-sydney_cost_aud |
| Storage $/TB/mo | $6.95 /TB/mo | Inferred | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | EUR 5.99 per TB per month, converted at 1.16. The first terabyte is the base subscription itself. | #hetzner-object-storage-storage_price |
| Egress $/TB | $1.38 /TB | Inferred | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | EUR 1.19 per TB beyond the 1 TB included, converted at 1.16. About one sixty-fifth of the AWS rate, and the single reason Hetzner tops this table. | #hetzner-object-storage-egress_price |
| Egress cap (x stored) | — | Unknown | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | Not applicable: the 1 TB of traffic bundled into the base fee is an absolute allowance, not a multiple of stored volume, and traffic above it is billed at EUR 1.19/TB rather than restricted. | #hetzner-object-storage-egress_cap_multiple |
| Class A $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | — | #hetzner-object-storage-class_a_price |
| Class B $/M ops | $0 /M ops | Vendor-claimed | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | — | #hetzner-object-storage-class_b_price |
| Min retention | 0 ms | Inferred | — | — | — | #hetzner-object-storage-min_retention |
| Min billed object | 0 B | Inferred | — | — | — | #hetzner-object-storage-min_billed_object |
| S3 API coverage | 70 % | Inferred | — | — | A Ceph RADOS Gateway behind an S3 face. Object CRUD, multipart and presigned URLs work; the documented limitations list is long and includes object lock and several bucket-level APIs. | #hetzner-object-storage-s3_api_coverage |
| Presigned URLs | ● | Inferred | 2026-07-23 | — | — | #hetzner-object-storage-presigned_urls |
| Multipart upload | ● | Vendor-claimed | 2026-07-23 | https://docs.hetzner.com/storage/object-storage/supported-actions | — | #hetzner-object-storage-multipart_upload |
| Versioning | — | Unknown | — | — | Hetzner's compatibility documentation has been ambiguous about versioning since launch. Test it against your own bucket before relying on it. | #hetzner-object-storage-versioning |
| Lifecycle rules | ◐ | Inferred | — | — | Basic expiration is supported; the full lifecycle configuration surface is not. | #hetzner-object-storage-lifecycle_rules |
| Event notifications | ○ | Inferred | — | — | — | #hetzner-object-storage-event_notifications |
| CDN integration | diy | Inferred | — | — | No CDN product. Point your own at it and pay EUR 1.19/TB on cache misses, which is cheap enough that this hurts far less than usual. | #hetzner-object-storage-cdn_integration |
| Max object size | 5 TB | Inferred | — | — | The Ceph-inherited multipart ceiling; not prominently documented. | #hetzner-object-storage-max_object_size |
| IAM granularity | 2 | Inferred | — | — | Per-project S3 credentials. No meaningful per-bucket scoping, no policy language. | #hetzner-object-storage-iam_granularity |
| Sydney region | ○ | Vendor-claimed | 2026-07-23 | https://www.hetzner.com/storage/object-storage/ | Germany and Finland only. | #hetzner-object-storage-sydney_region |
| TTFB from Sydney | 300 ms | Inferred | — | — | Falkenstein or Helsinki to Sydney; around 280–320 ms uncached. | #hetzner-object-storage-ttfb_sydney |
| Durability (nines) | — | Unknown | — | — | Hetzner publishes no annual durability figure. For a product widely used as a backup target, that omission is worth weighing. | #hetzner-object-storage-durability_nines |
| Uptime SLA | 99.9 % | Inferred | — | — | Hetzner Cloud's general availability commitment; there is no object-storage-specific SLA. | #hetzner-object-storage-uptime_sla |
| Object lock / WORM | ○ | Inferred | — | — | No WORM. If you need immutable backups for a compliance obligation, this rules Hetzner out entirely. | #hetzner-object-storage-object_lock |
| Replication model | single-az | Inferred | — | — | Redundant within one datacentre location; no cross-location replication feature. | #hetzner-object-storage-replication_model |
| Official MCP server | ○ | Inferred | — | — | — | #hetzner-object-storage-mcp_server |
| GA year | 2,024 | Inferred | — | — | — | #hetzner-object-storage-ga_year |
| Positioning | European bulk storage at hardware-vendor prices, with hardware-vendor features. | Inferred | — | — | — | #hetzner-object-storage-positioning |

**Verdict.** Wins the headline number by a mile and loses the feature comparison by a similar margin. No object lock, ambiguous versioning, no notifications, no APAC location, no published durability figure — brilliant for build caches and cold backups, wrong for a system of record.

**Pick it when**

- CI artefacts, build caches and cold backups where the bill is the point
- European origins where EUR 1.19/TB egress changes what is economically possible
- Anyone already running Hetzner dedicated or cloud servers

## Methodology

Every price on this page is the published pay-as-you-go rate — no committed-use discounts and no enterprise agreements. The killer field, "true cost /mo", is computed by us from those rates against one fixed scenario: 1 TB (1,000 GB) stored for a calendar month, 5 TB (5,000 GB) egressed to the public internet, and 10 M requests split 1 M Class A (PUT, POST, COPY, LIST) and 9 M Class B (GET, HEAD). Each provider's arithmetic is written out in the note on its own cell so you can check us — if a figure cannot be reconstructed from the numbers published in its own row, it does not belong in the column, which is why three rows are null rather than estimated. The same request split is applied to everyone, so providers that do not meter requests at all get a genuine advantage here rather than a modelling artefact.

One netting rule, applied everywhere. An allowance that is part of the rate card itself is deducted before the overage rate applies: the volumes bundled into Hetzner's and DigitalOcean's base fees, Backblaze's free egress up to three times stored data, AWS's first 100 GB of egress, and Scaleway's first 75 GB of storage and 75 GB of egress. A separately branded free plan is not deducted, because it is a different product tier rather than the price of the one we are quoting — that affects only Cloudflare R2, whose 10 GB / 1 M Class A / 10 M Class B free tier would take its total from 22.74 to 14.85, and we say so in the cell note instead of folding it in.

Non-USD list prices are converted at 1 EUR = 1.16 USD, and the AUD column at 1 USD = 1.52 AUD, both struck 2026-07-23 — refresh them if the spread has moved, because for Scaleway and Hetzner the FX rate moves the answer more than the pricing page does. This page previously carried the euro at 1.08, which understated both of those providers by about seven per cent. Three rows have a null cost. Wasabi's no-egress-fee model is bounded by a fair-use cap of roughly one times stored volume, so this scenario falls outside its terms and has no list price. iDrive e2 sells the same shape of promise and publishes neither the multiple nor the rate above it, so there is nothing to compute against — we previously quoted 24.00 there on an assumed 3x allowance and an assumed 0.01/GB overage, neither of which appears on iDrive's rate card, and it has been withdrawn. MinIO has no price because you are buying servers and transit, not storage. Latency figures are inferred from network topology and community reports, not measured by toolweight, and are marked accordingly.

## FAQ

### Is Cloudflare R2 egress really free, with no catch?

Yes for standard object reads over the public internet — R2 bills storage and operations only, with no published fair-use cap on bandwidth. The catches are elsewhere: Class A operations cost USD 4.50 per million, which stings on write-heavy or list-heavy workloads, and the free bandwidth is Cloudflare's network, so you inherit its routing. R2 also has no contractual Sydney region, only an Oceania location hint.

### Why can't you price Wasabi on this page?

Wasabi charges no egress fee, but its acceptable-use policy limits monthly downloads to roughly the volume you store. Our scenario egresses five times the stored volume, which is outside those terms — Wasabi reviews or restricts the account rather than sending a larger bill, so there is no list price to quote. Storage alone would be USD 6.99 for the terabyte, and we have left the computed cell null.

### Which S3-compatible providers have a Sydney region?

Wasabi (ap-southeast-2), DigitalOcean Spaces (syd1), Bunny Storage and AWS S3 all have Sydney presence. Tigris reaches Sydney through Fly.io's footprint. Cloudflare R2 offers a best-effort Oceania location hint rather than a guaranteed region. Backblaze B2, Hetzner Object Storage and Scaleway have no Australian or Oceania location at all, and sit 200–300 ms away.

### What does a minimum retention period actually cost me?

It means an object deleted before that window is still billed for the full window. Wasabi's is 90 days, so a file written and deleted on day two costs 90 days of storage. On churny workloads — CI caches, temporary uploads, video transcode intermediates — this quietly multiplies the effective storage price several times over the headline rate. Check it before you compare per-terabyte numbers.

### How S3-compatible is 'S3-compatible' in practice?

Core operations — PUT, GET, multipart, presigned URLs — work everywhere. Divergence starts at versioning, object lock, lifecycle transitions, bucket notifications and IAM policy semantics. MinIO and AWS are the reference points; Wasabi and Tigris sit around 90%; Cloudflare R2 is a little below them because it implements no versioning at all, which is the single largest gap in this roster on a provider people otherwise treat as a drop-in; Hetzner is closer to 70%; Bunny Storage is not really an S3 API at all despite being shortlisted against these providers constantly.

### Should I self-host MinIO to save money?

Only if you already operate storage hardware. On our scenario the cheap managed providers land at USD 12–30; a dedicated box with enough disk for a terabyte of erasure-coded capacity and the traffic included is more like USD 50–70 before you count your own time, and you take on erasure-coding configuration, upgrades and on-call. Self-hosting is a control and data-residency decision here, not a cost saving. MinIO's community build also lost its admin console in 2025, so the free tier is less complete than it was.

### Can I put a CDN in front and stop worrying about egress?

Partly. A CDN only helps on cache hits; misses, range requests and large unique objects still pull from origin at origin egress rates. AWS is the exception worth knowing — S3 to CloudFront origin fetch is free, so CloudFront's roughly USD 0.085/GB replaces S3's 0.09 rather than stacking on it. Backblaze gets the same effect free via the Bandwidth Alliance with Cloudflare and Fastly.

## Recent changes

| Date | Kind | Event | Tools | Source |
| --- | --- | --- | --- | --- |
| 2025-04-10 | launch | **Cloudflare ships R2 Data Catalog** — Cloudflare added a managed Apache Iceberg catalogue on top of R2 buckets, letting query engines read tables directly out of R2. It matters here because it makes zero-egress storage viable as an analytics substrate rather than just an asset bucket. | cloudflare-r2 | https://blog.cloudflare.com/r2-data-catalog/ |
| 2025-05-20 | launch | **Backblaze launches B2 Overdrive** — A higher-throughput B2 tier aimed at AI and HPC workloads, priced above standard B2 in exchange for much higher aggregate bandwidth. Standard B2 pay-as-you-go pricing was unaffected at the time, but it signalled that the flat commodity tier is no longer the whole product — B2 has since moved to $6.95/TB with all Class A, B and C API calls free. | backblaze-b2 | — |
| 2025-04-29 | launch | **Storj adds S3 Object Lock** — Storj shipped Object Lock through its S3 gateway during the first half of 2025, closing the gap that had kept it out of ransomware-resistant backup evaluations. Combined with the versioning added the year before, it made Storj a credible target for backup software. | storj | — |
| 2025-06-03 | deprecation | **MinIO strips the admin console from the community build** — MinIO removed the browser-based management UI from the AGPL community edition, leaving the mc CLI for administration and reserving the console for the commercial AIStor product. Entirely within the licence, badly received, and it pushed a number of self-hosters back toward managed providers. | minio | — |
| 2025-07-15 | launch | **AWS previews S3 Vectors** — Amazon added native vector storage and similarity search to S3 as a preview, positioning the bucket itself as a low-cost vector store. Nothing comparable exists on any other provider in this roster, and it is the clearest recent example of what the AWS premium actually buys. | aws-s3 | https://aws.amazon.com/blogs/aws/introducing-amazon-s3-vectors-first-cloud-storage-with-native-vector-support-at-scale/ |

## Sources

| Source | Last verified |
| --- | --- |
| https://developers.cloudflare.com/r2/pricing/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/api/s3/api/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/api/s3/presigned-urls/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/objects/multipart-objects/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/buckets/object-lifecycles/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/buckets/event-notifications/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/platform/limits/ | 2026-07-23 |
| https://developers.cloudflare.com/r2/reference/durability/ | 2026-07-23 |
| https://blog.cloudflare.com/r2-ga/ | — |
| https://www.backblaze.com/cloud-storage/pricing | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-data-regions | 2026-07-23 |
| https://www.backblaze.com/cloud-storage/transaction-pricing | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-file-versions | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-lifecycle-rules | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-event-notifications | 2026-07-23 |
| https://www.backblaze.com/cloud-storage/integrations/cloudflare | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-large-files | 2026-07-23 |
| https://www.backblaze.com/blog/cloud-storage-durability/ | 2026-07-23 |
| https://www.backblaze.com/docs/cloud-storage-object-lock | 2026-07-23 |
| https://wasabi.com/cloud-storage-pricing | 2026-07-23 |
| https://docs.wasabi.com/ | 2026-07-23 |
| https://docs.wasabi.com/docs/versioning | 2026-07-23 |
| https://www.tigrisdata.com/docs/pricing/ | 2026-07-23 |
| https://www.tigrisdata.com/docs/objects/presigned/ | 2026-07-23 |
| https://www.tigrisdata.com/docs/overview/ | 2026-07-23 |
| https://www.digitalocean.com/pricing/spaces-object-storage | 2026-07-23 |
| https://docs.digitalocean.com/products/spaces/how-to/enable-cdn/ | 2026-07-23 |
| https://docs.digitalocean.com/platform/regional-availability/ | 2026-07-23 |
| https://www.scaleway.com/en/pricing/storage/ | 2026-07-23 |
| https://www.scaleway.com/en/docs/object-storage/how-to/use-bucket-versioning/ | 2026-07-23 |
| https://www.scaleway.com/en/docs/object-storage/how-to/manage-lifecycle-rules/ | 2026-07-23 |
| https://www.scaleway.com/en/docs/object-storage/how-to/use-object-lock/ | 2026-07-23 |
| https://www.scaleway.com/en/docs/object-storage/concepts/ | 2026-07-23 |
| https://www.hetzner.com/storage/object-storage/ | 2026-07-23 |
| https://docs.hetzner.com/storage/object-storage/supported-actions | 2026-07-23 |
| https://www.storj.io/pricing | 2026-07-23 |
| https://storj.dev/dcs/api/s3/object-versioning | 2026-07-23 |
| https://storj.dev/dcs/api/s3/object-lock | 2026-07-23 |
| https://storj.dev/learn/concepts/data-structure | 2026-07-23 |
| https://www.idrive.com/e2/pricing | 2026-07-23 |
| https://www.idrive.com/e2/object-lock | 2026-07-23 |
| https://bunny.net/pricing/ | 2026-07-23 |
| https://bunny.net/pricing/storage/ | 2026-07-23 |
| https://bunny.net/storage/ | 2026-07-23 |
| https://aws.amazon.com/s3/pricing/ | 2026-07-23 |
| https://aws.amazon.com/cloudfront/pricing/ | 2026-07-23 |
| https://aws.amazon.com/s3/faqs/ | 2026-07-23 |
| https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html | 2026-07-23 |
| https://aws.amazon.com/about-aws/global-infrastructure/regions_az/ | 2026-07-23 |
| https://aws.amazon.com/s3/storage-classes/ | 2026-07-23 |
| https://aws.amazon.com/s3/sla/ | 2026-07-23 |
| https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html | 2026-07-23 |

## Related comparisons

- [Database engines](https://toolweight.dev/compare/sqlite-vs-postgres-vs-mysql) — Should I use SQLite, PostgreSQL or MySQL?
- [Convex alternatives](https://toolweight.dev/compare/convex-alternatives) — What are the best alternatives to Convex, and how hard is each one to leave?
- [Vercel alternatives](https://toolweight.dev/compare/vercel-alternatives) — Which Vercel alternative should I use, and what happens to my bill if my site goes viral?
- [Sandbox providers](https://toolweight.dev/compare/sandbox-providers) — Which sandbox provider should I run untrusted or agent-generated code on?

## Licence and attribution

Data from toolweight (https://toolweight.dev), licensed CC-BY-4.0.

- Licence: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)
- Canonical HTML: https://toolweight.dev/compare/s3-compatible-storage
- Machine-readable: https://toolweight.dev/compare/s3-compatible-storage.md · https://toolweight.dev/api/v1 · https://toolweight.dev/mcp
- toolweight takes no affiliate revenue and sells no placements. Corrections: https://toolweight.dev/suggest
