# AWS S3 Pricing Explained (2026): Storage, Requests and Data Transfer Costs

> **Source:** https://upstash.com/blog/aws-s3-pricing-explained-2026
> **Date:** 2026-10-09
> **Author(s):** Josh
> **Reading time:** 19 min read
> **Tags:** blob
> **Format:** text/markdown — machine-readable content for agents and LLMs

AWS S3 pricing for 2026: storage classes, request and data transfer rates, CloudFront plans, the minimums that raise a bill, and worked examples.

---

S3 pricing might seem straightforward at first. You put files into storage, and you're charged based on the amount of space those files require. 

But then, you get your first real bill, and you see way more lines than you were expecting. You're paying for storage, sure, but you're also paying for requests, data transfer, and maybe even a few features that you enabled along the way.

AWS lists everything on their pricing page. But it's long, and it doesn't really tell you what's actually relevant to your application. In this article I want to go over how S3 pricing works in plain terms. What you pay for, where most of the money actually goes, and how to calculate your own bill. I'll also throw in how it compares to Upstash Blob at the end.

## How much does S3 cost?

S3 Standard costs $0.023/GB/month stored, $0.005/1,000 writes, $0.0004/1,000 reads, and $0.09/GB for data transfer out to the internet (after the first 100 GB/month) in the US East (N. Virginia) region. There's no minimum cost, so you don't pay anything for an empty S3 bucket. All the details are in [Amazon's S3 pricing page](https://aws.amazon.com/s3/pricing/).

As an overview:

| What S3 bills | S3 Standard rate |
| --- | --- |
| Storage | $0.023 per GB-month for the first 50 TB, $0.022 for the next 450 TB, $0.021 above 500 TB |
| Requests | $0.005 per 1,000 writes and lists, $0.0004 per 1,000 reads |
| Data transfer out | $0.09 per GB for the first 10 TB, after 100 GB free |

Note that some storage classes may also charge for data retrieval per GB read. Other features like Intelligent-Tiering monitoring, inventory reports or replication are charged separately.

![](https://cdn.bydefault.so/image-tMM1h8DkntE_2OeGNZv2V.png)

*S3 storage pricing for US East (N. Virginia), October 2026*

The region you pick changes the rate too. The same GB in S3 Standard costs:

| Region | Storage per GB-month | Writes per 1,000 |
| --- | --- | --- |
| US East (N. Virginia) | $0.023 | $0.005 |
| US West (Oregon) | $0.023 | $0.005 |
| EU (Frankfurt) | $0.0245 | $0.0054 |
| Asia Pacific (Singapore) | $0.025 | $0.005 |
| South America (São Paulo) | $0.0405 | $0.007 |

So a bucket in São Paulo would cost 76% more per GB than the same bucket in N. Virginia.

## Storage classes and what each one costs per GB

Standard is the default class, and an object stays there until you or a lifecycle rule move it. Most of the other classes charge less per GB and add a retrieval fee, a minimum storage time, or both:

| Storage class | Storage per GB-month | Retrieval per GB | Minimum duration | Good for |
| --- | --- | --- | --- | --- |
| S3 Standard | $0.023 | None | None | Files your app reads often |
| S3 Intelligent-Tiering | $0.023 down to $0.00099, by tier | None | None | Data with access patterns you can't predict |
| S3 Standard-IA (Infrequent Access) | $0.0125 | $0.01 | 30 days | Files read about once a month |
| S3 One Zone-IA | $0.01 | $0.01 | 30 days | Rarely read files you can recreate, kept in one Availability Zone |
| S3 Glacier Instant Retrieval | $0.004 | $0.03 | 90 days | Archives read about once a quarter, in milliseconds |
| S3 Glacier Flexible Retrieval | $0.0036 | $0.01 standard, free in bulk | 90 days | Archives read about once a year, restored in minutes to hours |
| S3 Glacier Deep Archive | $0.00099 | $0.02 standard, $0.0025 in bulk | 180 days | Archives read less than once a year, restored in hours |
| S3 Express One Zone | $0.11 | $0.0006, plus $0.0032 per GB uploaded | None | Single-digit millisecond access in one Availability Zone |

AWS [designed](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html) each of the above storage classes for a particular frequency of access. This ranges from about once a month for the two IA classes to once a quarter for Glacier Instant Retrieval to once a year or less for the remaining two Glacier classes.

S3 Intelligent-Tiering automatically moves objects between tiers as needed and does not charge a retrieval fee. It does, however, charge $0.0025 per 1,000 objects monitored monthly. AWS does not monitor files below 128 KB, so they are kept at the standard $0.023 price point.

The cost to store 1,000 GB for a month for the various tiers above:

![](https://cdn.bydefault.so/image-dN211QITuVhvu8lh6F7WT.png)

## The minimums that make cheap classes expensive

There are three rules to the lower-cost storage classes. These impact you when you have smaller files or short-lived ones.

- **Minimum object size:** Storage classes such as S3 Standard-IA, S3 One Zone-IA and Glacier Instant Retrieval charge you as if every object is at least 128 KB.
- **Minimum duration:** These storage classes charge you for objects as if you stored them for at least a certain length of time: 30 days for S3 Standard-IA and S3 One Zone-IA, 90 days for Glacier Instant Retrieval and Glacier Flexible Retrieval, and 180 days for Glacier Deep Archive. If you delete, overwrite, or move the object to another storage class before that length of time is up, you're charged for the remainder.
- **Archive metadata charges:** Objects that are archived to Glacier Flexible Retrieval or Glacier Deep Archive include 40 KB of metadata. S3 charges you for 8 KB of this metadata at the S3 Standard rate and 32 KB at the archive storage class rate.

Take one million thumbnails of 10 KB each, 10 GB in total. In Standard-IA, S3 bills each one as 128 KB:

```text
S3 Standard:     10 GB × $0.023                         = $0.23 a month
S3 Standard-IA:  1,000,000 × 128 KB = 128 GB × $0.0125  = $1.60 a month
```

The class with the lower rate costs about seven times more for these files.

The minimum duration behaves similarly. A 100 GB backup uploaded to Amazon S3 Glacier Instant Retrieval but replaced after 10 days will be billed for the full 90 days.

![](https://cdn.bydefault.so/drawing-KsQuDaPJvaE0XwAOcxrf-.png)

In dollars, next to the same 10 days in S3 Standard:

```text
Glacier Instant Retrieval:  100 GB × $0.004 × 3 months        = $1.20
S3 Standard, 10 days:       100 GB × $0.023 × 10 / 30 days    = $0.08
```

So Standard is cheaper if you are writing backups that rotate every few days.

## Request pricing

S3 bills almost every API call to a bucket, and in S3 Standard a write costs 12.5 times what a read costs. The rates depend on the storage class of the object:

| Storage class | Writes per 1,000 | Reads per 1,000 | Lifecycle transitions into the class per 1,000 |
| --- | --- | --- | --- |
| S3 Standard | $0.005 | $0.0004 | n/a |
| S3 Intelligent-Tiering | $0.005 | $0.0004 | $0.01 |
| S3 Standard-IA and One Zone-IA | $0.01 | $0.001 | $0.01 |
| S3 Glacier Instant Retrieval | $0.02 | $0.01 | $0.02 |
| S3 Glacier Flexible Retrieval | $0.03 | $0.0004 | $0.03 |
| S3 Glacier Deep Archive | $0.05 | $0.0004 | $0.05 |
| S3 Express One Zone | $0.00113 | $0.00003 | n/a |

A few rules determine which rate each request uses:

- PUT, COPY, and POST requests are considered write requests. GET and all other requests are considered read requests.
- A LIST request, regardless of the class, uses the write request rate for S3 Standard, i.e., $0.005 per 1,000 requests.
- DELETE and CANCEL requests are free.
- If you use the S3 console to browse the contents of your bucket, then you'll see GET and LIST requests made by the console, which are charged like API requests by S3.

Requests can cost more than storage when files are small. An app that writes 100 million log files of 5 KB each in a month ends the month with 500 GB in the bucket:

```text
Writes:   100,000,000 / 1,000 × $0.005  = $500.00
Storage:  500 GB × $0.023               = $11.50
```

Creating the logs above is 43 times more expensive than storing the whole 500GB of them for an entire month. If your application aggregates 1,000 log files into a single object prior to uploading, then the cost of writing drops to $0.50.

## Data transfer out costs $0.09 per GB

Uploads to S3 are free. Downloads to the internet are free for the first 100 GB a month, counted across all your AWS services, and after that S3 charges per GB:

| Data transferred out to the internet per month | Price per GB |
| --- | --- |
| First 100 GB | Free |
| Next 10 TB | $0.09 |
| Next 40 TB | $0.085 |
| Next 100 TB | $0.07 |
| Over 150 TB | $0.05 |

Where the bytes go matters for what you pay.

- **Free**: data coming from the internet, data transferred between buckets in the same region, data transferred to another AWS service in the same region, and data transferred out to CloudFront.
- **Paid**: data transferred out to the internet, and data transferred out to another AWS region ($0.01/GB N. Virginia to Ohio, $0.02/GB Oregon to N. Virginia).
- **Extra Paid**: S3 Transfer Acceleration ($0.04-$0.08/GB)

![](https://cdn.bydefault.so/drawing-2jFY1fump_obzfhdV8I8R.png)

Serving a file once costs almost **4 times as much** ($0.09 / $0.023 = 3.9) as storing it for a month.

An application that stores 1,000 GB and serves 1,000 GB will pay $23 for storage and $81 for data transfer (900 GB of chargeable data transfer \* $0.09).

## Serving S3 through CloudFront

S3 doesn't charge for data sent to CloudFront, AWS's content delivery network (CDN). When you use CloudFront to serve your files, you are billed for data transfer according to [CloudFront pricing](https://aws.amazon.com/cloudfront/pricing/pay-as-you-go/).

An overview:

![](https://cdn.bydefault.so/drawing-bGbZ85JCu1Rycz9BFhpLE.png)

CloudFront offers two payment options. The first option is Pay-as-you-go. With this plan, you get up to 1 TB of data transfer and 10 million requests for free each month. After that, you pay $0.085 per GB for the next 9 TB of transfer in the United States and Europe.

The [flat-rate plans](https://aws.amazon.com/cloudfront/pricing/) charge one monthly price per distribution, with no overage charges:

| Plan | Monthly price | Requests | Data transfer | S3 Standard storage credit |
| --- | --- | --- | --- | --- |
| Free | $0 | 1 million | 100 GB | 5 GB |
| Pro | $15 | 10 million | 50 TB | 50 GB |
| Business | $200 | 125 million | 50 TB | 1 TB |
| Premium | $1,000 | 500 million | 50 TB | 5 TB |

![](https://cdn.bydefault.so/image-Jn4LVxGKeClAPUhZdeEu6.png)

*CloudFront flat-rate plans, October 2026*

On the Pro plan, for $15, you get up to 50 TB of data transfer. That's 50,000 GB, which, going directly with S3, would cost $4,292.70.

The more stringent allowance is the number of requests. 10 million requests can amount to 50 TB of data transfer only when the average response size is 5 MB (50 TB / 10,000,000). An app that serves small images is going to burn through requests much faster than through data transfer.

These allowances [are not hard limits](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/flat-rate-pricing-plan.html#usage-allowance). If you consistently exceed them by far, CloudFront may decide to fulfill your traffic from fewer or more distant locations until you upgrade. An account that is using the AWS Free Tier can't subscribe to a flat-rate plan.

Note that, whichever way you go, S3 will continue charging you for storage, writes, and reads that CloudFront causes when it can't find a file in its cache and needs to go to your bucket to fetch it.

## Versioning, unfinished uploads and other extra charges

There are some more things that can increase the cost:

- **Old Versions:** With versioning on, [each version is a full object](https://docs.aws.amazon.com/AmazonS3/latest/userguide/versioning-workflows.html) and you pay the normal price for it. So if you have 3 versions of a 1 GB file, you'll be billed for 3 GB.
- **Unfinished Multipart Uploads:** If you used multipart uploads but didn't complete the upload, [all parts stay in the bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html) and use storage. You can add a lifecycle rule to abort incomplete multipart uploads after a specified number of days (e.g. 7).
- **Lifecycle Transitions:** When objects are transitioned to a cheaper storage class via lifecycle rules, you are billed for each object that is transitioned. For example, transition of 10,000,000 objects to Glacier Deep Archive will cost $500 (10,000,000 / 1,000 \* $0.05) even before you start saving money on storage.
- **Intelligent-Tiering Monitoring:** Each monitored object costs $0.0025 per 1,000 objects. For 100,000,000 objects, it would be $250 / month.
- **Reports & Analytics:** S3 Inventory ($0.0025 per million objects listed) and S3 Analytics ($0.10 per million objects monitored).

## Does S3 have a free tier?

AWS Free Tier includes [up to $200](https://aws.amazon.com/s3/pricing/) of credits that can be used towards S3 usage (for accounts created on or after July 15, 2025). The free plan lasts for up to 6 months after creating an AWS account, or until the credits are used up. Credits expire 12 months after the AWS account is created.

Additionally, some allowances are free for all AWS accounts on a monthly basis. These include 100 GB of free data transfer out of all AWS services per month, and up to 1 TB of free data transfer plus 10 million free requests per month when using the CloudFront pay-as-you-go pricing option.

## How do you calculate an S3 bill?

The way to calculate the cost would be to take each metric, multiply it by its rate and add them up. That would look like GB stored \* storage rate + requests / 1,000 \* request rate + (GB served - 100 GB) \* transfer rate. All of these rates are published by AWS as a [JSON price list](https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonS3/current/us-east-1/index.json) that doesn't require an account to access, so you can write a script to calculate these automatically on most recent prices.

Let's look at pricing an app served directly from a bucket on S3 Standard with those rates. Let's compare two apps:

- **an image app** with 200 GB stored, 2,000 GB served, 1M uploads and 40M reads per month.
- **a user uploads app** with 500 GB stored, 4,000 GB served, 5M uploads and 100M reads per month.

This script loads the S3 and data transfer price lists for US East (N. Virginia) and prices both:

```ts
const base = "https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws"

type Tier = { from: number; to: number; usd: number }
type Dimension = { beginRange: string; endRange: string; pricePerUnit: { USD: string } }
type Offer = {
  publicationDate: string
  products: Record<string, { attributes: { usagetype?: string } }>
  terms: { OnDemand: Record<string, Record<string, { priceDimensions: Record<string, Dimension> }>> }
}

async function load(service: string): Promise<Offer> {
  const response = await fetch(`${base}/${service}/current/us-east-1/index.json`)
  return (await response.json()) as Offer
}

function tiers(offer: Offer, usageType: string): Tier[] {
  const sku = Object.keys(offer.products).find((id) => offer.products[id].attributes.usagetype === usageType)
  if (!sku) throw new Error(`No price for ${usageType}`)
  return Object.values(offer.terms.OnDemand[sku])
    .flatMap((term) => Object.values(term.priceDimensions))
    .map((d) => ({ from: Number(d.beginRange), to: d.endRange === "Inf" ? Infinity : Number(d.endRange), usd: Number(d.pricePerUnit.USD) }))
    .sort((a, b) => a.from - b.from)
}

function cost(units: number, rates: Tier[]) {
  return rates.reduce((sum, tier) => sum + Math.max(0, Math.min(units, tier.to) - tier.from) * tier.usd, 0)
}

const s3 = await load("AmazonS3")
const transfer = await load("AWSDataTransfer")

const storage = tiers(s3, "TimedStorage-ByteHrs")
const writes = tiers(s3, "Requests-Tier1")
const reads = tiers(s3, "Requests-Tier2")
const egress = tiers(transfer, "DataTransfer-Out-Bytes")

function bill(name: string, use: { storedGB: number; servedGB: number; writes: number; reads: number }) {
  const lines = {
    storage: cost(use.storedGB, storage),
    egress: cost(Math.max(0, use.servedGB - 100), egress), // first 100 GB a month is free
    writes: cost(use.writes, writes),
    reads: cost(use.reads, reads),
  }
  const total = Object.values(lines).reduce((sum, usd) => sum + usd, 0)
  console.log(name)
  for (const [label, usd] of Object.entries(lines)) console.log(`  ${label.padEnd(8)} $${usd.toFixed(2)}`)
  console.log(`  ${"total".padEnd(8)} $${total.toFixed(2)}`)
}

console.log("Price list published:", s3.publicationDate.slice(0, 10))
console.log("Storage per GB:", storage.map((tier) => tier.usd).join(" / "))
console.log("Egress per GB:", egress.map((tier) => tier.usd).join(" / "))
bill("Image app", { storedGB: 200, servedGB: 2_000, writes: 1_000_000, reads: 40_000_000 })
bill("User uploads app", { storedGB: 500, servedGB: 4_000, writes: 5_000_000, reads: 100_000_000 })
```

If we run it with `npx tsx s3-bill.mts`, we get:

```text
Price list published: 2026-09-28
Storage per GB: 0.023 / 0.022 / 0.021
Egress per GB: 0.09 / 0.085 / 0.07 / 0.05
Image app
  storage  $4.60
  egress   $171.00
  writes   $5.00
  reads    $16.00
  total    $196.60
User uploads app
  storage  $11.50
  egress   $351.00
  writes   $25.00
  reads    $40.00
  total    $427.50
```

In the image app example, data transfer makes up 87% of the cost ($171 / $196.60 = 0.87):

![](https://cdn.bydefault.so/image-dp6UhTrV-kReY4XCBXOI0.png)

## S3 vs. Upstash Blob pricing

[Upstash Blob](https://upstash.com/pricing/blob) is S3-compatible object storage with one price list for every region and a CDN included. Next to S3 Standard, the rates look like this:

|  | AWS S3 Standard (N. Virginia) | Upstash Blob |
| --- | --- | --- |
| Storage per GB-month | $0.023 | $0.02 |
| Data transfer out per GB | $0.09 after 100 GB free | $0.02 after 1 TB free |
| Writes per 1 million | $5.00 | $4.50 |
| Reads per 1 million | $0.40 | $0.30 |
| Deletes | Free | Free |
| CDN | CloudFront, set up and billed separately | Included |
| Regions | The price depends on the region | One global bucket, one price |
| Free tier | Up to $200 in credits for new accounts | 1 GB storage, 10 GB transfer, 10,000 reads and 2,000 writes a month |

Here is the pricing for Upstash Blob:

![](https://cdn.bydefault.so/image-ivTSkGyeDmdtDU6GYzLwk.png)

*Upstash Blob pricing, October 2026*

The same two apps cost this much a month on Upstash Blob:

```text
Image app:         200 GB × $0.02 + 1,000 GB × $0.02 (the first 1 TB is free) + 1M × $4.50 + 40M × $0.30   = $40.50
User uploads app:  500 GB × $0.02 + 3,000 GB × $0.02 (the first 1 TB is free) + 5M × $4.50 + 100M × $0.30  = $122.50
```

And here are all three setups side by side:

| App | S3 on its own | S3 with CloudFront | Upstash Blob |
| --- | --- | --- | --- |
| Image app | $196.60 | $122.56 on pay-as-you-go, plus the reads that reach the bucket | $40.50 |
| User uploads app | $427.50 | $225.00 on the Business plan, plus the reads that reach the bucket | $122.50 |

With pay-as-you-go CloudFront, the image app pays $82.96 for the 976 GB above the free 1 TB (AWS counts 1 TB as 1,024 GB) and $30 for the 30 million requests above the free 10 million. It pays $9.60 more to S3 for storage and writes. The $15 Pro plan covers 10 million requests, only a quarter of what the app makes, so the flat-rate plan that fits is Business at $200.

![](https://cdn.bydefault.so/image-2mANbE_ulrxrRLchbk8BH.png)

The user uploads app is cheapest with that $200 Business plan, which also covers its storage. It pays $25 more to S3 for the writes. With pay-as-you-go it would cost $379.46.

![](https://cdn.bydefault.so/image-Z5WoX6HP19qyJqjrnilx0.png)

So Upstash Blob costs about 3x less than S3 with CloudFront for the image app ($122.56 / $40.50 = 3.0), and 1.8x less for the user uploads app ($225 / $122.50 = 1.8).

Next to S3 alone, it costs 4.9x and 3.5x less.

Both example apps serve many small files, which is where the rates differ most. Above the free allowance, [CloudFront costs](https://aws.amazon.com/cloudfront/pricing/pay-as-you-go/) $1.00 per million HTTPS requests and $0.085 per GB. Upstash Blob costs $0.30 per million reads and $0.02 per GB.

You also have less to set up. With AWS, you need to set up an S3 bucket in a region with the right IAM credentials, a CloudFront distribution, and decide between a pay-as-you-go model or a specific plan.

With Upstash Blob, the CDN and the [first 1 TB of data transfer](https://upstash.com/blog/upstash-blob-now-includes-1-tb-of-free-egress-every-month) are part of the simple pricing model, and you can connect to your bucket with [just a token](https://upstash.com/docs/blob/bucket/connecting). You can compare how much simpler the code is in our [detailed comparison of Amazon S3 and Upstash Blob](https://upstash.com/blog/aws-s3-vs-upstash-blob).

Amazon S3 is more appropriate for:

- **Archival storage.** Glacier Deep Archive is $0.00099 per GB, which is more than 20x less than Upstash Blob's $0.02.
- **Your technology stack is on AWS.** This is particularly relevant if you need to use the stored data in other AWS services, which offers free data transfer if they're in the same region.
- **Serving large files with a flat rate.** If you serve more than 1.75 TB per month of files and you can stay under 10 million requests, then CloudFront's $15 per month Pro plan is more cost-effective than Upstash Blob's data transfer charge ((1,750 GB - 1,000 GB) \* $0.02 = $15).

Upstash Blob is great when you want a simple pricing model, don't want to choose a region, and want a CDN included with the first 1 TB of data transfer for free. There's also the free plan that pauses your bucket when you reach its limits, so you'll never be charged.

## S3 pricing in short

- S3 Standard costs $0.023 per GB/month, $0.005 per 1k write requests, and $0.0004 per 1k read requests (US East N. Virginia).
- S3 Data transfer out costs $0/GB (first 100 GB/month) and $0.09/GB (first 10 TB/month). It's $0 for uploading data and transferring to CloudFront.
- S3 Cheaper classes range from $0.0125/GB (Standard-IA) down to $0.00099/GB (Glacier Deep Archive). These have retrieval fees, minimum storage durations (30 to 180 days) and, for three of them, a 128KB minimum size.
- S3 costs vary per region. S3 Standard costs $0.0405 per GB/month in São Paulo.
- CloudFront offers the first TB of data transfer out for free (on the pay-as-you-go model) and flat rate plans starting from $0/month and $15/month.
- New accounts get up to $200 in free credits that can be applied to Amazon S3.
- [Upstash Blob](https://upstash.com/pricing/blob) is $0.02 per GB of storage, with the first 1TB of monthly transfer for free, and a CDN included.

---

This site has a search endpoint: https://context7.com/api/v2/ask?siteKey=ask_4cf2adc7846aa874f833b068&query=<URL-encoded question>. It returns documentation that answers the question, with a source link for each part. No API key is needed. If nothing matches, it says so.