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.
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.
| Handle | Type | Description |
|---|---|---|
input | any | Upstream data for {{ input.field }} template references in settings. |
| Handle | Type | Description |
|---|---|---|
result | object | S3 operation result |
The result (accessed as {{ s3.* }}) shape:
| Field | Type | Description |
|---|---|---|
success | boolean | Whether the operation succeeded |
url | string | Object URL or presigned URL when applicable |
content | string | Downloaded content (for download) |
objects | array | Listed objects with keys and metadata (for list) |
error | string | Error 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
}
Each node run executes a single operation. Set Operation, then configure the fields shown for that operation.
| Setting | Type | Default | Description |
|---|---|---|---|
operation | enum | upload | Storage action to perform: upload, download, list, delete, or presign. |
| Setting | Type | Default | Description |
|---|---|---|---|
allowed_operations | multi-select | All operations | Which 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. |
| Setting | Type | Default | Description |
|---|---|---|---|
bucket | string | — | S3 bucket name. Required for all operations. Supports {{ }} bindings. |
Shown when operation is upload:
| Setting | Type | Default | Description |
|---|---|---|---|
key | string | — | Object key/path (e.g. uploads/report.pdf). Supports {{ }} bindings. |
content | code editor | — | Content to upload. Supports {{ }} bindings. |
Shown when operation is download:
| Setting | Type | Default | Description |
|---|---|---|---|
key | string | — | Object key/path to download. Supports {{ }} bindings. |
Shown when operation is list:
| Setting | Type | Default | Description |
|---|---|---|---|
prefix | string | — | Key prefix to filter listing (e.g. uploads/). Supports {{ }} bindings. |
Shown when operation is delete:
| Setting | Type | Default | Description |
|---|---|---|---|
key | string | — | Object key/path to delete. Supports {{ }} bindings. |
Shown when operation is presign:
| Setting | Type | Default | Description |
|---|---|---|---|
key | string | — | Object key/path. Supports {{ }} bindings. |
expires_in | number | 3600 | Presigned URL expiry in seconds. Supports {{ }} bindings. |
Configure on the Environment Variables page:
| Variable | Required | Description |
|---|---|---|
AWS_ACCESS_KEY_ID | Yes | AWS or S3-compatible access key ID (e.g. AKIA...) |
AWS_SECRET_ACCESS_KEY | Yes | AWS or S3-compatible secret access key |
S3_ENDPOINT_URL | No | Custom 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. |
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 }}.
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
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.
- S3-compatible endpoints: Set
S3_ENDPOINT_URLfor MinIO, R2, or other non-AWS providers — omit it for standard AWS S3. - Bucket is always required: Unlike optional fields,
bucketmust be set for every operation. - Download content: Use
{{ s3.content }}after adownloadoperation; it is empty for other operations. - List results: Use
{{ s3.objects }}after alistoperation 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
deleteif the agent should not remove objects.
- Code — generate content to upload
- Return — return presigned URLs as HTTP responses
- AI Agent — connect S3 as an agent tool
- Environment Variables — store AWS credentials and endpoint URL
