Endpoint

https://<org-id>.buckets.excloud.in

Your org ID is shown in exc me. Every org gets its own subdomain — that’s how bucket name uniqueness is scoped.

Region

Pick any value; SDKs require one for signature calculation but the server doesn’t care. The recommended value is auto.

Signature

AWS Signature Version 4 (SigV4). Path-style and virtual-hosted-style addressing both work.

Supported operations

CategorySupported
Service / bucketListBuckets, HeadBucket, CreateBucket, DeleteBucket, GetBucketLocation, GetBucketAcl, PutBucketAcl
ObjectsGetObject, HeadObject, PutObject, DeleteObject, DeleteObjects (bulk), CopyObject, ListObjectsV2, ListObjectVersions
MultipartCreateMultipartUpload, UploadPart, UploadPartCopy, CompleteMultipartUpload, AbortMultipartUpload, ListMultipartUploads, ListParts
Presigned URLsYes (GET, PUT)
Range readsYes (Range: bytes=...)
Conditional requestsYes (If-Match, If-None-Match, If-Modified-Since)
Server-side encryptionYes (encryption at rest is on by default)

Not supported (yet)

  • S3 Object Lock / WORM
  • S3 Lifecycle policies (object expiry, transition)
  • Replication
  • Inventory
  • Event notifications
  • Static website hosting (use is_public=true + presigned URLs or a CDN in front)

If you need one of these, email support@excloud.dev.

SDK configuration examples

AWS CLI (~/.aws/config profile)

[profile excloud]
region = auto
endpoint_url = https://<org-id>.buckets.excloud.in

Or have exc write it for you:

exc buckets keys configure AKIA... --profile excloud

Then:

aws --profile excloud s3 ls
aws --profile excloud s3 cp ./file.txt s3://my-bucket/

boto3 (Python)

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://<org-id>.buckets.excloud.in",
    region_name="auto",
    aws_access_key_id="AKIA...",
    aws_secret_access_key="...",
)

Go (aws-sdk-go-v2)

cfg, err := config.LoadDefaultConfig(ctx,
    config.WithRegion("auto"),
    config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc(
        func(service, region string, opts ...interface{}) (aws.Endpoint, error) {
            return aws.Endpoint{
                URL: "https://<org-id>.buckets.excloud.in",
            }, nil
        },
    )),
)
client := s3.NewFromConfig(cfg)

Node.js (AWS SDK v3)

import { S3Client } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  region: "auto",
  endpoint: "https://<org-id>.buckets.excloud.in",
  forcePathStyle: false,
  credentials: {
    accessKeyId: "AKIA...",
    secretAccessKey: "...",
  },
});

rclone

[excloud]
type = s3
provider = Other
access_key_id = AKIA...
secret_access_key = ...
endpoint = https://<org-id>.buckets.excloud.in
region = auto

Sanity check

aws --endpoint-url https://<org-id>.buckets.excloud.in s3 ls

If credentials are correct you’ll see every bucket in your org. A 403 means the access key isn’t valid (or has been deleted); a network error means the endpoint URL is wrong.