Skip to content

Limits

Size, count and request limits on the hosted S3 endpoint.

LimitValueAmazon S3What happens past it
Single PutObject5 GiB5 GiB400 EntityTooLarge. Use a multipart upload.
Multipart part size5 MiB to 5 GiB (the last part can be smaller)Same400 EntityTooSmall or 400 EntityTooLarge
Parts per upload3,00010,000400 InvalidArgument on the part that crosses the limit
Largest objectAbout 14.6 TiB (3,000 × 5 GiB)50 TiB—
Object key length958 bytes1,024 bytesKeys from 959 to 1,024 bytes fail with 500 InternalError
Keys per ListObjects page1,0001,000400 InvalidArgument for max-keys above 1,000
Keys per DeleteObjects request1,0001,000400 MalformedXML
Clock skewUnder 15 minutes15 minutes401
Content-LengthRequired on uploadsRequired411 MissingContentLength
Presigned URL lifetime1 second to 7 days7 days400: "X-Amz-Expires must be between 1 and 604800 seconds"

On the Free plan, an upload that would take you past your 10 GiB storage allowance is refused with 400 EntityTooLarge before any data is sent. The console shows your usage.

Choosing a part size

Use parts of at least 10 MiB. Each part counts as at least 10 MiB of storage, so smaller parts make a file count as more than it holds. See The 10 MiB minimum. The AWS CLI and boto3 default to 8 MiB parts, and the AWS SDK for JavaScript and rclone to 5 MiB, so each quickstart sets a larger part size.

Because of the 3,000-part limit, your part size also sets your largest file:

Part sizeLargest file
10 MiBAbout 29 GiB
64 MiBAbout 187 GiB
512 MiBAbout 1.5 TiB

rclone and DuckDB raise the part size for you when told the limit: max_upload_parts=3000 in the rclone quickstart, and s3_uploader_max_parts_per_file = 3000 in the DuckDB quickstart.

Concurrent downloads

Your organization can have a limited number of downloads in flight at once, shared by all of its buckets and access keys. Every GET counts as one, including each range request and each GET through a presigned URL. HEAD requests don't count.

Past the limit, Shelby returns 503 SlowDown with Retry-After: 1. AWS SDKs retry it for you. If it keeps happening, lower your client's parallelism. A web page that loads many presigned images or videos at once can hit it too, because a video player makes a series of range requests as it plays.

What isn't limited

Objects stay until you delete them. Shelby has no lifecycle rules or automatic expiry.