S3 API Comparison: SeaweedFS vs MinIO
Note
This page is generated by scanning the source code with AI and serves as a to-do list for SeaweedFS as we continue to add more S3 APIs to improve compatibility and functionality.
This page compares the S3 API implementation in SeaweedFS with MinIO.
Comparison Summary
| Feature Area | SeaweedFS Support | MinIO Support | Notes |
|---|---|---|---|
| Basic Object Ops | ✅ Full | ✅ Full | GET, PUT, DELETE, HEAD, COPY |
| Bucket Ops | ✅ Full | ✅ Full | Create, Delete, List, Head |
| Multipart Upload | ✅ Full | ✅ Full | |
| Object Tagging | ✅ Full | ✅ Full | |
| Object Lock | ✅ Full | ✅ Full | Retention, Legal Hold |
| Bucket Policy | ✅ Full | ✅ Full | |
| Lifecycle | ✅ Full | ✅ Full | |
| Versioning | ✅ Full | ✅ Full | |
| ACLs | ✅ Full | ⚠️ Dummy | MinIO accepts but does not enforce bucket and object ACL requests |
| Bucket Notifications | ❌ No | ✅ Full | GetBucketNotification, PutBucketNotification, ListenBucketNotification |
| Bucket Replication | ❌ No | ✅ Full | Get/Put/DeleteBucketReplication plus metrics and reset extensions |
| Bucket Policy Status | ✅ Full | ✅ Full | GetBucketPolicyStatus |
| Analytics / Inventory / IntelligentTiering / Metrics configs | ⚠️ Stub | ❌ Rejected (OSS) | SeaweedFS returns an empty list / NoSuchConfiguration so SDK probes succeed; MinIO OSS returns 501 NotImplemented (the equivalents live in mc admin / AIStor workflows, not the standard S3 endpoint) |
| S3 Tables | ✅ Full | ❌ No | SeaweedFS supports Iceberg via S3 Tables |
| Object Select | ❌ No | ✅ Yes | SelectObjectContent |
| Object Attributes | ✅ Yes | ✅ Yes | GetObjectAttributes |
| Lambda Triggers | ❌ No | ✅ Yes | GetObjectLambda |
| IAM Groups | ✅ Full | ⚠️ Proprietary | Similar group admin capability, but not API-compatible: SeaweedFS uses AWS IAM actions; MinIO uses proprietary /minio/admin/v3 endpoints. |
| STS | ✅ Partial | ✅ Full | SeaweedFS: standard AssumeRole APIs. MinIO: several extensions. |
Implemented APIs (Both)
- Service Operations:
ListBuckets - Bucket Operations:
HeadBucket,PutBucket,DeleteBucket,ListObjectsV1,ListObjectsV2,ListObjectVersions,GetBucketAcl,PutBucketAcl,GetBucketPolicy,PutBucketPolicy,DeleteBucketPolicy,GetBucketCors,PutBucketCors,DeleteBucketCors,GetBucketLifecycle,PutBucketLifecycle,DeleteBucketLifecycle,GetBucketLocation,GetBucketVersioning,PutBucketVersioning,GetBucketObjectLockConfiguration,PutBucketObjectLockConfiguration,GetBucketTagging,PutBucketTagging,DeleteBucketTagging,GetBucketEncryption,PutBucketEncryption,DeleteBucketEncryption - Object Operations:
HeadObject,GetObject,PutObject,PostObject(browser form upload),DeleteObject,CopyObject,DeleteMultipleObjects,GetObjectAttributes,GetObjectTagging,PutObjectTagging,DeleteObjectTagging,GetObjectAcl,PutObjectAcl,GetObjectRetention,PutObjectRetention,GetObjectLegalHold,PutObjectLegalHold - Multipart Upload:
CreateMultipartUpload,AbortMultipartUpload,CompleteMultipartUpload,UploadPart,CopyObjectPart,ListMultipartUploads,ListParts
SeaweedFS Specific / Better Implemented
- S3 Tables API (Iceberg Support): Extensive support for Iceberg tables, namespaces, and buckets.
CreateTableBucket,ListTableBuckets,GetTableBucket,DeleteTableBucket,CreateNamespace,CreateTable, etc.
- Bucket Management: SeaweedFS implements
PublicAccessBlockandOwnershipControlswhich are rejected or labeled as dummy in some MinIO versions.
MinIO Specific / Not in SeaweedFS
- Advanced Object Querying:
SelectObjectContent. - Extensions:
GetObjectLambda,PostRestoreObject,PutObjectExtract(Snowball auto-extract). - Bucket Notifications:
GetBucketNotification,PutBucketNotification, plus MinIO'sListenBucketNotificationSSE-style event stream. - Bucket Replication:
GetBucketReplication,PutBucketReplication,DeleteBucketReplication, replication metrics (v1/v2),ResetBucketReplicationStart,ResetBucketReplicationStatus,ValidateBucketReplicationCreds. - Persisted bucket configurations: AWS Analytics, Inventory, IntelligentTiering, and Metrics configurations are not implemented on either side at the standard S3 endpoint. MinIO OSS rejects all methods with 501 NotImplemented; SeaweedFS exposes well-formed empty /
NoSuchConfigurationstubs so AWS-SDK probes succeed. The equivalents live in MinIO'smc admin/ AIStor workflows.
STS API Comparison
| STS Action | SeaweedFS | MinIO | Notes |
|---|---|---|---|
sts:AssumeRole |
✅ | ✅ | Standard SigV4 auth |
sts:AssumeRoleWithWebIdentity |
✅ | ✅ | OIDC / JWT support |
sts:AssumeRoleWithLDAPIdentity |
✅ | ✅ | LDAP integration |
sts:GetFederationToken |
✅ | ❌ | Temp credentials with scoped-down policy |
sts:GetCallerIdentity |
✅ | ❌ | Returns ARN/account/user of caller |
sts:AssumeRoleWithClientGrants |
❌ | ✅ | MinIO extension |
sts:AssumeRoleWithCertificate |
❌ | ✅ | MinIO extension (TLS certs) |
sts:AssumeRoleWithCustomToken |
❌ | ✅ | MinIO extension |
Detailed Comparison Table
| API Action | SeaweedFS | MinIO |
|---|---|---|
s3:GetObject |
✅ | ✅ |
s3:PutObject |
✅ | ✅ |
s3:DeleteObject |
✅ | ✅ |
s3:CopyObject |
✅ | ✅ |
s3:SelectObjectContent |
❌ | ✅ |
s3:GetObjectAttributes |
✅ | ✅ |
s3:PostRestoreObject |
❌ | ✅ |
s3:GetBucketCORS |
✅ | ✅ |
s3:PutBucketCORS |
✅ | ⚠️ (Dummy) |
s3:GetBucketACL |
✅ | ✅ |
s3:PutBucketACL |
✅ | ⚠️ (Dummy) |
s3:GetBucketLifecycle |
✅ | ✅ |
s3:PutBucketLifecycle |
✅ | ✅ |
s3:GetBucketEncryption |
✅ | ✅ |
s3:GetBucketVersioning |
✅ | ✅ |
s3:GetBucketLocation |
✅ | ✅ |
s3:GetBucketPolicy |
✅ | ✅ |
s3:PutBucketPolicy |
✅ | ✅ |
s3:DeleteBucketPolicy |
✅ | ✅ |
s3:GetBucketObjectLockConfiguration |
✅ | ✅ |
s3:GetBucketTagging |
✅ | ✅ |
s3:PutBucketOwnershipControls |
✅ | ❌ (Rejected) |
s3:GetPublicAccessBlock |
✅ | ❌ (Rejected) |
s3:GetBucketNotification |
❌ | ✅ |
s3:PutBucketNotification |
❌ | ✅ |
s3:GetBucketReplication |
❌ | ✅ |
s3:PutBucketReplication |
❌ | ✅ |
s3:DeleteBucketReplication |
❌ | ✅ |
s3:GetBucketPolicyStatus |
✅ | ✅ |
s3:PutBucketRequestPayment |
✅ (BucketOwner only) |
❌ (Rejected) |
s3:GetBucketAccelerate |
⚠️ (Static Suspended) |
⚠️ (Dummy) |
s3:GetBucketLogging |
⚠️ (Static empty) | ⚠️ (Dummy) |
s3:GetBucketAnalyticsConfiguration / s3:ListBucketAnalyticsConfigurations |
⚠️ (Stub) | ❌ (Rejected, 501) |
s3:GetBucketInventoryConfiguration / s3:ListBucketInventoryConfigurations |
⚠️ (Stub) | ❌ (Rejected, 501) |
s3:GetBucketIntelligentTieringConfiguration / s3:ListBucketIntelligentTieringConfigurations |
⚠️ (Stub) | ❌ (Rejected, 501) |
s3:GetBucketMetricsConfiguration / s3:ListBucketMetricsConfigurations |
⚠️ (Stub) | ❌ (Rejected, 501) |
s3:GetBucketWebsite |
❌ | ⚠️ (Dummy) |
s3:GetObjectACL |
✅ | ⚠️ (Dummy) |
s3:PutObjectACL |
✅ | ⚠️ (Dummy) |
Notes on behavioral divergence
s3:GetBucketPolicyStatus— both services return anIsPublicflag, but the definition of "public" differs. MinIO marks a bucket public only when anonymous credentials can bothListBucketandPutObject. SeaweedFS marks it public if anyAllowstatement grantsPrincipal: "*"without aCondition. A bucket open to anonymous reads only would reporttruein SeaweedFS andFALSEin MinIO.s3:GetBucketAccelerate— MinIO returns 200 +<AccelerateConfiguration/>with no<Status>child (AWS clients default-interpret asSuspended). SeaweedFS returns the same empty XML but with an explicit<Status>Suspended</Status>element.
IAM API Comparison
SeaweedFS implements IAM actions as standard AWS IAM API calls (same endpoint as S3). MinIO uses a proprietary admin API (/minio/admin/v3/) accessible via mc admin CLI and madmin-go SDK.
For group management specifically, MinIO supports broadly similar administration features, but not the same API surface. Group creation and deletion are implicit in MinIO's member-management flow, ListGroupsForUser is surfaced via user info (MemberOf) rather than a dedicated API, ListAttachedGroupPolicies is folded into broader admin responses, and SeaweedFS UpdateGroup rename support has no MinIO equivalent.
| IAM Action | SeaweedFS | MinIO | Notes |
|---|---|---|---|
iam:CreateUser |
✅ | ⚠️ Proprietary | MinIO: mc admin user add |
iam:DeleteUser |
✅ | ⚠️ Proprietary | MinIO: mc admin user remove |
iam:GetUser |
✅ | ⚠️ Proprietary | MinIO: mc admin user info |
iam:ListUsers |
✅ | ⚠️ Proprietary | MinIO: mc admin user list |
iam:UpdateUser |
✅ | ⚠️ Proprietary | |
iam:SetUserStatus |
✅ | ⚠️ Proprietary | MinIO: mc admin user enable/disable |
iam:CreateAccessKey |
✅ | ⚠️ Proprietary | SeaweedFS also accepts optional caller-supplied AccessKeyId/SecretAccessKey (extension). MinIO: mc admin user svcacct add |
iam:DeleteAccessKey |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct rm |
iam:ListAccessKeys |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct ls |
iam:UpdateAccessKey |
✅ | ⚠️ Proprietary | |
iam:CreatePolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy create |
iam:DeletePolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy rm |
iam:ListPolicies |
✅ | ⚠️ Proprietary | MinIO: mc admin policy ls |
iam:GetPolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy info |
iam:PutUserPolicy |
✅ | ❌ | MinIO has no inline policy concept |
iam:GetUserPolicy |
✅ | ❌ | |
iam:DeleteUserPolicy |
✅ | ❌ | |
iam:ListUserPolicies |
✅ | ❌ | |
iam:AttachUserPolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy attach |
iam:DetachUserPolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy detach |
iam:ListAttachedUserPolicies |
✅ | ⚠️ Proprietary | |
iam:CreateGroup |
✅ | ⚠️ Proprietary | MinIO: implicit create via mc admin group add / update-group-members; no AWS IAM CreateGroup action |
iam:DeleteGroup |
✅ | ⚠️ Proprietary | MinIO: remove empty group via mc admin group remove; no AWS IAM DeleteGroup action |
iam:GetGroup |
✅ | ⚠️ Proprietary | MinIO: mc admin group info |
iam:ListGroups |
✅ | ⚠️ Proprietary | MinIO: mc admin group list |
iam:AddUserToGroup |
✅ | ⚠️ Proprietary | MinIO: mc admin group add <group> <user> |
iam:RemoveUserFromGroup |
✅ | ⚠️ Proprietary | MinIO: mc admin group remove <group> <user> |
iam:AttachGroupPolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy attach --group |
iam:DetachGroupPolicy |
✅ | ⚠️ Proprietary | MinIO: mc admin policy detach --group |
iam:ListAttachedGroupPolicies |
✅ | ⚠️ Proprietary | No dedicated MinIO API; exposed via group info / policy mapping queries |
iam:ListGroupsForUser |
✅ | ⚠️ Proprietary | No dedicated MinIO API; returned as MemberOf in user info |
iam:UpdateGroup |
✅ | ⚠️ Partial | SeaweedFS extension: rename or enable/disable. MinIO only supports enable/disable via set-group-status |
iam:PutGroupPolicy |
✅ | ❌ | Group inline policies; MinIO only supports managed policies |
iam:GetGroupPolicy |
✅ | ❌ | |
iam:DeleteGroupPolicy |
✅ | ❌ | |
iam:ListGroupPolicies |
✅ | ❌ | |
iam:GetPolicyVersion |
✅ | ❌ | Managed policy version read; no MinIO equivalent |
iam:ListPolicyVersions |
✅ | ❌ | Managed policy version list; no MinIO equivalent |
iam:CreateServiceAccount |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct add |
iam:DeleteServiceAccount |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct rm |
iam:GetServiceAccount |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct info |
iam:ListServiceAccounts |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct ls |
iam:UpdateServiceAccount |
✅ | ⚠️ Proprietary | MinIO: mc admin user svcacct edit |
iam:TagUser |
✅ | ❌ | Add tags to a user; AWS limits (50 tags, key 1-128, value 0-256) enforced |
iam:UntagUser |
✅ | ❌ | Remove tags from a user |
iam:ListUserTags |
✅ | ❌ | List tags on a user |
iam:GetAccessKeyLastUsed |
📋 Planned | ❌ | Return when an access key was last used |
Introduction
- Quick Start with weed mini
- Simplest S3 Bucket and User Setup
- Components
- Getting Started
- Production Setup
- A typical step‐by‐step example
- Benchmarks
- FAQ
- Applications
API
Configuration
- Replication
- Store file with a Time To Live
- Failover Master Server
- Erasure coding for warm storage
- EC Bitrot Detection
- Server Startup via Systemd
- Environment Variables
Filer
- Filer Setup
- Directories and Files
- File Operations Quick Reference
- Data Structure for Large Files
- Filer Data Encryption
- Filer Commands and Operations
- Filer JWT Use
- TUS Resumable Uploads
Filer Stores
- Filer Cassandra Setup
- Filer Redis Setup
- Super Large Directories
- Path-Specific Filer Store
- Choosing a Filer Store
- Customize Filer Store
Management
Advanced Filer Configurations
- Migrate to Filer Store
- Add New Filer Store
- Filer Store Replication
- Filer Active Active cross cluster continuous synchronization
- Filer as a Key-Large-Value Store
- Path Specific Configuration
- Filer Change Data Capture
- Filer Operation Serialization
FUSE Mount
- FIO benchmark
- fstab and systemd mount
- POSIX Compliance
- Distributed POSIX Locks
- P2P reading in weed mount
WebDAV
SFTP Server
Cloud Drive
- Cloud Drive Benefits
- Cloud Drive Architecture
- Configure Remote Storage
- Mount Remote Storage
- Cache Remote Storage
- Cloud Drive Quick Setup
- Gateway to Remote Object Storage
AWS S3 API
- Amazon S3 API
- Supported APIs vs Minio
- S3 Lifecycle
- S3 Lifecycle vs Volume TTL
- S3 Conditional Operations
- S3 CORS
- S3 Object Lock and Retention
- S3 Object Versioning
- S3 API Benchmark
- S3 API FAQ
- S3 Bucket Quota
- S3 Rate Limiting
- S3 API Audit log
- S3 Nginx Proxy
- Docker Compose for S3
S3 Table Bucket
- S3 Table Bucket
- S3 Table Bucket Commands
- S3 Tables Security
- SeaweedFS Iceberg Catalog
- Iceberg Table Maintenance
Iceberg Integrations
- Spark Iceberg Integration
- Trino Iceberg Integration
- Dremio Iceberg Integration
- DuckDB Iceberg Integration
- Doris Iceberg Integration
- RisingWave Iceberg Integration
- Lakekeeper Iceberg Integration
S3 Authentication & IAM
- S3 Configuration - Start Here
- S3 Credentials (
-s3.config) - OIDC Integration (
-s3.iam.config) - Kubernetes ServiceAccount Authentication (IRSA-style)
- S3 Policy Variables
- S3 Policy Conditions
- S3 Bucket Policies
- Amazon IAM API
- AWS IAM CLI
- weed shell - Shell IAM Commands
Server-Side Encryption
S3 Client Tools
- AWS CLI with SeaweedFS
- s3cmd with SeaweedFS
- rclone with SeaweedFS
- restic with SeaweedFS
- nodejs with Seaweed S3
Machine Learning
HDFS
- Hadoop Compatible File System
- run Spark on SeaweedFS
- run HBase on SeaweedFS
- run Presto on SeaweedFS
- Hadoop Benchmark
- HDFS via S3 connector
Replication and Backup
- Async Replication to another Filer [Deprecated]
- Async Backup
- Async Filer Metadata Backup
- Async Replication to Cloud [Deprecated]
- Kubernetes Backups and Recovery with K8up
Metadata Change Events
Messaging
- Structured Data Lake with SMQ and SQL
- Seaweed Message Queue
- SQL Queries on Message Queue
- SQL Quick Reference
- PostgreSQL-compatible Server weed db
- Pub-Sub to SMQ to SQL
- Kafka to Kafka Gateway to SMQ to SQL
Use Cases
Operations
- System Metrics
- weed shell
- Data Backup
- Deployment to Kubernetes and Minikube
- Deployment with seaweed-up
Rust Volume Server
Advanced
- Large File Handling
- Optimization
- Optimization for Many Small Buckets
- Volume Management
- Tiered Storage
- Cloud Tier
- Cloud Monitoring
- Load Command Line Options from a file
- SRV Service Discovery
- Volume Files Structure
Security
- Security Overview
- Security Configuration
- Cryptography and FIPS Compliance
- Run Blob Storage on Public Internet