Use your buckets with S3 tools and SDKs: the aws cli, rclone, boto3 and the AWS SDK for JavaScript.
Every project has an S3-compatible endpoint next to the Storage API. Files you put there are the same files you see in Studio and through the SDKs.
#Endpoint and keys
Create an access key in Studio under Storage → S3 access. The secret is shown once. Then use:
Endpoint: https://<ref>.p.stitchdb.com/storage/v1/s3
Region: the one shown in Studio (us-east-1 and auto work too)
Addressing: path-styleAccess keys can read and write every bucket and skip your storage policies, like the service_role key. Keep them on servers and in backup tools, never in an app. A project can have up to 10 keys; deleting one stops it right away.
#aws cli
aws configure set aws_access_key_id <access key id> --profile stitchdb
aws configure set aws_secret_access_key <secret> --profile stitchdb
aws configure set region us-east-1 --profile stitchdb
aws s3 ls --profile stitchdb --endpoint-url https://<ref>.p.stitchdb.com/storage/v1/s3
aws s3 cp ./backup.tar.gz s3://backups/2026/ --profile stitchdb --endpoint-url https://<ref>.p.stitchdb.com/storage/v1/s3#JavaScript (AWS SDK v3)
import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3'
const s3 = new S3Client({
endpoint: 'https://<ref>.p.stitchdb.com/storage/v1/s3',
region: 'us-east-1',
forcePathStyle: true,
credentials: { accessKeyId: process.env.S3_KEY_ID, secretAccessKey: process.env.S3_SECRET },
})
await s3.send(new PutObjectCommand({ Bucket: 'avatars', Key: 'a.png', Body: file }))#Python (boto3)
import boto3
from botocore.config import Config
s3 = boto3.client('s3', endpoint_url='https://<ref>.p.stitchdb.com/storage/v1/s3', region_name='us-east-1',
aws_access_key_id=KEY_ID, aws_secret_access_key=SECRET,
config=Config(s3={'addressing_style': 'path'}))
s3.upload_file('report.pdf', 'docs', '2026/report.pdf')#rclone
[stitchdb]
type = s3
provider = Other
endpoint = https://<ref>.p.stitchdb.com/storage/v1/s3
access_key_id = <access key id>
secret_access_key = <secret>
region = us-east-1
force_path_style = true#As a signed-in user
To let a user's own S3 client in with your storage policies applied, sign with the project ref as access key ID, the anon key as secret, and the user's access token as session token:
const s3 = new S3Client({
endpoint: 'https://<ref>.p.stitchdb.com/storage/v1/s3', region: 'us-east-1', forcePathStyle: true,
credentials: { accessKeyId: '<ref>', secretAccessKey: ANON_KEY, sessionToken: session.access_token },
})#What works
Buckets (create, list, delete), objects (put, get, head, copy, delete, delete many, list v1 and v2), multipart uploads and presigned URLs. Uploads count against your file size and storage limits like any other upload. Not supported: versioning, object lock, bucket policies and ACLs (use storage policies instead).