Hermes Desktop is a local AI assistant that can run on your machine without sending data to external LLM providers. Combining it with a search API gives you an SEO research assistant that has access to live SERP data while keeping your workflow private. This tutorial shows how to connect Hermes Desktop to the Scavio API for rank tracking, keyword research, and content gap analysis. You will build a local SEO workflow that queries live search results and processes them through your local Hermes model.
Prerequisites
- Hermes Desktop installed and running
- A Scavio API key from scavio.dev
- Python 3.8+ installed
- requests library installed
Walkthrough
Step 1: Set up the search API client
Create a Python module that Hermes Desktop can call for live search data.
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def search(query, platform="google"):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": platform, "query": query})
return resp.json()
result = search("best project management tools 2026")
print(f"Results: {len(result.get('organic_results', []))}")Step 2: Build rank tracking function
Check where your domain ranks for target keywords using live SERP data.
def check_rank(keyword, domain):
data = search(keyword)
for i, r in enumerate(data.get("organic_results", [])):
if domain in r.get("link", ""):
return {"keyword": keyword, "position": i + 1, "url": r["link"]}
return {"keyword": keyword, "position": None, "url": None}
rank = check_rank("project management tools", "example.com")
print(f"Position: {rank['position']}")Step 3: Extract content gaps
Analyze top-ranking pages to find content topics your site is missing.
def find_content_gaps(keyword, my_domain):
data = search(keyword)
paa = data.get("people_also_ask", [])
competitors = [r for r in data.get("organic_results", [])[:10]
if my_domain not in r.get("link", "")]
gaps = []
for q in paa:
gaps.append({"type": "paa", "topic": q.get("question", "")})
for c in competitors[:3]:
gaps.append({"type": "competitor", "title": c.get("title", ""),
"url": c.get("link", "")})
return gaps
gaps = find_content_gaps("project management tools", "example.com")
for g in gaps[:5]:
print(f"[{g['type']}] {g.get('topic') or g.get('title')}")Step 4: Format output for Hermes
Structure the SEO data as a prompt-ready format that Hermes Desktop can process.
def seo_report_for_hermes(keyword, domain):
rank = check_rank(keyword, domain)
gaps = find_content_gaps(keyword, domain)
lines = [f"SEO Report: {keyword}"]
lines.append(f"Current rank: {rank['position'] or 'Not found'}")
lines.append(f"Content gaps:")
for g in gaps[:5]:
lines.append(f" - [{g['type']}] {g.get('topic') or g.get('title')}")
return "\n".join(lines)
report = seo_report_for_hermes("project management tools", "example.com")
print(report)Python Example
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
def seo_check(keyword, domain):
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": keyword})
data = resp.json()
for i, r in enumerate(data.get("organic_results", [])):
if domain in r.get("link", ""):
return {"keyword": keyword, "position": i + 1}
return {"keyword": keyword, "position": None}
print(seo_check("best project management tools", "example.com"))JavaScript Example
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function seoCheck(keyword, domain) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: keyword})
});
const results = (await r.json()).organic_results || [];
const idx = results.findIndex(r => (r.link||"").includes(domain));
return {keyword, position: idx >= 0 ? idx + 1 : null};
}
seoCheck("best project management tools", "example.com").then(console.log);Expected Output
A local SEO research workflow powered by Hermes Desktop and live SERP data, providing rank tracking, content gap analysis, and prompt-ready reports.