R2 Object Storage opens its doors
Cloudflare has moved its object storage service, R2, from closed beta into an open beta. The service is designed to eliminate the egress fees that developers and enterprises face when retrieving data from incumbent cloud providers. R2 is now available to self-serve customers through the Cloudflare dashboard, with enterprise accounts onboarded via their customer success manager.
The announcement comes after a six-month closed beta with design partners. Cloudflare says the response highlighted a range of use cases that were hampered by egress pricing: independent developers whose side projects were strangled by bandwidth charges, large corporations that had abandoned multi-cloud storage strategies, and non-profit research organizations that found data-sharing costs prohibitive.
Two ways in: Workers and S3
R2 exposes two distinct APIs. The in-Worker API binds a bucket directly to a Cloudflare Worker, allowing the worker to perform PUT, GET, DELETE and LIST operations. The S3-compatible API authenticates requests via SigV4 against an R2 URL. Direct public access over the internet is not yet available; routing through a Worker is currently the only way to expose R2 data publicly.
For testing the S3-compatible API, the boto3 SDK is the recommended starting point. A Python script is sufficient to connect, provided you populate the account_id, access_key and secret_access_key fields with R2 credentials.
main.py
import boto3
s3 = boto3.resource('s3',
endpoint_url = 'https://<accountid>.r2.cloudflarestorage.com',
aws_access_key_id = '<access_key_id>',
aws_secret_access_key = '<access_key_secret>'
)
print('Buckets:')
for bucket in s3.buckets.all():
print(' - ', bucket.name)
bucket = s3.Bucket('my-bucket-name')
print('Objects:')
for item in bucket.objects.all():
print(' - ', item.key)
Current feature set and limits
Both APIs support the full range of basic S3 create/read/update/delete operations. During the beta, Cloudflare is targeting sustained throughput of 1,000 GET operations per second and 100 PUT operations per second per bucket. Objects up to approximately 5 TB are supported, with individual parts capped at 5 GB.
Data access is strongly consistent: once a PUT is confirmed, subsequent GETs will reflect the new value. The one exception is bucket deletion, after which the bucket may briefly persist and continue accepting reads and writes.
Pricing: no egress, free tier included
R2 charges based on storage volume and operation type. Storage runs at $0.015 per GB per month. Class A operations, which mutate state (bucket creation, object writes, listing), cost $4.50 per million. Class B operations, which read existing state, cost $0.36 per million. Egress bandwidth is free.
A forever-free tier is also available, including 10 GB-months of storage, 1,000,000 Class A operations per month and 10,000,000 Class B operations per month. Usage resets monthly. During the open beta, any usage beyond the free tier will be billed.
What's next
Performance and regional coverage
The immediate focus is on scaling performance and reliability under live production traffic. The stated throughput ceilings (1,000 GETs and 100 PUTs per second per bucket) are expected to rise as Cloudflare gains operational confidence. Users with higher needs are encouraged to contact the team.
Currently, bucket creation does not involve a region selector. The long-term vision is global, automatic placement of objects in the region closest to the request. Today, data is primarily stored in North America, which can add latency elsewhere. The roadmap includes adding more storage regions and subsequently automatic migration of existing objects. Cloudflare also plans to offer jurisdictional restrictions, similar to what it built for Durable Objects, to support privacy compliance.
Feature expansion
Beyond the basic S3 API, the near-term roadmap includes support for TTLs for automatic data deletion, public buckets that don't require a Worker intermediary, pre-signed URLs for token-based access to individual keys, and integration with Cloudflare's cache for scaled reads and global distribution. Feature requests are being gathered via the r2-open-beta channel on the Cloudflare Developers Discord.



