# Tigris 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](https://github.com/tigrisdata-community/s3-api-compat-tests) against each provider using the [AWS JS SDK v3](https://github.com/tigrisdata-community/s3-api-compat-tests/tree/main/ts). The suite includes both a TypeScript runner and a [Go runner](https://github.com/tigrisdata-community/s3-api-compat-tests) (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](https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html).

## 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](/content/docs/api/s3/#notes/index.html) |
| GetObjectTagging                     | ✅      | ❌   | ❌   |
| HeadObject                           | ✅      | ✅   | ✅   |
| ListObjects                          | ✅      | ✅   | ✅   |
| ListObjectsV2                        | ✅      | ✅   | ✅   |
| ListObjectsV2 (delimiter)           | ✅      | ✅   | ✅   |
| ListObjectsV2 (pagination)          | ✅      | ✅   | ✅   |
| PutObject                            | ✅      | ✅   | ✅   |
| PutObject (custom metadata)         | ✅      | ✅   | ✅   |
| PutObject (SHA256 checksum)         | ✅      | ✅   | ✅   |
| PutObject (SSE-S3)                  | ✅      | ✅   | ✅   |
| PutObject (storage class)           | ✅      | ✅   | ✅   |
| PutObjectAcl                        | ✅      | ❌   | ⚠️  [4](/content/docs/api/s3/#notes/index.html) |
| PutObjectTagging                    | ✅      | ❌   | ❌   |
| RestoreObject                        | ✅      | ✅   | ❌   |

## Bucket operations

| Operation                            | Tigris | R2  | GCS |
|--------------------------------------|--------|-----|-----|
| CreateBucket                         | ✅      | ✅   | ✅   |
| DeleteBucket                         | ✅      | ✅   | ✅   |
| DeleteBucketCors                     | ✅      | ✅   | ❌   |
| DeleteBucketEncryption                | ⚠️  [1](/content/docs/api/s3/#notes/index.html) | ✅   | ❌   |
| DeleteBucketLifecycle                 | ✅      | ✅   | ❌   |
| DeleteBucketOwnershipControls        | ✅      | ❌   | ❌   |
| DeleteBucketTagging                  | ✅      | ❌   | ❌   |
| GetBucketAccelerateConfiguration      | ✅      | ❌   | ✅   |
| GetBucketAcl                         | ✅      | ✅   | ⚠️  [4](/content/docs/api/s3/#notes/index.html) |
| GetBucketCors                         | ✅      | ✅   | ❌   |
| GetBucketEncryption                   | ⚠️  [1](/content/docs/api/s3/#notes/index.html) | ✅   | ❌   |
| GetBucketLifecycleConfiguration        | ✅      | ✅   | ❌   |
| GetBucketLocation                     | ✅      | ✅   | ✅   |
| GetBucketNotificationConfiguration     | ✅      | ❌   | ✅   |
| GetBucketOwnershipControls            | ✅      | ❌   | ❌   |
| GetBucketPolicy                       | ❌      | ❌   | ❌   |
| GetBucketPolicyStatus                 | ✅      | ❌   | ✅   |
| GetBucketTagging                      | ✅      | ❌   | ❌   |
| GetBucketVersioning                   | ❌      | ✅   | ⚠️  [5](/content/docs/api/s3/#notes/index.html) |
| HeadBucket                           | ✅      | ✅   | ✅   |
| ListBuckets                          | ✅      | ✅   | ❌   |
| ListObjectVersions                    | ✅      | ❌   | ⚠️  [5](/content/docs/api/s3/#notes/index.html) |
| PutBucketAcl                        | ⚠️  [2](/content/docs/api/s3/#notes/index.html) | ❌   | ⚠️  [4](/content/docs/api/s3/#notes/index.html) |
| PutBucketCors                         | ✅      | ✅   | ❌   |
| PutBucketEncryption                   | ⚠️  [1](/content/docs/api/s3/#notes/index.html) | ✅   | ❌   |
| PutBucketLifecycleConfiguration        | ✅      | ❌   | ❌   |
| PutBucketNotificationConfiguration     | ❌      | ❌   | ❌   |
| PutBucketOwnershipControls            | ✅      | ❌   | ❌   |
| PutBucketPolicy                       | ❌      | ❌   | ❌   |
| PutBucketTagging                      | ✅      | ❌   | ❌   |
| PutBucketVersioning                   | ❌      | ❌   | ⚠️  [5](/content/docs/api/s3/#notes/index.html) |

## Multipart uploads

| Operation                            | Tigris | R2  | GCS |
|--------------------------------------|--------|-----|-----|
| AbortMultipartUpload                 | ✅      | ✅   | ✅   |
| CompleteMultipartUpload              | ✅      | ✅   | ✅   |
| CreateMultipartUpload                | ✅      | ✅   | ✅   |
| ListMultipartUploads                 | ✅      | ✅   | ✅   |
| ListParts                            | ✅      | ✅   | ✅   |
| UploadPart                           | ✅      | ✅   | ✅   |
| UploadPartCopy                       | ✅      | ⚠️  [3](/content/docs/api/s3/#notes/index.html) | ❌   |

### Notes

1. **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.
2. **Canned ACLs**: Only canned ACLs (`public-read` and `private`) are supported.
3. **Conditional copy**: R2 supports UploadPartCopy but does not support conditional copy operations (`x-amz-copy-source-if-match`, etc.).
4. **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.
5. **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](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html) | Yes                  |
| [ListAccessKeys](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html) | Yes                  |
| [UpdateAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html) | Yes                  |
| [DeleteAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html) | Yes                  |
| [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html) | Yes                  |
| [ListPolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicies.html) | Yes                  |
| [GetPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html) | Yes                  |
| [AttachUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachUserPolicy.html) | Yes                  |
| [ListUserPolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUserPolicies.html) | Yes                  |
| [DeletePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeletePolicy.html) | Yes                  |
| [DetachUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachUserPolicy.html) | Yes                  |

## CloudFront APIs

| CloudFront API                      | Supported in Tigris |
|-------------------------------------|----------------------|
| [CreatePublicKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreatePublicKey.html) | Yes                  |
| [GetPublicKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetPublicKey.html) | Yes                  |
| [DeletePublicKey](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DeletePublicKey.html) | Yes                  |
| [ListPublicKeys](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListPublicKeys.html) | Yes                  |

## Next steps

Check out the [language-specific guides](/content/docs/sdks/s3/index.html) on how to use the AWS S3 SDKs with Tigris.

- [Object operations](/content/docs/api/s3/#object-operations/index.html)
- [Bucket operations](/content/docs/api/s3/#bucket-operations/index.html)
- [Multipart uploads](/content/docs/api/s3/#multipart-uploads/index.html)
  - [Notes](/content/docs/api/s3/#notes/index.html)
- [Presigned URLs](/content/docs/api/s3/#presigned-urls/index.html)
- [IAM APIs](/content/docs/api/s3/#iam-apis/index.html)
- [CloudFront APIs](/content/docs/api/s3/#cloudfront-apis/index.html)
- [Next steps](/content/docs/api/s3/#next-steps/index.html)
