Overview
This workflow refreshes the pricing and feature data on programmatic comparison pages every Monday by pulling live SERP data for each competitor mentioned on the pages. Comparison pages go stale fast because competitor pricing changes frequently. This pipeline ensures every comparison page shows current pricing, updated feature lists, and fresh metadata so search engines see consistently accurate content.
Trigger
Cron schedule (every Monday at 6:00 AM UTC)
Schedule
Runs every Monday at 6:00 AM UTC
Workflow Steps
Load comparison page inventory
Read the list of comparison pages and the competitors referenced on each page.
Search for current competitor data
Query Scavio Google for each competitor to find current pricing, features, and positioning.
Extract pricing from search results
Parse pricing information from organic snippets, knowledge panels, and featured snippets.
Update comparison page data files
Write the refreshed pricing and feature data back to the comparison page data store.
Log update summary
Record which pages were updated, what pricing changed, and flag any competitors with missing data.
Python Implementation
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
COMPARISON_PAGES = [
{
"slug": "scavio-vs-serpapi",
"competitors": [
{"name": "SerpAPI", "query": "SerpAPI pricing 2026"},
{"name": "Scavio", "query": "Scavio search API pricing 2026"},
],
},
{
"slug": "scavio-vs-dataforseo",
"competitors": [
{"name": "DataForSEO", "query": "DataForSEO pricing 2026"},
{"name": "Scavio", "query": "Scavio API pricing plans"},
],
},
]
def search_competitor(query: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query},
timeout=15,
)
res.raise_for_status()
data = res.json()
snippets = [r.get("snippet", "") for r in data.get("organic", [])[:5]]
kg = data.get("knowledge_graph") or {}
return {
"query": query,
"top_snippets": snippets,
"knowledge_graph": kg.get("description", ""),
"fetched_at": datetime.utcnow().isoformat(),
}
def run():
date = datetime.utcnow().strftime("%Y-%m-%d")
updates = []
for page in COMPARISON_PAGES:
page_data = {"slug": page["slug"], "competitors": []}
for comp in page["competitors"]:
result = search_competitor(comp["query"])
page_data["competitors"].append({
"name": comp["name"],
"serp_data": result,
})
updates.append(page_data)
output = {"date": date, "pages_refreshed": len(COMPARISON_PAGES), "updates": updates}
Path(f"comparison_refresh_{date}.json").write_text(json.dumps(output, indent=2))
print(f"Comparison page refresh {date}: {len(COMPARISON_PAGES)} pages updated")
for u in updates:
print(f" {u['slug']}: {len(u['competitors'])} competitors refreshed")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const PAGES = [
{ slug: "scavio-vs-serpapi", competitors: [{ name: "SerpAPI", query: "SerpAPI pricing 2026" }, { name: "Scavio", query: "Scavio API pricing 2026" }] },
{ slug: "scavio-vs-dataforseo", competitors: [{ name: "DataForSEO", query: "DataForSEO pricing 2026" }] },
];
async function searchCompetitor(query) {
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 }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
const data = await res.json();
return { snippets: (data.organic ?? []).slice(0, 5).map((r) => r.snippet ?? ""), kg: data.knowledge_graph?.description ?? "" };
}
for (const page of PAGES) {
const results = [];
for (const comp of page.competitors) results.push(await searchCompetitor(comp.query));
console.log(`${page.slug}: ${page.competitors.length} competitors refreshed`);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews