Before investing in Amazon FBA inventory, you need to validate that a product can actually be profitable. This means checking competition density on Amazon, verifying demand signals across Google and TikTok, and stress-testing your margin assumptions. This tutorial builds a profitability validation pipeline that uses Scavio to pull live data from Amazon, Google, and TikTok at $0.005 per search, replacing expensive tools like Helium 10 (starting at $49/month).
Prerequisites
- Python 3.9+ installed
- requests library installed
- A Scavio API key from scavio.dev
- Basic understanding of Amazon FBA economics
Walkthrough
Step 1: Check Amazon competition density
Search Amazon for your product to see how many competing listings exist, their ratings, and pricing patterns. High competition with established brands means harder entry.
import os, requests, re
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
URL = 'https://api.scavio.dev/api/v1/search'
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def check_amazon_competition(product: str) -> dict:
resp = requests.post(URL, headers=H,
json={'query': f'site:amazon.com {product}',
'country_code': 'us', 'num_results': 10})
results = resp.json().get('organic_results', [])
# Extract pricing from snippets
prices = []
for r in results:
price_match = re.search(r'\$([\d,]+\.\d{2})', r.get('snippet', '') + r.get('title', ''))
if price_match:
prices.append(float(price_match.group(1).replace(',', '')))
# Extract ratings
ratings = []
for r in results:
rating_match = re.search(r'(\d+\.\d+) out of 5', r.get('snippet', ''))
if rating_match:
ratings.append(float(rating_match.group(1)))
return {
'product': product,
'listings_found': len(results),
'price_range': {'min': min(prices) if prices else 0, 'max': max(prices) if prices else 0,
'avg': sum(prices)/len(prices) if prices else 0},
'avg_rating': sum(ratings)/len(ratings) if ratings else 0,
'competition': 'high' if len(results) >= 8 else 'medium' if len(results) >= 4 else 'low',
}
comp = check_amazon_competition('silicone baking mat set')
print(f"Product: {comp['product']}")
print(f"Competition: {comp['competition']} ({comp['listings_found']} listings)")
print(f"Price range: ${comp['price_range']['min']:.2f} - ${comp['price_range']['max']:.2f}")
print(f"Avg rating: {comp['avg_rating']:.1f}")Step 2: Verify demand signals across Google
Search Google for buying-intent queries to gauge demand. High search volume for product-specific queries indicates real market demand.
import time
def check_demand_signals(product: str) -> dict:
"""Check Google for buying intent signals."""
intent_queries = [
f'best {product} 2026',
f'{product} review',
f'{product} vs',
f'where to buy {product}',
]
total_results = 0
buying_signals = 0
for q in intent_queries:
resp = requests.post(URL, headers=H,
json={'query': q, 'country_code': 'us', 'num_results': 5})
results = resp.json().get('organic_results', [])
total_results += len(results)
# Count buying intent results (Amazon, Walmart, shopping sites)
for r in results:
link = r.get('link', '').lower()
if any(shop in link for shop in ['amazon.', 'walmart.', 'target.', '/shop', '/buy']):
buying_signals += 1
time.sleep(0.3)
return {
'product': product,
'intent_queries': len(intent_queries),
'total_results': total_results,
'buying_signals': buying_signals,
'demand_score': buying_signals / total_results if total_results else 0,
'demand_level': 'high' if buying_signals > 8 else 'medium' if buying_signals > 4 else 'low',
}
demand = check_demand_signals('silicone baking mat set')
print(f"Demand: {demand['demand_level']}")
print(f"Buying signals: {demand['buying_signals']}/{demand['total_results']}")
print(f"Cost: {demand['intent_queries']} searches = ${demand['intent_queries'] * 0.005:.3f}")Step 3: Calculate profitability margins
Combine the competition and demand data with your cost assumptions to estimate profitability. Flag products that do not meet minimum margin thresholds.
def validate_profitability(product: str, unit_cost: float, shipping_cost: float = 3.0) -> dict:
"""Full profitability validation with live data."""
# Get live market data
competition = check_amazon_competition(product)
time.sleep(0.3)
demand = check_demand_signals(product)
# Calculate margins
avg_price = competition['price_range']['avg']
if avg_price == 0:
return {'product': product, 'verdict': 'SKIP', 'reason': 'No pricing data found'}
amazon_fee = avg_price * 0.15 # 15% referral fee
fba_fee = 4.50 # Estimated FBA fee
total_cost = unit_cost + shipping_cost + amazon_fee + fba_fee
profit_per_unit = avg_price - total_cost
margin = profit_per_unit / avg_price if avg_price > 0 else 0
# Verdict
issues = []
if margin < 0.20:
issues.append(f'Low margin: {margin:.0%}')
if competition['competition'] == 'high' and competition['avg_rating'] > 4.3:
issues.append('High competition with strong ratings')
if demand['demand_level'] == 'low':
issues.append('Low demand signals')
verdict = 'GO' if not issues else 'CAUTION' if len(issues) == 1 else 'SKIP'
return {
'product': product, 'verdict': verdict,
'avg_price': avg_price, 'total_cost': total_cost,
'profit_per_unit': profit_per_unit, 'margin': margin,
'competition': competition['competition'],
'demand': demand['demand_level'],
'issues': issues,
'api_cost': 0.025, # 5 searches total
}
result = validate_profitability('silicone baking mat set', unit_cost=3.50)
print(f"\nProfitability Report: {result['product']}")
print(f"Verdict: {result['verdict']}")
print(f"Avg price: ${result['avg_price']:.2f}")
print(f"Total cost: ${result['total_cost']:.2f}")
print(f"Profit/unit: ${result['profit_per_unit']:.2f} ({result['margin']:.0%})")
print(f"Competition: {result['competition']}, Demand: {result['demand']}")
if result['issues']:
print(f"Issues: {', '.join(result['issues'])}")Step 4: Batch validate a product shortlist
Run the profitability check across multiple product ideas and rank them by margin and demand. This replaces hours of manual research.
def batch_validate(products: list[dict]) -> list:
"""Validate multiple products and rank by profitability."""
results = []
for p in products:
print(f"Validating: {p['name']}...")
result = validate_profitability(p['name'], p['unit_cost'])
results.append(result)
time.sleep(0.5)
# Sort by margin descending
results.sort(key=lambda x: x.get('margin', 0), reverse=True)
return results
products = [
{'name': 'silicone baking mat set', 'unit_cost': 3.50},
{'name': 'bamboo cutting board set', 'unit_cost': 5.00},
{'name': 'stainless steel water bottle', 'unit_cost': 4.00},
]
results = batch_validate(products)
print('\nProduct Validation Summary')
print('=' * 60)
for r in results:
print(f"[{r['verdict']:7s}] {r['product'][:30]:30s} "
f"Margin: {r.get('margin',0):.0%} Profit: ${r.get('profit_per_unit',0):.2f}")
total_cost = sum(r['api_cost'] for r in results)
print(f'\nTotal validation cost: ${total_cost:.3f}')
print(f'Helium 10 equivalent: $49/month minimum')Python Example
import os, requests, re, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def validate_product(product, unit_cost):
# Check Amazon competition
resp = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'query': f'site:amazon.com {product}', 'country_code': 'us', 'num_results': 10})
results = resp.json().get('organic_results', [])
prices = [float(m.group(1).replace(',','')) for r in results
for m in [re.search(r'\$([\d,]+\.\d{2})', r.get('snippet',''))] if m]
avg_price = sum(prices)/len(prices) if prices else 0
margin = (avg_price - unit_cost - avg_price*0.15 - 7.5) / avg_price if avg_price else 0
print(f'{product}: ${avg_price:.2f} avg, {margin:.0%} margin, {len(results)} competitors')
for p, c in [('silicone baking mat', 3.50), ('bamboo cutting board', 5.00)]:
validate_product(p, c)
time.sleep(0.3)JavaScript Example
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function validateProduct(product, unitCost) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `site:amazon.com ${product}`, country_code: 'us', num_results: 10 })
});
const results = (await resp.json()).organic_results || [];
const prices = results.flatMap(r => {
const m = (r.snippet || '').match(/\$([\d,]+\.\d{2})/);
return m ? [parseFloat(m[1].replace(',', ''))] : [];
});
const avg = prices.length ? prices.reduce((a,b) => a+b, 0) / prices.length : 0;
const margin = avg ? (avg - unitCost - avg*0.15 - 7.5) / avg : 0;
console.log(`${product}: $${avg.toFixed(2)} avg, ${(margin*100).toFixed(0)}% margin, ${results.length} competitors`);
}
validateProduct('silicone baking mat', 3.50);Expected Output
Validating: silicone baking mat set...
Validating: bamboo cutting board set...
Validating: stainless steel water bottle...
Product Validation Summary
============================================================
[GO ] bamboo cutting board set Margin: 35% Profit: $8.25
[CAUTION] silicone baking mat set Margin: 22% Profit: $3.10
[SKIP ] stainless steel water bottle Margin: 12% Profit: $2.40
Total validation cost: $0.075
Helium 10 equivalent: $49/month minimum