Overview
Every morning, search target keywords, record competitor positions, compare to yesterday, and email a summary of position changes. Catches competitor SEO moves early.
Trigger
Daily at 6 AM UTC
Schedule
Daily at 6 AM UTC
Workflow Steps
Load keywords and competitors
Read keyword list and competitor domains from config.
Search each keyword
Query Google SERP for each keyword via search API.
Extract competitor positions
Find each competitor domain in results and record position.
Compare to previous day
Load yesterday data and calculate position deltas.
Send email report
Format position changes and send via SMTP or API.
Python Implementation
import requests, os, json
H = {"x-api-key": os.environ["SCAVIO_API_KEY"]}
KEYWORDS = ["best crm software", "crm comparison 2026"]
COMPETITORS = ["hubspot.com", "salesforce.com", "pipedrive.com"]
def track_positions():
report = {}
for kw in KEYWORDS:
data = requests.post("https://api.scavio.dev/api/v1/search",
headers=H, json={"platform": "google", "query": kw}).json()
positions = {}
for r in data.get("organic_results", []):
for comp in COMPETITORS:
if comp in r.get("link", ""):
positions[comp] = r.get("position", 0)
report[kw] = positions
return report
today = track_positions()
for kw, positions in today.items():
print(f"\n{kw}:")
for domain, pos in sorted(positions.items(), key=lambda x: x[1]):
print(f" #{pos} {domain}")JavaScript Implementation
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
const keywords = ["best crm software"];
const competitors = ["hubspot.com", "salesforce.com"];
for (const kw of keywords) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H, body: JSON.stringify({platform: "google", query: kw})
});
const data = await r.json();
for (const comp of competitors) {
const pos = data.organic_results?.find(r => r.link?.includes(comp));
console.log(`${kw}: ${comp} = #${pos?.position || "not found"}`);
}
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews