Tony Wang6 min de lecturaCómo scrapear Indeed en 2026 (API y Python)
Indeed's Publisher API está descontinuada; sus ToS restringen bots. Qué hay accesible en 2026, la realidad legal y una API alternativa.
Indeed no ofrece una API de desarrollador abierta en 2026 — la antigua Publisher API y el feed XML están descontinuados, y lo que queda es un programa cerrado a socios para empleadores y proveedores de ATS, no un registro público. Esta guía cubre qué es realista recolectar de la búsqueda de empleo pública de Indeed, la realidad legal y técnica de hacerlo tú mismo, y una API estructurada que devuelve búsqueda de empleos, detalle de empleo y datos de ubicación como JSON.
¿Por qué scrapear datos de empleos de Indeed?
- Investigación de demanda de contratación — rastrea qué roles, empresas y ubicaciones están publicando activamente en la bolsa de empleo general más grande.
- Agregación de bolsas de trabajo — trae listados a una meta-búsqueda o a una bolsa de empleo de nicho sin mantener el propio frontend de Indeed.
- Benchmarking de salarios — agrega rangos salariales publicados por título, ubicación y nivel de senioridad.
- Pipelines de IA/LLM — alimenta publicaciones estructuradas a una herramienta de matching de currículums o de asesoría profesional en lugar de scrapear HTML crudo.
- Herramientas de reclutamiento — muestra roles abiertos de varias empresas en un solo feed buscable junto con otras señales de sourcing.
¿Es legal scrapear Indeed?
Opción 1: Hazlo tú mismo en Python (y por qué se rompe)
Un scrape mínimo se ve como un trabajo normal de búsqueda y parseo:
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
params = {"q": "software engineer", "l": "Austin, TX", "start": 0}
resp = requests.get("https://www.indeed.com/jobs", headers=headers, params=params)
soup = BeautifulSoup(resp.text, "html.parser")
for card in soup.select("div.job_seen_beacon"):
title = card.select_one("h2.jobTitle span")
company = card.select_one("span.companyName")
print(title.get_text(strip=True) if title else None, company.get_text(strip=True) if company else None)
Funciona, una vez — luego aparece la lista habitual:
- Detección de bots. Indeed sirve interstitials y bloqueos a solicitudes que no se ven como una sesión de navegador real; una llamada
requestsdesnuda, sin cookies, sin ejecución de JS y sin IP residencial, se detecta rápido, y vuelves a un stack de navegador headless más proxy para una página de lista "simple". - Las páginas individuales de empleo son la parte que prohíbe el robots.txt. Los resultados de búsqueda en sí son indexables, pero
/viewjob— donde viven la descripción completa, el salario y el enlace de aplicación — está específicamente excluido para bots generales. - La paginación tiene un límite. El parámetro
startde Indeed solo recorre una ventana limitada de resultados por consulta; la cobertura amplia del mercado significa dividir la misma búsqueda de muchas formas por ubicación y palabra clave, no paginar hasta el final. - Deriva del markup. Nombres de clase como
job_seen_beaconyjobTitlecambian sin aviso, y un selector que funcionaba el trimestre pasado devuelve silenciosamente nada este trimestre.
Opción 2: Herramientas sin código / ya hechas
Las herramientas de scraping visual pueden apuntar y hacer clic para colocar un selector sobre los resultados de búsqueda de Indeed de la misma forma que el script de Python, pero heredan los mismos problemas — detección de bots en la capa de solicitud, una página de detalle de empleo prohibida y selectores frágiles — porque el método de acceso subyacente no ha cambiado. Te ahorran escribir el parser, no el problema de anti-bot o de ToS que hay debajo.
Opción 3: Una API estructurada de Indeed
La API de Indeed de Crawlora devuelve búsqueda de empleos, detalle de empleo y autocompletado de ubicación como JSON normalizado con una sola clave — sin parseo de HTML, sin sesión que mantener:
curl "https://api.crawlora.net/api/v1/indeed/search?q=software+engineer&l=Austin,+TX" \
-H "x-api-key: $CRAWLORA_API_KEY"
El mismo flujo en Python — buscar, y luego traer el detalle completo de un empleo por su job_key:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/indeed"
search = requests.get(f"{base}/search", headers=h, params={
"q": "software engineer", "l": "Austin, TX", "page": 1, "fromage": 7,
}).json()["data"]
job_key = search["jobs"][0]["job_key"]
job = requests.get(f"{base}/job", headers=h, params={"jk": job_key}).json()["data"]
/indeed/search acepta q (obligatorio), l para la ubicación, page (base 1), sort (relevance o date), radius en millas y fromage para limitar los resultados a publicaciones dentro de N días. Forma de la respuesta (recortada):
{
"code": 200,
"msg": "OK",
"data": {
"query": "software engineer",
"location": "Austin, TX",
"page": 1,
"total": 3040,
"jobs": [
{
"job_key": "5e52165ce276aa5a",
"title": "Staff HPC Applications Engineer",
"company": "NextSilicon",
"location": "Austin, TX",
"city": "Austin",
"state": "TX",
"posted_at": "2026-08-03T05:00:00Z",
"url": "https://www.indeed.com/viewjob?jk=5e52165ce276aa5a"
}
]
}
}
/indeed/job toma el jk (job key) de un resultado de búsqueda y devuelve el detalle completo de esa publicación — descripción, salario y beneficios incluidos donde Indeed los publica. Y dado que l en /indeed/search necesita una cadena de ubicación válida de Indeed, /indeed/locations/suggest convierte una consulta parcial en una:
locations = requests.get(f"{base}/locations/suggest", headers=h, params={
"q": "Austin", "limit": 5,
}).json()["data"]
# {"query": "Austin", "suggestions": [{"name": "Austin, TX (Travis County)", "source": "PRECISELY"}, ...]}
Qué puedes recolectar
- De la búsqueda —
job_key, título, empresa, ubicación (ciudad/estado/código postal), rango salarial y moneda cuando se publica, tipo(s) de empleo, indicador de remoto, indicadores de patrocinado/contratación urgente, un fragmento del resultado yposted_at. - Del detalle de empleo —
description_text/description_htmlcompletos, salario mínimo/máximo/período, lista de beneficios, tipo de empleo, indicador de remoto,direct_apply, calificación de la empresa y número de reseñas, yvalid_through. - Del sugeridor de ubicación — cadenas de ubicación normalizadas (con fuente, por ejemplo
PRECISELY) para volver a usar enlen el endpoint de búsqueda.
Limitaciones
- Sin filtro de texto completo ni arbitrario más allá de
q/l/radius/fromage/sort— construye cobertura ejecutando múltiples búsquedas dirigidas (palabra clave × ubicación) en lugar de un rastreo amplio único. - Los campos de detalle de empleo dependen de lo que publicó el empleador. El salario, los beneficios y el indicador de remoto suelen estar vacíos cuando el propio Indeed no tiene esos datos.
- Las publicaciones cerradas no se marcan en tiempo real — un
job_keyque devuelve un 404 o datos obsoletos en/indeed/jobnormalmente significa que el listado se cerró; vuelve a comprobar periódicamente en lugar de asumir que sigue abierto. - Esto cubre solo datos públicos de búsqueda y detalle — sin paneles de empleadores protegidos por inicio de sesión, datos de solicitantes ni flujos de Indeed Apply.
Dónde se usa esto
- Investigación de demanda de contratación y de mercado — rastrear el volumen de publicaciones y las tendencias salariales por rol, empresa y área metropolitana.
- Productos de meta-búsqueda de empleo y bolsas de trabajo de nicho — agregar listados de Indeed junto con otras fuentes en un solo feed.
- Herramientas de benchmarking de compensación — consolidar rangos salariales publicados entre títulos y ubicaciones comparables.
- Se combina con el dataset de Job Postings y la guía de job postings para roles de fuentes de ATS que Indeed no cubre.
Fuentes
Empieza a recolectar
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 búsqueda, empleo y sugerencia de ubicación en el Playground, revisa el esquema en la documentación de la API y consulta los precios. Indeed es una fuente en un mercado de contratación fragmentado — cómo scrapear job postings cubre las 14 plataformas de ATS mediante las que las empresas publican directamente, y cómo scrapear LinkedIn cubre las páginas públicas de empresa detrás de los empleadores que están contratando. Para señales específicas de equipos de ingeniería, cómo scrapear GitHub es un buen complemento, y cómo scrapear Upwork cubre el lado freelance de esa misma demanda de contratación. Para las líneas legales del scraping en general, consulta es legal el web scraping.
Parte de nuestra serie de guías how-to-scrape — cada plataforma que cubrimos, en un índice.
Preguntas frecuentes
¿Tiene Indeed una API pública de desarrollador en 2026?
No. La antigua Publisher API de Indeed y el feed XML de empleos están descontinuados — no se han emitido nuevas claves de desarrollador desde 2023–2024. Lo que queda es un programa de integración Indeed Apply / ATS para empleadores gestionado por ventas, dirigido a empleadores y proveedores de sistemas de seguimiento de candidatos, no un registro abierto para leer el índice público de búsqueda de empleo de Indeed.
¿Es legal scrapear las publicaciones de empleo de Indeed?
Esto no es asesoría legal, pero los Términos de Uso de Indeed prohíben usar bots o scrapers para acceder al sitio sin permiso, y el robots.txt prohíbe a los bots generales rastrear páginas individuales de detalle de empleo (/viewjob) así como varias rutas de búsqueda/API, con prohibiciones aún más amplias para los rastreadores de IA. Las páginas públicas de resultados de búsqueda no requieren inicio de sesión, pero tanto los términos como el robots.txt restringen el acceso automatizado — revisa ambos y respeta los límites de tasa antes de scrapear.
¿Qué pasó con el feed XML de empleos de Indeed?
Indeed fue eliminando gradualmente su Publisher API y el programa de feed XML desde aproximadamente 2023–2024, y en marzo de 2026 Indeed dejó de otorgar visibilidad de búsqueda gratuita a los empleos entregados mediante feeds XML de fuente única sin integración con un ATS — esto empuja a empleadores e integradores hacia conexiones ATS directas en su lugar.
¿Por qué el scraping de Indeed por cuenta propia falla tan a menudo?
Además de la exposición legal, un scraper simple de requests y BeautifulSoup se topa con detección de bots en la capa de solicitud, una ventana de paginación que limita cuántos resultados devuelve una sola consulta, y nombres de clases CSS en las páginas de búsqueda y empleo de Indeed que cambian sin aviso — y eso antes siquiera de tocar las páginas individuales de detalle de empleo que el robots.txt bloquea para rastreadores generales.
¿Qué campos devuelve una API estructurada de Indeed?
Los resultados de búsqueda incluyen job key, título, empresa, ubicación, rango salarial cuando se publica, tipo de empleo, indicador de remoto y fecha de publicación. El detalle de empleo añade la descripción completa, salario mínimo/máximo/período, beneficios, tipo de empleo y calificación de la empresa. Un endpoint de sugerencia de ubicación convierte un fragmento de nombre de ciudad en una cadena de ubicación válida para la consulta de búsqueda.
¿Puedo obtener datos salariales de Indeed a gran escala?
Sí, siempre que el propio Indeed haya asociado datos salariales a la publicación — tanto las respuestas de búsqueda como las de detalle de empleo incluyen salary_min, salary_max, salary_period y salary_currency cuando el empleador o la propia estimación de Indeed los completa. La cobertura no es uniforme; muchas publicaciones simplemente no tienen un campo de salario.
¿En qué se diferencia scrapear Indeed de scrapear bolsas de trabajo alojadas en un ATS como Greenhouse o Workday?
Indeed es un único agregador con un índice de búsqueda, pero con Términos de Uso y reglas de robots.txt restrictivas para las publicaciones individuales. Plataformas ATS como Greenhouse, Lever y Workday tienen el problema opuesto — más de una docena de backends JSON públicos, mayormente sin autenticación, sin un esquema unificado. Indeed y las bolsas basadas en ATS son fuentes complementarias, no un sustituto una de la otra.