Output Ports
| Port | Triggered When |
| success |
The S3 operation completed successfully. All requested data is available in the output. |
| error |
The operation failed. Reasons include: bucket not found, object not found (download/delete), access denied (IAM permissions), invalid key format, S3 service error, or network timeout. The error_message and error_code fields describe the cause. |
upload — Output Schema
| Field | Type | Description |
object_url | string | Full S3 URL of the uploaded object: https://<bucket>.s3.<region>.amazonaws.com/<key>. Note: this URL is only directly accessible if the object ACL is public-read. For private objects, use getPresignedUrl. |
bucket | string | The bucket the object was uploaded to. |
key | string | The resolved object key (after expression evaluation). |
etag | string | Entity tag (MD5 hash) of the uploaded object. Useful for integrity verification. |
version_id | string | Version ID assigned by S3 if bucket versioning is enabled. null for non-versioned buckets. |
size_bytes | integer | Size of the uploaded object in bytes. |
download — Output Schema
| Field | Type | Description |
file_data | string / object | The downloaded file content. Format depends on output_format: base64 string, UTF-8 text string, or parsed JSON object. |
content_type | string | The MIME type of the object as stored in S3. |
size_bytes | integer | Size of the downloaded object in bytes. |
last_modified | string | ISO 8601 timestamp of when the object was last modified. |
etag | string | Entity tag for integrity verification. |
metadata | object | Custom metadata stored with the object at upload time (x-amz-meta-* headers, with prefix stripped). |
version_id | string | Version ID of the retrieved object, if versioning is enabled. |
getPresignedUrl — Output Schema
| Field | Type | Description |
url | string | The pre-signed URL. Valid for the configured expiry_seconds. Include in email links, webhook responses, or API payloads. |
expires_at | string | ISO 8601 timestamp when the URL expires. |
method | string | GET or PUT — the HTTP method the URL authorises. |
bucket | string | The bucket the URL applies to. |
key | string | The object key the URL applies to. |
list — Output Schema
| Field | Type | Description |
objects | array | Array of object summary items. Each item contains: key, size (bytes), last_modified (ISO 8601), etag, storage_class. |
common_prefixes | array of strings | Virtual sub-folder names when delimiter is set (e.g. ["/reports/2026/04/", "/reports/2026/05/"]). |
total_count | integer | Number of objects returned in this response. |
is_truncated | boolean | true if more objects exist beyond max_keys. |
next_continuation_token | string | Token to pass in a subsequent list request to retrieve the next page. null if is_truncated is false. |
delete — Output Schema
| Field | Type | Description |
deleted | boolean | true when the delete succeeded. |
key | string | The key that was deleted. |
version_id | string | The version ID of the deleted object, or the delete marker version ID for versioned buckets. |
Expression Paths for Downstream Nodes
| Expression | Returns |
{@ $node.s3Node.object_url } | Permanent S3 URL after upload |
{@ $node.s3Node.key } | Resolved S3 key |
{@ $node.s3Node.etag } | ETag of uploaded/downloaded object |
{@ $node.s3Node.url } | Pre-signed URL (getPresignedUrl) |
{@ $node.s3Node.expires_at } | Pre-signed URL expiry timestamp |
{@ $node.s3Node.file_data } | Downloaded file content |
{@ $node.s3Node.size_bytes } | File size in bytes |
{@ $node.s3Node.objects } | Array of objects from list operation |
{@ $node.s3Node.objects[0].key } | Key of first listed object |
{@ $node.s3Node.total_count } | Count of listed objects |
Example Output — upload
{
"object_url": "https://bizfirstgo-documents.s3.eu-west-1.amazonaws.com/invoices/2026/05/INV-00421.pdf",
"bucket": "bizfirstgo-documents",
"key": "invoices/2026/05/INV-00421.pdf",
"etag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"version_id": null,
"size_bytes": 148320
}
Example Output — getPresignedUrl
{
"url": "https://bizfirstgo-documents.s3.eu-west-1.amazonaws.com/invoices/2026/05/INV-00421.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=...",
"expires_at": "2026-05-24T09:14:22.000Z",
"method": "GET",
"bucket": "bizfirstgo-documents",
"key": "invoices/2026/05/INV-00421.pdf"
}
Example Output — list
{
"objects": [
{
"key": "reports/2026/05/weekly-summary-2026-05-19.pdf",
"size": 204800,
"last_modified": "2026-05-19T08:02:11.000Z",
"etag": "\"a3f5b2c1d0e9f4a8b7c6d5e4f3a2b1c0\"",
"storage_class": "STANDARD"
},
{
"key": "reports/2026/05/weekly-summary-2026-05-12.pdf",
"size": 198452,
"last_modified": "2026-05-12T08:01:45.000Z",
"etag": "\"b4f6c3d2e1f0a9b8c7d6e5f4a3b2c1d0\"",
"storage_class": "STANDARD"
}
],
"common_prefixes": [],
"total_count": 2,
"is_truncated": false,
"next_continuation_token": null
}
Storing the object_url vs. the pre-signed URL: Store the permanent object_url (from upload) in your database for internal reference. Generate a fresh getPresignedUrl each time you need to share the file externally — this ensures access control is always enforced and you can set appropriate expiry windows per sharing context.