We’re excited to announce Bytescale now supports any S3‑compatible API for use as external storage. That means whether you’re running MinIO on‑prem, a self‑hosted Ceph cluster, or any other storage service with an S3‑compatible API, you can now plug it straight into Bytescale.
What’s new?
With this update, your team can:
- Plug in any S3‑compatible endpoint either manually via the Bytescale Dashboard or programmatically via the PutFolder API operation.
 - Seamlessly integrates with every part of Bytescale, including our File Processing APIs, Storage APIs, CDN, SDKs, and widgets.
 - Customizable object keys via settings like customizable object key prefixes and relative vs. absolute path resolution, built to fit your infrastructure needs.
 
Why you’ll love it
- Freedom to choose – Use any S3‑compatible storage service—self‑hosted, cloud‑hosted, or anything in between.
 - Compliance & budget friendly – Select a storage provider that aligns with your data residency, regulatory, or cost requirements
 - Full feature parity – Benefit from the same high‑performance media processing APIs and media-optimized CDN provided by Bytescale, even with files stored externally.
 - Highly configurable – Fine‑tune object key structures, control how S3 URLs are resolved (subdomain vs. path-style), and specify unsupported operations to prevent Bytescale from using them—ensuring reliable integration with any S3-compatible service.
 
How to get started
- Head to Folder Settings → Storage Settings in the Bytescale Dashboard.
 - Pick Generic S3 as your storage type.
 - Provide your endpoint, bucket name, region, credentials, and custom options (
forcePathStyle,objectKeyPrefix, etc.). - Save changes—Bytescale will now treat your folder’s storage as an external source.
 
Alternatively, use the PutFolder operation to create Generic S3 folders programmatically. The configuration payload looks like this:
{
  "type": "GenericS3",
  "bucket": {
    "bucketEndpoint": "https://example.com/foo",
    "bucketName": "my-bucket",
    "bucketRegion": "auto",
    "forcePathStyle": true,
    "objectKeyPrefix": "uploads/",
    "unsupportedOperations": []
  },
  "credentials": {
    "accessKey": "YOUR_ACCESS_KEY",
    "secretKey": "YOUR_SECRET_KEY"
  },
  "useAbsolutePaths": true
}
Learn more
For full details, check out the docs: