The Problem
SERP landscapes shift constantly, but without historical snapshots there is no way to analyze trends. Which competitors gained positions over the last quarter? When did AI Overviews start appearing for your target keywords? Did the featured snippet holder change after the last algorithm update? Without archived SERP data, these questions are unanswerable. You know the current state but have no record of how you got here. Competitive intelligence is limited to the present moment.
The Scavio Solution
Build a weekly SERP archival pipeline that snapshots the full SERP state for your target keywords every week and stores it in a queryable format. Each snapshot captures organic positions, AI Overview presence, featured snippets, local pack results, and People Also Ask questions. Over weeks and months, the archive becomes a competitive intelligence database that shows exactly when changes happened, who gained or lost positions, and how SERP features evolved. At $0.005/credit, archiving 100 keywords weekly costs $2/mo.
Before
Before archival, SERP analysis was limited to the present moment. The team could not answer when a competitor first appeared in top 3, when AI Overviews started dominating a keyword cluster, or how positions shifted after algorithm updates.
After
After building the archival pipeline, the team has months of SERP history to analyze. Trend analysis shows exactly when competitive shifts happened, and the data informs strategy adjustments weeks before the quarterly review.
Who It Is For
SEO strategists who need historical SERP data for trend analysis and competitive intelligence. Teams that want to measure the impact of algorithm updates with before/after comparison data.
Key Benefits
- Weekly full-SERP snapshots including all features and positions
- Competitive trend analysis over weeks and months
- AI Overview presence tracking shows feature adoption curves
- Algorithm update impact analysis with before/after data
- 100 keywords archived weekly for $2/mo
Python Example
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
def snapshot_serp(keyword: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword, "num": 20, "ai_overview": True},
timeout=15,
)
res.raise_for_status()
data = res.json()
return {
"keyword": keyword,
"date": datetime.utcnow().strftime("%Y-%m-%d"),
"organic": [{"position": r.get("position"), "domain": r.get("link", "").split("/")[2] if r.get("link") else "", "title": r.get("title", "")} for r in data.get("organic", [])[:20]],
"has_ai_overview": bool(data.get("ai_overview")),
"has_featured_snippet": bool(data.get("featured_snippet")),
"has_local_pack": bool(data.get("local_pack")),
"paa_questions": [p.get("question", "") for p in data.get("people_also_ask", [])],
}
def weekly_archive(keywords: list[str]):
date = datetime.utcnow().strftime("%Y-%m-%d")
archive_dir = Path("serp_archive")
archive_dir.mkdir(exist_ok=True)
snapshots = [snapshot_serp(kw) for kw in keywords]
archive_path = archive_dir / f"serp_{date}.json"
archive_path.write_text(json.dumps(snapshots, indent=2))
print(f"Archived {len(snapshots)} keywords to {archive_path}")
# Summary
aio_count = sum(1 for s in snapshots if s["has_ai_overview"])
print(f" AI Overviews: {aio_count}/{len(snapshots)} keywords")
return snapshots
keywords = ["best search API", "SERP API comparison", "web scraping alternative"]
weekly_archive(keywords)JavaScript Example
const API_KEY = "your_scavio_api_key";
async function snapshotSerp(keyword) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "google", query: keyword, num: 20, ai_overview: true }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
return {
keyword,
date: new Date().toISOString().slice(0, 10),
organic: (data.organic ?? []).slice(0, 20).map((r) => ({ position: r.position, domain: r.link ? new URL(r.link).hostname : "", title: r.title ?? "" })),
hasAiOverview: !!data.ai_overview,
hasFeaturedSnippet: !!data.featured_snippet,
paaQuestions: (data.people_also_ask ?? []).map((p) => p.question ?? ""),
};
}
const keywords = ["best search API", "SERP API comparison"];
const snapshots = [];
for (const kw of keywords) snapshots.push(await snapshotSerp(kw));
console.log(`Archived ${snapshots.length} keywords`);
const aioCount = snapshots.filter((s) => s.hasAiOverview).length;
console.log(` AI Overviews: ${aioCount}/${snapshots.length}`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews