You need the exc CLI installed and authenticated. See CLI Installation if you haven’t done that yet.

1. Create a bucket

exc buckets create my-first-bucket

Bucket names are unique per org. Use lowercase letters, numbers, and hyphens — same rules as S3.

2. Generate an S3 access key

exc buckets keys create laptop

Output:

ACCESS_KEY_ID: EXCEXCLOUDEXAMPLEKEY
SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

One-time secret

The secret is shown only once. If you lose it, delete the key and create a new one. Never commit either value to git.

Set them as environment variables for the rest of this guide:

export AWS_ACCESS_KEY_ID=EXCEXCLOUDEXAMPLEKEY
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
export AWS_REGION=auto

3. Upload an object

Using the AWS CLI

aws --endpoint-url https://buckets.excloud.dev \
  s3 cp ./hello.txt s3://my-first-bucket/hello.txt

The endpoint is the same for every org — your access key identifies which org you are.

Using the exc CLI

exc buckets objects upload my-first-bucket ./hello.txt --key hello.txt

Using boto3

import boto3
from botocore.config import Config

s3 = boto3.client(
    "s3",
    endpoint_url="https://buckets.excloud.dev",
    region_name="auto",
    config=Config(s3={"addressing_style": "path"}),  # path-style required
)

s3.upload_file("hello.txt", "my-first-bucket", "hello.txt")

4. Share

For a one-off, expiring URL:

exc buckets objects presign my-first-bucket hello.txt --ttl 3600

For a public object, flip the bucket to public and request the object’s public URL:

exc buckets update my-first-bucket --public true

Public objects are reachable at https://<org-id>.objects.excloud.dev/public/my-first-bucket/hello.txt (find your <org-id> with exc me).

5. Clean up

exc buckets objects delete my-first-bucket hello.txt
exc buckets delete         my-first-bucket
exc buckets keys delete    $AWS_ACCESS_KEY_ID

Where next