You cannot directly and cheaply query ChatGPT, Perplexity, and Gemini for 'best [your category]' at scale, and even if you could, they disagree wildly. One Reddit test ran the same 50 'best tool' prompts through all three and found they named the same brand only 21% of the time. So measure the inputs instead of the outputs. These assistants ground their answers in the live SERP and in high-signal community threads (Reddit especially). If you track which sources rank and get cited for your money queries, you get a repeatable, cheap proxy for AI-recommendation visibility. This is the Scavio 4-signal AI-recommendation audit: SERP organic presence, People-Also-Ask coverage, knowledge-graph entity match, and Reddit mention share.
Prerequisites
- A Scavio API key (50 free credits at signup)
- Python 3.9+ or Node 18+
- A list of 10-20 'best [category]' and 'who should I hire for X' queries your buyers actually ask
Walkthrough
Step 1: List the queries an AI would fan out
Assistants expand one question into many sub-queries. Write the head query ('best serp api') plus the fan-outs a model would generate: 'cheapest serp api', 'serp api for rag', 'serpapi alternative'. These are what you will score.
queries = [
"best serp api for ai agents",
"cheapest web search api 2026",
"serpapi alternative",
"serp api for rag pipeline",
]Step 2: Pull the full SERP for each query (2 credits each)
Set light_request:false so one call returns organic_results, related_questions (People Also Ask), knowledge_graph, and related_searches. Those blocks are the source pool AI assistants draw from.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def serp(q):
return requests.post("https://api.scavio.dev/api/v2/google",
headers=H, json={"query": q, "light_request": False}).json()Step 3: Score the 4 signals for your brand
For each query, check: (1) does your domain appear in organic_results, (2) do you show up in any related_questions answer, (3) does the knowledge_graph name you, (4) are you mentioned in the Reddit threads that rank. Signals 1-3 come from the SERP call; signal 4 comes from a Reddit search.
def score_brand(q, brand, domain):
s = serp(q)
organic = any(domain in r.get("link", "") for r in s.get("organic_results", []))
paa = any(brand.lower() in (x.get("question","") + x.get("answer","")).lower()
for x in s.get("related_questions", []))
kg = brand.lower() in str(s.get("knowledge_graph", {})).lower()
return {"query": q, "organic": organic, "paa": paa, "knowledge_graph": kg}Step 4: Add the Reddit citation signal
Assistants lean on Reddit for 'best tool' answers. Search Reddit for the same query and check whether your brand is named in the top threads. Reddit presence is a leading indicator of AI-answer citations for the same topic.
def reddit_mention(q, brand):
r = requests.post("https://api.scavio.dev/api/v1/reddit/search",
headers=H, json={"query": q, "sort": "top"}).json()
return sum(brand.lower() in p.get("title","").lower() for p in r.get("posts", []))Step 5: Roll it up into a weekly visibility score
Run the audit on a schedule and store the four booleans per query. Your score is the share of queries where you hit each signal. Track the delta week over week; a rising Reddit and organic share precedes rising AI-answer mentions.
rows = [ {**score_brand(q, "Scavio", "scavio.dev"),
"reddit": reddit_mention(q, "Scavio")} for q in queries ]
hit = lambda k: round(100 * sum(bool(r[k]) for r in rows) / len(rows))
print("organic %:", hit("organic"), " PAA %:", hit("paa"),
" KG %:", hit("knowledge_graph"), " reddit hits:", sum(r["reddit"] for r in rows))Python Example
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def audit(query, brand, domain):
s = requests.post("https://api.scavio.dev/api/v2/google",
headers=H, json={"query": query, "light_request": False}).json()
r = requests.post("https://api.scavio.dev/api/v1/reddit/search",
headers=H, json={"query": query, "sort": "top"}).json()
return {
"query": query,
"organic": any(domain in x.get("link","") for x in s.get("organic_results", [])),
"knowledge_graph": brand.lower() in str(s.get("knowledge_graph", {})).lower(),
"reddit_hits": sum(brand.lower() in p.get("title","").lower() for p in r.get("posts", [])),
}
print(audit("best serp api for ai agents", "Scavio", "scavio.dev"))JavaScript Example
import { Scavio } from "scavio";
const client = new Scavio({ apiKey: process.env.SCAVIO_API_KEY });
async function audit(query, brand, domain) {
const s = await client.google.search({ query, light_request: false });
const r = await client.reddit.search({ query, sort: "top" });
return {
query,
organic: (s.organic_results || []).some(x => (x.link || "").includes(domain)),
knowledgeGraph: JSON.stringify(s.knowledge_graph || {}).toLowerCase().includes(brand.toLowerCase()),
redditHits: (r.posts || []).filter(p => (p.title || "").toLowerCase().includes(brand.toLowerCase())).length,
};
}
console.log(await audit("best serp api for ai agents", "Scavio", "scavio.dev"));Expected Output
{'query': 'best serp api for ai agents', 'organic': True, 'knowledge_graph': False, 'reddit_hits': 2}