An r/microsaas post warned that most microsaas ideas fail because founders ignore negative signals. This tutorial systematically searches for three red flags: market saturation (too many existing tools), declining interest (trend data), and strong incumbents (funded companies dominating the SERP).
Prerequisites
- Scavio API key
- Python 3.8+
Walkthrough
Step 1: Check for market saturation
Count existing tools and alternatives pages.
import requests, os
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def check_saturation(idea):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'google', 'query': f'best {idea} tools 2026'}).json()
results = data.get('organic_results', [])
listicles = [r for r in results if any(w in r.get('title', '').lower()
for w in ['best', 'top', 'comparison', 'vs', 'alternative'])]
return {'total_results': len(results), 'listicles': len(listicles),
'saturated': len(listicles) >= 5}Step 2: Check for declining interest
Search for complaints about existing tools -- if users are leaving, the market might be dying.
def check_declining(idea):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'reddit', 'query': f'{idea} dead OR dying OR declining OR shutting down'}).json()
results = data.get('results', [])
return {'decline_posts': len(results),
'declining': len(results) >= 3}Step 3: Check for strong incumbents
Search for funded companies and enterprise players.
def check_incumbents(idea):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=H,
json={'platform': 'google', 'query': f'{idea} software company funding'}).json()
results = data.get('organic_results', [])
funded = [r for r in results if any(w in r.get('snippet', '').lower()
for w in ['series', 'raised', 'million', 'billion', 'ipo', 'acquired'])]
return {'funded_companies': len(funded),
'strong_incumbents': len(funded) >= 3}Step 4: Generate negative signal report
Combine all checks into a verdict.
def negative_signal_report(idea):
sat = check_saturation(idea)
dec = check_declining(idea)
inc = check_incumbents(idea)
red_flags = sum([sat['saturated'], dec['declining'], inc['strong_incumbents']])
print(f'Idea: {idea}')
print(f'Saturation: {sat["listicles"]} listicles ({"RED FLAG" if sat["saturated"] else "OK"})')
print(f'Declining: {dec["decline_posts"]} posts ({"RED FLAG" if dec["declining"] else "OK"})')
print(f'Incumbents: {inc["funded_companies"]} funded ({"RED FLAG" if inc["strong_incumbents"] else "OK"})')
print(f'\nVerdict: {red_flags}/3 red flags')
if red_flags >= 2: print('AVOID: High risk of failure')
elif red_flags == 1: print('CAUTION: Investigate further')
else: print('PROCEED: Low negative signals')
negative_signal_report('project management')Python Example
import os, requests
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def check_idea(idea):
for q, label in [
(f'best {idea} tools', 'Saturation'),
(f'{idea} dead declining', 'Decline'),
(f'{idea} funding raised', 'Incumbents')]:
data = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': q}).json()
print(f'{label}: {len(data.get("organic_results", []))} results')
check_idea('email marketing')JavaScript Example
const checks = ['best tools', 'dead declining', 'funding raised'];
for (const suffix of checks) {
const res = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'},
body: JSON.stringify({platform: 'google', query: `${idea} ${suffix}`})
});
const data = await res.json();
console.log(`${suffix}: ${data.organic_results?.length} results`);
}Expected Output
Negative signal report: saturation score, decline indicators, incumbent strength, and overall verdict (Avoid/Caution/Proceed). 3 Google + 1 Reddit query = $0.02.