Una publicación de r/hiringcafe lanzó un agente de búsqueda de empleo con IA que coincidía con los filtros de usuarios avanzados en una bolsa de trabajo. Este tutorial recorre la capa de datos: SERP para páginas ATS, Reddit para hilos de contratación, extracto para la descripción completa del trabajo.
Requisitos previos
- Python 3.10+
- Clave API de Scavio
Guia paso a paso
Paso 1: Tomar currículum de usuario + preferencias
Entradas: habilidades, ubicación, rango salarial, preferencia remota.
USER = {'skills': ['python', 'rust', 'mcp'], 'location': 'remote', 'min_salary': 150000}Paso 2: Generar consultas dirigidas a ATS
sitio: las consultas encuentran páginas de Greenhouse, Lever, Ashby.
ATS_DOMAINS = ['greenhouse.io', 'lever.co', 'ashbyhq.com']
def queries(user):
return [f'site:{d} {" ".join(user["skills"])} {user["location"]}' for d in ATS_DOMAINS]Paso 3: SERP en dominios ATS
Búsqueda de Scavio por consulta.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def ats_jobs(q):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY}, json={'query': q}).json()
return r.get('organic_results', [])[:20]Paso 4: Reddit contrata hilos como una superficie paralela
r/cscareerquestions, r/jobs, subs de nicho emergen vacantes sin previo aviso.
def reddit_jobs(skills):
return requests.post('https://api.scavio.dev/api/v1/reddit/search',
headers={'x-api-key': API_KEY},
json={'query': f'{" ".join(skills)} hiring 2026'}).json().get('posts', [])[:20]Paso 5: Extraer la descripción completa del puesto
Las páginas ATS se representan como rebajas limpias.
def description(url):
r = requests.post('https://api.scavio.dev/api/v1/extract',
headers={'x-api-key': API_KEY}, json={'url': url, 'format': 'markdown'}).json()
return r.get('markdown', '')Paso 6: Puntuación + clasificación con LLM
Haga coincidir el currículum con la descripción completa.
import anthropic
client = anthropic.Anthropic()
def score(resume, jd):
msg = client.messages.create(model='claude-sonnet-4-6', max_tokens=200,
messages=[{'role':'user','content':f'Score this resume vs job description 0-100 with 1-line reason. RESUME: {resume}. JD: {jd}'}])
return msg.content[0].textEjemplo en Python
# Daily run: 3 ATS queries + 1 Reddit query + ~20 extracts = ~25 credits = $0.11.Ejemplo en JavaScript
// Same pattern in TS via the Anthropic SDK.Salida esperada
About 30-60 ranked jobs per day with full descriptions and 0-100 fit scores. Reddit thread surfacing catches unannounced roles 3-7 days earlier.