HomeAPI Documentation

API Documentation

CloudStorage provides a fully S3-compatible API. Use your existing tools, SDKs, and workflows with a single endpoint change.

Quickstart

Get up and running in under two minutes.

1

Create an account

Sign up at cloudstorage.io/signup. You will receive your first S3 access key and a default bucket automatically.

2

Configure your client

Point any S3-compatible client at our endpoint.

bash
aws configure
# Access Key ID: your-access-key
# Secret Access Key: your-secret-key
# Region: eu-central-1

# Set the endpoint for all commands
export AWS_ENDPOINT_URL=https://s3.cloudstorage.io
3

Upload your first file

Use any S3 operation you already know.

bash
aws s3 --endpoint-url https://s3.cloudstorage.io \
  cp ./my-file.txt s3://my-bucket/my-file.txt

Endpoint: https://s3.cloudstorage.io
Region: eu-central-1

Authentication

CloudStorage uses S3-compatible access keys for API authentication. Every request must be signed using AWS Signature Version 4.

Obtaining credentials

When you create an account, your first access key pair is generated automatically. You can create up to 5 access keys from the dashboard or via the API.

bash
# Create a new access key via the API
curl -X POST https://cloudstorage.io/api/keys \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{"name": "production-key"}'

# Response:
# {
#   "accessKey": "CS...",
#   "secretKey": "..."
# }

Managing keys

MethodEndpointDescription
GET/api/keysList all access keys
POST/api/keysCreate a new access key
DELETE/api/keys?id=xxxDelete an access key

Important: Secret keys are only shown once at creation time. Store them securely. If you lose a secret key, delete it and create a new one.

S3 Compatibility

CloudStorage supports the core S3 API operations. Our S3 proxy at https://s3.cloudstorage.io handles requests with automatic quota enforcement.

Supported operations

Bucket Operations

  • CreateBucket
  • DeleteBucket
  • HeadBucket
  • ListBuckets

Object Operations

  • PutObject
  • GetObject
  • DeleteObject
  • HeadObject
  • ListObjectsV2
  • CopyObject

Multipart Upload

  • CreateMultipartUpload
  • UploadPart
  • CompleteMultipartUpload
  • AbortMultipartUpload

Presigned

  • Presigned GET
  • Presigned PUT

Compatible tools

Any tool that supports a custom S3 endpoint will work. Verified compatibility includes:

AWS CLIboto3AWS SDK for JSAWS SDK for GorcloneMinIO ClientCyberducks3cmdTerraform S3 backend

Code Examples

Integrate CloudStorage into your application using any S3-compatible SDK.

Client setup

python
import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://s3.cloudstorage.io",
    region_name="eu-central-1",
    aws_access_key_id="YOUR_ACCESS_KEY",
    aws_secret_access_key="YOUR_SECRET_KEY",
)

# Upload a file
s3.upload_file("local-file.txt", "my-bucket", "remote-file.txt")

# Download a file
s3.download_file("my-bucket", "remote-file.txt", "downloaded.txt")

# List objects
response = s3.list_objects_v2(Bucket="my-bucket")
for obj in response.get("Contents", []):
    print(obj["Key"], obj["Size"])

Bucket Operations

Buckets are the top-level containers for your objects. You can create up to 10 buckets per account. Buckets can also be managed through the dashboard API.

Create a bucket

python
s3.create_bucket(
    Bucket="my-new-bucket",
    CreateBucketConfiguration={"LocationConstraint": "eu-central-1"},
)

List buckets

python
response = s3.list_buckets()
for bucket in response["Buckets"]:
    print(bucket["Name"], bucket["CreationDate"])

Delete a bucket

bash
# Bucket must be empty before deletion
aws s3 rb s3://my-bucket --endpoint-url https://s3.cloudstorage.io

# Force delete (removes all objects first)
aws s3 rb s3://my-bucket --force --endpoint-url https://s3.cloudstorage.io

Object Operations

Objects are the files stored in your buckets. There is no individual object size limit beyond your plan quota. Large files are automatically handled via multipart upload by most SDKs.

Put object

python
# Upload from file
s3.upload_file("local-file.txt", "my-bucket", "path/to/file.txt")

# Upload from bytes
s3.put_object(
    Bucket="my-bucket",
    Key="hello.txt",
    Body=b"Hello, CloudStorage!",
    ContentType="text/plain",
)

Get object

python
# Download to file
s3.download_file("my-bucket", "path/to/file.txt", "local-file.txt")

# Read into memory
response = s3.get_object(Bucket="my-bucket", Key="hello.txt")
data = response["Body"].read()
print(data.decode("utf-8"))

Delete object

python
s3.delete_object(Bucket="my-bucket", Key="path/to/file.txt")

List objects

python
# List all objects
response = s3.list_objects_v2(Bucket="my-bucket")
for obj in response.get("Contents", []):
    print(f"{obj['Key']:40s} {obj['Size']:>10d} bytes")

# List with prefix (like a directory)
response = s3.list_objects_v2(Bucket="my-bucket", Prefix="data/2025/")
for obj in response.get("Contents", []):
    print(obj["Key"])

# Paginate through many objects
paginator = s3.get_paginator("list_objects_v2")
for page in paginator.paginate(Bucket="my-bucket"):
    for obj in page.get("Contents", []):
        print(obj["Key"])

Presigned URLs

Generate temporary URLs that allow anyone to download or upload objects without needing credentials. Useful for sharing files, enabling direct browser uploads, or integrating with third-party services.

Generate a presigned download URL

python
# Generate a URL valid for 1 hour (3600 seconds)
url = s3.generate_presigned_url(
    "get_object",
    Params={"Bucket": "my-bucket", "Key": "report.pdf"},
    ExpiresIn=3600,
)
print(url)
# https://s3.cloudstorage.io/my-bucket/report.pdf?X-Amz-Algorithm=...

Generate a presigned upload URL

python
# Generate a URL that allows uploading
url = s3.generate_presigned_url(
    "put_object",
    Params={
        "Bucket": "my-bucket",
        "Key": "uploads/user-file.jpg",
        "ContentType": "image/jpeg",
    },
    ExpiresIn=600,  # 10 minutes
)

# Client can then upload with:
# curl -X PUT -H "Content-Type: image/jpeg" --data-binary @photo.jpg "URL"

Note: Presigned URLs respect your storage quota. Uploads via presigned URLs that would exceed your plan limit will be rejected with a 403 error.

Rate Limits

CloudStorage applies rate limits to ensure fair usage across all users.

Operation TypeLimitWindow
PUT / POST / DELETE100 requestsper second
GET / HEAD300 requestsper second
LIST50 requestsper second
Dashboard API30 requestsper minute

When rate limited, the API returns 429 Too Many Requests with a Retry-After header. Most S3 SDKs handle retry logic automatically.

Error Codes

CloudStorage returns standard S3-compatible error codes. Below are the most common ones you may encounter.

HTTP CodeErrorDescription
400InvalidBucketNameBucket name does not meet naming requirements.
403AccessDeniedInvalid credentials or accessing another user's resources.
403QuotaExceededUpload would exceed your plan's storage quota. Upgrade your plan or delete existing data.
404NoSuchKeyThe requested object does not exist.
404NoSuchBucketThe specified bucket does not exist.
409BucketAlreadyExistsA bucket with that name already exists in your account.
409BucketNotEmptyCannot delete a bucket that still contains objects.
429TooManyRequestsRate limit exceeded. Retry after the duration in the Retry-After header.
500InternalErrorAn unexpected error occurred. Retry with exponential backoff.

Tip: All error responses include an XML body with Code, Message, and RequestId fields, matching the standard S3 error response format. Include the RequestId when contacting support.

Simple REST API

For simpler use cases where you don't need full S3 compatibility, CloudStorage offers a straightforward REST API. No SDK required -- just standard HTTP requests with an API key header.

Authentication

Authenticate requests using your access key and secret key in either of these formats:

bash
# Option 1: X-API-Key header
curl https://cloudstorage.io/api/v1/files \
  -H "X-API-Key: YOUR_ACCESS_KEY:YOUR_SECRET_KEY"

# Option 2: Bearer token
curl https://cloudstorage.io/api/v1/files \
  -H "Authorization: Bearer YOUR_ACCESS_KEY:YOUR_SECRET_KEY"

Endpoints

MethodEndpointDescription
POST/api/v1/filesUpload a file (multipart form-data or raw body)
GET/api/v1/filesList files (?prefix=, ?limit=, ?bucket=)
GET/api/v1/files/{id}Download a file
GET/api/v1/files/{id}?meta=trueGet file metadata only
DELETE/api/v1/files/{id}Delete a file

Upload a file

bash
# Upload using multipart form-data (file field)
curl -X POST https://cloudstorage.io/api/v1/files \
  -H "X-API-Key: YOUR_ACCESS_KEY:YOUR_SECRET_KEY" \
  -F "[email protected]"

# Response:
# {
#   "id": "abc123",
#   "key": "photo.jpg",
#   "bucket": "default",
#   "size": 204800,
#   "contentType": "image/jpeg",
#   "createdAt": "2026-01-15T10:30:00Z"
# }

List files

bash
curl "https://cloudstorage.io/api/v1/files?prefix=photos/&limit=20&bucket=my-bucket" \
  -H "X-API-Key: YOUR_ACCESS_KEY:YOUR_SECRET_KEY"

# Response:
# {
#   "files": [
#     { "id": "abc123", "key": "photos/cat.jpg", "size": 102400, "contentType": "image/jpeg", "updatedAt": "2026-01-15T10:30:00Z" },
#     { "id": "def456", "key": "photos/dog.png", "size": 204800, "contentType": "image/png", "updatedAt": "2026-01-16T08:15:00Z" }
#   ],
#   "hasMore": false
# }

Download and metadata

bash
# Download a file by ID
curl https://cloudstorage.io/api/v1/files/abc123 \
  -H "X-API-Key: YOUR_ACCESS_KEY:YOUR_SECRET_KEY" \
  -o downloaded-file.jpg

Delete a file

bash
curl -X DELETE https://cloudstorage.io/api/v1/files/abc123 \
  -H "X-API-Key: YOUR_ACCESS_KEY:YOUR_SECRET_KEY"

# Response:
# { "success": true }

File Sharing

Share files with anyone using short vanity URLs. Upload a file and get a link like cloudstorage.io/s/abc123 that anyone can use to download it. Optionally add password protection, expiry times, and download limits.

File sharing is also available from the dashboard UI via the Share button on any file.

Sharing options

Password Protection

Require a password before the file can be downloaded.

Expiry

Auto-expire links after 1 hour, 24 hours, 7 days, or 30 days.

Download Limits

Set a maximum number of downloads before the link is disabled.

API endpoints

MethodEndpointDescription
POST/api/shares/uploadUpload file directly for sharing (multipart, session auth)
POST/api/sharesCreate share link for an existing file
GET/api/sharesList your share links
DELETE/api/shares?id=xxxDeactivate a share link
GET/api/shares/download?code=xxxPublic download (no auth required)

Create a share link

bash
# Upload a file and create a share link
curl -X POST https://cloudstorage.io/api/shares/upload \
  -H "Cookie: session=your-session-cookie" \
  -F "[email protected]"

# Or create a share link for an existing file
curl -X POST https://cloudstorage.io/api/shares \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{
    "fileName": "presentation.pdf",
    "fileSize": 5242880,
    "bucket": "my-bucket",
    "objectKey": "docs/presentation.pdf",
    "password": "secret123",
    "expiresIn": "7d",
    "maxDownloads": 50
  }'

# Response:
# {
#   "id": "share_abc123",
#   "code": "abc123",
#   "url": "https://cloudstorage.io/s/abc123",
#   "expiresAt": "2026-01-22T10:30:00Z",
#   "maxDownloads": 50
# }

List and manage shares

bash
curl https://cloudstorage.io/api/shares \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "shares": [
#     {
#       "id": "share_abc123",
#       "code": "abc123",
#       "fileName": "presentation.pdf",
#       "downloads": 12,
#       "maxDownloads": 50,
#       "expiresAt": "2026-01-22T10:30:00Z",
#       "active": true
#     }
#   ]
# }

Image Transformations

Transform images on the fly via URL parameters. Resize, convert formats, apply effects, and optimize images without any preprocessing pipeline. A self-hosted alternative to Cloudinary or imgix.

Endpoint: /api/img/{bucket}/{path}?params
Cache: Transformed images are cached for 7 days.
Auto-format: Automatically serves WebP or AVIF when the browser supports it via Accept header detection.

Parameters

ParamDescriptionExample
wWidth in pixelsw=400
hHeight in pixelsh=300
fitResize mode: fit, fill, cover, contain, crop, padfit=cover
formatOutput format: webp, avif, jpeg, pngformat=webp
qQuality (1-100)q=80
blurGaussian blur radiusblur=10
sharpenSharpen amountsharpen=2
rotateRotation in degreesrotate=90
gravityCrop anchor: ce (center), sm (smart), no, so, ea, wegravity=sm
dprDevice pixel ratio multiplierdpr=2

Examples

bash
# Generate a 200x200 cover thumbnail with smart cropping
curl "https://cloudstorage.io/api/img/my-bucket/photos/hero.jpg?w=200&h=200&fit=cover&gravity=sm"

# Use in an HTML img tag:
# <img src="https://cloudstorage.io/api/img/my-bucket/photos/hero.jpg?w=200&h=200&fit=cover" />

Webhooks

Configure webhook endpoints to receive real-time notifications when events happen in your storage account. Webhooks are delivered via HTTPS POST requests with JSON payloads.

Supported events

Object Events

  • object.created
  • object.deleted
  • object.updated

Bucket Events

  • bucket.created
  • bucket.deleted

Quota Events

  • quota.warning
  • quota.exceeded

Other Events

  • key.created
  • key.revoked
  • share.created
  • share.downloaded

API endpoints

MethodEndpointDescription
POST/api/webhooksCreate a webhook endpoint
GET/api/webhooksList your webhooks
PATCH/api/webhooksUpdate webhook (toggle active, change events)
DELETE/api/webhooks?id=xxxDelete a webhook

Create a webhook

bash
curl -X POST https://cloudstorage.io/api/webhooks \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{
    "url": "https://your-app.com/webhooks/cloudstorage",
    "events": ["object.created", "object.deleted", "quota.warning"]
  }'

# Response:
# {
#   "id": "wh_abc123",
#   "url": "https://your-app.com/webhooks/cloudstorage",
#   "events": ["object.created", "object.deleted", "quota.warning"],
#   "secret": "whsec_...",
#   "active": true,
#   "createdAt": "2026-01-15T10:30:00Z"
# }

Payload format

Each webhook delivery is a POST request with a JSON body:

json
{
  "event": "object.created",
  "timestamp": "2026-01-15T10:30:00Z",
  "data": {
    "bucket": "my-bucket",
    "key": "uploads/photo.jpg",
    "size": 204800,
    "contentType": "image/jpeg"
  }
}

Signature verification

Every webhook request includes an X-CloudStorage-Signature header containing an HMAC-SHA256 signature. Verify it using the secret returned when creating the webhook.

javascript
import crypto from "crypto";

function verifyWebhook(payload, signature, secret) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

// In your webhook handler:
app.post("/webhooks/cloudstorage", (req, res) => {
  const signature = req.headers["x-cloudstorage-signature"];
  const isValid = verifyWebhook(JSON.stringify(req.body), signature, WEBHOOK_SECRET);
  if (!isValid) return res.status(401).send("Invalid signature");
  // Process event...
  res.status(200).send("OK");
});

Reliability: Failed deliveries are retried up to 3 times with exponential backoff. Webhooks are automatically disabled after 10 consecutive failures. Re-enable them from the dashboard or via the PATCH endpoint.

File Versioning

Time Machine for your files. Every time you overwrite a file, the previous version is automatically preserved. Browse version history, compare changes, and restore any previous version with a single click or API call.

Also available via the Time Machine UI in the dashboard -- select any file and browse its full version history.

API endpoints

MethodEndpointDescription
POST/api/versionsUpload a new version (multipart: file, bucket, key)
GET/api/versions?bucket=xList all versioned files in a bucket
GET/api/versions?bucket=x&key=yList all versions of a specific file
PATCH/api/versionsRestore a previous version

Upload a new version

bash
curl -X POST https://cloudstorage.io/api/versions \
  -H "Cookie: session=your-session-cookie" \
  -F "[email protected]" \
  -F "bucket=my-bucket" \
  -F "key=docs/report.pdf"

# Response:
# {
#   "versionId": "ver_abc123",
#   "key": "docs/report.pdf",
#   "bucket": "my-bucket",
#   "size": 524288,
#   "versionNumber": 3,
#   "createdAt": "2026-01-15T10:30:00Z"
# }

List versions

bash
# List all versions of a specific file
curl "https://cloudstorage.io/api/versions?bucket=my-bucket&key=docs/report.pdf" \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "versions": [
#     { "versionId": "ver_abc123", "versionNumber": 3, "size": 524288, "createdAt": "2026-01-15T10:30:00Z", "isCurrent": true },
#     { "versionId": "ver_def456", "versionNumber": 2, "size": 412672, "createdAt": "2026-01-10T14:20:00Z", "isCurrent": false },
#     { "versionId": "ver_ghi789", "versionNumber": 1, "size": 307200, "createdAt": "2026-01-05T09:00:00Z", "isCurrent": false }
#   ]
# }

Restore a version

bash
# Restore a previous version (makes it the current version)
curl -X PATCH https://cloudstorage.io/api/versions \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "versionId": "ver_def456" }'

# Response:
# {
#   "success": true,
#   "restoredVersion": "ver_def456",
#   "newVersionNumber": 4
# }

Retention policy

Max Versions

Up to 10 versions are kept per file by default. Oldest versions are pruned when the limit is exceeded.

Max Age

Versions older than 30 days are automatically cleaned up by default. Both limits are configurable.

Tip: Version storage counts toward your plan quota. Monitor usage in the dashboard to avoid unexpected overages.

SFTP Access

Access your CloudStorage files over SFTP. SFTP access is opt-in and uses a separate password that you configure via the API. Once enabled, the same data is accessible via S3, REST API, and SFTP.

Enable SFTP

Enable SFTP access by setting a password (minimum 8 characters). Requires session authentication.

bash
# Enable SFTP access
curl -X POST https://cloudstorage.io/api/sftp \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "password": "your-sftp-password" }'

# Response:
# {
#   "enabled": true,
#   "username": "user_abc123",
#   "host": "sftp.cloudstorage.io",
#   "port": 2022
# }

Check SFTP status

bash
# Check if SFTP is enabled and get connection details
curl https://cloudstorage.io/api/sftp \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "enabled": true,
#   "username": "user_abc123",
#   "host": "sftp.cloudstorage.io",
#   "port": 2022
# }

Disable SFTP

bash
# Disable SFTP access
curl -X DELETE https://cloudstorage.io/api/sftp \
  -H "Cookie: session=your-session-cookie"

# Response:
# { "enabled": false }

Connecting via SFTP

Use any SFTP client to connect with the credentials returned by the API.

bash
# Connect using the sftp command
sftp -P 2022 [email protected]

# Or use the sftp:// URI
sftp://[email protected]:2022

# List your buckets
sftp> ls

# Navigate into a bucket and list files
sftp> cd my-bucket
sftp> ls

# Upload a file
sftp> put local-file.txt remote-file.txt

# Download a file
sftp> get remote-file.txt local-file.txt

Connection details: Host: sftp.cloudstorage.io Port: 2022

Billing API

Manage subscriptions, change plans, and access invoices programmatically through the Billing API. All billing endpoints require session authentication.

Plans

1 TB

$5/mo

Plan name: 1tb

5 TB

$25/mo

Plan name: 5tb

10 TB

$50/mo

Plan name: 10tb

25 TB

$125/mo

Plan name: 25tb

50 TB

$250/mo

Plan name: 50tb

Create checkout session

Start a new subscription by creating a Stripe checkout session.

bash
# Create a checkout session for a plan
curl -X POST https://cloudstorage.io/api/billing \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "planName": "5tb" }'

# Response:
# {
#   "url": "https://checkout.stripe.com/c/pay/cs_live_..."
# }

Change plan

Upgrades are applied immediately with prorated billing. Downgrades take effect at the end of the current billing period.

bash
# Change to a different plan
curl -X POST https://cloudstorage.io/api/billing/change \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "planName": "10tb" }'

# Response (upgrade - immediate):
# {
#   "success": true,
#   "effective": "immediate",
#   "prorated": true
# }

# Response (downgrade - end of period):
# {
#   "success": true,
#   "effective": "end_of_period",
#   "currentPeriodEnd": "2026-05-01T00:00:00Z"
# }

Billing portal

Get a link to the Stripe billing portal where users can view invoices and cancel their subscription.

bash
# Get Stripe billing portal URL
curl -X POST https://cloudstorage.io/api/billing/portal \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "url": "https://billing.stripe.com/p/session/..."
# }

Billing details

Retrieve full billing details including subscription status, invoices, upcoming invoice, and payment method.

bash
# Get billing details
curl https://cloudstorage.io/api/billing/details \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "subscription": {
#     "plan": "5tb",
#     "status": "active",
#     "currentPeriodEnd": "2026-05-01T00:00:00Z"
#   },
#   "invoices": [
#     { "id": "inv_abc123", "amount": 2500, "status": "paid", "date": "2026-04-01" }
#   ],
#   "upcomingInvoice": {
#     "amount": 2500,
#     "date": "2026-05-01"
#   },
#   "paymentMethod": {
#     "type": "card",
#     "last4": "4242",
#     "brand": "visa"
#   }
# }

Teams API

Create and manage teams to collaborate on shared buckets. Invite members with role-based access control.

List teams

bash
# List all teams you belong to
curl https://cloudstorage.io/api/teams \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "teams": [
#     { "id": "team_abc123", "name": "Engineering", "role": "admin", "memberCount": 5, "bucketCount": 3 }
#   ]
# }

Create team

bash
# Create a new team
curl -X POST https://cloudstorage.io/api/teams \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "name": "Engineering" }'

# Response:
# {
#   "id": "team_abc123",
#   "name": "Engineering",
#   "createdAt": "2026-04-01T12:00:00Z"
# }

Manage team

Use PATCH with different actions to manage team buckets and members.

bash
# Add a bucket to the team
curl -X PATCH https://cloudstorage.io/api/teams \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "teamId": "team_abc123", "action": "add_bucket", "bucketName": "shared-assets" }'

# Remove a bucket from the team
curl -X PATCH https://cloudstorage.io/api/teams \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "teamId": "team_abc123", "action": "remove_bucket", "bucketName": "shared-assets" }'

# Remove a member from the team
curl -X PATCH https://cloudstorage.io/api/teams \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "teamId": "team_abc123", "action": "remove_member", "userId": "user_def456" }'

# Change a member's role
curl -X PATCH https://cloudstorage.io/api/teams \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "teamId": "team_abc123", "action": "change_role", "userId": "user_def456", "role": "write" }'

Delete team

bash
# Delete a team
curl -X DELETE "https://cloudstorage.io/api/teams?id=team_abc123" \
  -H "Cookie: session=your-session-cookie"

# Response:
# { "success": true }

Invite member

Invite a user by email. Available roles are admin, write, and read.

bash
# Invite a member to the team
curl -X POST https://cloudstorage.io/api/teams/invite \
  -H "Content-Type: application/json" \
  -H "Cookie: session=your-session-cookie" \
  -d '{ "teamId": "team_abc123", "email": "[email protected]", "role": "write" }'

# Response:
# {
#   "inviteId": "inv_xyz789",
#   "email": "[email protected]",
#   "role": "write",
#   "expiresAt": "2026-04-08T12:00:00Z"
# }

List invites

bash
# List pending invites for a team
curl "https://cloudstorage.io/api/teams/invite?teamId=team_abc123" \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "invites": [
#     { "inviteId": "inv_xyz789", "email": "[email protected]", "role": "write", "expiresAt": "2026-04-08T12:00:00Z" }
#   ]
# }

Accept invite

bash
# Accept a team invite using the token from the invite email
curl "https://cloudstorage.io/api/teams/accept?token=invite_token_here" \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "success": true,
#   "teamId": "team_abc123",
#   "teamName": "Engineering",
#   "role": "write"
# }

Roles: admin can manage members and buckets, write can upload and modify files, read can only view and download files.

Storage Explorer API

Browse bucket contents programmatically. Returns files with sizes, types, and directory structure. Also available via the visual explorer in the dashboard.

List bucket contents

Use the bucket parameter to specify which bucket to browse, and the optional prefix parameter to navigate into subdirectories.

bash
# List root contents of a bucket
curl "https://cloudstorage.io/api/explorer?bucket=my-bucket" \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "files": [
#     { "key": "documents/", "type": "directory" },
#     { "key": "logo.png", "type": "file", "size": 24576, "contentType": "image/png", "lastModified": "2026-03-15T10:00:00Z" }
#   ],
#   "prefix": "",
#   "bucket": "my-bucket"
# }
bash
# List contents of a subdirectory
curl "https://cloudstorage.io/api/explorer?bucket=my-bucket&prefix=documents/" \
  -H "Cookie: session=your-session-cookie"

# Response:
# {
#   "files": [
#     { "key": "documents/reports/", "type": "directory" },
#     { "key": "documents/readme.txt", "type": "file", "size": 1024, "contentType": "text/plain", "lastModified": "2026-03-20T14:30:00Z" },
#     { "key": "documents/spec.pdf", "type": "file", "size": 512000, "contentType": "application/pdf", "lastModified": "2026-03-22T09:15:00Z" }
#   ],
#   "prefix": "documents/",
#   "bucket": "my-bucket"
# }

Tip: The Storage Explorer is also available as a visual file browser in the dashboard. Use the API for programmatic access or integration into your own tools.

Ready to get started?

Create your account and get S3 credentials in seconds.

Sign Up Free