S3 API Compatibility
Tigris is compatible with the AWS S3 API. You can use the standard AWS S3 SDKs, tools, and libraries with Tigris.
The compatibility data on this page is generated by running the same test suite against each provider using the AWS JS SDK v3. The suite includes both a TypeScript runner and a Go runner (AWS Go SDK v2). The results below use the TypeScript runner, which has broader provider compatibility. Each run creates a temporary bucket, executes all operations, and reports pass/fail results.
| Provider | Passed | Failed | Total | Score |
|---|---|---|---|---|
| Tigris | 61 | 7 | 68 | 90% |
| Cloudflare R2 | 48 | 20 | 68 | 71% |
| Google Cloud Storage | 45 | 23 | 68 | 66% |
✅ = supported |
⚠️
= partial support | ❌ = not supported
The complete list of S3 APIs is in the AWS S3 documentation.
Object operations
| Operation | Tigris | R2 | GCS |
|---|---|---|---|
| CopyObject | ✅ | ✅ | ✅ |
| DeleteObject | ✅ | ✅ | ✅ |
| DeleteObjects | ✅ | ✅ | ✅ |
| DeleteObjects (quiet mode) | ✅ | ✅ | ✅ |
| DeleteObjectTagging | ✅ | ✅ | ✅ |
| GetObject | ✅ | ✅ | ✅ |
| GetObject (If-Match) | ✅ | ✅ | ✅ |
| GetObject (If-Modified-Since) | ✅ | ✅ | ✅ |
| GetObject (If-None-Match) | ✅ | ✅ | ✅ |
| GetObject (If-Unmodified-Since) | ✅ | ✅ | ✅ |
| GetObject (range request) | ✅ | ✅ | ✅ |
| GetObjectAcl | ✅ | ❌ | ⚠️ 4 |
| GetObjectTagging | ✅ | ❌ | ❌ |
| HeadObject | ✅ | ✅ | ✅ |
| ListObjects | ✅ | ✅ | ✅ |
| ListObjectsV2 | ✅ | ✅ | ✅ |
| ListObjectsV2 (delimiter) | ✅ | ✅ | ✅ |
| ListObjectsV2 (pagination) | ✅ | ✅ | ✅ |
| PutObject | ✅ | ✅ | ✅ |
| PutObject (custom metadata) | ✅ | ✅ | ✅ |
| PutObject (SHA256 checksum) | ✅ | ✅ | ✅ |
| PutObject (SSE-S3) | ✅ | ✅ | ✅ |
| PutObject (storage class) | ✅ | ✅ | ✅ |
| PutObjectAcl | ✅ | ❌ | ⚠️ 4 |
| PutObjectTagging | ✅ | ❌ | ❌ |
| RestoreObject | ✅ | ✅ | ❌ |
Bucket operations
| Operation | Tigris | R2 | GCS |
|---|---|---|---|
| CreateBucket | ✅ | ✅ | ✅ |
| DeleteBucket | ✅ | ✅ | ✅ |
| DeleteBucketCors | ✅ | ✅ | ❌ |
| DeleteBucketEncryption | ⚠️ 1 | ✅ | ❌ |
| DeleteBucketLifecycle | ✅ | ✅ | ❌ |
| DeleteBucketOwnershipControls | ✅ | ❌ | ❌ |
| DeleteBucketTagging | ✅ | ❌ | ❌ |
| GetBucketAccelerateConfiguration | ✅ | ❌ | ✅ |
| GetBucketAcl | ✅ | ✅ | ⚠️ 4 |
| GetBucketCors | ✅ | ✅ | ❌ |
| GetBucketEncryption | ⚠️ 1 | ✅ | ❌ |
| GetBucketLifecycleConfiguration | ✅ | ✅ | ❌ |
| GetBucketLocation | ✅ | ✅ | ✅ |
| GetBucketNotificationConfiguration | ✅ | ❌ | ✅ |
| GetBucketOwnershipControls | ✅ | ❌ | ❌ |
| GetBucketPolicy | ❌ | ❌ | ❌ |
| GetBucketPolicyStatus | ✅ | ❌ | ✅ |
| GetBucketTagging | ✅ | ❌ | ❌ |
| GetBucketVersioning | ❌ | ✅ | ⚠️ 5 |
| HeadBucket | ✅ | ✅ | ✅ |
| ListBuckets | ✅ | ✅ | ❌ |
| ListObjectVersions | ✅ | ❌ | ⚠️ 5 |
| PutBucketAcl | ⚠️ 2 | ❌ | ⚠️ 4 |
| PutBucketCors | ✅ | ✅ | ❌ |
| PutBucketEncryption | ⚠️ 1 | ✅ | ❌ |
| PutBucketLifecycleConfiguration | ✅ | ❌ | ❌ |
| PutBucketNotificationConfiguration | ❌ | ❌ | ❌ |
| PutBucketOwnershipControls | ✅ | ❌ | ❌ |
| PutBucketPolicy | ❌ | ❌ | ❌ |
| PutBucketTagging | ✅ | ❌ | ❌ |
| PutBucketVersioning | ❌ | ❌ | ⚠️ 5 |
Multipart uploads
| Operation | Tigris | R2 | GCS |
|---|---|---|---|
| AbortMultipartUpload | ✅ | ✅ | ✅ |
| CompleteMultipartUpload | ✅ | ✅ | ✅ |
| CreateMultipartUpload | ✅ | ✅ | ✅ |
| ListMultipartUploads | ✅ | ✅ | ✅ |
| ListParts | ✅ | ✅ | ✅ |
| UploadPart | ✅ | ✅ | ✅ |
| UploadPartCopy | ✅ | ⚠️ 3 | ❌ |
Notes
- Encryption: Tigris encrypts all data at rest automatically. The bucket encryption configuration APIs accept requests but server-side encryption with managed keys is always on.
- Canned ACLs: Only canned ACLs (
public-readandprivate) are supported. - Conditional copy: R2 supports UploadPartCopy
but does not support conditional copy operations
(
x-amz-copy-source-if-match, etc.). - GCS ACL model: GCS uses a different ACL permission model where permissions are concentric (WRITE implies READ). S3-style ACL XML is accepted but behavior differs from AWS S3.
- GCS versioning: GCS maps versioning to its own generation number system, which differs from S3 version IDs.
Presigned URLs
| Operation | Tigris | R2 | GCS |
|---|---|---|---|
| PresignDeleteObject | ✅ | ✅ | ✅ |
| PresignGetObject | ✅ | ✅ | ✅ |
| PresignHeadObject | ✅ | ✅ | ✅ |
| PresignPutObject | ✅ | ✅ | ✅ |
| PresignUploadPart | ✅ | ✅ | ✅ |
IAM APIs
These IAM APIs are served at https://iam.storage.dev and are not covered by
the automated test suite.
| IAM API | Supported in Tigris |
|---|---|
| CreateAccessKey | Yes |
| ListAccessKeys | Yes |
| UpdateAccessKey | Yes |
| DeleteAccessKey | Yes |
| CreatePolicy | Yes |
| ListPolicies | Yes |
| GetPolicy | Yes |
| AttachUserPolicy | Yes |
| ListUserPolicies | Yes |
| DeletePolicy | Yes |
| DetachUserPolicy | Yes |
CloudFront APIs
| CloudFront API | Supported in Tigris |
|---|---|
| CreatePublicKey | Yes |
| GetPublicKey | Yes |
| DeletePublicKey | Yes |
| ListPublicKeys | Yes |
Next steps
Check out the language-specific guides on how to use the AWS S3 SDKs with Tigris.