> **For AI agents:** The documentation index is at [https://docs.digitalocean.com/llms.txt](https://docs.digitalocean.com/llms.txt). Markdown versions of pages use the same URL with `index.html.md` in place of the HTML page (for example, append `index.html.md` to the directory path instead of opening the HTML document).
# Spaces S3 Compatibility
Spaces Object Storage is an S3-compatible service for storing and serving large amounts of data. The built-in Spaces CDN minimizes page load times, improves performance, and reduces bandwidth and infrastructure costs.
DigitalOcean Spaces provides an S3-compatible API with partial support for Amazon S3 features.
## Feature Compatibility
The following table lists supported S3 features and restrictions:
| Feature | Notes |
|---|---|
| **Object Copy** | Supported with `CopyObject`. Cross-region and cross-cluster copies are not supported. |
| **Multipart Uploads** | Supported for large objects. `UploadPartCopy` is not supported across regions or clusters. |
| **Presigned URLs** | Supported with both Signature Version 2 and Version 4. |
| **Bucket Policies** | Supported only through the API (not configurable in the control panel). |
| **Bucket Versioning** | Supported only through the API (not configurable in the control panel). |
| **Bucket Lifecycle** | Supported for time-based expiration and removing incomplete multipart uploads. Tag-based lifecycle rules are not supported. |
| **Bucket Access Logging** | Supported only through the API. The source and destination buckets must be different. |
| **Object Encryption** | Supported with SSE-C (server-side encryption with customer-provided keys). Bucket-level encryption settings are not supported. |
| **Bucket Websites** | Supported at `https://[bucket-name].[region]-static.digitaloceanspaces.com`. CDN is not supported for bucket websites. |
| **List Objects** | Both `ListObjects` (legacy) and `ListObjectsV2` are supported. Use `ListObjectsV2` for new applications. |
| **Preflight Requests** | `OPTIONS` preflight requests require no permissions, but the bucket policy or ACL must still allow the subsequent request. |
| **Unsupported API Calls** | Unsupported S3 operations return a standard `NotImplemented` error. |
| **Authentication** | Spaces supports AWS Signature Version 4 (recommended) and Signature Version 2 for legacy clients. |
For more information on product-wide usage limits, see [Spaces Limits](https://docs.digitalocean.com/products/spaces/details/limits/index.html.md).
## Access Control Lists (ACLs)
Spaces supports a limited set of canned ACLs for buckets and objects. Only two ACLs are available:
- `private`: Grants `FULL_CONTROL` to the bucket or object owner. Blocks public access.
- `public-read`: Grants `FULL_CONTROL` to the owner and allows unauthenticated read access to anyone on the internet.
You can apply an ACL in two ways:
1. Send a `PUT ?acl` request with an XML `AccessControlPolicy`.
2. Use the `x-amz-acl` header with a canned ACL (simpler and recommended).
### Private ACL Example
To restrict access so only the bucket owner has full control, set the ACL to private. You can apply this setting either by adding the `x-amz-acl` header or by using an XML access control policy:
## x-amz-acl Header
```shell
curl -X PUT "https://example-space.nyc3.digitaloceanspaces.com/example.txt" \
-H "Authorization: ..." \
-H "Date: ..." \
-H "x-amz-acl: private" \
--upload-file ./example.txt
```
## XML Policy
```xml
6174283
6174283
FULL_CONTROL
```
### Public Read ACL Example
To make objects readable by anyone on the internet while still retaining full control as the owner, set the ACL to public-read. You can configure this either with the `x-amz-acl` header or with an XML access control policy:
## x-amz-acl Header
```shell
curl -X PUT "https://example-space.nyc3.digitaloceanspaces.com/example.txt" \
-H "Authorization: ..." \
-H "Date: ..." \
-H "x-amz-acl: public-read" \
--upload-file ./example.txt
```
## XML Policy
```xml
61742836174283
http://acs.amazonaws.com/groups/global/AllUsers
READ
6174283
FULL_CONTROL
```