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.
| Fact | Value |
|---|---|
| Platform | Amazon |
| Auth method | LWA OAuth 2.0 — standard + grantless token for notification setup |
| Rate limits | putListingsItem: 5 req/sec, burst 10 | getItemOffers: 2 req/sec, burst 2 |… |
| Difficulty | Intermediate |
| Time required | 45–60 minutes |
| Last updated | May 2026 |
API Quick Reference
LWA OAuth 2.0 — standard + grantless token for notification setup
putListingsItem: 5 req/sec, burst 10 | getItemOffers: 2 req/sec, burst 2 | createSubscription: 1/sec
JSON
REST only
API overview
https://sellingpartnerapi-na.amazon.comAuthentication
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
/notifications/v1/destinationsCreates an SQS destination for receiving notifications. Requires grantless token with sellingpartnerapi::notifications scope. Only needs to be set up once.
| Parameter | Type | Required | Description |
|---|---|---|---|
| optional | ||
| optional |
/notifications/v1/subscriptions/ANY_OFFER_CHANGEDSubscribes to offer change notifications for your seller account. Supports eventFilter with aggregation windows to batch notifications (e.g., FiveMinutes reduces noise).
| Parameter | Type | Required | Description |
|---|---|---|---|
| optional | ||
| optional | ||
| optional |
/products/pricing/v0/items/{asin}/offersReturns the current top 20 offers for an ASIN. Use for initial price checking, not for continuous monitoring (use SQS notifications instead).
| Parameter | Type | Required | Description |
|---|---|---|---|
| optional | ||
| optional | ||
| optional | ||
| optional |
/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.
| Parameter | Type | Required | Description |
|---|---|---|---|
| optional | ||
| optional | ||
| optional | ||
| optional |
Step-by-step automation
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.
1# Step 1: Get grantless access token for notification setup2curl -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"56# Step 2: Create SQS destination7curl -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"}}}'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.
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"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.
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 }'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.
1# Continuous repricing is implemented in code — see Node.js exampleComplete 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
createDestination requires a grantless LWA token with scope=sellingpartnerapi::notifications, not a standard refresh_token-based token.
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.
SQS queue permissions don't allow Amazon to write to it, or the destination ARN is incorrect.
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.
The purchasable_offer attribute format varies by product type. Some product types use 'our_price' with a 'schedule' array; others use different structures.
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.
Amazon's price propagation pipeline has a standard delay of 15-30 minutes after a successful patchListingsItem call.
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.
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.
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.
Make (Integromat)
HTTP modules can call SP-API, but the SQS + async notification pattern requires significant custom setup.
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.
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.
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).
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.
Need this automated?
Our team has built 600+ apps with API automations. We can build this for you.
Book a free consultation