object/get-many FormID 20508
List objects in a bucket with optional prefix filter and pagination support.
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
- Batch processing trigger: Enumerate all files in a landing prefix to feed into a loop node that processes each file individually.
- Storage reporting: Count objects in a bucket or prefix for storage usage metrics and cost allocation dashboards.
- Pattern-matching search: Find all objects whose keys match a naming convention prefix (e.g. all files starting with
invoices/2026/). - Archive sweep: Iterate over all files in a folder prefix to move them to a lower storage class or long-term archive bucket.
- Upload verification: After a bulk import job, verify the expected number of objects landed in the target prefix before proceeding.
Configuration
Connection
| Field | Required | Description |
|---|---|---|
accessKeyId | Required | AWS Access Key ID. Store in BizFirst Credentials Manager. |
secretKey | Required | AWS Secret Access Key. Never log or expose. |
sessionToken | Optional | STS session token for temporary credentials. |
region | Required | AWS region of the bucket. |
Operation Fields
| Field | Required | Description |
|---|---|---|
bucketName | Required | Name of the S3 bucket to list objects from. |
prefix | Optional | Key prefix to filter results. Only objects whose key starts with this prefix are returned (e.g. invoices/2026/). |
maxKeys | Optional | Maximum objects to return per page. Default: 1000. Maximum: 1000. |
continuationToken | Optional | Pagination 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 Code | Cause & Resolution |
|---|---|
NoSuchBucket | The specified bucket does not exist or is in the wrong region. Verify the bucket name and region in the connection settings. |
AccessDenied | The IAM identity lacks s3:ListBucket on the target bucket ARN. Update the IAM policy. |
InvalidToken | The continuationToken is invalid or has expired. Restart pagination from the first call (omit token). |
Output
Success Port
| Field | Type | Description |
|---|---|---|
status | string | success on successful listing. |
errorCode | string | Empty string on success. |
bucketName | string | The searched bucket. |
objectCount | int | Number of objects returned on this page. |
nextContinuationToken | string | Token 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
| Expression | Result |
|---|---|
{{ $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 Area | Recommendation |
|---|---|
| Credential Storage | Store credentials in BizFirst Credentials Manager. Never hardcode. |
| IAM Permissions | Grant s3:ListBucket on the target bucket ARN. Restrict further with s3:prefix condition key if listing should be scoped to specific prefixes only. |
| Prefix Scoping | Always supply a prefix when the workflow targets a specific folder. Listing an entire large bucket is expensive and rarely needed in automated workflows. |
| Pagination Completeness | Always check nextContinuationToken. If non-empty, there are more objects — loop to retrieve all pages before processing to avoid missing objects. |
| High-Volume Listing | For buckets with millions of objects, set maxKeys: 1000 and process in a loop. Avoid accumulating all results in memory before processing. |
| Listing for Deletion | When listing objects prior to bulk deletion, ensure the list is complete and validated before executing delete operations. |
| Token Caching | Do 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