← Back to Blog

5 Best Practices to Optimize S3 API Calls and Slash Object Storage Overhead by 60%

By QuixiCloud Team•October 17, 2026
5 Best Practices to Optimize S3 API Calls and Slash Object Storage Overhead by 60%

5 Best Practices to Optimize S3 API Calls and Slash Object Storage Overhead by 60%

In high-concurrency cloud software architectures, the cost efficiency of object storage is determined just as much by your API transaction patterns as it is by the raw terabytes of data sitting on disk.

Many engineering teams assume that once a storage provider and capacity tier are chosen, object storage costs remain fixed. In reality, inefficient API usage patterns—such as aggressive polling loops, unoptimized multipart chunking, and repeated recursive directory listings—frequently inflate monthly storage bills by 40% to 60%.

Whether you are operating high-volume media origins, SaaS document repositories, or automated CI/CD artifact caches, adhering to disciplined API patterns drastically curtails operational overhead while improving user-facing responsiveness.

Here are the 5 most impactful engineering best practices to optimize S3 API transactions and reduce operational cloud expenses.


1. Eliminate Recursive LIST Operations with an External Metadata Index

The ListObjectsV2 API call is classified as a Tier-1 operation on AWS S3 ($0.005 per 1,000 requests). It is also one of the slowest operations an application can perform when a bucket contains hundreds of thousands of keys.

The Problematic Pattern:

An application queries the S3 API directly to check if a user file exists or to display an index of uploaded documents:

// Inefficient: Hitting S3 directly on every dashboard render
const command = new ListObjectsV2Command({
  Bucket: "user-documents",
  Prefix: `users/${userId}/`,
});
const response = await s3Client.send(command);

If 15,000 active users browse their files daily, this approach triggers tens of thousands of high-latency, billable S3 API sweeps.

The Optimized Pattern:

Maintain file metadata (key path, file size, MIME type, upload timestamp, and ownership) in a relational database (PostgreSQL, MySQL) or high-speed cache (Redis).

  • Reads: Query the relational index (sub-millisecond latency, zero S3 API charges).
  • Writes: Insert a record upon successful object upload.
  • Impact: You eliminate over 95% of S3 LIST API calls while dramatically accelerating application page load times.

2. Optimize Multipart Upload Part Sizes (Avoid the 5MB Default Trap)

When uploading large objects (such as video masters, database dumps, or VM images), S3 client SDKs split objects into pieces via CreateMultipartUpload, UploadPart, and CompleteMultipartUpload.

The AWS S3 minimum chunk size is 5 Megabytes (MB), and many default SDK configurations adhere to this baseline:

  • Uploading a 10 Gigabyte (GB) file with 5MB parts requires 2,000 individual UploadPart API calls!
  • If an enterprise backup system streams 60 large files daily, that translates into 120,000 Tier-1 API calls every single day.

The Solution: Increase Chunk Size to 32MB or 64MB

In your transfer manager configuration, increase the multipart chunk threshold:

import { Upload } from "@aws-sdk/lib-storage";

const parallelUploads3 = new Upload({
  client: s3Client,
  params: {
    Bucket: "backup-vault",
    Key: "production_backup.tar.gz",
    Body: fileStream,
  },
  partSize: 64 * 1024 * 1024, // 64 MB chunk size
  queueSize: 8,              // 8 concurrent uploads
});

await parallelUploads3.done();

By raising the part size to 64MB, you reduce the total API calls required for a 10GB file from 2,000 calls down to just 157 calls—an over 92% reduction in API transactions!


3. Implement Direct Client Uploads via Presigned URLs

Routing heavy file uploads through your application web servers creates architectural bottlenecks: your servers must receive the payload, buffer it in memory or temporary disk, and re-transmit it to S3, consuming double the bandwidth and monopolizing worker threads.

The Modern Pattern: Direct Client Presigned Uploads

  1. The web browser or mobile client requests an authorized upload ticket from your backend.
  2. The backend generates a temporary Presigned PUT URL:
    import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
    import { PutObjectCommand } from "@aws-sdk/client-s3";
    
    const command = new PutObjectCommand({ Bucket: "media-vault", Key: assetKey });
    const uploadUrl = await getSignedUrl(s3Client, command, { expiresIn: 300 });
    
  3. The client uploads the binary payload directly to S3 via HTTP PUT.
  • Result: Zero application server CPU/RAM exhaustion, faster transfer speeds, and streamlined API execution.

4. Aggregate Micro-Files into Batch Archives

Writing millions of tiny objects (such as 2KB sensor telemetry records or 10KB JSON logs) directly to object storage creates severe cost multiplication:

  • Storing 1,000,000 small 5KB files requires 1 Million PUT requests ($5.00 on AWS) to store just 5 Gigabytes of data ($0.11 storage fee).
  • Auditing or retrieving those objects triggers another million GET or LIST operations.

The Solution: Buffer and Batch

Buffer incoming telemetry streams in an in-memory queue (Kafka, RabbitMQ, or Redis Streams). Periodically compress and flush them to S3 in consolidated batches (e.g., hourly .parquet, .avro, or .tar.gz archives).

  • You replace 100,000 individual S3 PUT requests with a single consolidated batch upload, slashing API consumption by 99%.

5. Choose an Object Storage Provider with Bundled API Operations

Regardless of how rigorously your software is optimized, active production platforms still execute millions of legitimate S3 requests every month.

On QuixiCloud M-S3, you don't have to worry about micro-transaction metering:

  • Individual 1 TB Tier ($4.99/mo) includes 2,500,000 Operations.
  • Team 1 TB Tier ($7.99/mo) includes 5,000,000 Operations.
  • White-Label Reseller ($24.99/mo) includes 15,000,000 Operations.
  • Built-in Defense: Platform rate limiting with 250 req/sec per IP burst protection protects your infrastructure from rogue crawlers and automated scraper floods.

Summary of Architectural Optimizations

| Strategy | Engineering Effort | API Call Reduction | Impact on Cost & Performance | |---|---|---|---| | Database Metadata Indexing | Medium (Schema design) | 80%–95% fewer LIST calls | Drastically faster page loads | | 64MB Multipart Chunking | Low (SDK config tweak) | 90%+ fewer UploadPart calls | Immediate API reduction on large files | | Client Presigned Direct Uploads | Medium (Frontend integration)| 50% network bandwidth reduction| Zero server CPU/RAM exhaustion | | Micro-File Batch Aggregation | Medium (Queue worker) | 95%+ fewer PUT calls | Prevents micro-file cost traps | | QuixiCloud Bundled Packs | Low (3-line endpoint switch) | Flat $0 API cost for 95% of apps | Full financial predictability |

Build leaner, faster, and more scalable cloud applications today. Deploy your buckets at aws.quixicloud.com.

Q

Written by QuixiCloud Team

The QuixiCloud Engineering Team is dedicated to building secure, scalable, and privacy-first cloud storage solutions.