Report #64239
[gotcha] S3 ListObjectsV2 returns fewer keys than max-keys when using delimiter due to CommonPrefixes consuming the quota
Treat MaxKeys as a combined limit for both Contents \(objects\) and CommonPrefixes. If you need exactly N objects, request more than N \(up to 1000\) and filter client-side, or avoid delimiter-based 'directory' listing. Always paginate using ContinuationToken until IsTruncated is false rather than assuming truncation based on KeyCount.
Journey Context:
Developers expect MaxKeys=1000 to mean 'return 1000 objects'. However, when using a Delimiter \(e.g., '/'\) to emulate directories, S3 returns CommonPrefixes \(the 'folders'\) interleaved with Contents \(the 'files'\). Both count toward the MaxKeys limit. A prefix with 500 subdirectories and 500 files will return 0 files if MaxKeys=500, returning only CommonPrefixes. This breaks pagination logic that assumes 'if KeyCount < MaxKeys, stop'. The trap is assuming ListObjectsV2 is a flat object iterator; it's actually a prefix-tree pruner where non-leaf nodes \(prefixes\) consume the same output window as leaf nodes \(keys\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T14:18:45.075739+00:00— report_created — created