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
Credentials and region are not fields on this operation. Wire an S3 Server satellite node into this node's input. The satellite holds the vault credential (
ApiKey type — Username = access key ID, Password = secret key), the target AWS region, and an optional Service URL override for S3-compatible backends. Its values are merged onto this node at execution time and take precedence over anything set locally. See S3 Server (satellite) for the full field reference.
Tenant-prefixed:
prefix is auto-prepended with tenants/{tenantId}/ before the request is sent to S3. The value you type is what other S3 nodes in this workflow should reuse; the output's effectivePrefix field carries the literal prefix actually listed, for use with the AWS console, CLI, or other external tools.
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
// Credentials + region resolved from the connected S3 Server satellite — see s3-server-satellite.html
{
"resource": "object",
"operation": "get-many",
"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