Portal Community
  object/get-many vs bucket/search: Both operations list objects in a bucket. Use object/get-many when you are working at the object level and want a clean pagination interface. Use bucket/search when the context is broader bucket-level exploration. Functionally, the operations are equivalent.

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 to list objects from.
prefixOptionalKey prefix to filter results. Only objects whose key starts with this prefix are returned (e.g. invoices/2026/).
maxKeysOptionalMaximum objects to return per page. Default: 1000. Maximum: 1000.
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": "object",
    "action": "getMany",
    "bucketName": "acme-ingest-landing",
    "prefix": "incoming/{{ $now | date: 'YYYY/MM/DD' }}/",
    "maxKeys": 500,
    "continuationToken": "{{ $node.PreviousPage.output.nextContinuationToken }}"
  }
}

Validation Errors

Error CodeCause & Resolution
NoSuchBucketThe specified bucket does not exist or is in the wrong region. Verify the bucket name and region in the connection settings.
AccessDeniedThe IAM identity lacks s3:ListBucket on the target bucket ARN. Update the IAM policy.
InvalidTokenThe continuationToken is invalid or has expired. Restart pagination from the first call (omit token).

Output

Success Port

FieldTypeDescription
statusstringsuccess on successful listing.
errorCodestringEmpty string on success.
bucketNamestringThe searched bucket.
objectCountintNumber of objects returned on this page.
nextContinuationTokenstringToken to pass for the next page. Empty if this is the final page.

Error Port

On failure, activates with errorCode, errorMessage, and httpStatusCode. Handle InvalidToken by looping from the first page to recover from pagination token expiry.

Sample Output

{
  "status": "success",
  "errorCode": "",
  "bucketName": "acme-ingest-landing",
  "objectCount": 47,
  "nextContinuationToken": ""
}

Expression Reference

ExpressionResult
{{ $node.GetObjects.output.objectCount }}Total objects on this page — use in loop counters or capacity reporting.
{{ $node.GetObjects.output.nextContinuationToken }}Pass to the next object/get-many call to retrieve the following page.
{{ $node.GetObjects.output.bucketName }}Confirm the listed bucket in reports or notifications.

Node Policies & GuardRails

Policy AreaRecommendation
Credential StorageStore credentials in BizFirst Credentials Manager. Never hardcode.
IAM PermissionsGrant s3:ListBucket on the target bucket ARN. Restrict further with s3:prefix condition key if listing should be scoped to specific prefixes only.
Prefix ScopingAlways supply a prefix when the workflow targets a specific folder. Listing an entire large bucket is expensive and rarely needed in automated workflows.
Pagination CompletenessAlways check nextContinuationToken. If non-empty, there are more objects — loop to retrieve all pages before processing to avoid missing objects.
High-Volume ListingFor buckets with millions of objects, set maxKeys: 1000 and process in a loop. Avoid accumulating all results in memory before processing.
Listing for DeletionWhen listing objects prior to bulk deletion, ensure the list is complete and validated before executing delete operations.
Token CachingDo not cache or store continuation tokens — they are time-sensitive and may expire if the bucket changes significantly between pages.

Examples

Example 1: Daily Batch File Processing

A scheduled workflow lists all files that landed in today's date-partitioned prefix and processes each one in a loop.

// Node: ListTodaysFiles (S3 — object/get-many)
{
  "bucketName": "acme-daily-imports",
  "prefix": "incoming/{{ $now | date: 'YYYY/MM/DD' }}/",
  "maxKeys": 1000
}
// Node: ProcessEachFile (Loop — driven by objectCount and individual downloads)
// Each iteration: object/download → validate → object/copy to processed/

Example 2: Storage Usage Report

A monthly report workflow counts total objects per tenant prefix to calculate storage allocation.

// For each tenant in the database:
// Node: CountTenantObjects (S3 — object/get-many)
{
  "bucketName": "acme-tenant-storage",
  "prefix": "tenants/{{ $loop.currentItem.tenantId }}/",
  "maxKeys": 1000
}
// Accumulate objectCount across paginated calls
// Final: write report row { tenantId, totalObjects, reportDate }

Example 3: Verify Bulk Upload Completeness

After a bulk import job finishes, verify the expected number of files arrived before triggering downstream processing.

// Node: VerifyUploads (S3 — object/get-many)
{
  "bucketName": "acme-bulk-import",
  "prefix": "batch-{{ $node.ImportJob.output.batchId }}/",
  "maxKeys": 1000
}
// Node: CheckCount (If Condition)
// objectCount == $node.ImportJob.output.expectedFileCount
// True: proceed to processing
// False: alert operations team of missing files