Early-stage SaaS founders face a critical decision: invest in SEO for long-term organic traffic or spend on Google Ads for immediate visibility. SERP data makes this decision data-driven instead of guesswork. By analyzing ad density, organic competition strength, AI Overview presence, and featured snippet availability for your target keywords, you can determine which channel offers better ROI. This tutorial shows how to use search API data to compare SEO versus Ads potential for a set of keywords and generate a channel recommendation.
Prerequisites
- Python 3.8+ installed
- requests library installed
- A Scavio API key from scavio.dev
- A list of target keywords for your SaaS product
Walkthrough
Step 1: Define your target keywords
Set up the keywords you want to analyze for SEO vs Ads potential.
import os, requests, json
API_KEY = os.environ["SCAVIO_API_KEY"]
KEYWORDS = [
"project management software",
"team collaboration tool",
"task management app for startups",
"best project tracker 2026",
]Step 2: Analyze SERP composition
For each keyword, check ad presence, organic results, AI Overviews, and SERP features.
def analyze_serp(keyword):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword})
data = resp.json()
organic = data.get("organic_results", [])
ads = data.get("ads", [])
return {
"keyword": keyword,
"organic_count": len(organic),
"ad_count": len(ads),
"has_ai_overview": bool(data.get("ai_overview")),
"paa_count": len(data.get("people_also_ask", [])),
"has_featured_snippet": any(r.get("featured_snippet") for r in organic[:3]),
}Step 3: Score SEO vs Ads potential
Calculate a score for each channel based on SERP composition.
def score_channels(analysis):
seo_score = 0
seo_score += (10 - min(analysis["ad_count"], 10)) * 5
seo_score += analysis["paa_count"] * 5
seo_score += 20 if analysis["has_featured_snippet"] else 0
seo_score -= 15 if analysis["has_ai_overview"] else 0
ads_score = 0
ads_score += analysis["ad_count"] * 10
ads_score += 20 if analysis["has_ai_overview"] else 0
return {
**analysis,
"seo_score": max(seo_score, 0),
"ads_score": max(ads_score, 0),
"recommendation": "SEO" if seo_score > ads_score else "Ads",
}Step 4: Generate the comparison report
Run the analysis across all keywords and produce a summary recommendation.
def compare_all(keywords):
results = [score_channels(analyze_serp(kw)) for kw in keywords]
seo_wins = sum(1 for r in results if r["recommendation"] == "SEO")
ads_wins = len(results) - seo_wins
return {
"total_keywords": len(results),
"seo_recommended": seo_wins,
"ads_recommended": ads_wins,
"overall": "SEO" if seo_wins > ads_wins else "Ads",
"details": results,
}
report = compare_all(KEYWORDS)
print(f"Overall: {report['overall']} ({report['seo_recommended']} SEO vs {report['ads_recommended']} Ads)")Python Example
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def analyze(keyword):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword})
d = resp.json()
ads = len(d.get("ads", []))
paa = len(d.get("people_also_ask", []))
return {"keyword": keyword, "ads": ads, "paa": paa,
"pick": "Ads" if ads > 3 else "SEO"}
for kw in ["project management software", "task tracker app"]:
print(analyze(kw))JavaScript Example
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function analyze(keyword) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: keyword})
});
const d = await r.json();
const ads = (d.ads||[]).length, paa = (d.people_also_ask||[]).length;
return {keyword, ads, paa, pick: ads > 3 ? "Ads" : "SEO"};
}
analyze("project management software").then(console.log);Expected Output
A keyword-level comparison report showing SEO and Ads scores for each keyword, with an overall channel recommendation based on SERP composition data.