Hermes is a desktop agent that can interact with your computer and run multi-step workflows. Combining it with a search API creates an SEO automation system that checks rankings, audits content, and researches keywords without manual SERP checks. The Scavio API provides structured search data that Hermes can process and act on. This tutorial shows how to configure Hermes with web search access, build SEO automation workflows, and run recurring rank checks. You will have a desktop-based SEO assistant that handles repetitive research tasks automatically.
Prerequisites
- Hermes desktop agent installed
- A Scavio API key from scavio.dev
- Python 3.8+ for testing API calls
Walkthrough
Step 1: Configure search access for Hermes
Set up the Scavio API connection so Hermes can query search data.
# Hermes tool configuration:
# Add a web search tool that calls the Scavio API
# The agent will use this tool for all SEO tasks
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def search_serp(query, search_type="search"):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": query, "type": search_type})
return resp.json()Step 2: Build a rank checking workflow
Create a workflow that checks where your domain ranks for target keywords.
def check_rank(domain, keyword):
data = search_serp(keyword)
results = data.get("organic_results", [])
for i, r in enumerate(results):
if domain in r.get("link", ""):
return {"keyword": keyword, "position": i + 1, "url": r["link"]}
return {"keyword": keyword, "position": None, "url": None}
keywords = ["search api", "serp api", "web search api"]
for kw in keywords:
rank = check_rank("scavio.dev", kw)
pos = rank["position"] or "not found"
print(f"{kw}: position {pos}")Step 3: Add content audit capability
Build a content audit that checks top-ranking pages for a keyword and identifies gaps.
def audit_content(keyword):
data = search_serp(keyword)
results = data.get("organic_results", [])[:5]
paa = data.get("people_also_ask", [])
return {
"keyword": keyword,
"top_titles": [r["title"] for r in results],
"content_gaps": [q.get("question", "") for q in paa],
"aio_present": bool(data.get("ai_overview")),
}
audit = audit_content("best project management tool")
for gap in audit["content_gaps"]:
print(f" Gap: {gap}")Step 4: Schedule recurring checks
Set up Hermes to run SEO checks on a schedule.
# Hermes scheduling:
# Tell Hermes to run the rank check daily:
# "Every morning at 9am, check rankings for these keywords
# and save results to seo_report.json"
import json
from datetime import date
def daily_report(domain, keywords):
report = {"date": date.today().isoformat(), "rankings": []}
for kw in keywords:
report["rankings"].append(check_rank(domain, kw))
with open("seo_report.json", "w") as f:
json.dump(report, f, indent=2)
return report
print(daily_report("example.com", ["crm software", "project management"]))Python Example
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def rank(domain, kw):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": kw})
for i, r in enumerate(resp.json().get("organic_results", [])):
if domain in r.get("link", ""):
return i + 1
return None
for kw in ["search api", "serp api"]:
print(f"{kw}: position {rank('scavio.dev', kw) or 'N/A'}")JavaScript Example
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function rank(domain, kw) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: kw})
});
const results = (await r.json()).organic_results || [];
const idx = results.findIndex(r => (r.link||"").includes(domain));
return idx >= 0 ? idx + 1 : null;
}
rank("scavio.dev", "search api").then(p => console.log("Position:", p));Expected Output
A Hermes desktop agent configured with SEO automation workflows that check rankings, audit content gaps, and generate daily reports using live SERP data.