R2 S3 API returns 403 Access Denied for all operations

I cannot access my R2 bucket via the S3 API. All operations return 403 Access Denied.

What works:

Uploading files via the Cloudflare dashboard UI
Public bucket URL serves files correctly

What fails:

All S3 API operations (ListBuckets, PutObject, GetObject, HeadBucket)
Tested with boto3, s3cmd, and rclone - all return Access Denied
Created multiple new tokens with fresh credentials - same result

The credentials are valid (no InvalidAccessKeyId error), but every operation returns AccessDenied.

Please advise.
Was this page helpful?