Overview
Drop-in n8n workflow that scans LinkedIn public posts via Google SERP site:linkedin.com queries, filters for keyword signals (hiring, funding, competitor mention), and posts matches to Slack or a shared Notion table. Replaces paid LinkedIn scraping tools for teams already paying for Scavio.
Trigger
Every 30 minutes via n8n schedule node
Schedule
Every 30 minutes
Workflow Steps
Build LinkedIn-scoped query
Compose Google SERP query with site:linkedin.com/posts or site:linkedin.com/in for post or profile scope.
Scavio SERP fetch
POST to /v1/search with the site-scoped query; receive structured organic_results.
Keyword filter
Drop results whose snippet does not match the keyword allowlist (hiring, raising, launching, etc.).
Dedupe
Check permalink against n8n state to avoid double-posting.
Enrich with author context
Optional: run a second SERP query on the author name for warm intent signal.
Post to Slack
Send formatted match to #linkedin-signals or write to a shared Notion table.
Python Implementation
import os, requests
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY}
def scan(keywords):
query = f'site:linkedin.com/posts ({" OR ".join(keywords)})'
r = requests.post("https://api.scavio.dev/api/v1/search",
headers=H, json={"query": query}).json()
return r.get("organic_results", [])
for hit in scan(["hiring", "raising seed", "launching"]):
print(hit["title"], hit["link"])JavaScript Implementation
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { "x-api-key": API_KEY, "content-type": "application/json" };
async function scan(keywords) {
const query = `site:linkedin.com/posts (${keywords.join(" OR ")})`;
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({ query })
}).then(r => r.json());
return r.organic_results || [];
}
for (const hit of await scan(["hiring", "raising seed", "launching"])) {
console.log(hit.title, hit.link);
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews