Skip to main content

Overview

By default, Tornado uploads files to our managed storage. You can configure your own S3-compatible bucket to receive downloads directly.

Supported Providers

ProviderEndpoint Format
AWS S3https://s3.{region}.amazonaws.com
Cloudflare R2https://{account_id}.r2.cloudflarestorage.com
MinIOhttps://your-minio-server.com
DigitalOcean Spaceshttps://{region}.digitaloceanspaces.com
Backblaze B2https://s3.{region}.backblazeb2.com

Configure Your Bucket

Use the /user/bucket endpoint to set your S3 configuration:
curl -X POST "https://tornado.velys.software/user/bucket" \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "endpoint": "https://s3.us-east-1.amazonaws.com",
    "bucket": "my-tornado-downloads",
    "region": "us-east-1",
    "access_key": "AKIAIOSFODNN7EXAMPLE",
    "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
  }'

Response

{
  "message": "Bucket configuration updated successfully"
}
Your credentials are verified before saving. The endpoint must be accessible and credentials must have write permissions.

Required Permissions

Your IAM user/role needs these permissions:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-tornado-downloads",
        "arn:aws:s3:::my-tornado-downloads/*"
      ]
    }
  ]
}

Cloudflare R2 Setup

1

Create R2 Bucket

In Cloudflare dashboard, go to R2 and create a new bucket.
2

Create API Token

Create an R2 API token with “Object Read & Write” permissions.
3

Get Account ID

Find your Account ID in the Cloudflare dashboard URL or overview page.
4

Configure Tornado

curl -X POST "https://tornado.velys.software/user/bucket" \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "endpoint": "https://YOUR_ACCOUNT_ID.r2.cloudflarestorage.com",
    "bucket": "my-downloads",
    "region": "auto",
    "access_key": "YOUR_R2_ACCESS_KEY_ID",
    "secret_key": "YOUR_R2_SECRET_ACCESS_KEY"
  }'

AWS S3 Setup

1

Create S3 Bucket

Create a bucket in the AWS Console with default settings.
2

Create IAM User

Create an IAM user with programmatic access and the permissions above.
3

Configure Tornado

curl -X POST "https://tornado.velys.software/user/bucket" \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "endpoint": "https://s3.us-west-2.amazonaws.com",
    "bucket": "my-tornado-bucket",
    "region": "us-west-2",
    "access_key": "AKIAIOSFODNN7EXAMPLE",
    "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
  }'

File Organization

Downloaded files are organized in your bucket:
my-tornado-downloads/
├── video-title-1.mp4
├── video-title-2.mp4
└── my-folder/           # When using folder parameter
    ├── episode-1.mp4
    ├── episode-2.mp4
    └── ...

Presigned URLs

When you poll job status, the s3_url returned is a presigned URL generated for your bucket:
{
  "status": "Completed",
  "s3_url": "https://my-bucket.s3.amazonaws.com/video.mp4?X-Amz-Algorithm=..."
}
The presigned URL is valid for 24 hours.

Reset to Default

To switch back to our managed storage, contact support to reset your bucket configuration.

Troubleshooting

ErrorCauseSolution
Verification failed: Access DeniedInvalid credentialsVerify access key and secret key
Verification failed: NoSuchBucketBucket doesn’t existCreate the bucket first
Verification failed: timeoutEndpoint unreachableCheck endpoint URL format