Tony Wang5 min de lecturaCómo scrapear ofertas de empleo en 2026 (14 plataformas ATS y Python)
Scrapea ofertas de empleo en 2026 en Greenhouse, Workday, Lever y otras 11 ATS: integraciones DIY o una API estructurada con dataset.
¿Por qué scrapear ofertas de empleo?
Los datos de ofertas de empleo son la capa base para la investigación del mercado laboral y los productos de reclutamiento:
- Investigación de señales de contratación — hacer seguimiento de qué empresas están contratando activamente, por departamento, ubicación y puesto.
- Benchmarking de compensación y mercado — agregar puestos publicados y requisitos en todo un sector.
- Herramientas de reclutamiento y sourcing — mostrar vacantes de muchas empresas en un solo feed.
- Investigación de empresas — inferir crecimiento o contracción a partir del volumen de publicaciones de una empresa a lo largo del tiempo.
¿Es legal scrapear ofertas de empleo?
Opción 1: DIY, una integración por cada ATS
La dificultad práctica no es la defensa anti-bot, sino que no existe un estándar. La página de empleo de una empresa es un envoltorio delgado sobre el ATS que use, y cada ATS expone un endpoint JSON distinto (a menudo no documentado):
import requests
# Greenhouse — el token identifica a la empresa
gh = requests.get("https://boards-api.greenhouse.io/v1/boards/stripe/jobs").json()
# Lever — un host distinto, un formato distinto
lever = requests.get("https://api.lever.co/v0/postings/netflix").json()
# Workday — tenant + datacenter + site, POST en vez de GET, y otra vez un formato distinto
wd = requests.post(
"https://acme.wd1.myworkdayjobs.com/wday/cxs/acme/External/jobs",
json={"limit": 20, "offset": 0},
).json()
Cada integración es su propio pequeño proyecto:
- Más de una docena de proveedores, más de una docena de esquemas. Greenhouse anida las solicitudes bajo
jobs[]con unidnumérico; Lever devuelve una lista plana con unidde tipo string y campos de descripción con formato HTML; Workday exige un POST con untenant,datacenterysiteque tienes que descubrir por cada empresa, y pagina conlimit/offseten lugar de un token. Multiplica eso por iCIMS, SmartRecruiters, Recruitee, Rippling, Oracle Recruiting, UKG, Personio, Ashby, Eightfold y Teamtailor, y acabas manteniendo más de una docena de parsers. - Primero tienes que averiguar qué ATS usa una empresa. No existe ningún directorio — o bien lo adivinas a partir del patrón de la URL de la página de empleo (
boards.greenhouse.io/<empresa>,jobs.lever.co/<empresa>,<empresa>.wd1.myworkdayjobs.com), o rastreas la página y detectas las llamadas a la API incrustadas. - Workday por sí solo merece el esfuerzo de integrarlo. Es una de las plataformas ATS más grandes en volumen de publicaciones empresariales, así que saltártelo porque su API basada en POST y limitada a un tenant supone más trabajo que un simple endpoint GET significa perderte una parte considerable del mercado.
- Las ofertas cerradas y obsoletas se quedan sin avisar. La mayoría de proveedores no borra de forma inmediata una solicitud cerrada, así que una actualización completa ingenua puede arrastrar durante días puestos «abiertos» que ya no lo están; necesitas detectar y reconciliar los cambios de estado, no solo añadir ofertas nuevas.
Opción 2: herramientas sin código
Los scrapers genéricos pueden extraer una página de empleo concreta, pero el verdadero cuello de botella — integrar más de una docena de backends de ATS distintos y normalizar sus esquemas — es el mismo problema tanto si vas haciendo clic en una herramienta visual como si escribes Python. Una herramienta pensada para un solo formato de página no resuelve el problema de la fragmentación de proveedores.
Opción 3: una API estructurada de empleos
Una API de scraping de empleos cubre 14 plataformas ATS — Ashby, Eightfold, Greenhouse, iCIMS, Lever, Oracle Recruiting, Personio, Recruitee, Rippling, SmartRecruiters, Teamtailor, UKG, Workable y Workday — bajo un único esquema, más una búsqueda que te dice qué ATS usa realmente una empresa.
Averigua a través de qué ATS publica una empresa:
curl "https://api.crawlora.net/api/v1/jobs/company-search?slug=stripe" \
-H "x-api-key: $CRAWLORA_API_KEY"
Obtén el listado de una empresa una vez que sepas el proveedor — aquí se muestran Greenhouse y Workday, los otros 11 siguen el mismo patrón con su propia ruta:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/jobs"
greenhouse_board = requests.get(f"{base}/greenhouse/board", headers=h, params={"token": "stripe"}).json()["data"]
workday_board = requests.get(f"{base}/workday/board", headers=h, params={
"tenant": "acme", "datacenter": "wd1", "site": "External", "limit": 50,
}).json()["data"]
O sáltate por completo las llamadas por proveedor y busca a la vez en todas las empresas cubiertas a través del dataset normalizado:
api_base = "https://api.crawlora.net/api/v1"
postings = requests.get(f"{api_base}/datasets/jobs/search", headers=h, params={
"q": "data engineer", "location": "Tokyo", "remote": "true", "page_size": 50,
}).json()["data"]
datasets/jobs/search acepta los filtros company, provider, department, location, employment_type y remote, además de include_closed si necesitas el historial de estados en lugar de solo los puestos abiertos. datasets/jobs/companies lista qué empresas están contratando y a través de qué proveedor, con un filtro min_open_roles — útil para encontrar empresas que contratan activamente sin saber de antemano qué ATS usan.
Qué puedes recopilar
Por cada oferta: puesto, departamento, ubicación(es), tipo de contrato, indicador de teletrabajo, fecha de publicación/actualización, estado abierto/cerrado y la descripción completa — además de qué empresa y qué proveedor ATS la originó. jobs/hiring-signals agrega el listado de una empresa en resúmenes (recuento de puestos abiertos por departamento y ubicación a lo largo del tiempo) sin necesidad de extraer cada oferta individual.
Limitaciones y desafíos habituales
- No hay un esquema universal. Cada ATS tiene sus propios nombres de campos y su propio anidamiento; normaliza en la ingesta, no en cada informe.
- Necesitas el proveedor antes de poder consultarlo directamente. Usa una búsqueda por empresa en lugar de adivinar el patrón de la URL de la página de empleo, o consulta el dataset unificado en lugar de los endpoints por proveedor.
- Las ofertas cerradas no desaparecen de inmediato. Haz seguimiento explícito del estado (
include_closeden la búsqueda del dataset) en lugar de asumir que una oferta ausente simplemente se cerró. - La API de Workday está basada en POST y limitada a un tenant, a diferencia de las APIs basadas en GET que usan la mayoría de los demás ATS — ten esto en cuenta como esfuerzo aparte si integras los proveedores tú mismo.
Dónde se usa esto
- Investigación de señales de contratación y de mercado — hacer seguimiento de qué empresas y sectores están contratando activamente. Consulta el hub de investigación del mercado laboral para casos de uso relacionados.
- Herramientas de reclutamiento y sourcing de talento — agregar vacantes de varias empresas en un solo feed consultable.
- El dataset de ofertas de empleo — la misma cobertura, ya recopilada y consultable sin necesidad de ejecutar un rastreo. Consulta también Workday es quien mueve el mercado laboral para ver lo que realmente muestran los datos agregados de publicaciones.
Fuentes
Empieza a recopilar
Pruébalo primero, gratis: ejecuta cualquier URL pública en el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de listados en el Playground, revisa el esquema en la documentación de la API y consulta los precios. Una oferta de empleo es solo la mitad del panorama — combínala con la empresa que hay detrás. Cómo scrapear LinkedIn cubre las páginas de empresa, la plantilla y los listados de producto a los que pertenecen esas ofertas, y cómo scrapear Yahoo Finance cubre los fundamentales frente a los que leer la velocidad de contratación, ya que los planes de plantilla de una empresa cotizada suelen moverse antes que sus previsiones. Si estás comparando mercados de listados estructurados, cómo scrapear anuncios de coches usados sigue los mismos patrones de agregador, y cómo scrapear Fiverr cubre el lado freelance de ese mismo mercado laboral. Para el conjunto de herramientas más amplio, cómo elegir una API de web scraping, y is web scraping legal.
Parte de nuestra serie de guías how-to-scrape — todas las plataformas que cubrimos, en un solo índice.
Preguntas frecuentes
¿Es legal scrapear ofertas de empleo?
Las páginas de ofertas en Greenhouse, Workday, Lever y plataformas ATS similares son públicas y no requieren autenticación, y los hechos publicados (puesto, ubicación, departamento) no son objeto de derechos de autor. Los términos de algunos ATS restringen el acceso automatizado incluso a ofertas públicas, así que revisa las condiciones del ATS y de la empresa contratante concretos, y no vuelvas a publicar descripciones completas de forma masiva.
¿Existe una única API que cubra todas las ofertas de empleo?
No. Las empresas publican a través de uno de más de una docena de sistemas de seguimiento de candidatos (ATS) — Workday, Greenhouse, Lever, iCIMS y más — cada uno con su propio endpoint y formato JSON. No existe una única API pública independiente del proveedor.
¿Cómo averiguo qué ATS usa una empresa?
No existe un directorio público. Puedes adivinarlo a partir del patrón de la URL de la página de empleo (por ejemplo, boards.greenhouse.io/<empresa>, jobs.lever.co/<empresa>), rastrear la página para detectar la llamada a la API incrustada, o usar una búsqueda por empresa que devuelva el proveedor directamente.
¿Por qué Workday necesita un tratamiento especial?
A diferencia de la mayoría de los demás ATS, que exponen un simple endpoint GET, Workday requiere una petición POST limitada a un tenant, datacenter y site que hay que descubrir por cada empresa — y es una de las plataformas ATS más grandes en volumen de publicaciones empresariales, así que el esfuerzo extra de integración merece la pena.
¿Las ofertas cerradas desaparecen de inmediato?
Normalmente no. La mayoría de los ATS no borra de forma inmediata una solicitud cerrada, así que una actualización completa ingenua puede arrastrar durante días puestos «abiertos» que ya no lo están — haz seguimiento explícito del estado en lugar de asumir que una oferta ausente simplemente se cerró.