Overview
This n8n workflow runs on a daily cron, pulls live SERP data for a list of target keywords through Scavio, and turns each result into a content brief without any manual handoff. The core node is a single HTTP Request calling POST /api/v1/google with light_request=false, which costs 2 credits ($0.01 per keyword) and returns organic_results, people_also_ask, knowledge_graph, and related_searches in one response. From there you extract the People Also Ask questions, the related searches, and the top organic titles, then feed that map of demand into an LLM node that drafts a brief: target keyword, intent, questions to answer, competing titles, and suggested H2s. Optionally a second branch hits POST /api/v1/reddit/search to check whether real people are asking about the topic on Reddit, so you don't write briefs for keywords nobody discusses. The honest tradeoff: Scavio gives you live SERP features and Reddit demand under one key, but it does not return historical search-volume numbers. If you need volume, pair this pipeline with DataForSEO (after its $50 minimum deposit) or another volume source. Scavio's edge here is one HTTP node, live SERP features, and multi-platform data under a single credit pool. n8n's Starter plan is EUR 20/mo for 2,500 executions, or you can self-host the Community Edition for free.
Trigger
Daily cron / schedule trigger in n8n
Schedule
Daily
Workflow Steps
Schedule trigger fires once a day
Add a Schedule Trigger node set to a daily cron (for example 06:00). This is the only thing that starts the run, so there's no manual handoff. Keep the list of target keywords in a Set node or a Google Sheet the workflow reads at the top.
Loop over your target keywords
Use a Split In Batches (Loop Over Items) node over your keyword list so each keyword flows through the rest of the pipeline one at a time. This keeps you under the rate limit (1 req/sec on free/PAYG, 2 req/sec on Project) and makes errors per-keyword instead of all-or-nothing.
HTTP Request to Scavio Google SERP
Add an HTTP Request node: POST https://api.scavio.dev/api/v1/google, header Authorization: Bearer {{ $env.SCAVIO_API_KEY }}, JSON body {"query": "{{ $json.keyword }}", "light_request": false}. With light_request=false (2 credits) the response includes people_also_ask, knowledge_graph, and related_searches alongside organic_results in one call.
Map the content gap with a Function node
A Function (Code) node pulls people_also_ask questions, related_searches terms, and the top 10 organic titles out of the response and shapes them into a compact JSON gap map. This is the structured input the LLM will turn into a brief, so you're not asking the model to guess what's ranking.
Optional: cross-check Reddit demand
Add a second HTTP Request node calling POST https://api.scavio.dev/api/v1/reddit/search with body {"query": "{{ $json.keyword }}"} (1 credit). If real threads come back, people actually discuss the topic. Merge those thread titles into the gap map so the brief reflects real questions, not just what Google surfaces.
LLM node drafts the brief
Feed the gap map into an LLM node (OpenAI, Anthropic, or any model node) with a prompt that returns a structured brief: target keyword, search intent, the PAA questions to answer, competing titles, and suggested H2s. Write the result to a Google Doc, Notion, or a database node, and the run finishes with no human in the loop.
Python Implementation
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
def build_brief(keyword: str) -> dict:
# Live SERP with full features: 2 credits ($0.01)
serp = requests.post("https://api.scavio.dev/api/v1/google", headers=H,
json={"query": keyword, "light_request": False}).json()
paa = [q.get("question") for q in serp.get("people_also_ask", [])]
related = [r.get("query") for r in serp.get("related_searches", [])]
titles = [row["title"] for row in serp.get("organic_results", [])[:10]]
# Optional: cross-check real demand on Reddit (1 credit)
reddit = requests.post("https://api.scavio.dev/api/v1/reddit/search", headers=H,
json={"query": keyword}).json()
threads = [t.get("title") for t in reddit.get("results", [])][:5]
return {
"keyword": keyword,
"people_also_ask": paa,
"related_searches": related,
"competing_titles": titles,
"reddit_threads": threads,
}
if __name__ == "__main__":
keywords = ["best serp api", "reddit api for sentiment", "google paa scraper"]
for kw in keywords:
gap_map = build_brief(kw)
# hand gap_map to your LLM call to draft the brief
print(gap_map["keyword"], len(gap_map["people_also_ask"]), "PAA questions")JavaScript Implementation
// n8n Function-node style fetch
const H = {
Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`,
"Content-Type": "application/json",
};
async function buildBrief(keyword) {
// Live SERP with full features: 2 credits ($0.01)
const serpRes = await fetch("https://api.scavio.dev/api/v1/google", {
method: "POST",
headers: H,
body: JSON.stringify({ query: keyword, light_request: false }),
});
const serp = await serpRes.json();
const paa = (serp.people_also_ask || []).map((q) => q.question);
const related = (serp.related_searches || []).map((r) => r.query);
const titles = (serp.organic_results || []).slice(0, 10).map((row) => row.title);
// Optional: cross-check real demand on Reddit (1 credit)
const redditRes = await fetch("https://api.scavio.dev/api/v1/reddit/search", {
method: "POST",
headers: H,
body: JSON.stringify({ query: keyword }),
});
const reddit = await redditRes.json();
const threads = (reddit.results || []).slice(0, 5).map((t) => t.title);
return { keyword, people_also_ask: paa, related_searches: related, competing_titles: titles, reddit_threads: threads };
}
const keyword = $json.keyword;
return [{ json: await buildBrief(keyword) }];Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Community, posts & threaded comments from any subreddit