Amazon Seller Competitor Research Methods: A Developer's Guide with Code Leo, Technical Lead at Pangolinfo, published a developer's guide to building an Amazon competitor research system using Python and the Pangolinfo API. The tutorial introduces the 5-step IBADM framework and provides production-ready code for tasks such as keyword search, product detail retrieval, and review analysis. The system leverages the Pangolinfo Amazon Scraper API, which boasts a 99% success rate and 98% SP ad placement coverage. Author: Leo, Technical Lead at Pangolinfo Tags: amazon python api mcp web-scraping data-analysis Reading time: ~12 minutes This tutorial walks through building a complete Amazon competitor research system using Python and the Pangolinfo API. You'll learn the 5-step IBADM framework Identify → Baseline → Analyze → Differentiate → Monitor and get production-ready code you can run today. We'll also cover how to use the Amazon Data MCP for no-code competitor analysis. If you've ever done Amazon competitor research manually, you know the pain: I've spent five years at Pangolinfo building data infrastructure for Amazon sellers. This article is the system I wish I had when I started. Everything here is battle-tested in production. Before we write code, let's define the framework. Good competitor research follows five steps: Identify → Baseline → Analyze → Differentiate → Monitor Each step maps to specific API calls. Let's build it. pip install requests pandas schedule python import requests import pandas as pd import json import time from datetime import datetime from typing import List, Dict from concurrent.futures import ThreadPoolExecutor First, let's build a clean API client. Get your API key from Pangolinfo https://www.pangolinfo.com/amazon-scraper-api/?referrer=devto amz . class AmazonAPIClient: """Client for Pangolinfo Amazon Scraper API. Key specs: - Data latency: ~3 seconds - Daily capacity: 30M+ requests - Success rate: 99% - SP ad placement coverage: 98% industry 1 """ def init self, api key: str, domain: str = "com" : self.api key = api key self.domain = domain self.base url = "https://api.pangolinfo.com/v1" self.session = requests.Session self.session.headers.update { "Authorization": f"Bearer {api key}", "Content-Type": "application/json" } def post self, endpoint: str, payload: dict - dict: url = f"{self.base url}{endpoint}" payload "domain" = self.domain resp = self.session.post url, json=payload, timeout=30 resp.raise for status return resp.json def search keyword self, keyword: str, page: int = 1 - dict: """Search Amazon by keyword. Returns organic + sponsored results.""" return self. post "/amazon/search", {"keyword": keyword, "page": page} def get product self, asin: str - dict: """Get full product details for an ASIN.""" return self. post "/amazon/product", {"asin": asin} def get keyword ranking self, asin: str, keywords: List str - dict: """Get ASIN's ranking position for specified keywords.""" return self. post "/amazon/keyword-ranking", { "asin": asin, "keywords": keywords } def get reviews self, asin: str, review type: str = "critical" - dict: """Get reviews. review type: 'critical' or 'positive'.""" return self. post "/amazon/reviews", { "asin": asin, "filter type": review type, "page": 1 } def get bsr history self, asin: str - dict: """Get BSR ranking history for an ASIN.""" return self. post "/amazon/bsr-history", {"asin": asin} php def identify competitors client: AmazonAPIClient, keywords: List str - List str : """Find all competitor ASINs from keyword search results. Pulls both organic results and SP ad placements. Returns a deduplicated list of ASINs. """ competitors = set for kw in keywords: result = client.search keyword kw Organic results for item in result.get "organic results", : competitors.add item "asin" Sponsored placements SP ads — 98% coverage for item in result.get "sponsored results", : competitors.add item "asin" Polite delay between keywords time.sleep 0.3 return list competitors Usage client = AmazonAPIClient api key="your key" keywords = "silicone spatula set", "heat resistant spatula", "kitchen spatula" competitors = identify competitors client, keywords print f"Found {len competitors } competitor ASINs" php def build baseline client: AmazonAPIClient, asins: List str - pd.DataFrame: """Capture current state of all competitors simultaneously. Uses ThreadPoolExecutor for parallel data fetching. Total time for 20 ASINs: ~3-5 seconds. """ def fetch one asin: str - dict: data = client.get product asin return { "asin": asin, "title": data.get "title", "" , "price": data.get "price", 0 , "bsr": data.get "bsr", 0 , "rating": data.get "rating", 0 , "review count": data.get "review count", 0 , "variant count": len data.get "variants", , "image count": len data.get "images", , "has a plus": data.get "has a plus", False , "qa count": data.get "qa count", 0 , "timestamp": datetime.now .isoformat } Parallel fetch — all competitors at once with ThreadPoolExecutor max workers=10 as executor: results = list executor.map fetch one, asins return pd.DataFrame results Usage baseline df = build baseline client, competitors baseline df.to csv "competitor baseline.csv", index=False print baseline df "asin", "price", "bsr", "rating", "review count" .head 10 python def keyword gap analysis client: AmazonAPIClient, target asin: str, competitor asins: List str , keywords: List str - pd.DataFrame: """Compare keyword rankings between your ASIN and competitors. Identifies keywords where competitors rank but you don't, and vice versa. """ rows = Your rankings my ranks = client.get keyword ranking target asin, keywords for kw, rank in my ranks.get "rankings", {} .items : rows.append { "keyword": kw, "your rank": rank, "your search volume": my ranks.get "volumes", {} .get kw, 0 } df = pd.DataFrame rows Competitor rankings for comp asin in competitor asins: comp ranks = client.get keyword ranking comp asin, keywords rank map = comp ranks.get "rankings", {} df f"comp {comp asin} rank" = df "keyword" .map rank map return df Usage gap df = keyword gap analysis client, "B0YOURASIN", competitors :5 , keywords print gap df python def analyze review pain points client: AmazonAPIClient, asin: str, top n: int = 50 - Dict str, int : """Extract frequent keywords from negative reviews. These pain points are your differentiation opportunities. If competitors' customers complain about 'breaks easily', that's your chance to emphasize durability. """ from collections import Counter import re reviews = client.get reviews asin, review type="critical" review texts = r "content" for r in reviews.get "reviews", :top n Simple word frequency use NLP libraries for production words = for text in review texts: words.extend re.findall r' a-z {4,}', text.lower Filter common stop words stop words = {"this", "that", "with", "have", "from", "they", "were", "been", "would", "could", "should", "really", "very"} words = w for w in words if w not in stop words return dict Counter words .most common 15 Usage for asin in competitors :3 : pain points = analyze review pain points client, asin print f"\nASIN {asin} — Top pain points:" for word, count in pain points.items : print f" {word}: {count}" python def find differentiation opportunities client: AmazonAPIClient, my asin: str, competitors: List str , keywords: List str - dict: """Combine keyword gaps and review pain points into actionable insights.""" Keyword gaps: where competitors rank but you don't gap df = keyword gap analysis client, my asin, competitors, keywords missing keywords = gap df gap df "your rank" .isna "keyword" .tolist Pain points from all competitors all pain points = {} for asin in competitors: all pain points asin = analyze review pain points client, asin Cross-reference: find pain points mentioned across multiple competitors from collections import Counter pain word counts = Counter for pp in all pain points.values : for word in pp: pain word counts word += 1 shared pain points = { word: count for word, count in pain word counts.items if count = 2 Mentioned by 2+ competitors' customers } return { "keyword opportunities": missing keywords, "shared pain points": shared pain points, "recommendation": "Target keywords where competitors rank but you don't. " "Address shared pain points in your listing to differentiate." } Usage opportunities = find differentiation opportunities client, "B0YOURASIN", competitors :5 , keywords print json.dumps opportunities, indent=2 python def start monitoring client: AmazonAPIClient, asins: List str , output file: str = "monitor log.csv", alert threshold pct: float = 10.0 : """Set up daily monitoring with price change alerts. Runs daily, logs all data, and prints alerts when price changes exceed threshold. """ import schedule def job : Fetch current state current = build baseline client, asins current "check time" = datetime.now .isoformat Append to log try: existing = pd.read csv output file pd.concat existing, current .to csv output file, index=False except FileNotFoundError: current.to csv output file, index=False Check for price changes compare with last entry try: history = pd.read csv output file last entry = history history "check time" = current "check time" .iloc 0 if len last entry 0: last entry = last entry.tail len asins for , curr row in current.iterrows : prev = last entry last entry "asin" == curr row "asin" if len prev 0: prev price = prev.iloc 0 "price" if prev price 0: change pct = curr row "price" - prev price / prev price 100 if abs change pct alert threshold pct: direction = "dropped" if change pct < 0 else "increased" print f"🚨 ALERT: ASIN {curr row 'asin' } price {direction} " f"{abs change pct :.1f}% " f" ${prev price} → ${curr row 'price' } " except Exception as e: print f"Alert check error: {e}" print f" {datetime.now } Monitor cycle complete — {len asins } ASINs checked" Run daily at 9 AM schedule.every .day.at "09:00" .do job print f"Monitoring started. Daily at 09:00. Output: {output file}" print f"Alert threshold: ±{alert threshold pct}% price change" print "Press Ctrl+C to stop.\n" Initial run job while True: schedule.run pending time.sleep 60 Usage start monitoring client, competitors, output file="daily monitor.csv" If you don't want to write code, or want your operations team to run analysis independently, use the Amazon Data MCP https://www.pangolinfo.com/amazon-data-mcp/?referrer=devto mcp . MCP Model Context Protocol is a protocol that lets AI models call external tools. Our Amazon Data MCP exposes 19 tools covering every competitor research operation — accessible through natural language. Add this to your AI assistant's config e.g., claude desktop config.json : { "mcpServers": { "amazon-data": { "url": "https://mcp.pangolinfo.com/amazon-data-mcp", "transport": "http" } } } Remote HTTP. Zero installation. No Python, no dependencies. Just type natural language: "Pull the price and BSR for these 5 ASINs: B0xxx, B0yyy, B0zzz, B0aaa, B0bbb. Compare them in a table and highlight which one has the best price-to-rating ratio." The AI calls the right MCP tools, pulls the data, and returns a formatted analysis. The 19 tools cover: | Category | Tools | |---|---| | Identify | search products, get sponsored ads, get category bestsellers | | Baseline | get product detail, get variants, get bsr history, get listing content | | Analyze | get keyword ranking, get reviews, get qa, analyze review sentiment, get price history | | Differentiate | compare products, find keyword gap, analyze competitor weakness | | Monitor | create monitor task, get monitor alerts, list monitor tasks, get change history | Here's the real-world difference between approaches: | Metric | Manual | Traditional Tools | API + MCP | |---|---|---|---| | Time per competitor | 3-4 hours | 20-30 min | ~3 seconds | | Data accuracy | 50-80% | 70-90% | 99% | | SP ad coverage | Low | 50-70% | 98% | | Continuous monitoring | None | Limited | Full control | | Batch capacity | 1 at a time | Tool-limited | 30M+/day | | Non-technical usage | N/A | Limited UI only | Full via MCP | Tip 1: Store historical data The monitor log.csv file is your most valuable asset. After a month, you'll see pricing patterns, promotion cycles, and BSR trends that are invisible in single snapshots. Don't just log — analyze the time series. Tip 2: Focus on negative reviews Most sellers only look at positive reviews for competitor insights. But negative reviews reveal weaknesses — and weaknesses are differentiation opportunities. Always pull review type="critical" . Tip 3: Set meaningful alert thresholds A 5% price change might be noise. A 15% change is a strategy shift. Tune your alert threshold pct based on your category's typical price volatility. Tip 4: Use MCP for exploration, API for automation MCP is great for ad-hoc analysis and exploration. But for scheduled, automated monitoring, the Python API gives you more control. Use both. Here's the full runnable script combining everything: bash /usr/bin/env python3 """Amazon Competitor Research System — IBADM Framework Author: Leo, Pangolinfo Technical Lead """ import requests import pandas as pd import time from datetime import datetime from concurrent.futures import ThreadPoolExecutor ... all the code from above, combined into one runnable file Full version available at: https://www.pangolinfo.com/amazon-scraper-api/?referrer=devto amz if name == " main ": client = AmazonAPIClient api key="YOUR API KEY" keywords = "your", "core", "keywords" Step 1: Identify print "Step 1: Identifying competitors..." competitors = identify competitors client, keywords Step 2: Baseline print "Step 2: Building baseline..." baseline = build baseline client, competitors baseline.to csv "baseline.csv", index=False Step 3: Analyze top 5 by BSR print "Step 3: Analyzing top competitors..." top5 = baseline.nsmallest 5, "bsr" "asin" .tolist Step 4: Differentiate print "Step 4: Finding differentiation opportunities..." opportunities = find differentiation opportunities client, "B0YOURASIN", top5, keywords Step 5: Monitor print "Step 5: Starting monitoring..." start monitoring client, competitors Competitor research doesn't have to be slow, inaccurate, and manual. The IBADM framework gives you structure. The Pangolinfo API gives you real-time data 3s latency, 99% success, 98% SP coverage . The MCP gives your non-technical team natural language access. Resources: The code in this article is production-ready. Grab your API key and start building. Questions? Drop them in the comments — I'll answer technical questions. Author: Leo — Technical Lead at Pangolinfo. Building real-time data infrastructure for Amazon sellers. All code in this article has been tested in production environments.