Resumen
Job seekers waste horas diario checking el same job boards. Este n8n flujo de trabajo ejecuta diario, searches Google for job listings coincidencia your criterios via Scavio, deduplicates contra anterior resultados, y envia solo nuevo job matches to Slack o correo electronico. Zero code, 250 free credits/mes covers el searches.
Desencadenador
Diario at 7 AM via n8n cron activar.
Programación
Diario
Pasos del flujo de trabajo
Activar on Programar
n8n Cron node fires diario at 7 AM. Configurable timezone.
Search for Jobs via Scavio HTTP Node
HTTP Solicitud node calls Scavio search API con job-related consultas. Returns structured resultados.
Filtrar Job-Related Resultados
Function node filtra resultados to mantener solo esos con job-related palabras clave in el titulo.
Deduplicate Against Anterior Ejecuta
Comparar URLs contra un almacenado lista of previously visto jobs. Keep solo nuevo listings.
Enviar Nuevo Jobs to Slack o Email
Format nuevo job listings y enviar via Slack webhook o correo electronico node.
Implementacion en Python
import requests, os, json
from pathlib import Path
API_KEY = os.environ["SCAVIO_API_KEY"]
H = {"x-api-key": API_KEY, "Content-Type": "application/json"}
SEEN_FILE = Path("seen_jobs.json")
JOB_QUERIES = [
"python developer remote jobs 2026",
"senior backend engineer remote",
"machine learning engineer hiring 2026",
]
def search_jobs(query: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=H,
json={"query": query, "country_code": "us"},
timeout=10,
)
results = resp.json().get("organic_results", [])
job_keywords = ["job", "hiring", "career", "position", "apply", "opening", "vacancy"]
return [{"title": r.get("title", ""), "url": r.get("link", ""), "snippet": r.get("snippet", "")}
for r in results if any(kw in r.get("title", "").lower() for kw in job_keywords)]
def daily_job_search():
seen = set(json.loads(SEEN_FILE.read_text())) if SEEN_FILE.exists() else set()
new_jobs = []
for q in JOB_QUERIES:
jobs = search_jobs(q)
for j in jobs:
if j["url"] not in seen:
new_jobs.append(j)
seen.add(j["url"])
SEEN_FILE.write_text(json.dumps(list(seen)))
return new_jobs
new_jobs = daily_job_search()
print(f"Found {len(new_jobs)} new job listings")
for j in new_jobs[:5]:
print(f" {j['title']}: {j['url']}")Implementacion en JavaScript
const H = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const JOB_QUERIES = ['python developer remote jobs 2026', 'senior backend engineer remote', 'machine learning engineer hiring 2026'];
async function searchJobs(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:H, body:JSON.stringify({query, country_code:'us'})});
const results = (await r.json()).organic_results || [];
const kws = ['job','hiring','career','position','apply','opening','vacancy'];
return results.filter(r=>kws.some(k=>(r.title||'').toLowerCase().includes(k))).map(r=>({title:r.title, url:r.link, snippet:r.snippet}));
}
async function dailyJobSearch() {
let seen = new Set();
try { seen = new Set(JSON.parse(fs.readFileSync('seen_jobs.json','utf8'))); } catch {}
const newJobs = [];
for (const q of JOB_QUERIES) {
for (const j of await searchJobs(q)) {
if (!seen.has(j.url)) { newJobs.push(j); seen.add(j.url); }
}
}
fs.writeFileSync('seen_jobs.json', JSON.stringify([...seen]));
return newJobs;
}
const newJobs = await dailyJobSearch();
console.log('Found '+newJobs.length+' new job listings');
for (const j of newJobs.slice(0,5)) console.log(' '+j.title+': '+j.url);Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA