Tony Wang6 min de lecturaCómo scrapear Upwork en 2026 (API y Python)
Scrapea empleos, presupuestos y perfiles freelance de Upwork en 2026 — por qué la API oficial requiere aprobación y una alternativa vía API.
El feed de empleos freelance de Upwork y los perfiles de freelancers son páginas web públicas, pero obtenerlos a escala no es tan simple como llamar a una API abierta. Upwork opera una API oficial basada en OAuth, pero está sujeta a aprobación — la solicitas, Upwork revisa la petición contra tu cuenta, y la revisión típica tarda alrededor de una semana. Esta guía cubre qué implica realmente ese proceso, por qué el scraping DIY se rompe frente a la postura anti-bot de Upwork, y cómo obtener datos de búsqueda de empleo, detalle de empleo y perfil de freelancer a través de una API estructurada en su lugar.
¿Por qué scrapear datos de Upwork?
- Investigación de tarifas del mercado freelance — sigue las tarifas por hora y de precio fijo por skill, categoría y nivel de experiencia en anuncios de empleo activos.
- Analítica de la gig economy — mide el volumen de publicaciones y las tendencias de demanda para skills específicas (Python, diseño, copywriting) a lo largo del tiempo.
- Monitoreo de competidores y agencias — descubre a qué tarifas y condiciones están ganando trabajo las agencias competidoras o los freelancers top.
- Pipelines de AI/LLM — alimenta datos normalizados del mercado freelance en modelos que fijan precios de trabajo o hacen match entre talento y briefs.
- Sourcing de talento — encuentra freelancers por skill y trayectoria para reclutamiento outbound, sin depender de la propia UI de búsqueda de Upwork.
¿Es legal scrapear Upwork?
Opción 1: DIY en Python (y por qué se rompe)
Una sola página de empleo o de perfil es fácil de obtener a mano:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.upwork.com/freelance-jobs/apply/Python-full-stack-developer_~022085006288356888767/",
headers={"User-Agent": "Mozilla/5.0"},
)
soup = BeautifulSoup(resp.text, "html.parser")
title = soup.select_one("h1")
Esto funciona exactamente una vez, y luego se degrada rápido:
- Renderizado pesado del lado del cliente. Las páginas de empleo y de perfil se hidratan vía JavaScript, así que una simple llamada con
requestsa menudo devuelve un cascarón sin el budget, el historial del cliente o los datos de feedback que realmente quieres — necesitas un navegador headless para obtener el DOM renderizado. - Detección de bots y rate limiting. Upwork se defiende activamente del tráfico no humano; los requests repetidos o rápidos desde una IP se limitan o bloquean, y la propia política de bots de Upwork dice que esto aplica "incluso con una API key" para recopilación masiva fuera de usos aprobados.
- La búsqueda requiere estado de sesión. El feed de búsqueda de empleos depende de filtros, tokens de paginación y cookies que establece la app del lado del cliente — replicarlo implica hacer ingeniería inversa de una interfaz que cambia sin aviso.
- Sin login, no hay acceso confiable a los campos restringidos. Algunos detalles del lado del cliente (historial de contacto completo, empleos solo por invitación) están detrás de una sesión autenticada, y loguear un bot pone en riesgo la cuenta.
Opción 2: Herramientas no-code / ya hechas
Los scrapers genéricos de apuntar y hacer clic pueden obtener una página individual de empleo o de perfil de Upwork, pero chocan con el mismo muro de renderizado en JavaScript y rate limiting que un script DIY — un scraper visual igual tiene que resolver el renderizado headless y la detección de bots, solo esconde el código. Para cualquier cosa más allá de un puñado de páginas, un backend mantenido que ya maneja el renderizado y la normalización es menos frágil que configurar una herramienta genérica contra un sitio que cambia su markup y sus defensas con regularidad.
Opción 3: Una API estructurada de Upwork
La Upwork API de Crawlora envuelve las páginas de búsqueda de empleo, detalle de empleo y perfil de freelancer detrás de tres endpoints y devuelve JSON normalizado — sin automatización de navegador ni gestión de sesión de tu lado.
Busca empleos freelance por palabra clave:
curl "https://api.crawlora.net/api/v1/upwork/search?q=python%20developer&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/upwork"
search = requests.get(f"{base}/search", headers=h, params={"q": "python developer", "page": 1}).json()["data"]
for job in search["jobs"]:
print(job["title"], job.get("budget_text"))
Forma de la respuesta (ejemplo real):
{
"code": 200,
"msg": "OK",
"data": {
"query": "python developer",
"page": 1,
"jobs": [
{
"id": "2085006288356888767",
"title": "Python full stack developer, python automation",
"url": "https://www.upwork.com/jobs/span-class-highlight-Python-span-full-stack-developer_~022085006288356888767/",
"posted_at": "Posted 2 days ago",
"budget_type": "hourly",
"budget_text": "Hourly: $60.00 - $75.00",
"experience_level": "Expert",
"duration": "1 to 3 months, 30+ hrs/week",
"skills": ["Python", "Django", "Flask"]
}
]
}
}
Obtén el detalle completo de un empleo por id:
job = requests.get(f"{base}/job/022085006288356888767", headers=h).json()["data"]
print(job["hourly_min"], job["hourly_max"], job["client"]["total_spent"])
Eso devuelve el rango de budget, el historial del cliente (fecha de miembro desde, gasto total, número de contrataciones, industria, tamaño de empresa), número de propuestas y países de los aplicantes — los campos que la propia página de empleo de Upwork muestra pero que un resultado de búsqueda no.
Consulta un perfil de freelancer por id:
freelancer = requests.get(f"{base}/freelancer/0157e03059a690281f", headers=h).json()["data"]
print(freelancer["hourly_rate"], freelancer["job_success_score"], freelancer["total_jobs"])
Eso devuelve tarifa por hora, job success score, calificación, número de reseñas, total de empleos y horas trabajadas, y entradas de feedback recientes.
Qué puedes recopilar
- Anuncios de empleo — título, descripción, fecha de publicación, tipo y rango de budget, nivel de experiencia, duración, tipo de proyecto, número de propuestas y skills requeridas.
- Señal del cliente — fecha de miembro desde, país, gasto total, número de contrataciones, horas reservadas, industria y tamaño de empresa, asociados a cada empleo.
- Perfiles de freelancer — nombre, título, tarifa por hora, estado de verificación, resumen, calificación, número de reseñas, job success score, ubicación, total de empleos y horas, y feedback reciente con fechas y calificaciones.
Limitaciones
- Solo datos públicos. Esto cubre lo visible en páginas públicas de empleo y de perfil — sin mensajería restringida por login, empleos solo por invitación ni datos de contacto.
- IDs, no crawling abierto. Los endpoints de empleo y freelancer requieren un id específico; descubre los ids primero a través de la búsqueda, y luego obtén el detalle de los que necesites.
- Los campos del resultado de búsqueda son más ligeros que el detalle de empleo. El endpoint de búsqueda devuelve un resumen (título, texto de budget, skills); usa el endpoint de detalle de empleo para el historial del cliente y las cifras exactas de budget.
- Instantáneas del mercado freelance, no datos de puja en tiempo real. El número de propuestas y las tarifas reflejan la página en el momento de la consulta — Upwork no expone datos de pujas en vivo a través de sus páginas públicas.
Dónde se usa esto
- Benchmarking de tarifas freelance — agrega tarifas por hora y de precio fijo por categoría de skill para fijar el precio de tu propio trabajo o el de un cliente.
- Investigación de mercado de la gig economy — sigue el volumen de publicaciones y la demanda por skill a lo largo del tiempo.
- Pipelines de sourcing de talento — filtra perfiles de freelancer por job success score, calificación y trayectoria antes del contacto.
- Datos de entrenamiento y matching para AI/LLM — datos normalizados de empleo y skills para modelos que fijan precios de trabajo freelance o hacen match entre briefs y talento.
Fuentes
Empieza a recopilar
Pruébalo primero, gratis: pasa cualquier URL pública por el Free Web Scraper, o verifica si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de búsqueda, empleo y freelancer en el Playground, revisa el esquema en los API docs, y consulta los pricing. Upwork es el equivalente en gig-work de los job boards cubiertos en how to scrape job postings — combina ambos si estás siguiendo tanto la contratación tradicional como la demanda freelance para las mismas skills. Si estás construyendo un pipeline de sourcing de talento más amplio, how to scrape GitHub cubre cómo encontrar developers por su actividad pública y sus repos, how to scrape Indeed cubre el lado tradicional de los job boards, y how to scrape Fiverr cubre el otro gran marketplace freelance para la misma demanda de gig-work. Para el marco legal detrás de todo esto, ver is web scraping legal.
Parte de nuestra serie de guías how-to-scrape — cada plataforma que cubrimos, en un solo índice.
Preguntas frecuentes
¿Upwork tiene una API pública oficial?
Sí. Upwork opera una API OAuth 2.0, documentada en developer.upwork.com, pero no es self-serve — solicitas credenciales de cliente en el API Center, y Upwork revisa la solicitud contra una cuenta verificada, con una revisión que típicamente tarda alrededor de una semana.
¿Es legal scrapear anuncios de empleo y perfiles de freelancers de Upwork?
Los anuncios de empleo y los perfiles públicos de freelancers son visibles sin login, pero la política de Trust & Safety de Upwork define a los bots de forma amplia y establece que la recopilación masiva de feeds de empleos o perfiles fuera de usos aprobados no está autorizada, incluso con una API key. Esto no es asesoría legal — revisa los términos de uso de Upwork y consulta a un abogado para tu caso concreto.
¿Puedo scrapear Upwork sin una API key?
Técnicamente las páginas son públicas, pero Upwork detecta y bloquea activamente patrones de tráfico no humano, y la política de bots aplica sin importar si tienes una API key. Un scraper DIY también debe resolver el renderizado del lado del cliente y la búsqueda basada en sesión, lo que suele fallar.
¿Qué datos obtengo de los anuncios de empleo de Upwork?
Título, descripción, fecha de publicación, tipo y rango de budget, nivel de experiencia, duración del proyecto, número de propuestas, skills requeridas, y señal del cliente como fecha de miembro desde, gasto total, número de contrataciones, industria y tamaño de empresa.
¿Qué datos obtengo de los perfiles de freelancer de Upwork?
Nombre, título, tarifa por hora, estado de verificación, resumen, calificación, número de reseñas, job success score, ubicación, total de empleos y horas trabajadas, y entradas de feedback recientes con fecha y calificación.
¿Cuánto tarda el proceso de aprobación de la API de Upwork?
La propia documentación de soporte de Upwork indica que la revisión suele tardar alrededor de una semana después de enviar la solicitud en el API Center, y que la mayoría de los rechazos se deben a datos de cuenta faltantes o sin verificar, no al caso de uso en sí.
¿En qué se diferencia una API estructurada de Upwork de la API oficial propia de Upwork?
Una API estructurada de terceros como la de Crawlora devuelve JSON normalizado para las páginas de búsqueda de empleo, detalle de empleo y perfil de freelancer, sin que tengas que pasar por el proceso de verificación y aprobación de cuenta de Upwork — útil cuando necesitas datos públicos de empleos o perfiles sin solicitar acceso directo a la plataforma.