Products · Developer platform

R2

Store large amounts of unstructured data without egress fees

Pricing and limits

Pricing

as of Nov 3, 2026

As of Nov 3, 2026, from Cloudflare's docs, last updated there Oct 30, 2026. Licensed CC BY 4.0; navigation removed.

R2 charges based on the total volume of data stored, along with two classes of operations on that data:

  1. Class A operations which are more expensive and tend to mutate state.
  2. Class B operations which tend to read existing state.

For the Infrequent Access storage class, data retrieval fees apply. There are no charges for egress bandwidth for any storage class.

All included usage is on a monthly basis.

Note

To learn about potential cost savings from using R2, refer to the R2 pricing calculator ↗︎.

R2 pricing

Standard storage Infrequent Access storage
Storage $0.015 / GB-month $0.01 / GB-month
Class A Operations $4.50 / million requests $9.00 / million requests
Class B Operations $0.36 / million requests $0.90 / million requests
Data Retrieval (processing) None $0.01 / GB
Egress (data transfer to Internet) Free 1 Free 1
Buckets per account First 100,000 included + $0.10 per additional bucket per month First 100,000 included + $0.10 per additional bucket per month

The bucket allowance is shared across all storage classes and applies regardless of your Workers plan. Refer to R2 limits for bucket creation limits and how to request a limit increase.

Billable unit rounding

Cloudflare rounds up your usage to the next billing unit.

For example:

  • If you have performed one million and one operations, you will be billed for two million operations.
  • If you have used 1.1 GB-month, you will be billed for 2 GB-month.
  • If you have retrieved data (for infrequent access storage) for 1.1 GB, you will be billed for 2 GB.

Free tier

You can use the following amount of storage and operations each month for free.

Free
Storage 10 GB-month / month
Class A Operations 1 million requests / month
Class B Operations 10 million requests / month
Egress (data transfer to Internet) Free 1

Caution

The free tier only applies to Standard storage, and does not apply to Infrequent Access storage.

Storage usage

Storage is billed using gigabyte-month (GB-month) as the billing metric. A GB-month is calculated by averaging the peak storage per day over a billing period (30 days).

For example:

  • Storing 1 GB constantly for 30 days will be charged as 1 GB-month.
  • Storing 3 GB constantly for 30 days will be charged as 3 GB-month.
  • Storing 1 GB for 5 days, then 3 GB for the remaining 25 days will be charged as 1 GB * 5/30 month + 3 GB * 25/30 month = 2.66 GB-month

For objects stored in Infrequent Access storage, you will be charged for the object for the minimum storage duration even if the object was deleted or moved before the duration specified.

Class A operations

Class A Operations include ListBuckets, PutBucket, ListObjects, PutObject, CopyObject, CompleteMultipartUpload, CreateMultipartUpload, LifecycleStorageTierTransition, ListMultipartUploads, UploadPart, UploadPartCopy, ListParts, PutBucketEncryption, PutBucketCors and PutBucketLifecycleConfiguration.

Class B operations

Class B Operations include HeadBucket, HeadObject, GetObject, UsageSummary, GetBucketEncryption, GetBucketLocation, GetBucketCors and GetBucketLifecycleConfiguration.

Free operations

Free operations include DeleteObject, DeleteBucket and AbortMultipartUpload.

Data retrieval

Data retrieval fees apply when you access or retrieve data from the Infrequent Access storage class. This includes any time objects are read or copied.

Minimum storage duration

For objects stored in Infrequent Access storage, you will be charged for the object for the minimum storage duration even if the object was deleted, moved, or replaced before the specified duration.

Storage class Minimum storage duration
Standard storage None
Infrequent Access storage 30 days

Basin Catalog pricing

Basin Catalog charges for catalog operations and compaction data processed, in addition to standard R2 storage and operations. For full details, refer to Basin Catalog pricing.

Data migration pricing

Super Slurper

Super Slurper is free to use. You are only charged for the Class A operations that Super Slurper makes to your R2 bucket. Objects with sizes < 100MiB are uploaded to R2 in a single Class A operation. Larger objects use multipart uploads to increase transfer success rates and will perform multiple Class A operations. Note that your source bucket might incur additional charges as Super Slurper copies objects over to R2.

Once migration completes, you are charged for storage & Class A/B operations as described in previous sections.

Sippy

Sippy is free to use. You are only charged for the operations Sippy makes to your R2 bucket. If a requested object is not present in R2, Sippy will copy it over from your source bucket. Objects with sizes < 200MiB are uploaded to R2 in a single Class A operation. Larger objects use multipart uploads to increase transfer success rates, and will perform multiple Class A operations. Note that your source bucket might incur additional charges as Sippy copies objects over to R2.

As objects are migrated to R2, they are served from R2, and you are charged for storage & Class A/B operations as described in previous sections.

Pricing calculator

To learn about potential cost savings from using R2, refer to the R2 pricing calculator ↗︎.

R2 billing examples

Standard storage example

If a user writes 1,000 objects in R2 Standard storage for 1 month with an average size of 1 GB and reads each object 1,000 times during the month, the estimated cost for the month would be:

Usage Free Tier Billable Quantity Price
Storage (1,000 objects) * (1 GB per object) = 1,000 GB-months 10 GB-months 990 GB-months $14.85
Class A Operations (1,000 objects) * (1 write per object) = 1,000 writes 1 million 0 $0.00
Class B Operations (1,000 objects) * (1,000 reads per object) = 1 million reads 10 million 0 $0.00
Data retrieval (processing) (1,000 objects) * (1 GB per object) = 1,000 GB NA None $0.00
TOTAL $14.85

Infrequent access example

If a user writes 1,000 objects in R2 Infrequent Access storage with an average size of 1 GB, stores them for 5 days, and then deletes them (delete operations are free), and during those 5 days each object is read 1,000 times, the estimated cost for the month would be:

Usage Free Tier Billable Quantity Price
Storage (1,000 objects) * (1 GB per object) = 1,000 GB-months NA 1,000 GB-months $10.00
Class A Operations (1,000 objects) * (1 write per object) = 1,000 writes NA 1,000 $9.00
Class B Operations (1,000 objects) * (1,000 reads per object) = 1 million reads NA 1 million $0.90
Data retrieval (processing) (1,000 objects) * (1 GB per object) = 1,000 GB NA 1,000 GB $10.00
TOTAL $29.90

Note that the minimal storage duration for infrequent access storage is 30 days, which means the billable quantity is 1,000 GB-months, rather than 167 GB-months.

Asset hosting

If a user writes 100,000 files with an average size of 100 KB object and reads 10,000,000 objects per day, the estimated cost in a month would be:

Usage Free Tier Billable Quantity Price
Storage (100,000 objects) * (100KB per object) 10 GB-months 0 GB-months $0.00
Class A Operations (100,000 writes) 1 million 0 $0.00
Class B Operations (10,000,000 reads per day) * (30 days) 10 million 290,000,000 $104.40
TOTAL $104.40

Cloudflare billing policy

To learn more about how usage is billed, refer to Cloudflare Billing Policy.

Frequently asked questions

Will I be charged for failed requests to my R2 bucket?

Requests that fail during authentication or authorization are not charged. This includes:

  • HTTP 401 ( Unauthorized) — missing or invalid credentials.
  • HTTP 403 when caused by an authentication failure such as SignatureDoesNotMatch, ExpiredRequest, or RequestTimeTooSkewed.
  • HTTP 403 ( AccessDenied) when valid credentials do not have permission to perform the operation.

Some requests that pass authentication and authorization but fail for other reasons are counted and billed according to the operation's class. For example:

  • A PutObject returning HTTP 412 ( PreconditionFailed) due to a conditional header like If-None-Match counts as a Class A operation.
  • A PutObject returning HTTP 400 ( BadDigest) due to a mismatched Content-MD5 counts as a Class A operation.

Footnotes

  1. Egressing directly from R2, including via the Workers API, S3 API, and r2.dev domains does not incur data transfer (egress) charges and is free. If you connect other metered services to an R2 bucket, you may be charged by those services. ↩ ↩2 ↩3

Limits

as of Nov 3, 2026

As of Nov 3, 2026, from Cloudflare's docs, last updated there Oct 30, 2026. Licensed CC BY 4.0; navigation removed.

Feature Limit
Data storage per bucket Unlimited
Number of objects per bucket Unlimited
Maximum number of buckets per account Unlimited, with a default limit of 100,000. Each bucket above 100,000 costs $0.10 per month.
Maximum rate of bucket management operations per bucket 1 50 per second
Number of custom domains per bucket 100
Object key length 1,024 bytes
Object metadata size 8,192 bytes
Object size 5 TiB per object 2
Maximum upload size 3 5 GiB (single-part) / 4.995 TiB (multi-part) 4
Maximum upload parts 10,000
Maximum concurrent writes to the same object name (key) 1 per second 5

Limits specified in MiB (mebibyte), GiB (gibibyte), or TiB (tebibyte) are storage units of measurement based on base-2. 1 GiB (gibibyte) is equivalent to 230 bytes (or 10243 bytes). This is distinct from 1 GB (gigabyte), which is 109 bytes (or 10003 bytes).

Need a higher limit?

To request an adjustment to a limit, complete the Limit Increase Request Form ↗︎. If the limit can be increased, Cloudflare will contact you with next steps.

Rate limiting on managed public buckets through r2.dev

Managed public bucket access through an r2.dev subdomain is not intended for production usage and has a variable rate limit applied to it. The r2.dev endpoint for your bucket is designed to enable testing.

  • If you exceed the rate limit (hundreds of requests/second), requests to your r2.dev endpoint will be temporarily throttled and you will receive a 429 Too Many Requests response.
  • Bandwidth (throughput) may also be throttled when using the r2.dev endpoint.

For production use cases, connect a custom domain to your bucket. Custom domains allow you to serve content from a domain you control (for example, assets.example.com), configure fine-grained caching, set up redirect and rewrite rules, mutate content via Cloudflare Workers, and get detailed URL-level analytics for content served from your R2 bucket.

Cloudflare REST API

The Cloudflare REST API is rate limited to 1,200 requests per five minutes across all R2 REST API operations on your account.

For high-throughput object operations, use the S3-compatible API or Workers API instead. The Cloudflare REST API is best suited for lower-volume management and configuration operations.

Footnotes

  1. Bucket management operations include creating, deleting, listing, and configuring buckets. This limit does not apply to reading or writing objects to a bucket. ↩
  2. The object size limit is 5 GiB less than 5 TiB, so 4.995 TiB. ↩
  3. Max upload size applies to uploading a file via one request, uploading a part of a multipart upload, or copying into a part of a multipart upload. If you have a Worker, its inbound request size is constrained by Workers request limits. The max upload size limit does not apply to subrequests. ↩
  4. The max upload size is 5 MiB less than 5 GiB, so 4.995 GiB. ↩
  5. Concurrent writes to the same object name (key) at a higher rate return HTTP 429 (rate limited) responses. ↩

Timeline

32 entries since February 2024.

October 2026

September 2026

  • R2 bandwidth usage metrics

    New R2 product-level Metrics page in the Cloudflare dashboard shows bandwidth usage. You can view usage across all buckets or per bucket. Go to R2 Metrics ↗ Bandwidth throughput is split by object upload and download. The GraphQL Analytics API exposes the same bandwidth usage metrics that power the dashboard for your queries and analytics. For more information, refer to R2 metrics and analytics.

  • R2 Data Catalog adds table maintenance visibility and manual queueing

    R2 Data Catalog now provides table-level maintenance visibility and manual compaction queueing in the Cloudflare dashboard. These updates make it easier to understand when maintenance is eligible to run, inspect completed operations, and request maintenance without leaving the table view. To view table maintenance details: In the Cloudflare dashboard, go to R2 Data Catalog. Select a catalog, then…

  • R2 Data Access Logs

    R2 Data Access Logs are now generally available. Turn on logging for a bucket to record object read, write, list, multipart upload, and delete operations with response status codes below 400. Data Access Logs cover requests made through the S3-compatible API, Cloudflare API and dashboard, Workers bindings, and public buckets through r2.dev or custom domains. Events are available in Workers Observ…

August 2026

  • New `us` jurisdiction for R2

    R2 now supports a us jurisdiction, which guarantees that bucket data is stored and processed within the United States. Use this jurisdiction when you need explicit US data residency guarantees. Use the jurisdiction-specific S3 endpoint to create and access buckets in the us jurisdiction: https://<ACCOUNT_ID>.us.r2.cloudflarestorage.com To access a bucket in the us jurisdiction from Workers, set j…

  • Billing is now enabled for R2 Data Catalog

    Billing is now enabled for R2 Data Catalog on non-enterprise accounts. R2 Data Catalog usage beyond the included free tier will appear on your next invoice. R2 Data Catalog charges based on two dimensions, in addition to standard R2 storage and operations: Catalog operations: $9.00 / million operations for metadata requests such as creating tables, reading table metadata, and updating table prope…

July 2026

  • Sippy now supports Azure Blob Storage and S3-compatible storage providers

    Sippy can now incrementally migrate data from Azure Blob Storage and any S3-compatible object storage provider to Cloudflare R2, in addition to Amazon S3 and Google Cloud Storage. Sippy copies objects to R2 as your application requests them, so you can start serving data from R2 without first moving your entire dataset or paying migration-specific egress fees. Enable Sippy Run the following comma…

  • R2 Data Catalog now supports read-only API tokens

    R2 Data Catalog now accepts read-only API tokens, so query engines and clients that only read data no longer need a read-write token. Previously, every catalog operation required an Admin Read & Write token, which granted read-only clients more access than they needed. You can now authenticate your Iceberg engine based on your workload: Read-only operations (such as listing namespaces, loading ta…

  • R2 Data Catalog warns before you delete data manually

    R2 Data Catalog is a managed Apache Iceberg ↗︎ catalog built directly into your R2 bucket. Iceberg tracks your data through a tree of metadata files, so every insert, update, and delete must go through a catalog transaction. Manually adding, modifying, or deleting objects outside the catalog can leave pointers referencing files that no longer exist, corrupting the table into an inconsistent state…

June 2026

  • Billable usage and budget alerts now in product sidebars

    Pay-as-you-go customers can now view billable usage and create budget alerts directly from the product overview pages for Workers & Pages, D1, R2, Workers KV, Queues, Vectorize, Durable Objects, and Containers. A new sidebar widget shows current-period spend and the billing cycle date range, alongside a button to create a budget alert. The widget pulls from the same data as the Billable Usage das…

May 2026

  • R2 Data Catalog pricing announced

    R2 Data Catalog is a managed Apache Iceberg ↗︎ data catalog built directly into R2 buckets, queryable by any Iceberg-compatible engine such as Spark, Snowflake, and DuckDB. R2 Data Catalog now has published pricing for catalog operations and table compaction, in addition to standard R2 storage and operations. Billing is not yet enabled. We will provide at least 30 days notice before we start char…

  • R2 Data Catalog gets a dedicated dashboard experience

    R2 Data Catalog is a managed Apache Iceberg ↗︎ data catalog built directly into your R2 bucket. It exposes a standard Iceberg REST catalog interface so you can connect query engines like Spark, Snowflake, DuckDB, and R2 SQL to your data in R2. R2 Data Catalog now has a dedicated section in the Cloudflare dashboard, replacing the previous settings panel embedded in R2 bucket configuration. The new…

  • R2 Data Catalog now exposes metrics via the GraphQL Analytics API

    R2 Data Catalog is a managed Apache Iceberg data catalog built directly into your R2 bucket that allows you to connect query engines like R2 SQL, Spark, Snowflake, and DuckDB to your data in R2. You can now query analytics for your R2 Data Catalog warehouses via Cloudflare's GraphQL Analytics API. Two new datasets are available: r2CatalogDataOperationsAdaptiveGroups tracks Iceberg REST API reques…

April 2026

  • Empty buckets and delete folders from the R2 dashboard

    You can now empty an entire R2 bucket or delete folders directly from the dashboard. Emptying a bucket is required before you can delete it. Previously, this required scripting or configuring lifecycle rules. Now, the dashboard can handle it in a single action. Empty a bucket Go to your bucket's Settings tab and select Empty under the Empty Bucket section. This deletes all objects in the bucket w…

  • R2 Data Catalog snapshot expiration now removes unreferenced data files

    R2 Data Catalog, a managed Apache Iceberg ↗︎ catalog built into R2, now removes unreferenced data files during automatic snapshot expiration. This improvement reduces storage costs and eliminates the need to run manual maintenance jobs to reclaim space from deleted data. Previously, snapshot expiration only cleaned up Iceberg metadata files such as manifests and manifest lists. Data files that we…

February 2026

  • Backup and restore API for Sandbox SDK

    Sandboxes now support createBackup() and restoreBackup() methods for creating and restoring point-in-time snapshots of directories. This allows you to restore environments quickly. For instance, in order to develop in a sandbox, you may need to include a user's codebase and run a build step. Unfortunately git clone and npm install can take minutes, and you don't want to run these steps every time…

  • Improve Global Upload Performance with R2 Local Uploads - Now in Open Beta

    Local Uploads is now available in open beta. Enable it on your R2 bucket to improve upload performance when clients upload data from a different region than your bucket. With Local Uploads enabled, object data is written to storage infrastructure near the client, then asynchronously replicated to your bucket. The object is immediately accessible and remains strongly consistent throughout. Refer t…

December 2025

  • R2 Data Catalog now supports automatic snapshot expiration

    R2 Data Catalog now supports automatic snapshot expiration for Apache Iceberg tables. In Apache Iceberg, a snapshot is metadata that represents the state of a table at a given point in time. Every mutation creates a new snapshot which enable powerful features like time travel queries and rollback capabilities but will accumulate over time. Without regular cleanup, these accumulated snapshots can…

November 2025

  • Mount R2 buckets in Containers

    Containers now support mounting R2 buckets as FUSE (Filesystem in Userspace) volumes, allowing applications to interact with R2 using standard filesystem operations. Common use cases include: Bootstrapping containers with datasets, models, or dependencies for sandboxes and agent environments Persisting user configuration or application state without managing downloads Accessing large static files…

October 2025

  • R2 Data Catalog table-level compaction

    You can now enable compaction for individual Apache Iceberg ↗︎ tables in R2 Data Catalog, giving you fine-grained control over different workloads. # Enable compaction for a specific table (no token required) npx wrangler r2 bucket catalog compaction enable <BUCKET> <NAMESPACE> <TABLE> --target-size 256 This allows you to: Apply different target file sizes per table Disable compaction for specifi…

September 2025

  • R2 Data Catalog now supports compaction

    You can now enable automatic compaction for Apache Iceberg ↗︎ tables in R2 Data Catalog to improve query performance. Compaction is the process of taking a group of small files and combining them into fewer larger files. This is an important maintenance operation as it helps ensure that query performance remains consistent by reducing the number of files that needs to be scanned. To enable automa…

May 2025

  • R2 Dashboard experience gets new updates

    We're excited to announce several improvements to the Cloudflare R2 dashboard experience that make managing your object storage easier and more intuitive: All-new settings page We've redesigned the bucket settings page, giving you a centralized location to manage all your bucket configurations in one place. Improved navigation and sharing Deeplink support for prefix directories: Navigate through…

April 2025

  • R2 Data Catalog is a managed Apache Iceberg data catalog built directly into R2 buckets

    Today, we are launching R2 Data Catalog in open beta, a managed Apache Iceberg catalog built directly into your Cloudflare R2 bucket. If you are not already familiar with it, Apache Iceberg ↗︎ is an open table format designed to handle large-scale analytics datasets stored in object storage, offering ACID transactions and schema evolution. R2 Data Catalog exposes a standard Iceberg REST catalog i…

  • Cloudflare Pipelines now available in beta

    Cloudflare Pipelines is now available in beta, to all users with a Workers Paid plan. Pipelines let you ingest high volumes of real time data, without managing the underlying infrastructure. A single pipeline can ingest up to 100 MB of data per second, via HTTP or from a Worker. Ingested data is automatically batched, written to output files, and delivered to an R2 bucket in your account. You can…

March 2025

  • Set retention polices for your R2 bucket with bucket locks

    You can now use bucket locks to set retention policies on your R2 buckets (or specific prefixes within your buckets) for a specified period — or indefinitely. This can help ensure compliance by protecting important data from accidental or malicious deletion. Locks give you a few ways to ensure your objects are retained (not deleted or overwritten). You can: Lock objects for a specific duration, f…

February 2025

  • Super Slurper now supports migrations from all S3-compatible storage providers

    Super Slurper can now migrate data from any S3-compatible object storage provider to Cloudflare R2. This includes transfers from services like MinIO, Wasabi, Backblaze B2, and DigitalOcean Spaces. For more information on Super Slurper and how to migrate data from your existing S3-compatible storage buckets to R2, refer to our documentation.

  • Super Slurper now transfers data to R2 up to 5x faster

    Super Slurper now transfers data from cloud object storage providers like AWS S3 and Google Cloud Storage to Cloudflare R2 up to 5x faster than it did before. We moved from a centralized service to a distributed system built on the Cloudflare Developer Platform — using Cloudflare Workers, Durable Objects, and Queues — to both improve performance and increase system concurrency capabilities (and w…