Skip to main content
RapidDev - Software Development Agency

How to Automate Amazon Price Updates Using the API

Subscribe to ANY_OFFER_CHANGED notifications via Amazon SQS to detect when competitors change prices on your ASINs. Respond by calculating your new price and patching it via PATCH /listings/2021-08-01/items/{sellerId}/{sku} with the updated purchasable_offer attribute. This event-driven approach eliminates polling and handles price changes within minutes.

Need help automating? Talk to an expert
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate6 min read45–60 minutesAmazonLast updated May 2026RapidDev Engineering Team
TL;DR

Subscribe to ANY_OFFER_CHANGED notifications via Amazon SQS to detect when competitors change prices on your ASINs. Respond by calculating your new price and patching it via PATCH /listings/2021-08-01/items/{sellerId}/{sku} with the updated purchasable_offer attribute. This event-driven approach eliminates polling and handles price changes within minutes.

Quick facts about this guide
FactValue
PlatformAmazon
Auth methodLWA OAuth 2.0 — standard + grantless token for notification setup
Rate limitsputListingsItem: 5 req/sec, burst 10 | getItemOffers: 2 req/sec, burst 2 |…
DifficultyIntermediate
Time required45–60 minutes
Last updatedMay 2026

API Quick Reference

Auth

LWA OAuth 2.0 — standard + grantless token for notification setup

Rate limit

putListingsItem: 5 req/sec, burst 10 | getItemOffers: 2 req/sec, burst 2 | createSubscription: 1/sec

Format

JSON

SDK

REST only

API overview

Base URLhttps://sellingpartnerapi-na.amazon.com

Authentication

Standard SP-API requests use LWA tokens with seller authorization (refresh_token). However, createDestination for SQS notification setup requires a grantless access token with scope=sellingpartnerapi::notifications. This is different from the standard token — it uses client_credentials grant type and doesn't require a refresh token.

Key endpoints

POST/notifications/v1/destinations

Creates an SQS destination for receiving notifications. Requires grantless token with sellingpartnerapi::notifications scope. Only needs to be set up once.

ParameterTypeRequiredDescription
optional
optional
POST/notifications/v1/subscriptions/ANY_OFFER_CHANGED

Subscribes to offer change notifications for your seller account. Supports eventFilter with aggregation windows to batch notifications (e.g., FiveMinutes reduces noise).

ParameterTypeRequiredDescription
optional
optional
optional
GET/products/pricing/v0/items/{asin}/offers

Returns the current top 20 offers for an ASIN. Use for initial price checking, not for continuous monitoring (use SQS notifications instead).

ParameterTypeRequiredDescription
optional
optional
optional
optional
PATCH/listings/2021-08-01/items/{sellerId}/{sku}

Applies a partial update to an existing listing. Use with op=replace on the purchasable_offer attribute to update price without affecting title, images, or other attributes.

ParameterTypeRequiredDescription
optional
optional
optional
optional

Step-by-step automation

1

Set Up SQS Queue and ANY_OFFER_CHANGED Subscription

Create an SQS queue in your AWS account and grant Amazon permission to write to it. Then register the queue as a destination and subscribe to ANY_OFFER_CHANGED. This one-time setup is required before notifications start flowing.

request.sh
1# Step 1: Get grantless access token for notification setup
2curl -X POST https://api.amazon.com/auth/o2/token \
3 -H "Content-Type: application/x-www-form-urlencoded" \
4 -d "grant_type=client_credentials&client_id=$LWA_CLIENT_ID&client_secret=$LWA_CLIENT_SECRET&scope=sellingpartnerapi::notifications"
5
6# Step 2: Create SQS destination
7curl -X POST https://sellingpartnerapi-na.amazon.com/notifications/v1/destinations \
8 -H "x-amz-access-token: $GRANTLESS_TOKEN" \
9 -H "Content-Type: application/json" \
10 -d '{"name": "repricing-queue", "resourceSpecification": {"sqs": {"arn": "arn:aws:sqs:us-east-1:ACCOUNT_ID:repricing-queue"}}}'
2

Process SQS Messages and Extract Competitor Prices

Poll your SQS queue for ANY_OFFER_CHANGED messages. Each message contains the ASIN, your current offers, and the top competitor offers. Parse the payload to determine if repricing is warranted.

request.sh
1# SQS polling (standard AWS SQS API use AWS SDK in practice)
2curl -X POST "https://sqs.us-east-1.amazonaws.com/ACCOUNT_ID/repricing-queue" \
3 -H "Content-Type: application/x-www-form-urlencoded" \
4 -d "Action=ReceiveMessage&MaxNumberOfMessages=10&WaitTimeSeconds=20&AttributeNames.1=All"
3

Update Price via patchListingsItem

Apply the calculated new price using PATCH with a JSON Merge Patch operation on the purchasable_offer attribute. patchListingsItem is preferred over putListingsItem for price-only changes because it won't accidentally overwrite other listing attributes.

request.sh
1curl -X PATCH "https://sellingpartnerapi-na.amazon.com/listings/2021-08-01/items/$SELLER_ID/MY-SKU-001?marketplaceIds=ATVPDKIKX0DER" \
2 -H "x-amz-access-token: $LWA_ACCESS_TOKEN" \
3 -H "Content-Type: application/json" \
4 -d '{
5 "productType": "KITCHEN",
6 "patches": [{
7 "op": "replace",
8 "path": "/attributes/purchasable_offer",
9 "value": [{
10 "marketplace_id": "ATVPDKIKX0DER",
11 "currency": "USD",
12 "our_price": [{"schedule": [{"value_with_tax": 23.99}]}]
13 }]
14 }]
15 }'
4

Build a Continuous Repricing Loop

Run a polling loop that continuously checks SQS, processes offer change events, calculates new prices, and applies updates. Add guardrails for minimum/maximum price and minimum margin to prevent race conditions with other repricing tools.

request.sh
1# Continuous repricing is implemented in code see Node.js example

Complete working code

Complete Amazon repricing automation: subscribes to ANY_OFFER_CHANGED via SQS, calculates new prices with min/max guardrails, and updates listings via patchListingsItem.

Error handling

Cause

createDestination requires a grantless LWA token with scope=sellingpartnerapi::notifications, not a standard refresh_token-based token.

Fix

Use grant_type=client_credentials with scope=sellingpartnerapi::notifications to get the grantless token. Use this token ONLY for createDestination. Use your standard refresh_token-based token for createSubscription and all listing updates.

Cause

SQS queue permissions don't allow Amazon to write to it, or the destination ARN is incorrect.

Fix

Add an SQS queue policy allowing the principal 'arn:aws:iam::437868002744:root' (Amazon's Selling Partner principal) to call SendMessage on your queue. Without this policy, Amazon cannot deliver notifications.

Cause

The purchasable_offer attribute format varies by product type. Some product types use 'our_price' with a 'schedule' array; others use different structures.

Fix

Query the Product Type Definitions API to get the exact schema for your product type's purchasable_offer attribute. The structure shown in the code examples works for most product types, but verify against your specific productType schema.

Cause

Amazon's price propagation pipeline has a standard delay of 15-30 minutes after a successful patchListingsItem call.

Fix

This is expected behavior. Design your repricing logic to accept delayed propagation. Don't re-trigger repricing within 30 minutes of a previous update for the same SKU — use a last_updated timestamp per SKU to implement this debounce.

Cause

If multiple SQS messages arrive for the same ASIN simultaneously and are processed in parallel, concurrent price updates can each try to beat a competitor by $0.01.

Fix

Process SQS messages for the same ASIN sequentially, not in parallel. Use a per-ASIN lock or process messages one at a time. Always enforce minimum price in calculateNewPrice before calling the API.

Rate limits & throttling

Security checklist

  • Store LWA credentials and refresh tokens in environment variables or AWS Secrets Manager
  • Apply SQS queue access policy to allow only Amazon's Selling Partner ARN to write messages
  • Implement minimum price guardrails in code — never allow price to drop below COGS + minimum margin
  • Log all price changes with ASIN, SKU, old_price, new_price, competitor_price, and timestamp
  • Implement a circuit breaker: if 5 consecutive patchListingsItem calls fail, pause repricing and alert
  • Test repricing logic with a single low-risk ASIN before enabling for your full catalog

Automation use cases

Buy Box Competitive Repricing

Automatically price 1 cent below the current lowest competitor to maximize Buy Box win rate, with a floor at your minimum margin price.

Margin-Protected Dynamic Pricing

Set maximum and minimum price bounds per ASIN. Automatically reprice within those bounds based on competitor activity without risking below-cost sales.

Inventory-Based Pricing

Combine repricing with inventory levels — raise prices when stock is low to protect margin, lower prices when overstocked to accelerate sell-through.

No-code alternatives

Don't want to write code? These platforms can automate the same workflows visually.

Zapier

No native Amazon SP-API integration. The SQS + patchListingsItem pattern is too complex for Zapier.

Pros
    Cons

      Make (Integromat)

      HTTP modules can call SP-API, but the SQS + async notification pattern requires significant custom setup.

      Pros
        Cons

          n8n

          Most practical automation tool for this. Can poll SQS with AWS credentials, calculate prices with Code nodes, and call SP-API with HTTP Request nodes.

          Pros
            Cons

              Best practices

              • Always use event-driven ANY_OFFER_CHANGED via SQS — getItemOffers polling is impractical at scale with its 2 req/sec limit
              • Set hard minimum and maximum price limits per SKU in your config — automation errors can cause catastrophic underpricing
              • Debounce: don't reprice the same SKU within 30 minutes of the last update — Amazon's propagation takes time and you could spiral
              • Use patchListingsItem not putListingsItem for price updates to avoid accidentally overwriting other listing attributes
              • Log every price change with the competitor price that triggered it for debugging and business review
              • The FiveMinutes aggregation window on ANY_OFFER_CHANGED subscriptions reduces noise significantly on high-volume ASINs
              • Test with a single ASIN that has a wide min-max range before expanding to your full catalog
              • Use a separate SQS queue for repricing vs. other notifications to isolate failure domains

              Ask AI to help

              Copy one of these prompts to get a personalized, working implementation.

              ChatGPT / Claude Prompt

              Help me build a Node.js Amazon repricing automation using the SP-API. It should: (1) poll an SQS queue for ANY_OFFER_CHANGED notifications — each message contains the ASIN and the current lowest competitor offers, (2) extract the competitor's landed price (ListingPrice.Amount + Shipping.Amount) from the notification payload, (3) calculate a new price that's $0.01 below the competitor but never below a configurable minimum price, (4) update the price via PATCH /listings/2021-08-01/items/{sellerId}/{sku} using patchListingsItem with the purchasable_offer attribute — use op:replace with our_price.schedule.value_with_tax, (5) add 200ms delays between price updates and debounce within 30 minutes per SKU. Include LWA token refresh (1-hour tokens from https://api.amazon.com/auth/o2/token).

              Lovable / V0 Prompt

              Build me an Amazon repricing dashboard that: (1) shows all my ASINs with their current list price and the current lowest competitor price fetched via GET /products/pricing/v0/items/{asin}/offers (needs x-amz-access-token header), (2) has a repricing config table where I can set min_price, max_price per ASIN, (3) shows last price update time and what triggered it, (4) has a manual override button to set a specific price via PATCH /listings/2021-08-01/items/{sellerId}/{sku} with the purchasable_offer patch. Store the repricing config and price history in Supabase.

              Frequently asked questions

              Why use SQS notifications instead of polling getItemOffers for repricing?

              getItemOffers has a rate limit of 2 req/sec with burst 2. If you have 100 ASINs you want to monitor, polling each one every minute would require 100 req/min = 1.67 req/sec — already near the limit and using all your API budget for this single task. ANY_OFFER_CHANGED via SQS fires automatically whenever a top-20 offer changes on your ASIN, with no polling needed. It's faster (event-driven vs. scheduled) and doesn't consume any API quota.

              How do I get Amazon's Selling Partner ARN to add to my SQS queue policy?

              The ARN is 'arn:aws:iam::437868002744:root'. Add an SQS queue policy that allows this principal to call sqs:SendMessage on your queue's ARN. Without this policy, Amazon cannot deliver notifications to your queue and createDestination will succeed but no messages will arrive.

              How long does it take for a price change to show on Amazon's product page?

              Price changes submitted via patchListingsItem take 15-30 minutes to propagate to the product detail page and offer listing. The API returns ACCEPTED immediately, but the actual marketplace update is asynchronous. Factor this delay into your repricing strategy — don't reprice the same SKU within 30 minutes of the previous update.

              What's the difference between the grantless token and the standard LWA token?

              The standard token uses grant_type=refresh_token with a seller's refresh_token. The grantless token uses grant_type=client_credentials with scope=sellingpartnerapi::notifications. The grantless token is for operations that don't require seller-specific authorization (like setting up notification infrastructure). Use grantless for createDestination; use standard for createSubscription and all listing updates.

              Can I monitor competitor prices on ASINs where I'm not currently selling?

              ANY_OFFER_CHANGED delivers notifications for ASINs where you have an active offer. If you don't have a listing on the ASIN, you won't receive notifications for it. To monitor competitor prices on ASINs where you're not selling, you would need to use getItemOffers polling (subject to rate limits) or a third-party repricing tool.

              Can RapidDev help me build a more sophisticated repricing strategy?

              Yes. RapidDev can build advanced repricing logic including inventory-based pricing (raise price as stock drops), competitive tiers (different strategies for Buy Box vs. off-Buy Box), time-of-day pricing, and custom ACOS-linked repricing that connects your ad spend to pricing decisions.

              What is the aggregationSettings FiveMinutes option for ANY_OFFER_CHANGED?

              When you subscribe with aggregationTimePeriod: 'FiveMinutes', Amazon batches all offer changes for an ASIN within a 5-minute window and sends one notification instead of potentially dozens. This reduces noise on high-velocity ASINs. For most repricing scenarios, FiveMinutes is the right setting — you don't need to react to every individual bid change within seconds.

              RapidDev

              Need this automated?

              Our team has built 600+ apps with API automations. We can build this for you.

              Book a free consultation
              Matt Graham

              Written by

              Matt Graham · CEO & Founder, RapidDev

              1,000+ client projects delivered. Columbia University & Harvard Business School alumnus, U.S. Navy veteran. About the author →

              Want this built for you?

              We ship production apps at a fixed price — $13K–$25K, 6–10 weeks, source code yours. You've seen what it takes; we do it every week.

              Get a fixed-price quote

              We put the rapid in RapidDev

              Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.