{
  "schemaVersion": 1,
  "name": "storage.so",
  "description": "Monthly cost comparison of S3-compatible object storage: seven managed services plus a self-hosted MinIO baseline.",
  "url": "https://storage.so",
  "verified": "2026-10-08",
  "currency": {
    "base": "USD",
    "eurUsd": 1.15,
    "note": "USD or EUR estimates; euro products converted at €1 = $1.15"
  },
  "units": {
    "storage": "decimal GB (1 GB = 10^9 bytes), average stored over the month",
    "egress": "decimal GB downloaded per month",
    "requests": "millions of operations per month",
    "money": "USD per month before tax"
  },
  "exclusions": "Ingress, tax, support, CDN, retrieval tiers, replication, and migration costs are excluded.",
  "calculation": {
    "input": "Four monthly values: storageGb (average decimal GB stored), egressGb (decimal GB downloaded to the public internet), writeMillions (PUT/COPY/POST/LIST, millions), readMillions (GET/HEAD, millions). Negative or non-finite values count as 0.",
    "units": "Inputs are decimal GB. When a provider sets billingUnit \"binary\", convert storage and egress into its billing unit first: binaryGb = decimalGb / (2^30 / 10^9), i.e. divide by 1.073741824. Allowances, limits, and tier bounds are then expressed in that same unit.",
    "rounding": "When a provider sets roundsBillingUnits, storage GB and request millions are rounded up to whole units before free allowances apply.",
    "tiers": "When storageTiers or egressTiers are present they replace the flat per-GB rate. Each tier's untilGb is an upper bound measured from zero; the final tier omits it. Price each slice at its own rate and sum. Egress tiers apply to the volume left after the free allowance.",
    "models": {
      "metered": "storage = max(storageGb - freeStorageGb, 0) priced with storageTiers when present, otherwise × storagePerGbUsd, raised to minimumMonthlyUsd if set. egressAllowance = storageGb × egressAllowanceMultiplier when set, otherwise freeEgressGb. egress = max(egressGb - egressAllowance, 0) priced with egressTiers when present, otherwise × egressPerGbUsd.",
      "flat": "Same formula as metered. Providers with fairUseOnly publish no overage price: egress above the allowance costs 0 but makes the provider unsuitable.",
      "bundle": "storage = minimumMonthlyUsd whenever storageGb or egressGb is above 0, plus max(storageGb - includedStorageGb, 0) × storagePerGbUsd. egress = max(egressGb - includedEgressGb, 0) × egressPerGbUsd.",
      "self-hosted": "storage = fixedMonthlyUsd whenever storageGb is above 0. Egress and requests are unmetered."
    },
    "requests": "For every model: writes = max(writeMillions - freeWriteMillions, 0) × writePerMillionUsd; reads = max(readMillions - freeReadMillions, 0) × readPerMillionUsd.",
    "total": "total = storage + egress + writes + reads, in USD per month before tax. EUR = USD / eurUsd.",
    "eligibility": "A result is unsuitable when the workload exceeds any entry in the provider's limits. Unsuitable results keep their estimate but are never recommended.",
    "recommendation": "Recommend the lowest-total suitable managed provider. Self-hosted providers (managed: false) are a hardware-only baseline and are never recommended."
  },
  "knownLimitations": [
    "AWS and Wasabi bill binary GB (GiB); other providers are modeled in decimal GB.",
    "Rates are US East (AWS) or default-region list prices. Other regions, acceleration, replication, and CDN usage vary.",
    "Minimum storage durations, minimum billable object sizes, retrieval fees, replication, CDN, support, and tax are not priced. See each provider's caution."
  ],
  "scenarioUrl": {
    "template": "https://storage.so/?storage={storageGb}&egress={egressGb}&writes={writeMillions}&reads={readMillions}#calculator",
    "note": "Opens the interactive calculator with these inputs. Results render in the browser; without JavaScript the page shows the default scenario, so compute from this document instead."
  },
  "links": {
    "llms": "https://storage.so/llms.txt",
    "json": "https://storage.so/pricing.json",
    "markdown": "https://storage.so/pricing.md",
    "calculator": "https://storage.so/#calculator",
    "agentsGuide": "https://storage.so/agents",
    "corrections": "mailto:hello@storage.so?subject=Pricing%20correction"
  },
  "providers": [
    {
      "id": "cloudflare-r2",
      "name": "Cloudflare R2",
      "managed": true,
      "recommendable": true,
      "pricingModel": "metered",
      "region": "Automatic placement; location hints",
      "bestFor": "Video, public assets, AI datasets",
      "summary": "The cleanest fit for public assets and download-heavy applications.",
      "caution": "Operation fees can dominate workloads with millions of tiny-object reads.",
      "published": {
        "storage": "$0.015 / GB",
        "egress": "Free",
        "requests": "$4.50 write · $0.36 read / M",
        "minimum": "None"
      },
      "rates": {
        "storagePerGbUsd": 0.015,
        "egressPerGbUsd": 0,
        "writePerMillionUsd": 4.5,
        "readPerMillionUsd": 0.36,
        "freeStorageGb": 10,
        "freeWriteMillions": 1,
        "freeReadMillions": 10,
        "roundsBillingUnits": true
      },
      "limits": [],
      "source": {
        "url": "https://developers.cloudflare.com/r2/pricing/",
        "label": "Cloudflare R2 pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "backblaze-b2",
      "name": "Backblaze B2",
      "managed": true,
      "recommendable": true,
      "pricingModel": "metered",
      "region": "US + EU regions",
      "bestFor": "Backups, media archives, NAS",
      "summary": "Low hot-storage price with a generous, but finite, egress allowance.",
      "caution": "Traffic above three times average monthly storage is billed at $0.01/GB.",
      "published": {
        "storage": "$0.00695 / GB",
        "egress": "3× storage free; then $0.01 / GB",
        "requests": "Core S3 calls free",
        "minimum": "None"
      },
      "rates": {
        "storagePerGbUsd": 0.00695,
        "egressPerGbUsd": 0.01,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0,
        "freeStorageGb": 10,
        "egressAllowanceMultiplier": 3
      },
      "limits": [],
      "source": {
        "url": "https://www.backblaze.com/cloud-storage/pricing",
        "label": "Backblaze B2 pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "wasabi",
      "name": "Wasabi",
      "managed": true,
      "recommendable": true,
      "pricingModel": "flat",
      "region": "North America, EMEA, APAC",
      "bestFor": "Immutable backups, media masters",
      "summary": "Simple capacity pricing for stable backup sets that rarely churn.",
      "caution": "One-TiB account minimum and 90-day minimum storage duration on Pay-Go. Wasabi bills binary GB (GiB).",
      "published": {
        "storage": "$7.99 / TiB",
        "egress": "Free within 1× fair-use policy",
        "requests": "Free",
        "minimum": "$7.99 / month"
      },
      "rates": {
        "storagePerGbUsd": 0.007802734375,
        "billingUnit": "binary",
        "egressPerGbUsd": 0,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0,
        "egressAllowanceMultiplier": 1,
        "minimumMonthlyUsd": 7.99,
        "fairUseOnly": true
      },
      "limits": [
        {
          "code": "egress-fair-use",
          "rule": "egressGb must not exceed storageGb × multiplier",
          "multiplier": 1
        }
      ],
      "source": {
        "url": "https://wasabi.com/pricing/faq",
        "label": "Wasabi Pay-Go pricing FAQ",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "hetzner-object-storage",
      "name": "Hetzner Object Storage",
      "managed": true,
      "recommendable": true,
      "pricingModel": "bundle",
      "region": "Germany + Finland",
      "bestFor": "EU workloads, backups, private assets",
      "summary": "A European bundle with storage and traffic included in one base price.",
      "caution": "The account-wide base charge applies whenever at least one bucket is active. Objects under 64 kB are billed as 64 kB.",
      "published": {
        "storage": "$7.99 includes 1 TB; then $8.86 / TB",
        "egress": "1 TB included; then $1.20 / TB",
        "requests": "Free",
        "minimum": "$7.99 while a bucket exists"
      },
      "rates": {
        "storagePerGbUsd": 0.00886,
        "egressPerGbUsd": 0.0012,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0,
        "minimumMonthlyUsd": 7.99,
        "includedStorageGb": 1000,
        "includedEgressGb": 1000
      },
      "limits": [],
      "source": {
        "url": "https://www.hetzner.com/storage/object-storage/",
        "label": "Hetzner Object Storage pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "scaleway",
      "name": "Scaleway Multi-AZ",
      "managed": true,
      "recommendable": true,
      "pricingModel": "metered",
      "region": "Paris, Amsterdam, Warsaw",
      "bestFor": "Sovereign EU apps, multi-AZ data",
      "summary": "European multi-AZ storage with no request line item and clear data residency.",
      "caution": "Euro prices are converted at €1 = $1.15 for calculator ranking; tax excluded.",
      "published": {
        "storage": "€0.01606 / GB",
        "egress": "75 GB free; then €0.01 / GB",
        "requests": "Free",
        "minimum": "None"
      },
      "rates": {
        "storagePerGbUsd": 0.018469,
        "egressPerGbUsd": 0.0115,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0,
        "freeEgressGb": 75
      },
      "limits": [],
      "source": {
        "url": "https://www.scaleway.com/en/pricing/storage/#object-storage",
        "label": "Scaleway storage pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "idrive-e2",
      "name": "IDrive e2",
      "managed": true,
      "recommendable": true,
      "pricingModel": "flat",
      "region": "Global regions",
      "bestFor": "Backup software, migrations, archives",
      "summary": "Budget-friendly capacity with free API calls and a broad egress allowance.",
      "caution": "Pay-as-you-go bills a full one-terabyte minimum even when less is stored.",
      "published": {
        "storage": "$0.006 / GB",
        "egress": "3× storage free; then $0.01 / GB",
        "requests": "Free",
        "minimum": "$6 / month"
      },
      "rates": {
        "storagePerGbUsd": 0.006,
        "egressPerGbUsd": 0.01,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0,
        "egressAllowanceMultiplier": 3,
        "minimumMonthlyUsd": 6
      },
      "limits": [],
      "source": {
        "url": "https://www.idrive.com/s3-storage-e2/pricing",
        "label": "IDrive e2 pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "aws-s3",
      "name": "AWS S3 Standard",
      "managed": true,
      "recommendable": true,
      "pricingModel": "metered",
      "region": "US East baseline; many regions",
      "bestFor": "AWS-native apps, global enterprise",
      "summary": "The compatibility baseline and ecosystem leader, but not the low-cost option.",
      "caution": "US East rates with published volume tiers. AWS bills binary units (1 GB = 2^30 bytes), so a decimal terabyte is billed as 931 GB. Other regions, acceleration, replication, and CDN usage vary.",
      "published": {
        "storage": "$0.023 / GB, less above 50 TB",
        "egress": "100 GB free; then $0.09 to $0.05 / GB",
        "requests": "$5 write · $0.40 read / M",
        "minimum": "None"
      },
      "rates": {
        "storagePerGbUsd": 0.023,
        "egressPerGbUsd": 0.09,
        "writePerMillionUsd": 5,
        "readPerMillionUsd": 0.4,
        "freeEgressGb": 100,
        "billingUnit": "binary",
        "storageTiers": [
          {
            "untilGb": 51200,
            "perGbUsd": 0.023
          },
          {
            "untilGb": 512000,
            "perGbUsd": 0.022
          },
          {
            "perGbUsd": 0.021
          }
        ],
        "egressTiers": [
          {
            "untilGb": 10240,
            "perGbUsd": 0.09
          },
          {
            "untilGb": 51200,
            "perGbUsd": 0.085
          },
          {
            "untilGb": 153600,
            "perGbUsd": 0.07
          },
          {
            "perGbUsd": 0.05
          }
        ]
      },
      "limits": [],
      "source": {
        "url": "https://aws.amazon.com/s3/pricing/",
        "label": "Amazon S3 pricing",
        "verified": "2026-10-08"
      }
    },
    {
      "id": "minio-hetzner",
      "name": "MinIO on Hetzner",
      "managed": false,
      "recommendable": false,
      "pricingModel": "self-hosted",
      "region": "Single Hetzner EU data center",
      "bestFor": "Large self-managed archives",
      "summary": "The raw-cost floor: excellent unit economics, with operations and resilience on you.",
      "caution": "SX65-2 price baseline; assumes four 22 TB drives and two-drive parity (44,000 decimal GB before filesystem overhead). Confirm hardware configuration and availability. Labor, backups, HA, IPv4, and setup excluded.",
      "published": {
        "storage": "$92.10 for ~44 TB usable",
        "egress": "Unlimited on 1 Gbit/s uplink",
        "requests": "No metered API fee",
        "minimum": "$92.10 / month + setup"
      },
      "rates": {
        "fixedMonthlyUsd": 92.1,
        "capacityGb": 44000,
        "uplinkGbps": 1,
        "egressPerGbUsd": 0,
        "writePerMillionUsd": 0,
        "readPerMillionUsd": 0
      },
      "limits": [
        {
          "code": "capacity",
          "rule": "storageGb must not exceed limitGb",
          "limitGb": 44000
        },
        {
          "code": "uplink",
          "rule": "egressGb must not exceed limitGb (one 730-hour month at full line rate)",
          "limitGb": 328500,
          "uplinkGbps": 1
        }
      ],
      "source": {
        "url": "https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/",
        "label": "Hetzner June 2026 price list",
        "verified": "2026-10-08"
      }
    }
  ],
  "examples": [
    {
      "id": "archive",
      "label": "Active archive",
      "input": {
        "storageGb": 10000,
        "egressGb": 100,
        "writeMillions": 0.5,
        "readMillions": 1
      },
      "calculatorUrl": "https://storage.so/?storage=10000&egress=100&writes=0.5&reads=1#calculator",
      "recommendedProviderId": "idrive-e2",
      "ranked": [
        {
          "providerId": "idrive-e2",
          "totalUsd": 60,
          "storageUsd": 60,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "backblaze-b2",
          "totalUsd": 69.43,
          "storageUsd": 69.43,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "wasabi",
          "totalUsd": 72.67,
          "storageUsd": 72.67,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "hetzner-object-storage",
          "totalUsd": 87.73,
          "storageUsd": 87.73,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "cloudflare-r2",
          "totalUsd": 149.85,
          "storageUsd": 149.85,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "scaleway",
          "totalUsd": 184.98,
          "storageUsd": 184.69,
          "egressUsd": 0.29,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "aws-s3",
          "totalUsd": 217.1,
          "storageUsd": 214.2,
          "egressUsd": 0,
          "requestsUsd": 2.9,
          "suitable": true,
          "issues": [],
          "notes": []
        }
      ],
      "selfHostedBaseline": [
        {
          "providerId": "minio-hetzner",
          "totalUsd": 92.1,
          "storageUsd": 92.1,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": [
            "Hardware estimate only; operator time and high availability are not priced."
          ]
        }
      ]
    },
    {
      "id": "backup",
      "label": "Backup and DR",
      "input": {
        "storageGb": 5000,
        "egressGb": 500,
        "writeMillions": 2,
        "readMillions": 1
      },
      "calculatorUrl": "https://storage.so/?storage=5000&egress=500&writes=2&reads=1#calculator",
      "recommendedProviderId": "idrive-e2",
      "ranked": [
        {
          "providerId": "idrive-e2",
          "totalUsd": 30,
          "storageUsd": 30,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "backblaze-b2",
          "totalUsd": 34.68,
          "storageUsd": 34.68,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "wasabi",
          "totalUsd": 36.33,
          "storageUsd": 36.33,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "hetzner-object-storage",
          "totalUsd": 43.43,
          "storageUsd": 43.43,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "cloudflare-r2",
          "totalUsd": 79.35,
          "storageUsd": 74.85,
          "egressUsd": 0,
          "requestsUsd": 4.5,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "scaleway",
          "totalUsd": 97.23,
          "storageUsd": 92.35,
          "egressUsd": 4.89,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "aws-s3",
          "totalUsd": 150.41,
          "storageUsd": 107.1,
          "egressUsd": 32.91,
          "requestsUsd": 10.4,
          "suitable": true,
          "issues": [],
          "notes": []
        }
      ],
      "selfHostedBaseline": [
        {
          "providerId": "minio-hetzner",
          "totalUsd": 92.1,
          "storageUsd": 92.1,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": [
            "Hardware estimate only; operator time and high availability are not priced."
          ]
        }
      ]
    },
    {
      "id": "application",
      "label": "Application",
      "input": {
        "storageGb": 500,
        "egressGb": 2000,
        "writeMillions": 1,
        "readMillions": 10
      },
      "calculatorUrl": "https://storage.so/?storage=500&egress=2000&writes=1&reads=10#calculator",
      "recommendedProviderId": "cloudflare-r2",
      "ranked": [
        {
          "providerId": "cloudflare-r2",
          "totalUsd": 7.35,
          "storageUsd": 7.35,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "backblaze-b2",
          "totalUsd": 8.41,
          "storageUsd": 3.41,
          "egressUsd": 5,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "hetzner-object-storage",
          "totalUsd": 9.19,
          "storageUsd": 7.99,
          "egressUsd": 1.2,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "idrive-e2",
          "totalUsd": 11,
          "storageUsd": 6,
          "egressUsd": 5,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "scaleway",
          "totalUsd": 31.37,
          "storageUsd": 9.23,
          "egressUsd": 22.14,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "aws-s3",
          "totalUsd": 178.35,
          "storageUsd": 10.71,
          "egressUsd": 158.64,
          "requestsUsd": 9,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "wasabi",
          "totalUsd": 7.99,
          "storageUsd": 7.99,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": false,
          "issues": [
            {
              "code": "egress-fair-use",
              "message": "Outside the published 1× egress fair-use guideline.",
              "limitGb": 465.6612873077392,
              "actualGb": 1862.6451492309568
            }
          ],
          "notes": []
        }
      ],
      "selfHostedBaseline": [
        {
          "providerId": "minio-hetzner",
          "totalUsd": 92.1,
          "storageUsd": 92.1,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": [
            "Hardware estimate only; operator time and high availability are not priced."
          ]
        }
      ]
    },
    {
      "id": "media",
      "label": "Media delivery",
      "input": {
        "storageGb": 2000,
        "egressGb": 20000,
        "writeMillions": 1,
        "readMillions": 50
      },
      "calculatorUrl": "https://storage.so/?storage=2000&egress=20000&writes=1&reads=50#calculator",
      "recommendedProviderId": "hetzner-object-storage",
      "ranked": [
        {
          "providerId": "hetzner-object-storage",
          "totalUsd": 39.65,
          "storageUsd": 16.85,
          "egressUsd": 22.8,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "cloudflare-r2",
          "totalUsd": 44.25,
          "storageUsd": 29.85,
          "egressUsd": 0,
          "requestsUsd": 14.4,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "idrive-e2",
          "totalUsd": 152,
          "storageUsd": 12,
          "egressUsd": 140,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "backblaze-b2",
          "totalUsd": 153.83,
          "storageUsd": 13.83,
          "egressUsd": 140,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "scaleway",
          "totalUsd": 266.08,
          "storageUsd": 36.94,
          "egressUsd": 229.14,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "aws-s3",
          "totalUsd": 1693.79,
          "storageUsd": 42.84,
          "egressUsd": 1625.95,
          "requestsUsd": 25,
          "suitable": true,
          "issues": [],
          "notes": []
        },
        {
          "providerId": "wasabi",
          "totalUsd": 14.53,
          "storageUsd": 14.53,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": false,
          "issues": [
            {
              "code": "egress-fair-use",
              "message": "Outside the published 1× egress fair-use guideline.",
              "limitGb": 1862.6451492309568,
              "actualGb": 18626.45149230957
            }
          ],
          "notes": []
        }
      ],
      "selfHostedBaseline": [
        {
          "providerId": "minio-hetzner",
          "totalUsd": 92.1,
          "storageUsd": 92.1,
          "egressUsd": 0,
          "requestsUsd": 0,
          "suitable": true,
          "issues": [],
          "notes": [
            "Hardware estimate only; operator time and high availability are not priced."
          ]
        }
      ]
    }
  ]
}
