Skip to main content
Bunny Storage supports an S3-compatible API, allowing you to use familiar S3 tools, libraries, and workflows with your storage zones. Use existing S3 tools and scripts, leverage popular S3 libraries across all programming languages, migrate from AWS S3 with minimal code changes, and work with S3 GUI tools.
S3 compatibility is currently in public preview. Currently, S3 compatibility can only be enabled when creating a new storage zone and cannot be enabled on an existing storage zone. Support for enabling S3 compatibility on existing storage zones is currently in development.

Creating a storage zone with S3 compatibility

To create an S3-compatible storage zone:
  1. Navigate to Storage → Add Storage Zone
  2. Enter a name (minimum 4 characters, letters, numbers, and dashes only)
  3. Enable the S3 Compatibility option
  4. Select your preferred storage tier
  5. Choose your region
  6. Configure replication
  7. Confirm and Add Storage Zone

Quickstart

Once you’ve created your S3-compatible storage zone, you’re ready to connect.

Authentication and credentials

The credentials you need to connect via S3 are located in the Access tab:
  • Access Key ID: Your Storage Zone name (bucket name)
  • Secret Access Key: Your Storage Zone Password
  • Endpoint URL: https://[region]-s3.storage.bunnycdn.com
  • Region: de (Frankfurt), ny (New York), sg (Singapore), uk (London),
    se (Stockholm), la (Los angeles),jh (Johannesburg) & syd (Sydney)
Bunny Storage supports both path-style URLs (e.g., https://[region]-s3.storage.bunnycdn.com/bucket-name/key) and virtual hosted-style URLs (e.g., https://bucket-name.[region]-s3.storage.bunnycdn.com/key).

Content Type Detection

When uploading objects, Content-Type is determined in the following order:
  1. Content-Type header - If provided in the request
  2. File extension detection - Automatic detection based on file extension
  3. Default fallback - binary/octet-stream for unknown types

Checksum Validation

SHA256 checksum validation is available using the x-amz-checksum-sha256 header (Base64 encoded).

Presigned URL Validation

Presigned URLs require authentication. For publicly available presigned URLs fronted by CDN please use bunny.net CDN by adding a pullzone to your storage zone. Presigned URL example (1hour):
https://[region]-s3.storage.bunnycdn.com/bucket-name/path/to/object/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=[AccessKeyID+Date+region+servicerequest]&X-Amz-Date=20260320T160912Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=[HMAC-SHA256Signature]/
Presigned URL cache: Presigned URLs are cached and the cache validates signatures for cached objects. Currently objects up to 256 MB are cached, and only if they are accessed at least twice.

Object metadata

You can attach metadata to an object when you upload it with PutObject or CreateMultipartUpload. It is stored with the object and returned on every GetObject and HeadObject response.
  • Custom metadata: any x-amz-meta-* header. Keys are stored lowercase, as on AWS.
  • System metadata: Cache-Control, Content-Disposition, Content-Encoding, Content-Language, Expires, and x-amz-website-redirect-location.
Each set is limited to 2 KB of combined key and value bytes. A request over the limit is rejected with 400 MetadataTooLarge. CopyObject keeps the source object’s metadata by default. Send x-amz-metadata-directive: REPLACE to store the metadata from the copy request instead. The website redirect location is never copied and must be set on the copy request explicitly.
Metadata keys that contain an underscore, such as x-amz-meta-my_key, are silently dropped and the upload still succeeds. Use hyphens x-amz-meta-my-key`.
Metadata is only available over S3. CDN pull zones do not yet use stored metadata, so headers such as Cache-Control and Content-Disposition are not sent with CDN responses. Configure caching and download behavior on the CDN pull zone instead. Overwriting an object through the HTTP API, FTP, SFTP, or the dashboard clears its S3 metadata.
GetObject and HeadObject also honor the response-content-type, response-cache-control, response-content-disposition, response-content-encoding, response-content-language, and response-expires query parameters, so a presigned URL can force a download filename or cache policy.

Adding metadata to existing objects

Objects uploaded before metadata support, or through a non-S3 protocol, have no S3 metadata. To add it, copy the object onto itself with x-amz-metadata-directive: REPLACE:
REPLACE replaces all of the object’s metadata with the headers on the copy request. Include every header you want to keep, and always send Content-Type explicitly so the object keeps the correct type.

Uploading with metadata through a presigned URL

To upload with metadata through a presigned PUT URL, include the x-amz-meta-* and system metadata headers when you generate the URL with your SDK, so they become part of the signature. The client must then send exactly the same headers and values with the upload. A missing or changed header fails with 403 SignatureDoesNotMatch.

Bulk delete

DeleteObjects deletes up to 1,000 keys in a single request. Each key is reported individually in the response, so one failed key does not abort the batch. Deleting a key that does not exist counts as a success, and duplicate keys collapse to a single result entry.
  • The request must carry a Content-MD5 or x-amz-checksum-* header, as on AWS. Supported algorithms are CRC32, CRC32C, CRC64NVME, SHA1, and SHA256. The AWS CLI and SDKs add one automatically.
  • Entries with a VersionId are rejected per key, as versioning is not yet supported.
  • A folder key only removes the empty folder marker. Its contents stay in place.
  • If the request returns 503 SlowDown, retry the operation after the Retry-After interval.

Example

AWS CLI

You must use --endpoint-url https://[region]-s3.storage.bunnycdn.com with each command or set up an AWS CLI profile with the endpoint configured.

rclone

You can use rclone with Bunny Storage:

Supported S3 operations

Bunny Storage provides comprehensive S3 API compatibility for all your storage needs.

Object operations

  • PUT Object: Create and update objects
  • GET Object: Read objects (range requests supported)
  • DELETE Object: Delete a single object
  • DELETE Objects: Delete up to 1,000 objects in one request
  • COPY Object: Copy objects between locations
  • HEAD Object: Get object metadata, including custom x-amz-meta-* headers
  • PRESIGN Object: Generate object URL expiry time (Set in seconds - default 1 hour)

Directory listing

  • LIST Objects: List objects (V1 and V2)
  • List with prefix filtering
  • Paginated results
  • Directory-style navigation
  • Common prefixes support

Multipart upload operations

Bunny Storage provides full support for S3 multipart uploads, enabling efficient upload of large objects. Recommended for objects over 100MB.

S3 API compatibility matrix

Below is a detailed list of implemented object-level operations with their supported features:

Unsupported operations

The following S3 operations are not currently supported:

Limits

Be aware of the following limitations when using S3-compatible storage:
  • 500 Max RPS rate (upload & download combined)
  • 1Gbps Max bandwidth throughput

Regional availability

S3-compatible storage zones support automatic multi-region replication. All operations including uploads, deletes, and multipart uploads are automatically replicated to your configured replication regions. S3 compatibility is currently available in the following regions:
  • Frankfurt (DE)
  • New York (NY)
  • Singapore (SG)
  • London (UK)
  • Stockholm (SE)
  • Los Angeles (LA)
  • Johannesburg (JH)
  • Sydney (SYD)
Additional regions will be added in the future. Regions that do not yet support S3 have no [region]-s3 endpoint, and requests to their storage host return 501 NotImplemented.
S3 compatibility cannot be changed after storage zone creation.

Known limitations

The following S3 features are limited by:
  • ACLs: Access Control Lists are not supported
  • CORS Configuration: CORS is not configurable — the S3 endpoint always responds with Access-Control-Allow-Origin: *. To control CORS, front the storage zone with a pull zone and configure it at the CDN level for file delivery.
  • Lifecycle Policies: Automatic lifecycle transitions are not supported
  • Object Metadata: Custom metadata (x-amz-meta-*) and system metadata (Cache-Control and similar) are each limited to 2 KB. Keys containing an underscore are silently dropped. Metadata is returned only on S3 requests and is not yet used by pull zones. Metadata is cleared when the object is overwritten through a non-S3 protocol
  • Bulk Delete: Maximum 1,000 keys per DeleteObjects request. A folder key removes only the folder marker, not its contents
  • Multipart Limits: Maximum 10,000 parts per upload
  • Multipart Session Expiry: Sessions expire after 10 days
  • Object Tagging: Object and bucket tagging is not supported
  • Presigned URLs: Minimum time: 1 second | Maximum time: 7 days (604800 seconds)
  • Server-Side Encryption: SSE/SSE-C encryption is not currently supported
  • Versioning: Object versioning is not supported

Error Codes

Bunny Storage returns standard S3 error codes:
Some error codes may differ from standard AWS S3 behavior. See the notes below for Bunny-specific details.

Best Practices

  1. Use an SDK to interact with the S3 api
  2. Enable Replication for at least one additional region
  3. Implement retry logic for transient failures, honouring the Retry-After header on SlowDown responses
  4. Use multipart uploads for objects larger than 100MB
  5. Include Content-Type headers when uploading, or rely on automatic detection
  6. Handle pagination properly when listing objects or parts (max 1000 per request)
  7. Monitor multipart sessions and abort abandoned uploads to free storage
  8. Set presigned URL expiry time in seconds --expires-in 3600 = 1 hour
  9. Read-only password support use this secret access key for read-only access
Last modified on October 23, 2026