Pulse x reMKTR

Cut SP-API Costs: Smarter Calls, Faster Sales Now

Written by Jacob Heinz | Dec 4, 2025 5:54:30 PM

You’re paying for every noisy API call now. That stings during Prime Day or the holiday crush when traffic 10x’s and your integration decides to poll like it’s 2012.

Here’s the fix: design your stack to call less and deliver more. Amazon’s guidance is clear — use event-driven patterns, batch the heavy stuff, harden retries, and stop wasting requests on stale data. That combo trims your Selling Partner API (SP-API) bill and makes your ops feel faster.

Looking for tooling that helps eliminate noisy polls and consolidate requests? Explore Requery.

If you’re a large-scale seller or integrator, this isn’t optional. Under the new SP-API cost framework, unnecessary calls hit margins and increase latency risks right when you need reliability. The move is obvious: fewer, smarter calls.

Below is the playbook. No fluff. You’ll get the best practices Amazon expects, how to wire them, and where teams usually overspend. You’ll go from reactive polling to a durable, event-driven engine that scales cleanly during peaks and sleeps quietly off-peak.

  • TL;DR
  • Use events over polling to slash request volume and latency bursts.
  • Replace per-entity calls with Reports for reads and Feeds for writes.
  • Backoff with jitter, respect 429 and 5xx, and make retries idempotent.
  • Cache aggressively, filter narrowly, paginate safely, and dedupe.
  • Pre-warm for peaks: bigger queues, scheduled reports, circuit breakers.

Stop Polling Let Events

Why events beat polls

Polling is the tax you pay for not listening. With SP-API Notifications routed through Amazon EventBridge or SQS, you flip the model: Amazon tells you when something changes, and you react. That means fewer wasted calls and fresher data.

AWS CTO Werner Vogels said it best: 'Everything fails, all the time.' Events localize failures. If orders spike, you scale your consumers — not your pollers. If a marketplace is quiet, your system stays quiet.

Events also shrink your “freshness window.” If you poll every 5 minutes, your worst-case delay is 5:00 plus queueing and processing. With events, you’re usually working within seconds. That can hit a service-level goal instead of chasing it.

A simple migration path works:

  • Step 1: Keep your pollers, but add Notifications for one workflow (e.g., orders) and consume them first when available.
  • Step 2: As your event consumers prove stable, reduce poll frequency and use polling only as a backstop.
  • Step 3: Turn your pollers into reconciliation jobs that run hourly or daily, not minute-by-minute.

What to subscribe to

Start with the changes that drive money or operations:

  • Orders and order status changes
  • Feed processing/completion
  • Report processing finished
  • Shipment and fulfillment status

The pattern: subscribe only to events you act on. Don’t chase vanity signals.

Noise-control checklist:

  • If your team never changes behavior from a signal, unsubscribe from it.
  • If a signal creates duplicate work (e.g., multiple updates to the same order in seconds), debounce in your queue layer.
  • Add a small 'coalescing' delay (e.g., 1–3 seconds) for high-churn entities so you process one merged update instead of five small ones.

Wiring it up

  • Use the SP-API Notifications API to create a destination (EventBridge or SQS) and subscribe to relevant event types.
  • Validate message signatures and treat the queue as your truth.
  • Store event metadata for idempotency; process each event once.

Operational hardening that pays off:

  • Put an SQS dead-letter queue (DLQ) behind your consumer. If a message fails N times, it lands in DLQ for manual review instead of thrashing.
  • Use visibility timeouts that exceed your worst-case processing time, and extend them on long-running work.
  • Keep message payloads small; stash large artifacts (like reports) in S3 and pass references.
  • Build a replayer: the ability to re-enqueue DLQ messages or historical events lets you fix bugs without live-fire risk.

Example: You’re polling the Orders API every 5 minutes across 7 marketplaces. That’s 288 calls/day/marketplace — 2,016 calls/day — just to check 'anything new?' Switch to order events and your polling shrinks to near zero while your order processing gets faster.

The missing safety net: run a scheduled reconciliation (e.g., hourly or daily) using a recent Order report to find any records you may have missed due to downstream issues. When you detect drift, queue corrective actions and update your last-known checkpoints.

Batch Everything

Replace N reads

If you’re fetching inventory, pricing, or order summaries object-by-object, you’re burning requests. The Reports API exists to give you a point-in-time snapshot in one go. Generate the report, pick up the file, and hydrate your internal store.

What to move to Reports first:

  • Inventory levels and reserved quantities
  • Pricing and Buy Box analytics
  • Order summaries for analytics or reconciliation

Best practice: Schedule recurring reports at the smallest cadence your business needs (often 15–60 minutes for most analytics) and stop making per-item reads in that window. Use the report as your cache-of-record until the next run.

Picking cadences that stick:

  • Operational decisions (reprices, low-stock alerts): 5–30 minutes if you’re also using events.
  • Analytics and dashboards: 15–60 minutes.
  • Deep accounting or catalog audits: daily.

Implementation tips that save rework:

  • Land raw report files in S3 with object versioning on. Keep raw, parsed, and curated layers so you can reprocess when parsers change.
  • Store a report manifest: report type, marketplace, time window, row count, and checksum. If counts don’t match expectations, don’t promote the data.
  • Normalize to your internal model on ingest and index by marketplace + SKU/ASIN for fast lookups.

Write in batches with Feeds

Updating hundreds or thousands of SKUs? Feeds are your friend. Build deltas and send a batch update rather than firing singular updates. You get fewer requests and more predictable throughput.

Practical flow:

  • Compute per-marketplace deltas.
  • Chunk into deterministic batches (e.g., 5k SKUs per feed).
  • Submit feeds with metadata for traceability.
  • Listen for 'feed processing finished' notifications, then reconcile.

Example: Instead of 10,000 individual price updates (10,000 calls), you push two feed files with 5,000 updates each (2 calls plus document upload). Call volume drops by orders of magnitude, and your failure surface shrinks.

Feed patterns that work:

  • Separate change types: price updates and quantity updates in distinct feeds improve observability and retries.
  • Make feed IDs deterministic per batch (timestamp + marketplace + hash). That’s your idempotency handle.
  • Keep feed sizes consistent. It’s easier to reason about throughput when batches are uniform.
  • Track end-to-end latency: submission → processing started → processing finished → downstream effects observed (e.g., price reflected on a listing).

When to go real-time instead of feeds:

  • A single, urgent change that must land within seconds.
  • Customer support actions where immediacy beats efficiency.

Even then, cap the per-minute updates and fold everything else back into your next feed cycle.

Error Budgets Backoff Idempotency

Backoff with jitter

When SP-API returns 429 (throttled) or 5xx (transient), you should retry — slowly and randomly. Exponential backoff with jitter is the standard: double the delay each time and add randomness to avoid retry storms. Respect any Retry-After header if provided.

Simple pattern (pseudo):

  • Try request
  • On 429/5xx: wait base * 2^n + random(0, jitter)
  • Cap max delay; use deadlines/cancellation
  • Log backoff, not just failures

AWS guidance specifically recommends jitter to avoid synchronized retries that amplify outages. Treat that as table stakes.

A practical recipe:

  • Base delay: 200–500 ms per attempt.
  • Max attempts: 5–7 for reads, 3–5 for writes.
  • Max delay: 30–60 seconds.
  • Total deadline: 90 seconds for user-facing paths, longer for async jobs.

Tie retries to context:

  • If a user is waiting, budget fewer tries with tighter timeouts.
  • If it’s a background job, allow more relaxation but keep a clear max.

Idempotency everywhere

Your integration must tolerate duplicates and partial failures. Generate idempotency keys for write operations (e.g., deterministic batch IDs per feed, or stable correlation IDs in your queue). Store processed IDs to drop duplicates. Make your internal state machines re-entrant.

Idempotency toolbox:

  • Keyed writes: include a unique operation ID in metadata.
  • Exactly-once-ish: store a small ledger of processed operation IDs with timestamps and hashes.
  • Re-entrant processors: if a step crashes mid-way, rerun safely without double-applying side effects.

Observe rate limits

Rate limits are per-operation. Expose them to your scheduler. Keep a per-operation token bucket and budget retries against it. When you hit the wall, degrade gracefully: queue work, run reports, or delay non-critical jobs.

Example: You hit a 429 on getCatalogItem. Old you would retry immediately and fail harder. New you backs off with jitter, queues the request behind a token bucket, and uses report data to answer non-urgent queries in the meantime.

Token bucket quick-start:

  • Define tokens-per-second per operation (align to documented limits).
  • Allow a burst (bucket size) to handle short spikes.
  • Each request consumes a token; retries consume tokens, too.
  • If the bucket is empty, wait or defer to batch pathways (reports/feeds).

Observability signals to watch:

  • Throttle rate (429s) and retry counts per operation.
  • P50/P95 latency, especially during backoffs.
  • Queue depth and DLQ counts.
  • Deadline cancellations vs hard failures.

Cache Filters and Paging

Cache like your margin

It does. Caching high-fanout reads (catalog attributes, ASIN metadata, brand info) turns 100s of calls into 1. Pick TTLs that match business needs: 15–60 minutes for slow-moving catalog data; seconds to minutes for pricing if you also have events.

Tactics that work:

  • Cache by marketplace + ASIN; invalidate on relevant events
  • Keep a warm store for frequently accessed SKUs
  • Memoize expensive transforms so you don’t recompute on every request

Design a two-level cache:

  • L1 in-process for ultra-fast reads of hot keys (milliseconds, per-instance).
  • L2 shared (Redis/Memcached) for cross-service reuse and higher hit rates.

Avoid cache stampedes:

  • Use request coalescing so the first miss populates the cache while others wait.
  • Add jitter to TTLs so many keys don’t expire at the same time.
  • Prefer 'refresh-ahead' for very hot items rather than hard expirations.

Filter narrowly and page thoughtfully

Most SP-API reads support filters (createdSince, updatedAfter, statuses) and pagination. Use them. Fetch only what changed since your last checkpoint. Never request 'everything' when you only need 'what’s new'.

Paging safety:

  • Always iterate until nextToken is empty; capture checkpoints so you can resume
  • Enforce per-page limits that fit your rate budget
  • Dedupe at the boundary: merge by orderId/sku to avoid double work on page overlaps

Checkpoint design:

  • Store the last successful createdSince/updatedAfter timestamp per marketplace.
  • Write checkpoints only after processing is fully complete (post-commit).
  • If a run fails mid-way, restart from the last durable checkpoint.

Example: Instead of listing all orders for a day (which could be thousands), query createdSince=last_run and only page through new/updated orders. Then cache the result for downstream services so they don’t trigger their own SP-API reads.

Peak Season Playbook

Before Prime Day

Peak behavior isn’t a surprise — the dates are on your calendar. Two weeks out, schedule more frequent reports for high-change datasets and increase queue depth. One week out, raise concurrency for event consumers and pre-scale your worker autoscaling targets.

Make it concrete:

  • Double DLQ retention and alerting so nothing gets lost in noise.
  • Increase report frequency for inventory/pricing to reduce ad-hoc reads.
  • Dry-run a feed submission with production-sized batches.
  • Warm caches by preloading top 1–5% SKUs by traffic and revenue.

Circuit breakers and graceful degradation

When the world gets hot, your system should choose what to drop. If you hit sustained throttling, pause non-critical syncs (e.g., catalog enrichments) and reserve your budget for revenue-critical flows (orders, fulfillment). Surface graceful fallbacks in dashboards and alert on backlogs, not just error counts.

Playbook during trouble:

  • Trip a per-operation circuit breaker at a defined error or throttle rate.
  • Route user-visible queries to cached data when possible.
  • Defer batch jobs and free tokens for real-time order flows.
  • Increase backoff windows system-wide until error rates normalize.

Budget your calls like cash

Model worst-case traffic. Example: if your median day does 25k orders and Prime Day does 8x, you’ll see ~200k order events. Can your consumers handle that with at-most-once semantics? Can your queues buffer a few hours at peak? Does your rate budget cover retries plus scheduled syncs? Answer those now, not during the spike.

A quick capacity checklist:

  • Max events per minute you can consume without lag.
  • Max queue depth before SLA impact.
  • Peak tokens per second available per SP-API operation.
  • Longest allowed retry delay before a user-facing timeout.

And because it will come up: as SP-API usage moves to more explicit cost models (and yes, you’ve seen posts like 'an update on SP-API fees' and the chatter on 'amazon sp-api 2026 fees: how to optimize your …'), the playbook above is the difference between scalable margins and surprise bills.

Quick Reboot

  • Events replace polling and cut waste; subscribe only to signals you act on.
  • Use Reports for bulk reads and Feeds for bulk writes; stop per-entity chatter.
  • Backoff with jitter, treat 429/5xx as normal, and design idempotent retries.
  • Cache aggressively, filter by time/status, and paginate with checkpoints.
  • Pre-warm capacity, add circuit breakers, and protect call budgets during peaks.

FAQ

Fastest way to cut volume

Switch from polling to event-driven. Subscribe to order, feed, and report events and process from queues. Then move heavy reads to scheduled Reports and heavy writes to Feeds. That two-step change typically slashes call volume while improving freshness.

Handle throttling without slowing

Respect 429s with exponential backoff and jitter, cap retry attempts, and budget retries using a token-bucket per operation. Deprioritize non-critical jobs when you approach rate ceilings and lean on your cached/report data to answer non-urgent queries.

Need both caching and Reports

Yes. Reports give you bulk, point-in-time truth; caching serves that truth quickly to internal services without extra SP-API calls. Invalidate caches via events and scheduled report checkpoints so you stay fresh without spamming the API.

Are Feeds always better

For large batches, yes. Feeds reduce the number of requests and provide predictable processing. For tiny updates that must be real-time, single calls can make sense — but measure the impact on rate limits and costs.

Prep for Prime Day

Two weeks out, increase report frequency, queue depth, and autoscaling targets. One week out, run failover tests and add circuit breakers. During the event, pause non-critical syncs to protect your rate budget for orders and fulfillment.

Where can I learn more

You’ll see discussions like 'diving into amazon sp-api hot topics! 🔥👋 #4270' in dev communities. For authoritative guidance, start with Amazon’s SP-API docs for Notifications, Reports, Feeds, rate limits, and error handling (linked below).

Handle scale without chaos

Partition everything by marketplace. That means queues per marketplace (or partition keys), per-marketplace checkpoints, and per-marketplace rate budgets. If one region gets noisy, it shouldn’t starve others.

Authentication and token churn

Cache LWA access tokens with their expiry and refresh them early. Avoid requesting a new token on every call. Centralize token management so internal services don’t each hit the auth endpoints independently.

Pick the right batch size

Choose a size that finishes within your target end-to-end latency while keeping failure blast radius small. Many teams start with 2k–5k records per feed, then tune based on processing times and error rates. Keep the size stable to simplify monitoring.

Monitor costs proactively

Expose three metrics: requests per operation, throttles per operation, and report/feed counts per day. Tag each workload by business function so you can spot runaway jobs quickly. Set alerts on unusual growth day-over-day or week-over-week.

Optimization Sprint

  • Days 1–2: Map every SP-API call by operation and volume; tag by business criticality.
  • Days 3–4: Enable Notifications; route to EventBridge or SQS; process idempotently.
  • Days 5–6: Migrate top 2 read-heavy workflows to Reports; add scheduled runs.
  • Days 7–8: Migrate top write-heavy workflow to Feeds; implement delta batching.
  • Days 9–10: Add exponential backoff with jitter and per-operation token buckets.
  • Days 11–12: Add caches for catalog/pricing and filter queries by updatedSince.
  • Days 13–14: Pre-warm peak settings; add circuit breakers; run a failover game day.

What good looks like at the end:

  • A dashboard showing request volume, throttles, queue depth, and feed/report throughput.
  • Pollers replaced or reduced to reconciliation-only jobs.
  • Bulk reads (reports) and bulk writes (feeds) stable in production.
  • Backoff and token buckets verified under load tests.
  • Cache hit rates climbing; stale reads minimized via event-driven invalidation.

You don’t win peak week by calling more APIs. You win by calling the right ones, at the right time, in the right shape.

In 120 seconds, here’s the mindset shift: your integration isn’t a hose sucking on SP-API — it’s a smart valve. Events trigger action. Reports set the baseline. Feeds apply change in bulk. Retries are calm and patient. Caches absorb read traffic. And your peak plan makes sure the revenue paths stay wide open when the flood hits.

Do this and two things happen: your call volume drops and your experience gets faster. That’s the rare optimization that saves money and makes customers happier.

If you want to see how teams put this playbook into practice, explore our Case Studies.

200,000 tiny polls or 200 useful events? In 2026, your margin knows the difference.

References