# elempleo Scraper - Colombia Jobs, Salaries, Vacantes & Empleos (`scrapers_lat/elempleo-scraper`) Actor

Scrape elempleo.com job postings across Colombia (Bogota, Medellin, Cali). Get title, company, salary range, city, contract type, work mode, experience, education, sector, vacancies and full description. Filter by keyword, city, salary or contract. Empleos y vacantes en Colombia. JSON, CSV, Excel.

- **URL**: https://apify.com/scrapers\_lat/elempleo-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Jobs, Business, Automation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.78 out of 5 stars

## Pricing

from $6.15 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

[![elempleo Scraper - Colombia Jobs, Salaries, Vacantes & Empleos](https://scrapers.lat/banners/elempleo-scraper.png)](https://console.apify.com/actors/VQgP2SkLQfe17Dz0H/input)

## elempleo Scraper: Colombia Jobs, Salaries, Vacantes & Empleos Data

The most complete **elempleo.com scraper** for **Colombia jobs data**. Turn any elempleo search into a clean dataset of **job postings**: title, company, real **salary range**, city, contract type, work mode, experience, education, sector, vacancies, deadlines and the full description. Search by **keyword and city**, or paste your own filtered URLs. Ideal for **recruiting data**, labor-market research, salary benchmarking and job aggregation across **empleos y vacantes en Colombia**.

Here is one real result, with the fields the actor returns:

```json
{
  "jobId": "1886761954",
  "id": "1886761954",
  "title": "Almacenista",
  "url": "https://www.elempleo.com/co/ofertas-trabajo/almacenista-1886761954",
  "applyUrl": "https://www.elempleo.com/co/ofertas-trabajo/almacenista-1886761954",
  "source": "elempleo.com",
  "matchedKeyword": "almacenista",
  "company": "Sodexo s.a",
  "companyName": "Sodexo s.a",
  "companyProfile": "Sodexo s.a - Servicios",
  "companySector": "Servicios",
  "companyLogo": "https://elempleo.blob.core.windows.net/empresasprd/3745.webp",
  "location": "Dosquebradas",
  "city": "Dosquebradas",
  "region": "Risaralda",
  "country": "CO",
  "salary": "$1,5 a $2 millones",
  "salaryMin": 1500000,
  "salaryMax": 2000000,
  "salaryCurrency": "COP",
  "salaryConfidential": false,
  "contractType": "Contrato Definido",
  "employmentType": "TEMPORARY",
  "workMode": "Presencial",
  "seniorityLevel": "Auxiliar, asistencial y otros",
  "jobArea": "Compras e Inventarios, Logistica y Distribucion",
  "profession": "Tecnico de Mantenimiento, Tecnico en Logistica",
  "sector": "Construccion",
  "vacancies": 1,
  "directApply": true,
  "education": "Tecnico Laboral",
  "experience": "1 ano de experiencia",
  "keySkills": ["almacenistas", "almacenista"],
  "equivalentPositions": ["Almacenista de obra", "Analista almacen repuestos", "Almacenista"],
  "tags": ["almacenistas", "almacenista"],
  "description": "Empresa del sector de mantenimiento y servicios requiere para su equipo de trabajo Almacenista con experiencia en manejo de inventarios...",
  "publishedDate": "Ayer",
  "publishedDateISO": "2026-09-03",
  "applicationDeadline": "2-11-2026",
  "applicationDeadlineISO": "2026-11-02",
  "observedAt": "2026-09-04T14:39:32.993Z",
  "error": null
}
```

**📥 [Input](https://apify.com/scrapers_lat/elempleo-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/elempleo-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/elempleo-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/elempleo-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Colombia-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Use cases](#use-cases)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [How it compares](#how-it-compares)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

This **elempleo scraper** collects **job postings from elempleo.com**, Colombia's largest job board, and writes one normalized record per offer to the run's dataset. Search by **keyword** (for example `desarrollador`, `contador`, `auxiliar contable`) and **city** (for example `bogota`, `medellin`, `cali`), or paste elempleo search or job URLs directly. Pagination is followed automatically.

When `withDetails` is on, it opens each job page to add the full description, requirements, education, experience, the **real salary range** (recovered even when the listing shows "confidential"), sector, seniority, vacancy count, application deadline and the company profile. Optional AI add-ons write a concise summary and extract structured requirements (skills, tools, languages, years of experience, seniority, must-haves).

### Use cases

- **Recruiting and sourcing data** for Colombia: build talent pipelines and monitor competitor hiring.
- **Salary benchmarking** with parsed `salaryMin` / `salaryMax` in COP.
- **Labor-market and economic research** across sectors, cities and seniority levels.
- **Job board aggregation** and vertical search feeds for **empleos Colombia**.
- **Lead generation**: hiring companies, sectors and contact-ready company profiles.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns developer jobs in Bogota with full details.

```json
{
  "keywords": ["desarrollador"],
  "location": "bogota",
  "maxJobs": 25,
  "withDetails": true
}
```

Or scrape a URL you filtered on the site:

```json
{
  "startUrls": ["https://www.elempleo.com/co/ofertas-empleo/medellin/trabajo-contador"],
  "maxJobs": 50,
  "withDetails": true
}
```

### Input reference

| Field | Type | Required | Description |
|---|---|---|---|
| `keywords` | array | no | Job search terms in Spanish. One search per term. |
| `location` | string | no | City or region in Colombia (bogota, medellin, cali...). Combined with each keyword. |
| `maxJobs` | integer | no | Max job listings across all searches. Blank or 0 = no limit. Free plans capped at 10. |
| `startUrls` | array | no | elempleo search or job URLs to scrape directly. |
| `startUrl` | string | no | A single elempleo search or listing URL. |
| `contractType` | string | no | Keep only offers matching this contract type (Indefinido, Definido, Obra o labor...). |
| `workModality` | string | no | Keep only offers matching this work mode (Remoto, Presencial, Hibrido). |
| `area` | string | no | Keep only offers whose area/profession matches. Requires job details. |
| `positionLevel` | string | no | Keep only offers whose seniority level matches. Requires job details. |
| `experience` | string | no | Keep only offers whose experience text matches. Requires job details. |
| `sector` | string | no | Keep only offers whose sector matches. Requires job details. |
| `salaryMin` | integer | no | Keep only offers whose salary (upper bound) is at least this many COP. |
| `sort` | string | no | Set to `date` to sort collected offers by most recent first. |
| `onlyRemote` | boolean | no | Keep only remote / hybrid offers. |
| `withDetails` | boolean | no | Open each job page for full detail. Paid plans only. Default true. |
| `withSummary` | boolean | no | AI add-on: 2-3 sentence summary per posting. Paid plans, requires details. |
| `withExtract` | boolean | no | AI add-on: structured skills, tools, languages, seniority, must-haves. Paid plans, requires details. |
| `proxyConfiguration` | object | no | Defaults to Apify Residential proxy pinned to Colombia. |

The actor also accepts competitor field names as aliases: `keyword`, `cargos`, `city`, `ciudades`, `tipoContrato`, `modalidadLaboral`, `campoLaboral`, `nivelesCargo`, `experiencias`, `sectorIndustria`, `maxItems`, `maxResults`, `sortExpression`, `maxPagesPerKeyword`.

### Output reference

One dataset item per job. Fields are `string` or `null` unless noted. Detail-only fields are populated when `withDetails` is on.

| Field | Type | Description |
|---|---|---|
| `jobId` / `id` | string | elempleo job id (unique per posting). |
| `title` | string | Job title. |
| `url` / `applyUrl` | string | Job page URL and apply URL. |
| `source` | string | Constant `elempleo.com`. |
| `matchedKeyword` / `keyword` | string | Search keyword that matched this job. |
| `company` | string | Company name, or `Empresa confidencial` when hidden. |
| `companyName` | string | Real company name from the job page. |
| `companyProfile` | string | Company name and sector combined. |
| `companySector` | string | Employer economic sector. |
| `companyLogo` | string | Company logo URL (null when the default placeholder). |
| `location` / `city` | string | City of the vacancy. |
| `region` | string | Department / region. |
| `country` | string | Country code, CO. |
| `salary` / `salaryText` | string | Salary text as published. |
| `salaryMin` | integer | Parsed lower salary bound (COP). |
| `salaryMax` | integer | Parsed upper salary bound (COP). |
| `salaryCurrency` | string | Salary currency (COP). |
| `salaryConfidential` | boolean | True when the employer hid the salary. |
| `contractType` | string | Contract type. |
| `employmentType` | string | Normalized type (FULL\_TIME, TEMPORARY...). |
| `workMode` | string | Presencial, Remoto, Hibrido. |
| `seniorityLevel` / `laborLevel` | string | Seniority / position level. |
| `jobArea` / `laborArea` / `industry` | string | Functional area / category. |
| `profession` | string | Profession / career field. |
| `sector` | string | Offer economic sector. |
| `vacancies` | integer | Number of open positions. |
| `directApply` | boolean | Whether the posting supports direct apply. |
| `education` | string | Required education level. |
| `experience` / `minimumExperience` / `experienceRequirements` | string | Required experience. |
| `keySkills` | array | Skills / keyword tags. |
| `requirements` | string | Requirements / keyword tags block. |
| `equivalentPositions` / `relatedPositions` | array | Equivalent / related job titles. |
| `tags` | array | Offer keyword tags. |
| `description` | string | Full job description. |
| `publishedDate` / `publishedText` / `publishedAgo` | string | Publication date text (Hoy, Ayer...). |
| `publishedDateISO` / `datePosted` | string | Publication date, ISO YYYY-MM-DD. |
| `applicationDeadline` | string | Application deadline as published. |
| `applicationDeadlineISO` / `validThrough` | string | Deadline, ISO YYYY-MM-DD. |
| `aiSummary` | string | AI summary (add-on). |
| `aiExtract` | object | AI structured requirements (add-on). |
| `observedAt` / `scrapedAt` | string | ISO timestamp of collection. |
| `error` | string | `null` on success. |

### How it compares

| Capability | This actor | Typical elempleo actors |
|---|---|---|
| Search by keyword + city | Yes | Some |
| Direct search / job URLs | Yes (`startUrls`) | Some |
| Filters: contract, work mode, area, level, experience, sector, salary | Yes | Partial |
| Parsed salary range (`salaryMin` / `salaryMax` in COP) | Yes | Rarely |
| Real salary recovered when listing shows "confidential" | Yes | Rarely |
| Region, country, employment type, direct-apply flag | Yes | Rarely |
| Vacancies, deadline (ISO), sector, seniority, company profile | Yes | Partial |
| Equivalent positions, tags, key skills | Yes | Partial |
| Company logo | Yes | No |
| AI summary and structured requirement extraction | Optional add-on | No |
| Competitor output field names accepted as aliases | Yes | N/A |
| Pay per result, no charge on failure | Yes | Varies |

This actor accepts every input the common elempleo actors accept and returns every field they return, plus parsed salary, structured location, employment type, vacancies, deadlines, company profile, equivalent positions and optional AI enrichment.

### Run via API and CLI

Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~elempleo-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["desarrollador"],"location":"bogota","maxJobs":25,"withDetails":true}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~elempleo-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":["https://www.elempleo.com/co/ofertas-empleo/"],"onlyRemote":true,"maxJobs":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/elempleo-scraper \
  --input '{"keywords":["contador"],"location":"medellin","maxJobs":50}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets.

### Billing and limits

- **Pay per result.** You are charged per job record returned (`result` event). See the [pricing tab](https://apify.com/scrapers_lat/elempleo-scraper/pricing).
- **Optional add-ons.** When `withDetails` fetches a job page and returns detail content, a `details` add-on is billed on top of the base result. AI add-ons (`ai_summary`, `ai_extract`) are billed per job and only on usable AI output. Add-ons are disabled for free plans.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further results and add-ons, and stops fetching extra job pages.
- **Free Apify plans** are capped at 10 records per run. Upgrade for higher `maxJobs`.

### FAQ and troubleshooting

**A run returned 0 records. Why?**
The search matched no offers, or your filters removed everything. Loosen the keyword, city or filters. Zero-result runs are not charged.

**How do I target a city or keyword?**
Set `keywords` and `location`, or paste a filtered elempleo URL into `startUrls`. The actor follows pagination from there.

**Why is `salary` confidential?**
Many Colombian postings hide salary on the listing. With `withDetails` on, the actor often recovers the real range into `salaryMin` / `salaryMax`; otherwise it reports `Salario confidencial` rather than inventing a value.

**Do I need job details for the AI add-ons?**
Yes. `withSummary` and `withExtract` require `withDetails`, since they read the full job page text.

**Is this an official elempleo tool?**
No. This actor is independent and has no affiliation with elempleo.com. It reads only data that is publicly available on the site.

### Related scrapers

- [Computrabajo Scraper](https://apify.com/scrapers_lat/computrabajo-scraper): Computrabajo job listings across Latin America.
- [Bumeran Jobs Scraper](https://apify.com/scrapers_lat/bumeran-jobs-scraper): Bumeran job postings in Latin America.
- [Catho Brasil Jobs Scraper](https://apify.com/scrapers_lat/catho-brasil-jobs-scraper): Catho job listings in Brazil.
- [ZonaJobs Argentina Scraper](https://apify.com/scrapers_lat/zonajobs-argentina-scraper): ZonaJobs postings in Argentina.
- [OCC Mexico Jobs Scraper](https://apify.com/scrapers_lat/occ-mexico-jobs-scraper): OCC job listings in Mexico.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

> Independent tool, not affiliated with elempleo.com. Accesses only publicly available data on elempleo.com.

***

## elempleo Scraper: Datos de Empleos, Salarios, Vacantes y Ofertas en Colombia

El **scraper de elempleo.com** mas completo para **datos de empleos en Colombia**. Convierte cualquier busqueda de elempleo en un dataset limpio de **ofertas de empleo**: cargo, empresa, **rango salarial** real, ciudad, tipo de contrato, modalidad, experiencia, educacion, sector, vacantes, fechas de cierre y la descripcion completa. Busca por **palabra clave y ciudad**, o pega tus propias URLs filtradas. Ideal para **datos de reclutamiento**, estudios del mercado laboral, comparacion de salarios y agregacion de **empleos y vacantes en Colombia**.

Aqui un resultado real, con los campos que devuelve el actor:

```json
{
  "jobId": "1886761954",
  "id": "1886761954",
  "title": "Almacenista",
  "url": "https://www.elempleo.com/co/ofertas-trabajo/almacenista-1886761954",
  "applyUrl": "https://www.elempleo.com/co/ofertas-trabajo/almacenista-1886761954",
  "source": "elempleo.com",
  "matchedKeyword": "almacenista",
  "company": "Sodexo s.a",
  "companyName": "Sodexo s.a",
  "companyProfile": "Sodexo s.a - Servicios",
  "companySector": "Servicios",
  "companyLogo": "https://elempleo.blob.core.windows.net/empresasprd/3745.webp",
  "location": "Dosquebradas",
  "city": "Dosquebradas",
  "region": "Risaralda",
  "country": "CO",
  "salary": "$1,5 a $2 millones",
  "salaryMin": 1500000,
  "salaryMax": 2000000,
  "salaryCurrency": "COP",
  "salaryConfidential": false,
  "contractType": "Contrato Definido",
  "employmentType": "TEMPORARY",
  "workMode": "Presencial",
  "seniorityLevel": "Auxiliar, asistencial y otros",
  "jobArea": "Compras e Inventarios, Logistica y Distribucion",
  "profession": "Tecnico de Mantenimiento, Tecnico en Logistica",
  "sector": "Construccion",
  "vacancies": 1,
  "directApply": true,
  "education": "Tecnico Laboral",
  "experience": "1 ano de experiencia",
  "keySkills": ["almacenistas", "almacenista"],
  "equivalentPositions": ["Almacenista de obra", "Analista almacen repuestos", "Almacenista"],
  "tags": ["almacenistas", "almacenista"],
  "description": "Empresa del sector de mantenimiento y servicios requiere para su equipo de trabajo Almacenista con experiencia en manejo de inventarios...",
  "publishedDate": "Ayer",
  "publishedDateISO": "2026-09-03",
  "applicationDeadline": "2-11-2026",
  "applicationDeadlineISO": "2026-11-02",
  "observedAt": "2026-09-04T14:39:32.993Z",
  "error": null
}
```

**📥 [Entrada](https://apify.com/scrapers_lat/elempleo-scraper/input-schema) · 📤 [Salida](https://apify.com/scrapers_lat/elempleo-scraper/output-schema) · 💰 [Precios](https://apify.com/scrapers_lat/elempleo-scraper/pricing) · ▶️ [Ejemplos](https://apify.com/scrapers_lat/elempleo-scraper/examples)**

### Tabla de contenido

- [Que hace](#que-hace)
- [Casos de uso](#casos-de-uso)
- [Inicio rapido](#inicio-rapido)
- [Referencia de entrada](#referencia-de-entrada)
- [Referencia de salida](#referencia-de-salida)
- [Como se compara](#como-se-compara)
- [Uso via API y CLI](#uso-via-api-y-cli)
- [Obtener resultados](#obtener-resultados)
- [Facturacion y limites](#facturacion-y-limites)
- [Preguntas frecuentes](#preguntas-frecuentes)

### Que hace

Este **scraper de elempleo** recopila **ofertas de empleo de elempleo.com**, el portal de empleo mas grande de Colombia, y escribe un registro normalizado por oferta en el dataset del run. Busca por **palabra clave** (por ejemplo `desarrollador`, `contador`, `auxiliar contable`) y **ciudad** (por ejemplo `bogota`, `medellin`, `cali`), o pega URLs de busqueda u oferta de elempleo directamente. La paginacion se sigue automaticamente.

Cuando `withDetails` esta activo, abre cada oferta para agregar la descripcion completa, requisitos, educacion, experiencia, el **rango salarial real** (recuperado incluso cuando la oferta muestra "confidencial"), sector, nivel, numero de vacantes, fecha de cierre y el perfil de la empresa. Los complementos de IA opcionales escriben un resumen y extraen requisitos estructurados (habilidades, herramientas, idiomas, anos de experiencia, nivel, indispensables).

### Casos de uso

- **Datos de reclutamiento y sourcing** para Colombia: arma pipelines de talento y monitorea la contratacion de la competencia.
- **Comparacion de salarios** con `salaryMin` / `salaryMax` en COP.
- **Investigacion del mercado laboral** por sector, ciudad y nivel.
- **Agregacion de portales de empleo** y buscadores verticales de **empleos Colombia**.
- **Generacion de leads**: empresas que contratan, sectores y perfiles de empresa.

### Inicio rapido

Abre el actor, pega esto en la entrada y presiona Run. Devuelve ofertas de desarrollador en Bogota con detalle completo.

```json
{
  "keywords": ["desarrollador"],
  "location": "bogota",
  "maxJobs": 25,
  "withDetails": true
}
```

O scrapea una URL que filtraste en el sitio:

```json
{
  "startUrls": ["https://www.elempleo.com/co/ofertas-empleo/medellin/trabajo-contador"],
  "maxJobs": 50,
  "withDetails": true
}
```

### Referencia de entrada

| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
| `keywords` | array | no | Terminos de busqueda en espanol. Una busqueda por termino. |
| `location` | string | no | Ciudad o region en Colombia (bogota, medellin, cali...). Se combina con cada palabra clave. |
| `maxJobs` | integer | no | Maximo de ofertas en todas las busquedas. Vacio o 0 = sin limite. Planes gratis limitados a 10. |
| `startUrls` | array | no | URLs de busqueda u oferta de elempleo para scrapear directo. |
| `startUrl` | string | no | Una sola URL de busqueda o listado de elempleo. |
| `contractType` | string | no | Solo ofertas cuyo tipo de contrato coincide (Indefinido, Definido, Obra o labor...). |
| `workModality` | string | no | Solo ofertas cuya modalidad coincide (Remoto, Presencial, Hibrido). |
| `area` | string | no | Solo ofertas cuyo area/profesion coincide. Requiere detalle. |
| `positionLevel` | string | no | Solo ofertas cuyo nivel coincide. Requiere detalle. |
| `experience` | string | no | Solo ofertas cuyo texto de experiencia coincide. Requiere detalle. |
| `sector` | string | no | Solo ofertas cuyo sector coincide. Requiere detalle. |
| `salaryMin` | integer | no | Solo ofertas cuyo salario (limite superior) es al menos estos COP. |
| `sort` | string | no | Pon `date` para ordenar las ofertas por mas recientes primero. |
| `onlyRemote` | boolean | no | Solo ofertas remotas / hibridas. |
| `withDetails` | boolean | no | Abre cada oferta para el detalle completo. Solo planes pagos. Por defecto true. |
| `withSummary` | boolean | no | Complemento IA: resumen de 2-3 frases por oferta. Planes pagos, requiere detalle. |
| `withExtract` | boolean | no | Complemento IA: habilidades, herramientas, idiomas, nivel e indispensables. Planes pagos, requiere detalle. |
| `proxyConfiguration` | object | no | Por defecto usa proxy Residencial de Apify fijado en Colombia. |

El actor tambien acepta nombres de campos de la competencia como alias: `keyword`, `cargos`, `city`, `ciudades`, `tipoContrato`, `modalidadLaboral`, `campoLaboral`, `nivelesCargo`, `experiencias`, `sectorIndustria`, `maxItems`, `maxResults`, `sortExpression`, `maxPagesPerKeyword`.

### Referencia de salida

Un item por oferta. Los campos son `string` o `null` salvo que se indique. Los campos de detalle se completan cuando `withDetails` esta activo.

| Campo | Tipo | Descripcion |
|---|---|---|
| `jobId` / `id` | string | Id de la oferta en elempleo (unico). |
| `title` | string | Titulo del cargo. |
| `url` / `applyUrl` | string | URL de la oferta y URL para postularse. |
| `source` | string | Constante `elempleo.com`. |
| `matchedKeyword` / `keyword` | string | Palabra clave que produjo esta oferta. |
| `company` | string | Nombre de empresa, o `Empresa confidencial` si esta oculto. |
| `companyName` | string | Nombre real de la empresa en la pagina de la oferta. |
| `companyProfile` | string | Nombre de empresa y sector combinados. |
| `companySector` | string | Sector economico del empleador. |
| `companyLogo` | string | URL del logo (null cuando es el placeholder por defecto). |
| `location` / `city` | string | Ciudad de la vacante. |
| `region` | string | Departamento / region. |
| `country` | string | Codigo de pais, CO. |
| `salary` / `salaryText` | string | Texto del salario publicado. |
| `salaryMin` | integer | Limite inferior del salario (COP). |
| `salaryMax` | integer | Limite superior del salario (COP). |
| `salaryCurrency` | string | Moneda del salario (COP). |
| `salaryConfidential` | boolean | True cuando la empresa oculto el salario. |
| `contractType` | string | Tipo de contrato. |
| `employmentType` | string | Tipo normalizado (FULL\_TIME, TEMPORARY...). |
| `workMode` | string | Presencial, Remoto, Hibrido. |
| `seniorityLevel` / `laborLevel` | string | Nivel del cargo. |
| `jobArea` / `laborArea` / `industry` | string | Area / categoria funcional. |
| `profession` | string | Profesion / campo. |
| `sector` | string | Sector economico de la oferta. |
| `vacancies` | integer | Numero de vacantes abiertas. |
| `directApply` | boolean | Si la oferta permite postulacion directa. |
| `education` | string | Nivel de educacion requerido. |
| `experience` / `minimumExperience` / `experienceRequirements` | string | Experiencia requerida. |
| `keySkills` | array | Habilidades / etiquetas clave. |
| `requirements` | string | Bloque de requisitos / etiquetas. |
| `equivalentPositions` / `relatedPositions` | array | Cargos equivalentes / relacionados. |
| `tags` | array | Etiquetas de la oferta. |
| `description` | string | Descripcion completa de la oferta. |
| `publishedDate` / `publishedText` / `publishedAgo` | string | Fecha de publicacion en texto (Hoy, Ayer...). |
| `publishedDateISO` / `datePosted` | string | Fecha de publicacion, ISO YYYY-MM-DD. |
| `applicationDeadline` | string | Fecha de cierre publicada. |
| `applicationDeadlineISO` / `validThrough` | string | Fecha de cierre, ISO YYYY-MM-DD. |
| `aiSummary` | string | Resumen IA (complemento). |
| `aiExtract` | object | Requisitos estructurados IA (complemento). |
| `observedAt` / `scrapedAt` | string | Marca de tiempo ISO de la recoleccion. |
| `error` | string | `null` en exito. |

### Como se compara

| Capacidad | Este actor | Actores tipicos de elempleo |
|---|---|---|
| Busqueda por palabra clave + ciudad | Si | Algunos |
| URLs directas de busqueda / oferta | Si (`startUrls`) | Algunos |
| Filtros: contrato, modalidad, area, nivel, experiencia, sector, salario | Si | Parcial |
| Rango salarial parseado (`salaryMin` / `salaryMax` en COP) | Si | Rara vez |
| Salario real recuperado cuando la oferta dice "confidencial" | Si | Rara vez |
| Region, pais, tipo de empleo, postulacion directa | Si | Rara vez |
| Vacantes, cierre (ISO), sector, nivel, perfil de empresa | Si | Parcial |
| Cargos equivalentes, etiquetas, habilidades clave | Si | Parcial |
| Logo de la empresa | Si | No |
| Resumen IA y extraccion estructurada de requisitos | Complemento opcional | No |
| Nombres de campos de la competencia aceptados como alias | Si | N/A |
| Pago por resultado, sin cargo en caso de fallo | Si | Varia |

Este actor acepta todas las entradas que aceptan los actores comunes de elempleo y devuelve todos sus campos, mas salario parseado, ubicacion estructurada, tipo de empleo, vacantes, fechas de cierre, perfil de empresa, cargos equivalentes y enriquecimiento IA opcional.

### Uso via API y CLI

Reemplaza `<TOKEN>` con tu token de API de Apify.

Ejecuta de forma sincrona y obten los items del dataset en una llamada:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~elempleo-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["desarrollador"],"location":"bogota","maxJobs":25,"withDetails":true}'
```

CLI de Apify:

```bash
apify call scrapers_lat/elempleo-scraper \
  --input '{"keywords":["contador"],"location":"medellin","maxJobs":50}'
```

### Obtener resultados

Cada run escribe en un dataset. Obten items como JSON, CSV o Excel cambiando `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"
```

`<DATASET_ID>` es el `defaultDatasetId` del objeto run. Usa `offset` y `limit` para paginar.

### Facturacion y limites

- **Pago por resultado.** Se cobra por cada registro de oferta devuelto (evento `result`). Ver la [pestana de precios](https://apify.com/scrapers_lat/elempleo-scraper/pricing).
- **Complementos opcionales.** Cuando `withDetails` obtiene una oferta con contenido, se cobra el complemento `details` sobre el resultado base. Los complementos IA (`ai_summary`, `ai_extract`) se cobran por oferta y solo con salida util. Los complementos estan deshabilitados en planes gratis.
- **Sin cargo en caso de fallo.** Si un run falla, el actor escribe un item con el campo `error` y no cobra por el. Los runs vacios no cuestan nada.
- **Limite de gasto respetado.** Configura `maxTotalChargeUsd` en el run; al alcanzarlo, el actor deja de emitir y cobrar mas resultados y complementos, y deja de descargar paginas extra.
- **Planes gratis de Apify** limitados a 10 registros por run. Mejora tu plan para mas `maxJobs`.

### Preguntas frecuentes

**Un run devolvio 0 registros. Por que?**
La busqueda no encontro ofertas, o tus filtros quitaron todo. Afloja la palabra clave, ciudad o filtros. Los runs sin resultados no se cobran.

**Como apunto a una ciudad o palabra clave?**
Configura `keywords` y `location`, o pega una URL filtrada de elempleo en `startUrls`. El actor sigue la paginacion desde ahi.

**Por que el `salary` es confidencial?**
Muchas ofertas colombianas ocultan el salario en el listado. Con `withDetails` activo, el actor suele recuperar el rango real en `salaryMin` / `salaryMax`; de lo contrario reporta `Salario confidencial` sin inventar un valor.

**Necesito el detalle para los complementos de IA?**
Si. `withSummary` y `withExtract` requieren `withDetails`, ya que leen el texto completo de la oferta.

**Es una herramienta oficial de elempleo?**
No. Este actor es independiente y no tiene afiliacion con elempleo.com. Solo lee datos disponibles publicamente en el sitio.

> Herramienta independiente, sin afiliacion con elempleo.com. Accede solo a datos disponibles publicamente en elempleo.com.

# Actor input Schema

## `keywords` (type: `array`):

Job search terms in Spanish, one search per term, for example \["desarrollador", "contador", "auxiliar contable"]. Leave empty to browse all offers or to use startUrls.

## `location` (type: `string`):

City or region in Colombia to filter by, for example "bogota", "medellin", "cali". Combined with each keyword. Optional.

## `maxJobs` (type: `integer`):

Maximum number of job listings to collect across all searches. Leave blank or 0 for no limit. Free Apify plans are capped at 10 per run.

## `startUrls` (type: `array`):

Optional list of elempleo.com search or job-offer URLs to scrape directly. Apply filters on the site and paste the resulting URLs. Pagination is followed automatically.

## `startUrl` (type: `string`):

A single elempleo.com search or listing URL, for example https://www.elempleo.com/co/ofertas-empleo/. Alternative to startUrls / keywords.

## `contractType` (type: `string`):

Keep only offers whose contract type matches this text, for example "Indefinido", "Definido", "Obra o labor", "Prestación de servicios". Optional.

## `workModality` (type: `string`):

Keep only offers whose work mode matches, for example "Remoto", "Presencial", "Híbrido". Optional.

## `area` (type: `string`):

Keep only offers whose area / profession matches this text, for example "Ingeniería", "Ventas", "Salud". Requires job details. Optional.

## `positionLevel` (type: `string`):

Keep only offers whose seniority level matches, for example "Profesional", "Auxiliar", "Directivo". Requires job details. Optional.

## `experience` (type: `string`):

Keep only offers whose required experience text matches, for example "1 año", "Sin experiencia". Requires job details. Optional.

## `sector` (type: `string`):

Keep only offers whose sector / industry matches, for example "Salud", "Construcción", "Tecnología". Requires job details. Optional.

## `salaryMin` (type: `integer`):

Keep only offers whose salary (upper bound) is at least this many Colombian pesos, for example 2000000. Confidential salaries are excluded when set. Optional.

## `sort` (type: `string`):

Optional. Set to "date" to sort the collected offers by most recent first.

## `onlyRemote` (type: `boolean`):

When enabled, keep only offers whose work mode signals remote / hybrid work (remoto / teletrabajo / híbrido).

## `withDetails` (type: `boolean`):

When enabled, the actor opens each job page to add the full description, requirements, education, experience, real salary range, sector, seniority, vacancies, deadline and company profile. Slower; one request per job. Paid plans only.

## `withSummary` (type: `boolean`):

Add-on (paid plans, requires job details). Uses AI to write a concise 2-3 sentence summary of each posting. Billed per job only on success.

## `withExtract` (type: `boolean`):

Add-on (paid plans, requires job details). Uses AI to extract structured skills, tools, languages, years of experience, seniority and must-haves. Billed per job only on success.

## `proxyConfiguration` (type: `object`):

Optional. Defaults to Apify Residential proxy pinned to Colombia, recommended for reliable access.

## Actor input object example

```json
{
  "keywords": [],
  "maxJobs": 10,
  "startUrls": [],
  "startUrl": "https://www.elempleo.com/co/ofertas-empleo/",
  "onlyRemote": false,
  "withDetails": true,
  "withSummary": false,
  "withExtract": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CO"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [],
    "maxJobs": 10,
    "startUrls": [],
    "startUrl": "https://www.elempleo.com/co/ofertas-empleo/",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "CO"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/elempleo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [],
    "maxJobs": 10,
    "startUrls": [],
    "startUrl": "https://www.elempleo.com/co/ofertas-empleo/",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "CO",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/elempleo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [],
  "maxJobs": 10,
  "startUrls": [],
  "startUrl": "https://www.elempleo.com/co/ofertas-empleo/",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CO"
  }
}' |
apify call scrapers_lat/elempleo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/elempleo-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VQgP2SkLQfe17Dz0H/builds/0kmpFuEG3X2i7tGae/openapi.json
