Skip to content

Bucket quotas ​

A hard per-bucket size limit in bytes. When a write would push the bucket over its quota, the request is refused with HTTP 507 QuotaExceeded — enforced on PUT, multipart complete, and copy. A quota of 0 (or none configured) means unlimited.

Setting a quota ​

Through the admin REST API (root credentials):

bash
# Set a 1 GiB quota
curl -X PUT -H "X-API-Key: admin" -H "X-API-Secret: admin-secret" \
  -H "Content-Type: application/json" -d '{"quota": 1073741824}' \
  http://localhost:8000/rest/api/v1/buckets/my-bucket/quota

# Read quota and current usage
curl -H "X-API-Key: admin" -H "X-API-Secret: admin-secret" \
  http://localhost:8000/rest/api/v1/buckets/my-bucket/quota
# → {"quota": 1073741824, "usage": 52428800}

# Clear (back to unlimited)
curl -X DELETE -H "X-API-Key: admin" -H "X-API-Secret: admin-secret" \
  http://localhost:8000/rest/api/v1/buckets/my-bucket/quota

Or in the console: bucket settings → Quota tab.

Enforcement semantics ​

Enforcement is per-node best-effort. Each node checks incoming bytes against a short-lived usage cache rather than recounting the bucket on every write, so:

  • In a multi-node cluster, concurrent writes on different nodes may overshoot the quota slightly within the cache window.
  • After deletes, freed headroom becomes visible once the cache refreshes.

Treat a quota as a guardrail against runaway growth, not a byte-exact accounting boundary.

TinyS3 is AGPLv3 licensed. Cloudflare and Cloudflare Workers are trademarks of Cloudflare, Inc. Amazon S3 and AWS are trademarks of Amazon.com, Inc. or its affiliates. MinIO is a trademark of MinIO, Inc. They are named only to describe compatibility; totis.ai is not affiliated with, endorsed by, or sponsored by any of them.