Home › Decoder › Requests-Tier1 and Requests-Tier2 - $0.005 per 1,000 PUTs and $0.0004 per 1,000 GETs

Requests-Tier1 and Requests-Tier2 - $0.005 per 1,000 PUTs and $0.0004 per 1,000 GETs

Requests-Tier1 is the S3 charge for PUT, COPY, POST and LIST requests ($0.005 per 1,000 in US East N. Virginia) and Requests-Tier2 the charge for GET and all other requests ($0.0004 per 1,000).

In your bill the usage type reads: Requests-Tier1, USE1-Requests-Tier1, Requests-Tier2, USE1-Requests-Tier2

What it costs

ChargePriceUnit
PUT, COPY, POST and LIST requests (Requests-Tier1)$0.005per 1,000 requests
GET, SELECT and all other requests (Requests-Tier2)$0.0004per 1,000 requests

US East (N. Virginia); other regions differ. Checked 2026-11-11. Sources: Amazon S3 pricing, AWS price list file, Amazon S3 offer, us-east-1.

Example with made-up numbers

300 million PUT or LIST requests and 2 billion GET requests in a month

Tier 1: 300,000 x $0.005 = $1,500.00. Tier 2: 2,000,000 x $0.0004 = $800.00

Combining small files so PUTs drop 10x saves 270,000 x $0.005 = $1,350.00; caching so GETs drop 80% leaves 400,000,000 requests = 400,000 x $0.0004 = $160.00, saving $640.00 per month

Typical causes

One object per event

A pipeline that writes a small file per message, log line or record makes millions of PUTs.

LIST as a queue

An application that lists a bucket every few seconds to find new objects.

Polling with GET or HEAD

A loop that checks whether an object changed, or a retry storm that repeats failed calls.

Lifecycle and replication on small objects

Every transition or replicated object is a request.

Find it in your bill

Have a CUR file queryable in Athena? Paste this and run it:

SELECT date_trunc('month', line_item_usage_start_date) AS month,
       line_item_product_code,
       line_item_usage_type,
       line_item_resource_id,
       SUM(line_item_usage_amount)  AS usage_amount,
       SUM(line_item_unblended_cost) AS cost
FROM your_cur_table
WHERE line_item_product_code = 'AmazonS3'
  AND (line_item_usage_type LIKE '%Requests-Tier1'
       OR line_item_usage_type LIKE '%Requests-Tier2')
GROUP BY 1, 2, 3, 4
ORDER BY month DESC, cost DESC
LIMIT 50;

Columns used: line_item_usage_start_date, line_item_product_code, line_item_usage_type, line_item_resource_id, line_item_usage_amount, line_item_unblended_cost.

No CUR file? Use Cost Explorer

  1. Open Billing and Cost Management, then Cost Explorer, and set the date range to the last 3 months with Monthly granularity.
  2. Set Group by to Usage type.
  3. In the Filters panel choose Usage type and tick the entries ending in *Requests-Tier1 or *Requests-Tier2 (the region prefix, such as USE1-, differs by region).
  4. Read the monthly cost per usage type. A line that grows faster than your traffic is the one to chase with the fix below.
  5. To see which resource drives it, query the CUR above; resource IDs appear only if your CUR was set up with resource IDs included, otherwise the resource column is empty.

Column names checked against: docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html, docs.aws.amazon.com/cur/latest/userguide/cur-ate-run.html.

The fix, step by step

Verify first

Check these before you change anything: the steps below are suggestions, and only you can see your own configuration.

  • Request metrics start counting from the moment you enable them; wait a day before reading them.
  • Batching small objects into larger ones changes how readers find the data (a Parquet file instead of a file per event); change the readers in the same release.
  • Lifecycle transitions and replication also count as requests; a rule that moves millions of small objects to another storage class costs more in requests than it saves in storage.
  • Putting CloudFront in front of S3 does not remove request charges by itself: CloudFront bills its own requests; use application caching or longer client cache headers instead.
  • The Requests lines are per Region and per bucket; look at the bucket and Region columns in your file before changing anything.

In the console

  1. S3 console > the bucket you suspect > Metrics > Bucket metrics, and check All requests, PUT and LIST request counts over the last month.
  2. To see which prefix drives it: Metrics > Request metrics > Create filter for a prefix (request metrics are billed as CloudWatch metrics; remove the filter after).
  3. Find applications that LIST often: search code and cron jobs for list-objects calls and for sync commands that run every minute.
  4. For writers: check object sizes at the prefix; thousands of objects under 1 MB per hour is the pattern to batch.
  5. Replace repeated LIST scans with S3 Inventory (bucket > Management > Inventory configurations) or an event notification.

With the CLI

aws s3api put-bucket-metrics-configuration --bucket EXAMPLE --id all-requests --metrics-configuration '{"Id":"all-requests"}'
aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name PutRequests --dimensions Name=BucketName,Value=EXAMPLE Name=FilterId,Value=all-requests --statistics Sum --period 86400 --start-time 2026-10-01T00:00:00Z --end-time 2026-11-01T00:00:00Z
aws cloudwatch get-metric-statistics --namespace AWS/S3 --metric-name ListRequests --dimensions Name=BucketName,Value=EXAMPLE Name=FilterId,Value=all-requests --statistics Sum --period 86400 --start-time 2026-10-01T00:00:00Z --end-time 2026-11-01T00:00:00Z
aws s3api delete-bucket-metrics-configuration --bucket EXAMPLE --id all-requests

Rollback

Delete the request-metrics configuration to stop that charge. Application changes roll back with the release that made them.

Find your S3 request lines in your own bill

Drop in your Cost Explorer or CUR CSV. Billtrim reads it in your browser, finds the Requests-Tier1 and Requests-Tier2 lines and shows how many requests you pay for.

See a sample result

Paste your export: how to export a Cost Explorer CSV or CUR file in two minutes.

Questions people ask

Why is a PUT so much more than a GET?

The price list charges $0.005 per 1,000 PUT, COPY, POST and LIST requests against $0.0004 per 1,000 GET requests, 12.5 times as much.

Does object size change the request price?

No. A 1 KB PUT and a 1 GB PUT cost the same per request, which is why many small objects are expensive.

Can I get the request count from my bill?

Yes: the Requests-Tier1 line cost divided by $0.005 per 1,000 is the request count, shown on the finding.

Related

Part of the guide: Reduce your AWS bill as a startup: a checklist for teams with no FinOps person