# 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[​](#object-operations "Direct link to 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](#notes) |
| GetObjectTagging                | ✅     | ❌ | ❌             |
| HeadObject                      | ✅     | ✅ | ✅             |
| ListObjects                     | ✅     | ✅ | ✅             |
| ListObjectsV2                   | ✅     | ✅ | ✅             |
| ListObjectsV2 (delimiter)       | ✅     | ✅ | ✅             |
| ListObjectsV2 (pagination)      | ✅     | ✅ | ✅             |
| PutObject                       | ✅     | ✅ | ✅             |
| PutObject (custom metadata)     | ✅     | ✅ | ✅             |
| PutObject (SHA256 checksum)     | ✅     | ✅ | ✅             |
| PutObject (SSE-S3)              | ✅     | ✅ | ✅             |
| PutObject (storage class)       | ✅     | ✅ | ✅             |
| PutObjectAcl                    | ✅     | ❌ | ⚠️ [4](#notes) |
| PutObjectTagging                | ✅     | ❌ | ❌             |
| RestoreObject                   | ✅     | ✅ | ❌             |

## Bucket operations[​](#bucket-operations "Direct link to Bucket operations")

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

## Multipart uploads[​](#multipart-uploads "Direct link to Multipart uploads")

| Operation               | Tigris | R2             | GCS |
| ----------------------- | ------ | -------------- | --- |
| AbortMultipartUpload    | ✅     | ✅             | ✅  |
| CompleteMultipartUpload | ✅     | ✅             | ✅  |
| CreateMultipartUpload   | ✅     | ✅             | ✅  |
| ListMultipartUploads    | ✅     | ✅             | ✅  |
| ListParts               | ✅     | ✅             | ✅  |
| UploadPart              | ✅     | ✅             | ✅  |
| UploadPartCopy          | ✅     | ⚠️ [3](#notes) | ❌  |

### Notes[​](#notes "Direct link to 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[​](#presigned-urls "Direct link to Presigned URLs")

| Operation           | Tigris | R2 | GCS |
| ------------------- | ------ | -- | --- |
| PresignDeleteObject | ✅     | ✅ | ✅  |
| PresignGetObject    | ✅     | ✅ | ✅  |
| PresignHeadObject   | ✅     | ✅ | ✅  |
| PresignPutObject    | ✅     | ✅ | ✅  |
| PresignUploadPart   | ✅     | ✅ | ✅  |

## IAM APIs[​](#iam-apis "Direct link to 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-apis "Direct link to 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[​](#next-steps "Direct link to Next steps")

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