Tools: MinIO Has a Free API — S3-Compatible Object Storage You Can Self-Host (2026)

Tools: MinIO Has a Free API — S3-Compatible Object Storage You Can Self-Host (2026)

AWS S3 API, But Free and On Your Server

Setup (Docker)

Python (boto3 — Same as AWS S3!)

JavaScript

Real Use Cases

MinIO vs AWS S3 MinIO is S3-compatible object storage you can run anywhere. Same API as AWS S3, but free and open-source. Dashboard at localhost:9001. API at localhost:9000. Same code works with AWS S3 — just change the endpoint_url. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Command

Copy

$ -weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001" -weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001" -weight: 500;">docker run -p 9000:9000 -p 9001:9001 \ -e MINIO_ROOT_USER=admin \ -e MINIO_ROOT_PASSWORD=password123 \ minio/minio server /data --console-address ":9001" import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket s3.create_bucket(Bucket="my-files") # Upload s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes") import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket s3.create_bucket(Bucket="my-files") # Upload s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes") import boto3 s3 = boto3.client("s3", endpoint_url="http://localhost:9000", aws_access_key_id="admin", aws_secret_access_key="password123") # Create bucket s3.create_bucket(Bucket="my-files") # Upload s3.upload_file("report.pdf", "my-files", "reports/2026/report.pdf") # Download s3.download_file("my-files", "reports/2026/report.pdf", "downloaded.pdf") # List objects for obj in s3.list_objects_v2(Bucket="my-files")["Contents"]: print(f"{obj[Key]}: {obj[Size]} bytes") import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true }); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World" })); import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true }); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World" })); import { S3Client, PutObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3"; const s3 = new S3Client({ endpoint: "http://localhost:9000", region: "us-east-1", credentials: { accessKeyId: "admin", secretAccessKey: "password123" }, forcePathStyle: true }); await s3.send(new PutObjectCommand({ Bucket: "my-files", Key: "hello.txt", Body: "Hello World" })); - Development/testing without AWS costs - On-premises file storage for regulated industries - Backup target for databases - Media storage for self-hosted apps - Data lake for analytics