Validating a product idea before writing code saves months of wasted effort. SERP data reveals whether people are searching for your solution, who already serves the market, and what gaps exist in current offerings. By analyzing search results for your target keywords, you can estimate demand, assess competition quality, and find underserved niches. This tutorial shows how to build a product validation pipeline using SERP data from the Scavio API. You will check search volume proxies, analyze competitor positioning, and identify content gaps that signal unmet demand.
Prerequisites
- Python 3.8+ installed
- requests library installed
- A Scavio API key from scavio.dev
- A product idea with 3-5 target keywords
Walkthrough
Step 1: Define validation keywords
Set up the keywords that represent your product idea and the problems it solves.
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
# Product idea: AI-powered invoice parser
VALIDATION_KEYWORDS = [
"ai invoice parser",
"automated invoice data extraction",
"invoice OCR API",
"extract data from invoices automatically",
]Step 2: Analyze search landscape
Query each keyword and assess the competitive landscape.
def analyze_keyword(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()
results = data.get("organic_results", [])[:10]
return {
"keyword": keyword,
"result_count": len(results),
"has_ads": bool(data.get("ads")),
"has_aio": bool(data.get("ai_overview")),
"paa_count": len(data.get("people_also_ask", [])),
"top_domains": list(set(r.get("link","").split("/")[2] for r in results[:5] if r.get("link"))),
}Step 3: Score market signals
Aggregate signals across keywords to build a validation score.
def validate(keywords):
signals = [analyze_keyword(kw) for kw in keywords]
score = 0
for s in signals:
if s["has_ads"]: score += 20 # Ads = commercial intent
if s["paa_count"] > 3: score += 10 # Questions = demand
if len(s["top_domains"]) < 4: score += 15 # Low competition
if s["has_aio"]: score += 5 # Google sees authority content
score = min(score, 100)
return {"score": score, "signals": signals,
"verdict": "strong" if score >= 60 else "moderate" if score >= 30 else "weak"}Step 4: Generate validation report
Produce a readable report summarizing the validation findings.
import json
result = validate(VALIDATION_KEYWORDS)
print(f"Validation Score: {result['score']}/100 ({result['verdict']})")
for s in result["signals"]:
print(f"\n{s['keyword']}:")
print(f" Ads: {'yes' if s['has_ads'] else 'no'} | PAA: {s['paa_count']} | AIO: {'yes' if s['has_aio'] else 'no'}")
print(f" Competitors: {', '.join(s['top_domains'][:3])}")
with open("validation_report.json", "w") as f:
json.dump(result, f, indent=2)Python Example
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def validate(kw):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw})
d = resp.json()
return {"keyword": kw, "ads": bool(d.get("ads")),
"paa": len(d.get("people_also_ask",[])),
"competitors": len(d.get("organic_results",[]))}
for kw in ["ai invoice parser", "invoice ocr api"]:
print(validate(kw))JavaScript Example
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function validate(kw) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: kw})
});
const d = await r.json();
return {keyword: kw, ads: !!(d.ads), paa: (d.people_also_ask||[]).length,
competitors: (d.organic_results||[]).length};
}
validate("ai invoice parser").then(console.log);Expected Output
A product validation report with a scored assessment of search demand, competitive landscape, and content gaps for each target keyword.