Portal Community
  S3 Folder Model: S3 has no native folders — folders are key prefixes. folder/get-many lists all objects whose keys begin with the specified folderPath prefix. The folderPath should end with / to scope results to the intended directory level (e.g. reports/2026/) and avoid accidentally matching sibling prefixes.

When to Use

Configuration

Connection

FieldRequiredDescription
accessKeyIdRequiredAWS Access Key ID. Store in BizFirst Credentials Manager.
secretKeyRequiredAWS Secret Access Key. Never log or expose.
sessionTokenOptionalSTS session token for temporary credentials.
regionRequiredAWS region of the bucket.

Operation Fields

FieldRequiredDescription
bucketNameRequiredName of the S3 bucket containing the folder.
folderPathRequiredFolder prefix to list. Should end with / (e.g. tenants/t1024/documents/). Omitting the trailing slash may return sibling objects.
continuationTokenOptionalPagination token from the previous call's nextContinuationToken. Omit for the first page.

Sample Configuration

{
  "connection": {
    "accessKeyId": "{{ $credentials.s3_prod.accessKeyId }}",
    "secretKey": "{{ $credentials.s3_prod.secretKey }}",
    "region": "us-east-1"
  },
  "operation": {
    "resource": "folder",
    "action": "getMany",
    "bucketName": "acme-tenant-storage",
    "folderPath": "tenants/{{ $node.TenantContext.output.tenantId }}/documents/",
    "continuationToken": "{{ $node.PreviousPage.output.nextContinuationToken }}"
  }
}

Validation Errors

Error CodeCause & Resolution
NoSuchBucketThe specified bucket does not exist. Verify the bucket name and region settings.
AccessDeniedThe IAM identity lacks s3:ListBucket on the target bucket. Update the IAM policy to include this permission scoped to the bucket ARN.
InvalidTokenThe continuationToken is invalid or expired. Restart pagination from the first page (omit the token).

Output

Success Port

FieldTypeDescription
statusstringsuccess on successful listing (returns success even if the folder is empty).
errorCodestringEmpty string on success.
bucketNamestringThe bucket that was listed.
folderPathstringThe folder prefix that was listed.
entryCountintNumber of objects found under this prefix on this page. Returns 0 for empty folders.
nextContinuationTokenstringToken for the next page. Empty string if this is the last page or the folder has fewer entries than the page size.

Error Port

On failure, activates with errorCode, errorMessage, and httpStatusCode. A successful call with entryCount: 0 indicates the folder is empty — this routes through the success port, not the error port.

Sample Output

{
  "status": "success",
  "errorCode": "",
  "bucketName": "acme-tenant-storage",
  "folderPath": "tenants/t1024/documents/",
  "entryCount": 23,
  "nextContinuationToken": ""
}

Expression Reference

ExpressionResult
{{ $node.ListFolder.output.entryCount }}Number of entries in the folder — check for 0 to detect empty folder before deletion.
{{ $node.ListFolder.output.nextContinuationToken }}Pass to next folder/get-many call for pagination. Empty string signals the last page.
{{ $node.ListFolder.output.folderPath }}Confirm the folder path that was listed in log entries or UI responses.
{{ $node.ListFolder.output.bucketName }}Confirm the target bucket in audit log or response payloads.

Node Policies & GuardRails

Policy AreaRecommendation
Credential StorageStore credentials in BizFirst Credentials Manager. Never hardcode.
IAM PermissionsGrant s3:ListBucket on the target bucket ARN. Use s3:prefix IAM condition to restrict listing to specific folder prefixes if needed.
Trailing SlashAlways include a trailing / in folderPath to scope the listing to the intended directory level and avoid matching sibling key prefixes.
Empty Folder HandlingAn empty folder returns entryCount: 0 via the success port. Use an If Condition downstream to branch on entryCount == 0 for pre-deletion checks.
Pagination CompletenessFor folders with many objects, check nextContinuationToken and loop to retrieve all pages before making deletion or processing decisions.
Sensitive Path ExposureFolder paths may expose tenant IDs or internal structure. Do not include folderPath in externally visible notifications or logs without sanitization.
Pre-Deletion Check PatternUse folder/get-many with entryCount == 0 as a safety gate before bucket/delete to confirm the bucket is empty when verifyEmpty is bypassed.

Examples

Example 1: Pre-Deletion Empty Verification

Before deleting a tenant's storage bucket, verify all folder contents have been cleared.

// Node: CheckTenantFolderEmpty (S3 — folder/get-many)
{
  "bucketName": "acme-shared-storage",
  "folderPath": "tenants/{{ $node.OffboardRequest.output.tenantId }}/"
}
// Node: VerifyEmpty (If Condition)
// Condition: entryCount == 0
// True: proceed to bucket/delete
// False: alert operations team — folder not empty, manual review required

Example 2: Admin File Browser API

An admin portal requests a paginated list of files in a tenant's folder for display in a document management UI.

// Node: ListTenantFiles (S3 — folder/get-many)
{
  "bucketName": "acme-tenant-docs",
  "folderPath": "tenants/{{ $node.Request.output.tenantId }}/{{ $node.Request.output.subfolder }}/",
  "continuationToken": "{{ $node.Request.output.pageToken }}"
}
// Response:
// { entries: entryCount, nextPageToken: nextContinuationToken }
// Return as API response to admin portal

Example 3: Upload Verification Before Processing

After a client completes a bulk document upload, verify all expected files are present in the upload folder before triggering the review workflow.

// Node: VerifyUploads (S3 — folder/get-many)
{
  "bucketName": "acme-client-uploads",
  "folderPath": "submissions/{{ $node.ClientSubmission.output.submissionId }}/"
}
// Node: CheckCount (If Condition)
// entryCount >= $node.ClientSubmission.output.expectedFileCount
// True: TriggerReviewWorkflow
// False: NotifyClient("Upload incomplete — expected N files, found M")