S3 Storage

S3-compatible storage operations — upload, download, list, delete, and presign objects in AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces, and other S3-compatible services.

When to Use

Use S3 Storage when you need object storage in a workflow:

  • Upload generated reports, exports, or user files to a bucket
  • Download file content for processing or transformation
  • List objects in a bucket (optionally filtered by prefix)
  • Delete objects when cleaning up temporary files
  • Generate time-limited presigned URLs for secure downloads

Connect an S3 Storage node to an AI Agent Tools handle to let the agent upload files, list bucket contents, or generate download links.

Inputs

HandleTypeDescription
inputanyUpstream data for {{ input.field }} template references in settings.

Output

HandleTypeDescription
resultobjectS3 operation result

The result (accessed as {{ s3.* }}) shape:

FieldTypeDescription
successbooleanWhether the operation succeeded
urlstringObject URL or presigned URL when applicable
contentstringDownloaded content (for download)
objectsarrayListed objects with keys and metadata (for list)
errorstringError message if success is false
{
  "success": true,
  "url": "https://my-bucket.s3.amazonaws.com/uploads/report.pdf",
  "content": null,
  "objects": [{ "key": "uploads/report.pdf", "size": 1024 }],
  "error": null
}

Settings

Each node run executes a single operation. Set Operation, then configure the fields shown for that operation.

Operation

SettingTypeDefaultDescription
operationenumuploadStorage action to perform: upload, download, list, delete, or presign.

Agent Permissions

SettingTypeDefaultDescription
allowed_operationsmulti-selectAll operationsWhich operations are available when this plugin is used as an AI agent tool. Excluded from the tool schema — the agent can only invoke operations in this list.

Target (all operations)

SettingTypeDefaultDescription
bucketstringS3 bucket name. Required for all operations. Supports {{ }} bindings.

upload

Shown when operation is upload:

SettingTypeDefaultDescription
keystringObject key/path (e.g. uploads/report.pdf). Supports {{ }} bindings.
contentcode editorContent to upload. Supports {{ }} bindings.

download

Shown when operation is download:

SettingTypeDefaultDescription
keystringObject key/path to download. Supports {{ }} bindings.

list

Shown when operation is list:

SettingTypeDefaultDescription
prefixstringKey prefix to filter listing (e.g. uploads/). Supports {{ }} bindings.

delete

Shown when operation is delete:

SettingTypeDefaultDescription
keystringObject key/path to delete. Supports {{ }} bindings.

presign

Shown when operation is presign:

SettingTypeDefaultDescription
keystringObject key/path. Supports {{ }} bindings.
expires_innumber3600Presigned URL expiry in seconds. Supports {{ }} bindings.

Required Secrets

Configure on the Environment Variables page:

VariableRequiredDescription
AWS_ACCESS_KEY_IDYesAWS or S3-compatible access key ID (e.g. AKIA...)
AWS_SECRET_ACCESS_KEYYesAWS or S3-compatible secret access key
S3_ENDPOINT_URLNoCustom endpoint for S3-compatible services (e.g. https://<account>.r2.cloudflarestorage.com for R2, http://localhost:9000 for MinIO). When omitted, the default AWS S3 endpoint is used.

Example

Canvas

Upload a report after generating it in a Code node:

Manual Trigger → Code → S3 Storage (upload)

S3 Storage settings:

  • Operation: upload
  • Bucket: my-app-exports
  • Object Key: reports/{{ input.date }}.json
  • Content: {{ code.result }}

Access the result downstream:

{{ s3.success }}
{{ s3.url }}

Generate a presigned download link:

Webhook Trigger → S3 Storage (presign) → Return

S3 Storage settings:

  • Operation: presign
  • Bucket: my-app-uploads
  • Object Key: {{ webhook.body.fileKey }}
  • Expires In (seconds): 3600

Return the presigned URL with {{ s3.url }}.

TSL

import webhook from @tensorify/webhook-trigger:4.0.0
import s3 from @tensorify/s3:1.0.0

node trigger @tensorify/webhook-trigger:4.0.0 {
    path = "/upload"
    method = "POST"
}

node upload @tensorify/s3:1.0.0 {
    operation = "upload"
    bucket = "my-app-exports"
    key = "uploads/{{ webhook.body.filename }}"
    content = "{{ webhook.body.content }}"
}

trigger.payload -> upload.input

Error Handling

S3 Storage has a hidden On Error control output branch (error). Enable it via the "Error output handle" toggle at the bottom of the settings panel.

The error branch fires when the S3 API returns an error or the request fails at runtime. On the main path, failures are also reflected in {{ s3.success }} and {{ s3.error }} on the result output.

Common Gotchas

  • S3-compatible endpoints: Set S3_ENDPOINT_URL for MinIO, R2, or other non-AWS providers — omit it for standard AWS S3.
  • Bucket is always required: Unlike optional fields, bucket must be set for every operation.
  • Download content: Use {{ s3.content }} after a download operation; it is empty for other operations.
  • List results: Use {{ s3.objects }} after a list operation to iterate over matched keys.
  • Check s3.success: The node completes on the main output even when the operation fails. Use an If node or the On Error branch to handle failures.
  • Agent permissions: Restrict Allowed Operations (Agent) — exclude delete if the agent should not remove objects.

See Also

On this page