S3 Compatible Storage

Store rendered files in your own S3 or Cloudflare R2 bucket

Updated

The Orshot S3 Compatible Storage integration allows you to store rendered files directly in your own Amazon S3 or Cloudflare R2 bucket. This gives you full control over your rendered content storage, enabling custom retention policies, access controls, and seamless integration with your existing cloud infrastructure.

Supported Providers#

  • Amazon S3 - AWS Simple Storage Service
  • Cloudflare R2 - S3-compatible object storage by Cloudflare

Connecting S3 Storage#

  1. In Orshot, open Integrations from the workspace sidebar
  2. Find S3 Storage and click Connect
  3. Under Storage Provider, pick AWS S3 or Cloudflare R2
  4. Enter your credentials:
    • S3 Endpoint or R2 Endpoint: Your S3/R2 endpoint URL
    • Access Key ID: Your access key
    • Secret Access Key: Your secret key
    • Bucket Name: The bucket where files will be stored
    • Folder Path: Default folder for renders (defaults to renders)
  5. Click Test Connection to verify your credentials
  6. Click Connect to save the configuration

Getting Your Credentials#

Amazon S3

  1. Go to AWS IAM Console
  2. Create a new IAM user or use an existing one
  3. Attach a policy with S3 permissions for your bucket:
JSON
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucket"],
      "Resource": [
        "arn:aws:s3:::your-bucket-name",
        "arn:aws:s3:::your-bucket-name/*"
      ]
    }
  ]
}
  1. Generate access keys for the user
  2. Your endpoint will be: https://s3.{region}.amazonaws.com (e.g., https://s3.us-east-1.amazonaws.com)

Cloudflare R2

  1. Go to Cloudflare Dashboard > R2
  2. Create a bucket if you haven't already
  3. Go to Manage R2 API Tokens and create a new API token
  4. Copy the Access Key ID and Secret Access Key
  5. Your endpoint will be: https://{account_id}.r2.cloudflarestorage.com

Using S3 Storage in API Requests#

While Automatic saving is on in the S3 settings, every render is uploaded to your bucket. You do not need to add connections to your API request.

To control the upload or set custom options, add the connections parameter to your render request.

JSON
{
  "templateId": 25,
  "modifications": {
    "headline": "Hello World"
  },
  "response": {
    "type": "url",
    "format": "png"
  },
  "connections": [
    {
      "type": "storage",
      "provider": "s3"
    }
  ]
}

Specifying a Custom Folder#

Override the default folder by specifying a folder path:

JSON
{
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "folder": "marketing/banners/2024"
    }
  ]
}

Custom File Names#

Use response.fileName to set a custom name for the uploaded file. Orshot keeps letters, numbers, - and _ (up to 50 characters) and adds a short random suffix so files never overwrite each other, for example marketing-banner-001-Ab12C.png. Without a name, files are called orshot-<templateId>-<date>-<suffix>.<ext>.

JSON
{
  "templateId": 25,
  "modifications": { "headline": "Hello" },
  "response": {
    "type": "url",
    "format": "png",
    "fileName": "marketing-banner-001"
  },
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "folder": "banners"
    }
  ]
}

API Response Examples#

Successful Upload#

JSON
{
  "data": {
    "content": "https://storage.orshot.com/cloud/w-50/renders/images/abc123.png",
    "type": "url",
    "format": "png",
    "responseTime": 1234.56
  },
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "path": "https://your-bucket.s3.us-east-1.amazonaws.com/renders/orshot-25-2026-10-27-Ab12C.png",
      "status": "success"
    }
  ]
}

For Amazon S3, path is the full object URL. For Cloudflare R2, path is the object key, for example renders/orshot-25-2026-10-27-Ab12C.png.

Multi-Page Upload#

When rendering multi-page templates, each page is uploaded separately:

JSON
{
  "data": [
    {
      "page": 1,
      "pageId": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
      "content": "https://storage.orshot.com/cloud/w-50/renders/images/abc123.png"
    },
    {
      "page": 2,
      "pageId": "b2c3d4e5-6f78-9012-bcde-f23456789012",
      "content": "https://storage.orshot.com/cloud/w-50/renders/images/def456.png"
    }
  ],
  "format": "png",
  "type": "url",
  "responseTime": 3166.01,
  "totalPages": 2,
  "renderedPages": 2,
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "path": [
        { "page": 1, "path": "https://your-bucket.s3.us-east-1.amazonaws.com/renders/orshot-25_page_1-2026-10-27-Ab12C.png" },
        { "page": 2, "path": "https://your-bucket.s3.us-east-1.amazonaws.com/renders/orshot-25_page_2-2026-10-27-Xy34Z.png" }
      ],
      "status": "success"
    }
  ]
}

Upload Failed (with Warning)#

Connection issues return warnings but don't block the render:

JSON
{
  "data": {
    "content": "https://storage.orshot.com/cloud/w-50/renders/images/abc123.png",
    "type": "url",
    "format": "png",
    "responseTime": 1234.56
  },
  "warnings": [
    {
      "title": "Failed to upload to s3: Access Denied",
      "details": ""
    }
  ],
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "path": null,
      "status": "error",
      "error": "Access Denied"
    }
  ]
}

S3 Not Connected#

JSON
{
  "data": {
    "content": "https://storage.orshot.com/cloud/w-50/renders/images/abc123.png",
    "type": "url",
    "format": "png",
    "responseTime": 1234.56
  },
  "warnings": [
    {
      "title": "Failed to upload to s3: S3 storage is not connected. Connect it in workspace settings.",
      "details": ""
    }
  ],
  "connections": [
    {
      "type": "storage",
      "provider": "s3",
      "path": null,
      "status": "error",
      "error": "S3 storage is not connected. Connect it in workspace settings."
    }
  ]
}

Connection Parameters#

ParameterTypeRequiredDescription
typestringNoOptional. Defaults to "storage"
providerstringYesMust be "s3"
folderstringNoCustom folder path. Uses default folder if not specified
disabledbooleanNoSet to true to skip this entry

Managing Your Connection#

Enable/Disable Sync#

You can temporarily pause S3 uploads without disconnecting:

  1. Open Integrations and click the gear icon on the S3 Storage card
  2. Turn Automatic saving off or on

Update Folder Path#

To change the default folder where renders are stored:

  1. Open Integrations and click the gear icon on the S3 Storage card
  2. Under Save renders to, click Change Folder
  3. Enter the new folder path
  4. Click Save

Edit Credentials#

If you need to update your S3 credentials:

  1. Open Integrations and click the gear icon on the S3 Storage card
  2. Click Edit Credentials
  3. Update the credentials
  4. Click Test Connection, then Save Changes

Notes#

  • Non-blocking: S3 upload failures won't block your render. You'll still get the image URL from Orshot's storage
  • Folder creation: Files are stored with the specified folder path as a prefix in the bucket
  • Supported formats: PNG, JPG, JPEG, WebP, AVIF, PDF, MP4, WebM, MOV, MKV, GIF
  • Permissions: Your key needs s3:PutObject to upload and s3:ListBucket for Test Connection

Need Help?#

  • Contact support at hi@orshot.com or use the chat button in your Orshot dashboard
Was this page helpful?

Ready to automate?

Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.

Get your API key
  • Image, PDF and video generation via API
  • Visual editor with AI and smart layouts
  • Zapier, Make, MCP and 40+ integrations
  • White-label embed for your own app
  • 100 free credits a month, no credit card required