Skip to main content
RapidDev - Software Development Agency
API AutomationsAmazonBearer Token

How to Automate Amazon Review Monitoring using the API

Amazon SP-API has NO getReviews endpoint — individual customer reviews are not accessible via the API. Brand-registered sellers can get aggregated review summaries via Brand Analytics reports using POST /reports/2021-06-30/reports with reportType GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT. Subscribe to BRANDED_ITEM_CONTENT_CHANGE and PRICING_HEALTH notifications for real-time alerts. Key limit: createReport at 0.0167 req/sec (1/min). Scraping reviews violates Amazon ToS.

Need help automating? Talk to an expert
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced7 min read1-2 hoursAmazonMay 2026RapidDev Engineering Team
TL;DR

Amazon SP-API has NO getReviews endpoint — individual customer reviews are not accessible via the API. Brand-registered sellers can get aggregated review summaries via Brand Analytics reports using POST /reports/2021-06-30/reports with reportType GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT. Subscribe to BRANDED_ITEM_CONTENT_CHANGE and PRICING_HEALTH notifications for real-time alerts. Key limit: createReport at 0.0167 req/sec (1/min). Scraping reviews violates Amazon ToS.

API Quick Reference

Auth

LWA OAuth 2.0 (Bearer token)

Rate limit

1 report request/minute (createReport)

Format

JSON + downloadable report file

SDK

Available

Understanding the Amazon SP-API

This page addresses a critical misconception head-on: Amazon SP-API does NOT have a getReviews endpoint. Individual customer reviews — star ratings, review text, reviewer names — are not exposed through any official Amazon API. If you've come here looking for a direct reviews API, it doesn't exist and scraping reviews violates Amazon's Terms of Service.

What SP-API does provide for brand-registered sellers: (1) Brand Analytics reports via the Reports API that aggregate review metrics, search term performance, and ASIN-level customer sentiment data, (2) BRANDED_ITEM_CONTENT_CHANGE notifications that fire when listing content is modified (including review-driven content changes), and (3) PRICING_HEALTH notifications that alert when Buy Box eligibility changes, which often correlates with review score drops.

The Reports API uses async generation: POST a report request, poll for completion via getReport, then download the data file. createReport is severely throttled at 0.0167 req/sec (1 request per minute sustained, burst 15). Amazon SP-API replaced the legacy MWS system on March 31, 2024 — any tutorial referencing MWS, AWS IAM signing, or Signature V4 is outdated and should be ignored. Official documentation: https://developer-docs.amazon.com/sp-api/docs/reports-api-v2021-06-30-reference

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

Setting Up Amazon SP-API Authentication

Amazon SP-API uses Login with Amazon (LWA) OAuth 2.0. You obtain a refresh token during app authorization and exchange it for a short-lived access token (1 hour) before each session of API calls. AWS IAM signing is NOT required — SP-API ignores SigV4 signatures since October 2023. Brand Analytics role requires separate approval in your Developer Profile.

  1. 1Go to Seller Central > Developer Console and register a new app under 'Develop Apps'
  2. 2Submit your Developer Profile documenting your use case and data handling — include Brand Analytics role if you need review data
  3. 3Wait for Amazon's review — restricted roles like Brand Analytics have additional review requirements
  4. 4Once approved, go to Seller Central > Apps & Services > Manage Your Apps and authorize your app to get your LWA refresh token
  5. 5Set environment variables: AMAZON_LWA_CLIENT_ID, AMAZON_LWA_CLIENT_SECRET, AMAZON_LWA_REFRESH_TOKEN, AMAZON_SELLER_ID
  6. 6Exchange your refresh token for an access token via POST to https://api.amazon.com/auth/o2/token
  7. 7Rotate LWA credentials every 180 days as required by Amazon's security policy
auth.py
1import os
2import requests
3import json
4
5def get_lwa_access_token():
6 response = requests.post(
7 'https://api.amazon.com/auth/o2/token',
8 data={
9 'grant_type': 'refresh_token',
10 'refresh_token': os.environ['AMAZON_LWA_REFRESH_TOKEN'],
11 'client_id': os.environ['AMAZON_LWA_CLIENT_ID'],
12 'client_secret': os.environ['AMAZON_LWA_CLIENT_SECRET']
13 }
14 )
15 response.raise_for_status()
16 token_data = response.json()
17 return token_data['access_token'] # Valid for 1 hour
18
19# Use in API requests
20token = get_lwa_access_token()
21headers = {
22 'x-amz-access-token': token,
23 'Content-Type': 'application/json'
24}
25print(f'Access token obtained: {token[:20]}...')

Security notes

  • Store LWA credentials in environment variables — never hardcode client ID, client secret, or refresh token
  • LWA access tokens expire in 1 hour — cache and refresh proactively rather than requesting a new token on every API call
  • Rotate LWA credentials every 180 days as required by Amazon's security policy
  • Brand Analytics data contains aggregated customer behavior — handle per Amazon's Data Protection Policy
  • Never scrape review pages — this violates Amazon ToS and can result in account suspension
  • Use the correct regional endpoint for each seller's marketplace (NA, EU, FE) — cross-region requests return 403

Key endpoints

POST/reports/2021-06-30/reports

Creates a report generation request. For Brand Analytics review data, use GET_BRAND_ANALYTICS_MARKET_BASKET_REPORT or GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT. Reports generate asynchronously — poll for status with getReport.

ParameterTypeRequiredDescription
reportTypestringrequiredReport type identifier. Brand Analytics types: GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT, GET_BRAND_ANALYTICS_MARKET_BASKET_REPORT, GET_BRAND_ANALYTICS_REPEAT_PURCHASE_REPORT. Requires Brand Analytics role approval.
marketplaceIdsarrayrequiredArray of marketplace IDs. US = ATVPDKIKX0DER, CA = A2EUQ1WTGCTBG2, UK = A1F83G8C2ARO7P
dataStartTimestringoptionalISO 8601 start of reporting period. Required for date-range reports.
dataEndTimestringoptionalISO 8601 end of reporting period

Request

json
1{"reportType": "GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT", "dataStartTime": "2024-01-01T00:00:00Z", "dataEndTime": "2024-01-31T00:00:00Z", "reportOptions": {"reportPeriod": "MONTH"}, "marketplaceIds": ["ATVPDKIKX0DER"]}

Response

json
1{"reportId": "ID323456789", "processingStatus": "IN_QUEUE"}
GET/reports/2021-06-30/reports/{reportId}

Polls report status. Once processingStatus is DONE, the reportDocumentId field contains the ID for downloading the report file. processingStatus can be: IN_QUEUE, IN_PROGRESS, DONE, CANCELLED, FATAL.

ParameterTypeRequiredDescription
reportIdstringrequiredThe report ID returned from createReport

Response

json
1{"reportId": "ID323456789", "reportType": "GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT", "processingStatus": "DONE", "reportDocumentId": "amzn1.tortuga.3.ed4c3258....", "createdTime": "2024-02-01T10:00:00Z", "processingEndTime": "2024-02-01T10:04:32Z"}
GET/reports/2021-06-30/documents/{reportDocumentId}

Gets the download URL for a completed report. The URL is pre-signed S3 and time-limited. Download it immediately after retrieving.

ParameterTypeRequiredDescription
reportDocumentIdstringrequiredThe document ID from the completed report object

Response

json
1{"reportDocumentId": "amzn1.tortuga.3.ed4c3258", "url": "https://tortuga-prod-na.s3.amazonaws.com/.../report.json?X-Amz-...", "compressionAlgorithm": "GZIP"}
POST/notifications/v1/subscriptions/{notificationType}

Subscribe to real-time notifications. Use BRANDED_ITEM_CONTENT_CHANGE for listing content change alerts and PRICING_HEALTH for Buy Box eligibility changes correlated with review score drops.

ParameterTypeRequiredDescription
notificationTypestringrequiredNotification type in the URL path. Use BRANDED_ITEM_CONTENT_CHANGE or PRICING_HEALTH for review monitoring workflows.
destinationIdstringrequiredThe SQS destination ID created via createDestination (uses a grantless token)

Request

json
1{"payloadVersion": "1.0", "destinationId": "dest-1234-5678-abcd-efgh"}

Response

json
1{"subscriptionId": "sub-1234-5678-abcd", "payloadVersion": "1.0", "destinationId": "dest-1234-5678-abcd-efgh"}

Step-by-step automation

1

Get an LWA Access Token

Why: Every SP-API call requires a fresh access token — tokens expire after 1 hour and must be refreshed.

Exchange your stored LWA refresh token for a short-lived access token by POSTing to Amazon's OAuth token endpoint. Cache the access token and its expiry time — only refresh when within 5 minutes of expiry to avoid unnecessary token requests.

request.sh
1curl -X POST https://api.amazon.com/auth/o2/token \
2 -H 'Content-Type: application/x-www-form-urlencoded' \
3 -d 'grant_type=refresh_token' \
4 -d "refresh_token=$AMAZON_LWA_REFRESH_TOKEN" \
5 -d "client_id=$AMAZON_LWA_CLIENT_ID" \
6 -d "client_secret=$AMAZON_LWA_CLIENT_SECRET"

Pro tip: Use the community library python-amazon-sp-api (pip install python-amazon-sp-api) which handles token management, caching, and retry logic automatically. It dramatically reduces boilerplate for SP-API integrations.

Expected result: A valid LWA access token (Atza|...) ready to be included in the x-amz-access-token header of all SP-API requests.

2

Request a Brand Analytics Report

Why: Brand Analytics reports are the only official way to get aggregated review and customer behavior data from Amazon — there is no direct reviews API.

POST to /reports/2021-06-30/reports with a Brand Analytics report type. Requires Brand Analytics role approval in your SP-API Developer Profile. The GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT shows which search terms customers use to find your products, with performance metrics. The report is generated asynchronously — save the reportId to poll for completion.

request.sh
1TOKEN=$(curl -s -X POST https://api.amazon.com/auth/o2/token \
2 -d "grant_type=refresh_token&refresh_token=$AMAZON_LWA_REFRESH_TOKEN&client_id=$AMAZON_LWA_CLIENT_ID&client_secret=$AMAZON_LWA_CLIENT_SECRET" \
3 | python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
4
5curl -X POST https://sellingpartnerapi-na.amazon.com/reports/2021-06-30/reports \
6 -H "x-amz-access-token: $TOKEN" \
7 -H 'Content-Type: application/json' \
8 -d '{
9 "reportType": "GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT",
10 "dataStartTime": "2024-01-01T00:00:00Z",
11 "dataEndTime": "2024-01-31T00:00:00Z",
12 "reportOptions": {"reportPeriod": "MONTH"},
13 "marketplaceIds": ["ATVPDKIKX0DER"]
14 }'

Pro tip: Brand Analytics report availability depends on having brand-registered ASINs with sufficient traffic. If Amazon returns 403, your account likely needs the Brand Analytics role approved in the Developer Console. If you get FATAL processing status, the report period may have insufficient data.

Expected result: A reportId string. Save this to poll for completion. Processing typically takes 1-15 minutes depending on the report type and date range.

3

Poll for Report Completion and Download

Why: Brand Analytics reports take 1-30 minutes to generate — polling ensures you download the file only when it's ready.

Poll GET /reports/2021-06-30/reports/{reportId} every 30-60 seconds until processingStatus is 'DONE'. Then call getReportDocument to get the pre-signed S3 download URL. The URL is time-limited — download immediately. Most Brand Analytics reports are GZIP compressed JSON.

request.sh
1# Poll for completion
2curl https://sellingpartnerapi-na.amazon.com/reports/2021-06-30/reports/ID323456789 \
3 -H "x-amz-access-token: $TOKEN"
4
5# After DONE status, get download URL
6curl https://sellingpartnerapi-na.amazon.com/reports/2021-06-30/documents/amzn1.tortuga.3.xxx \
7 -H "x-amz-access-token: $TOKEN"

Pro tip: Subscribe to the REPORT_PROCESSING_FINISHED notification instead of polling. When Amazon finishes generating the report, it sends a notification to your SQS queue with the reportDocumentId — no polling needed.

Expected result: The raw report content (tab-delimited text or JSON) containing Brand Analytics data including search term performance and customer behavior metrics.

4

Subscribe to BRANDED_ITEM_CONTENT_CHANGE Notifications

Why: Real-time notifications alert you when listing content changes — which can indicate review-driven content modifications, competitor-flagged content, or Amazon editorial changes.

Set up an SQS destination and subscribe to BRANDED_ITEM_CONTENT_CHANGE notifications. When Amazon detects a change to your brand-registered ASIN's listing content (title, description, images, bullet points), this notification fires. Combine with PRICING_HEALTH to detect when review score issues affect Buy Box eligibility. Creating destinations requires a grantless token (different scope from regular API calls).

request.sh
1# Step 1: Get grantless token for createDestination
2curl -X POST https://api.amazon.com/auth/o2/token \
3 -d 'grant_type=client_credentials' \
4 -d "client_id=$AMAZON_LWA_CLIENT_ID" \
5 -d "client_secret=$AMAZON_LWA_CLIENT_SECRET" \
6 -d 'scope=sellingpartnerapi::notifications'
7
8# Step 2: Create SQS destination (with grantless token)
9curl -X POST https://sellingpartnerapi-na.amazon.com/notifications/v1/destinations \
10 -H "x-amz-access-token: $GRANTLESS_TOKEN" \
11 -H 'Content-Type: application/json' \
12 -d '{"resourceSpecification": {"sqs": {"arn": "arn:aws:sqs:us-east-1:123456789:my-queue"}}, "name": "brand-monitoring-queue"}'

Pro tip: SQS standard queues work fine for notifications — FIFO queues are NOT supported by SP-API. Set the SQS queue policy to allow Amazon's SNS service to publish to it: add a policy allowing 'aws:SourceAccount' to match your account ID.

Expected result: Active subscriptions for BRANDED_ITEM_CONTENT_CHANGE and PRICING_HEALTH sending events to your SQS queue. When your listing content changes or Buy Box eligibility shifts, a notification message arrives in the queue.

Complete working code

A complete review monitoring pipeline: request a monthly Brand Analytics report, poll for completion, parse the results, and send a summary to Slack. Also includes the notification subscription setup for real-time content change alerts.

automate_amazon_review_monitoring.py
1import requests
2import os
3import time
4import gzip
5import json
6import csv
7import io
8import logging
9from datetime import datetime, timedelta
10
11logging.basicConfig(level=logging.INFO)
12log = logging.getLogger(__name__)
13
14BASE_URL = 'https://sellingpartnerapi-na.amazon.com'
15SLACK_WEBHOOK = os.environ.get('SLACK_WEBHOOK_URL')
16
17class SPAPIClient:
18 def __init__(self):
19 self._token = None
20 self._expires_at = 0
21
22 def token(self):
23 if time.time() >= self._expires_at - 300:
24 resp = requests.post('https://api.amazon.com/auth/o2/token', data={
25 'grant_type': 'refresh_token',
26 'refresh_token': os.environ['AMAZON_LWA_REFRESH_TOKEN'],
27 'client_id': os.environ['AMAZON_LWA_CLIENT_ID'],
28 'client_secret': os.environ['AMAZON_LWA_CLIENT_SECRET']
29 })
30 resp.raise_for_status()
31 d = resp.json()
32 self._token = d['access_token']
33 self._expires_at = time.time() + d['expires_in']
34 return self._token
35
36 def headers(self):
37 return {'x-amz-access-token': self.token(), 'Content-Type': 'application/json'}
38
39client = SPAPIClient()
40
41def request_report(report_type, start, end, marketplace='ATVPDKIKX0DER'):
42 resp = requests.post(f'{BASE_URL}/reports/2021-06-30/reports',
43 headers=client.headers(),
44 json={
45 'reportType': report_type,
46 'dataStartTime': f'{start}T00:00:00Z',
47 'dataEndTime': f'{end}T23:59:59Z',
48 'reportOptions': {'reportPeriod': 'MONTH'},
49 'marketplaceIds': [marketplace]
50 }
51 )
52 resp.raise_for_status()
53 return resp.json()['reportId']
54
55def await_report(report_id, timeout=1800):
56 deadline = time.time() + timeout
57 while time.time() < deadline:
58 resp = requests.get(f'{BASE_URL}/reports/2021-06-30/reports/{report_id}',
59 headers=client.headers())
60 data = resp.json()
61 log.info(f'Status: {data["processingStatus"]}')
62 if data['processingStatus'] == 'DONE':
63 return data['reportDocumentId']
64 if data['processingStatus'] in ('FATAL', 'CANCELLED'):
65 raise Exception(f'Report failed: {data["processingStatus"]}')
66 time.sleep(30)
67 raise TimeoutError('Report timeout')
68
69def download(doc_id):
70 resp = requests.get(f'{BASE_URL}/reports/2021-06-30/documents/{doc_id}',
71 headers=client.headers())
72 doc = resp.json()
73 file_resp = requests.get(doc['url'])
74 if doc.get('compressionAlgorithm') == 'GZIP':
75 return gzip.decompress(file_resp.content).decode('utf-8')
76 return file_resp.text
77
78def send_slack(msg):
79 if SLACK_WEBHOOK:
80 requests.post(SLACK_WEBHOOK, json={'text': msg})
81
82def main():
83 # Previous month
84 today = datetime.utcnow()
85 first = today.replace(day=1) - timedelta(days=1)
86 start = first.replace(day=1).strftime('%Y-%m-%d')
87 end = first.strftime('%Y-%m-%d')
88
89 log.info(f'Requesting Brand Analytics report for {start} to {end}')
90 report_id = request_report('GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT', start, end)
91 doc_id = await_report(report_id)
92 content = download(doc_id)
93
94 # Parse tab-delimited report
95 reader = csv.DictReader(io.StringIO(content), delimiter='\t')
96 rows = list(reader)
97 log.info(f'Report has {len(rows)} rows')
98
99 msg = f'*Amazon Brand Analytics — {start[:7]}*\n'
100 msg += f'Search terms analyzed: {len(rows)}\n'
101 if rows:
102 top = rows[:3]
103 msg += 'Top search terms:\n'
104 for r in top:
105 term = list(r.values())[0] if r else 'N/A'
106 msg += f' • {term}\n'
107
108 send_slack(msg)
109 log.info('Done')
110
111if __name__ == '__main__':
112 main()

Error handling

403Access to requested resource is denied
Cause

The Brand Analytics role is not approved for your SP-API application. This role requires additional review by Amazon due to its access to sensitive customer behavior data.

Fix

Go to your Developer Profile in the SP-API Developer Console and add the Brand Analytics role. Submit for review and wait for Amazon's approval — this can take days to weeks. Without this role, you cannot access any Brand Analytics report types.

Retry strategy

No retry — complete role approval process

FATALReport processingStatus: FATAL
Cause

The report generation failed. Common causes: insufficient data for the requested ASIN set or time period, incompatible reportOptions for the report type, or marketplace ID mismatch.

Fix

Check that your brand-registered ASINs have traffic data for the requested period. Try a shorter date range or a different report type. Verify marketplaceId matches your selling region.

Retry strategy

Retry with adjusted parameters — wait at least 1 minute (createReport rate limit) before retrying

429QuotaExceeded — request rate exceeded
Cause

Hit the createReport rate limit of 0.0167 req/sec (1 per minute). Also possible on getReport (2 req/sec) if polling too aggressively.

Fix

For createReport: enforce a 60-second minimum between report requests. For getReport polling: poll every 30-60 seconds, not every second. Check the x-amzn-RateLimit-Limit response header for the actual applied rate.

Retry strategy

Exponential backoff starting at 60 seconds for createReport. For getReport: simple 30-second delay between polls.

401Unauthorized — access token expired or invalid
Cause

LWA access token expired (1-hour lifetime) or invalid. Refresh token may also have expired (365-day lifetime) or been revoked.

Fix

Implement token caching with proactive refresh (refresh when within 5 minutes of expiry). If refresh token is expired, re-authorize through the SP-API authorization flow in Seller Central.

Retry strategy

Refresh token and retry immediately — one retry is sufficient

403Access Denied — LWA credentials rotation overdue
Cause

LWA credentials (client ID and secret) have not been rotated within the required 180-day window.

Fix

Go to the SP-API Developer Console, rotate your LWA credentials, and update your application's environment variables with the new values.

Retry strategy

No retry — rotate credentials first

Rate Limits for Amazon SP-API

ScopeLimitWindow
createReport0.0167 requests (1/min)per second sustained, burst 15
getReport2 requestsper second
createSubscription1 requestper second
retry-handler.ts
1import time
2import requests
3
4def sp_api_with_retry(fn, max_retries=5):
5 for attempt in range(max_retries):
6 try:
7 return fn()
8 except requests.HTTPError as e:
9 if e.response.status_code == 429:
10 # Check x-amzn-RateLimit-Limit header for actual limit
11 wait = max(60, 2 ** attempt)
12 print(f'Rate limited (429), waiting {wait}s')
13 time.sleep(wait)
14 elif e.response.status_code in (500, 503):
15 time.sleep(2 ** attempt)
16 else:
17 raise
18 raise Exception('Max retries exceeded')
  • Never poll createReport more than once per minute — the 0.0167 req/sec limit is extremely strict
  • Use the REPORT_PROCESSING_FINISHED notification to avoid polling getReport entirely — subscribe and wait for Amazon to notify you
  • Check the x-amzn-RateLimit-Limit response header on every API call — your actual applied rate may differ from documented defaults
  • Use the burst budget (15 for createReport) strategically — spread burst usage across minutes, not seconds
  • For regular monitoring, schedule monthly Brand Analytics reports and don't poll for ad-hoc review data

Security checklist

  • Store LWA client ID, client secret, and refresh token in environment variables — never hardcode
  • Rotate LWA credentials every 180 days as required by Amazon's security policy
  • Handle Brand Analytics data per Amazon's Data Protection Policy — don't store individual customer identifiers
  • Never scrape Amazon product pages for review data — this violates ToS and risks account suspension
  • Use the correct regional SP-API endpoint for each seller marketplace — NA, EU, FE are separate
  • Validate that all downloaded report data is from your own account before processing — verify seller ID matches
  • Use SQS message deduplication for notification processing to handle potential duplicate deliveries
  • Log API calls with timestamps and rate limit headers for debugging — never log the access token

Automation use cases

Monthly Brand Health Dashboard

advanced

Request Brand Analytics reports monthly and build a dashboard tracking search term performance, market basket associations, and repeat purchase rates to infer customer satisfaction trends.

Listing Content Change Alerting

intermediate

Subscribe to BRANDED_ITEM_CONTENT_CHANGE notifications and alert your team whenever Amazon or a third party modifies your listing title, bullets, or images — a common source of review-related problems.

Buy Box Health Monitor

intermediate

Subscribe to PRICING_HEALTH notifications to detect when your products lose Buy Box eligibility, which often correlates with review score problems or policy violations.

Search Term Trend Analysis

advanced

Collect 12 months of Brand Analytics search term reports and analyze trends to identify which terms drive the most traffic and how they correlate with review feedback.

No-code alternatives

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

Zapier

Free tier (100 tasks/month), paid from $19.99/month

Zapier has no native Amazon SP-API integration — the Amazon channel is for Alexa skills and product search, not seller data. Brand Analytics access requires custom HTTP requests.

Pros
  • + Can make HTTP requests to SP-API with correct headers
  • + Useful for alerting and Slack notifications
Cons
  • - No native SP-API module
  • - OAuth token management is manual
  • - Complex for SP-API authentication flow

Make

Free tier (1,000 ops/month), paid from $9/month

Make's HTTP module can call SP-API endpoints once you handle LWA token generation — useful for scheduled report requests and Slack/email alerts.

Pros
  • + Better HTTP request handling than Zapier
  • + Scheduled triggers for monthly reports
  • + Conditional logic for alert routing
Cons
  • - No native SP-API module
  • - LWA token refresh requires custom logic
  • - Brand Analytics setup is complex

n8n

Free (self-hosted), Cloud from €20/month

n8n's Code node and HTTP Request node can implement the full SP-API authentication and report download flow, with built-in scheduling for monthly Brand Analytics runs.

Pros
  • + Full SP-API access with Code node for token management
  • + Self-hostable for secure credential storage
  • + Schedule trigger for monthly reports
Cons
  • - Complex implementation for SP-API auth
  • - No pre-built SP-API nodes
  • - Requires developer setup

Best practices

  • Understand the limitation upfront: there is no Amazon reviews API — design your monitoring strategy around Brand Analytics reports and notifications, not individual review fetching
  • Request Brand Analytics reports monthly, not daily — the rate limit (1/min) and report granularity (monthly) make more frequent requests wasteful
  • Combine BRANDED_ITEM_CONTENT_CHANGE with PRICING_HEALTH notifications for a comprehensive real-time monitoring signal — content changes and Buy Box loss often precede visible review score impacts
  • Subscribe to REPORT_PROCESSING_FINISHED notification to eliminate polling for report completion
  • Store downloaded report data in a database for trend analysis across months — Amazon only retains report files for a limited time
  • Use SQS message visibility timeouts appropriately for notification processing to avoid double-processing
  • Cross-reference Brand Analytics search term data with your listing optimizations to understand what customers are actually looking for

Ask AI to help

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

ChatGPT / Claude Prompt

I'm building Amazon SP-API review monitoring using the Reports API in Python. I use POST /reports/2021-06-30/reports with reportType='GET_BRAND_ANALYTICS_SEARCH_TERMS_REPORT', poll for DONE status, then download the GZIP-compressed tab-delimited file. Help me: (1) implement the LWA token refresh with 5-minute early refresh before expiry, (2) parse the tab-delimited report content to extract top search terms, (3) add exponential backoff for 429 errors (respecting the 1 req/min createReport limit), and (4) set up a BRANDED_ITEM_CONTENT_CHANGE notification subscription using the grantless token flow.

Lovable / V0 Prompt

Build an Amazon brand health monitoring dashboard in React with: (1) a monthly calendar date picker to select the reporting period, (2) a 'Request Report' button that calls a backend API to trigger Brand Analytics report generation, (3) a status indicator showing IN_QUEUE / IN_PROGRESS / DONE with a polling mechanism, (4) when DONE, display a table of top search terms with columns for term, click share, conversion share, and impressions from the downloaded report, (5) a notification log showing recent BRANDED_ITEM_CONTENT_CHANGE events with ASIN and change timestamp.

Frequently asked questions

Can I get individual customer reviews via the Amazon SP-API?

No. Amazon SP-API does NOT expose individual customer reviews — there is no getReviews endpoint. Individual review text, star ratings, and reviewer information are not accessible through any official Amazon API. Brand-registered sellers can access aggregated review metrics via Brand Analytics reports, but not individual review data. Attempting to scrape review pages violates Amazon's Terms of Service and risks seller account suspension.

What data does the Brand Analytics report actually provide?

Brand Analytics reports (for brand-registered sellers) provide: search term performance data (what customers searched to find your products), market basket analysis (what other products are frequently purchased together with yours), repeat purchase rates, and demographic insights. These are aggregate metrics — not individual customer data. They're useful for understanding overall product perception and search trends but don't give you access to specific review content.

How do I know when my listing content has been changed?

Subscribe to the BRANDED_ITEM_CONTENT_CHANGE notification type via the Notifications API. When Amazon detects any change to your brand-registered ASIN's listing content (title, bullet points, description, images), a notification is sent to your configured SQS queue. This lets you detect unauthorized third-party edits, Amazon editorial changes, and content modifications that might affect your reviews.

What happens when I hit the createReport rate limit?

Amazon returns a 429 QuotaExceeded error. The createReport rate limit is extremely low at 0.0167 req/sec — that's 1 request per minute sustained. If you hit the 429, wait at least 60 seconds before retrying. Check the x-amzn-RateLimit-Limit response header which shows your actual applied rate — it may differ from the documented default for high-volume sellers.

Does Brand Analytics require brand registration?

Yes. Brand Analytics reports are only available to sellers with brand-registered products in Amazon's Brand Registry. Additionally, the Brand Analytics role must be explicitly approved in your SP-API Developer Profile — it's not automatically granted. Submit your Developer Profile with Brand Analytics listed and wait for Amazon's review, which can take days to weeks.

Are there third-party tools for Amazon review monitoring?

Yes. Since the official API doesn't provide individual review access, several third-party services (Jungle Scout, Helium 10, Feedback Whiz, Seller Labs) offer review monitoring through their own data collection methods. These tools operate under their own Terms of Service with Amazon — verify their compliance status before use. They typically offer alerting for new reviews, sentiment analysis, and response templates.

Can RapidDev help build a custom Amazon brand monitoring system?

Yes. RapidDev has built 600+ apps including Amazon seller tools that combine SP-API Brand Analytics data, notification processing, and custom dashboards. If you need a comprehensive brand monitoring solution, get a free consultation at rapidevelopers.com.

RapidDev

Need this automated?

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

Book a free consultation

Skip the coding — we'll build it for you

Our experts have built 600+ API automations. From prototype to production in days, not weeks.

Book a free consultation

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.