# Computrabajo & ElEmpleo Jobs Scraper (LATAM) (`radar-scraper/latam-jobs-hiring-signals`) Actor

Scrape Computrabajo (18 Latin American countries) and ElEmpleo (Colombia) by keyword: title, company, salary, work modality, seniority, dates and hiring signals. Every job matches your search; unrelated results are dropped and not charged. Incremental mode for new jobs. $2 per 1,000.

- **URL**: https://apify.com/radar-scraper/latam-jobs-hiring-signals.md
- **Developed by:** [Juan Felipe Henao López](https://apify.com/radar-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Computrabajo & ElEmpleo Jobs Scraper (LATAM)

Extrae ofertas de empleo de **Computrabajo** (18 países de Latinoamérica) y **ElEmpleo** (Colombia) por palabra clave. Cada oferta trae cargo, empresa, ciudad, salario normalizado, modalidad (presencial, híbrida o remota), seniority, tipo de contrato, fechas y **señales de contratación** (cuántas vacantes abre cada empresa en tus resultados).

**Lo que nos diferencia:** cada oferta entregada **corresponde a tu búsqueda según los datos del propio portal**. Las búsquedas de los portales son amplias y, a partir de cierta página, devuelven ofertas sin relación: nosotros las descartamos y **no las cobramos**. **Precio: $2 USD por cada 1.000 ofertas.**

*English version below.*

***

### Lo que devuelve el portal frente a lo que entregamos

Runs reales en la nube (2026-10-20, 500 ofertas pedidas salvo el prefill). "Revisadas" son las ofertas que devolvió la búsqueda del portal; "fieles", las que contienen tu palabra clave en el título, en el cargo según la taxonomía del portal o en la descripción de la oferta.

| Búsqueda | Portal | Revisadas | Fieles | Descartadas | Qué pasó |
|---|---|---|---|---|---|
| "analista de datos", Colombia | ElEmpleo | 440 | 250 | **190 (43%)** | La búsqueda de ElEmpleo mezcla cargos de otras áreas a partir de las primeras páginas. |
| | Computrabajo | 280 | 277 | 3 | En una búsqueda de oficio, casi todo es fiel. |
| "python", Argentina | Computrabajo | 76 | 51 | **25 (33%)** | Las páginas 4 y 5 ya casi no tenían relación: **la regla de corte detuvo la búsqueda** ("relevant results exhausted for this search"). |
| "python", Argentina, **sin** la regla de corte (versión anterior) | Computrabajo | 120 | 43 | 77 (64%) | Las páginas 4 a 6 traían **0 de 60** ofertas relacionadas ("Técnico instalador de internet satelital", "Repositor…"). Eso es lo que entrega y cobra un scraper que copia la búsqueda tal cual. |
| "desarrollador", Colombia (prefill, 30) | ElEmpleo + Computrabajo | 38 | 34 | 4 | — |

En el run de Colombia se entregaron 494 ofertas: 250 de Computrabajo y 244 de ElEmpleo (una vacante publicada en los dos portales se entregó una sola vez).

**Regla de corte:** si 2 páginas seguidas de un portal tienen menos de un 20% de ofertas fieles, dejamos de paginar ese portal y el mensaje del run lo dice. Así no recorres ni pagas resultados que ya no tienen relación con tu búsqueda.

### ¿Para quién es?

- **Ventas B2B y agencias de reclutamiento:** saber qué empresas están contratando, para qué cargos y con qué salario.
- **Analistas de mercado laboral y RR. HH.:** salarios, modalidad y demanda por cargo y país.
- **Quienes buscan empleo** y quieren un feed diario de vacantes nuevas.

### Qué puedes hacer

1. **Un feed diario de vacantes nuevas.** Programa el Actor con `incrementalMode: true` (por ejemplo, "analista de datos" en Colombia) y envía las ofertas nuevas a Google Sheets, Slack, tu CRM o WhatsApp con **n8n**, **Make** o la API de Apify.
2. **Señales de contratación.** Ordena por `companyOpenRolesInRun` para ver qué empresas abren más vacantes de un cargo. En el run de "analista de datos" en Colombia, las que más publicaban eran agencias de empleo y consultoras de TI (entre 6 y 14 vacantes cada una).
3. **Estudios de salario y modalidad.** En ese mismo run, el 69% de las ofertas publicaba salario, el 26% era híbrida y el 6% remota.

### Entrada

| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
| `searchKeyword` | texto | `desarrollador` | Cargo, habilidad o rol (`desarrollador`, `python`, `analista de datos`, `contador`…). Cada oferta entregada contiene la palabra en sus propios datos; el resto se descarta y no se cobra. |
| `country` | lista | `CO` | 18 países. Colombia usa Computrabajo y ElEmpleo; los demás, Computrabajo. |
| `portals` | lista | los 2 | `COMPUTRABAJO`, `ELEMPLEO` (ElEmpleo solo en Colombia). |
| `maxItems` | entero | `30` | Máximo de ofertas que se entregan y cobran (hasta 5.000). |
| `incrementalMode` | booleano | `false` | Solo vacantes nuevas desde el run anterior de la misma búsqueda. |
| `stateKey` | texto | — | Nombre opcional del historial incremental. |
| `resetIncrementalState` | booleano | `false` | Borra el historial y empieza de cero. |
| `proxyConfiguration` | objeto | datacenter | Computrabajo bloquea las IP de datacenter; el Actor cambia solo a un proxy residencial cuando hace falta. |

### Salida

Un registro por oferta. Ejemplo real (run `uPlEvPMCIf0hNIlos`, 2026-10-20; descripción abreviada). Fíjate en las fechas: la empresa **republicó** la oferta el 19 de octubre, pero se publicó por primera vez el 2 de octubre.

```json
{
  "id": "computrabajo-co-B726AE8E538A58EC61373E686DCF3405",
  "portal": "COMPUTRABAJO",
  "title": "Analista Senior de Parametrización",
  "company": { "name": "COMERCIALIZADORA DE SERVICIOS FINANCIEROS S.A.S", "isConfidential": false, "isVerified": true, "ratingAverage": null, "companyUrl": "https://co.computrabajo.com/comercializadoradeserviciosfinancieros" },
  "location": { "city": "Bogotá, D.C.", "stateRegion": "Bogotá, D.C.", "country": "CO" },
  "salary": { "rawSalaryText": "$ 1.771.000,00 (Mensual)", "minSalaryNumeric": 1771000, "maxSalaryNumeric": 1771000, "currency": "COP", "isSalaryDisclosed": true },
  "workModality": "ONSITE",
  "seniorityLevel": "MID_SENIOR",
  "contractType": "FULL_TIME",
  "isUrgentHiring": false,
  "keywordMatchedIn": "DESCRIPTION",
  "tags": [],
  "descriptionSnippet": "¿Quieres hacer parte de la Comercializadora de Servicios Financieros S.A.S.? ¡Esta oportunidad es para ti! Nos encontramos en búsqueda de nuestro próximo Analista Senior de Parametría…",
  "publishedDate": "2026-10-19",
  "publishedDateIsApproximate": true,
  "originalPostedDate": "2026-10-02",
  "validThrough": "2026-12-01",
  "companyOpenRolesInRun": 1,
  "listedOnPortals": ["COMPUTRABAJO"],
  "url": "https://co.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-analista-senior-de-parametrizacion-analitica-de-datos-en-bogota-dc-B726AE8E538A58EC61373E686DCF3405",
  "scrapedAt": "2026-10-20T05:31:56.774Z"
}
```

#### Cómo se calculan los campos

- **`keywordMatchedIn`:** dónde encontramos tu palabra clave en los datos del portal: `TITLE` (título), `POSITION` (cargo según la taxonomía de ElEmpleo) o `DESCRIPTION` (descripción de la oferta). La comparación es por palabras, sin tildes ni mayúsculas, y admite femenino y plural ("desarrollador" encuentra "Desarrolladora"). Es literal: "desarrollador" también encuentra "Desarrollador de canal" (un cargo comercial).
- **Fechas:**
  - `publishedDate` es la fecha que muestra el listado. **Computrabajo la reinicia cuando la empresa republica la oferta**, así que una vacante "de hoy" puede llevar semanas abierta. Si viene de un texto relativo ("Hace 3 horas"), es aproximada: `publishedDateIsApproximate: true`.
  - `originalPostedDate` es la fecha de la **primera publicación**, tomada de la ficha de la oferta. Solo existe cuando abrimos la ficha (ofertas aceptadas por descripción; un 29% en el run de Colombia).
  - `validThrough`: vencimiento según la ficha. **No entregamos ofertas vencidas:** las aceptadas por descripción se verifican una a una en su ficha. En las aceptadas por título lo verificamos por muestreo: 0 vencidas en 32 fichas con fecha de vencimiento de ofertas del listado, incluidas páginas profundas (2026-10-20). Los portales solo listan vacantes activas.
- **Salario:** `rawSalaryText` es solo el texto del salario (no la descripción). `minSalaryNumeric` y `maxSalaryNumeric` salen de ese texto o de los datos estructurados de la ficha. "A convenir" o "confidencial" → `isSalaryDisclosed: false`. Se leen bien los formatos de cada país ("$ 1.771.000,00" en Colombia, "$ 9,577.00" o "$15,000 - $18,000" en México, "S/. 1.130,00" en Perú). El valor es el que publica el anunciante: algunos ponen cifras de relleno, como "$ 11.111,00".
- **Modalidad y contrato:** del dato del portal (ElEmpleo publica ambos) o del título y las etiquetas de la oferta. **Seniority**, solo del título. Si el título no dice nada, `UNSPECIFIED`.
- **`companyOpenRolesInRun`:** cuántas ofertas de la misma empresa hay en tus resultados. `null` para empresas confidenciales.
- **Duplicados entre portales:** la misma vacante (empresa, cargo y ciudad) publicada en Computrabajo y en ElEmpleo se entrega **una vez**, con `listedOnPortals` y `portalUrls`.
- **Duplicados dentro de un portal:** si una empresa republica la misma vacante (mismo cargo, ciudad y **descripción idéntica**), se entrega y se cobra **una sola vez**. En un run de 494 ofertas en Colombia hubo 10 copias así, sobre todo en ElEmpleo. Las vacantes distintas de una misma empresa (otra ciudad, otro cargo u otra descripción) se entregan todas y suman en `companyOpenRolesInRun`.

### Modo incremental

Con `incrementalMode: true`, cada run entrega solo las ofertas que los runs anteriores de la **misma búsqueda** no entregaron. Lo ya recibido **no se entrega ni se cobra**. El historial se guarda en un key-value store con nombre **en tu cuenta de Apify**.

### Privacidad

El Actor no entrega datos de contacto de reclutadores (ni emails ni teléfonos). El título, la descripción y el salario se limpian de emails y teléfonos.

### Precio

**$2 USD por cada 1.000 ofertas** ($0,002 por oferta), más la pequeña tarifa estándar de Apify por cada run. Solo pagas las ofertas entregadas: las que no corresponden a tu búsqueda, las vencidas, los duplicados y, en modo incremental, las ya recibidas **no se cobran**.

| Ejemplo | Costo |
|---|---|
| 100 ofertas | ≈ $0,20 |
| 1.000 ofertas | ≈ $2 |
| Feed diario con ~50 vacantes nuevas | ≈ $0,10 al día |

### Limitaciones (léelas)

- **Duración:** las ofertas que no traen tu palabra en el título se verifican abriendo su ficha. Un run de 500 en Colombia tarda unos 13 minutos.
- **Búsquedas de habilidades** ("python", "excel"): la mayoría de las ofertas se verifican por la descripción, y la regla de corte puede detener la búsqueda antes de `maxItems` porque los resultados relevantes se agotan. Es intencional: no te entregamos relleno.
- **Bloqueos:** Computrabajo bloquea a veces incluso por proxy residencial. El Actor reintenta y, si una página sigue bloqueada, lo deja escrito en el log en vez de fallar en silencio. Si un portal falla del todo, el run sigue con el otro y lo avisa.
- **Descripción:** `descriptionSnippet` solo existe cuando leímos la descripción: siempre en ElEmpleo y, en Computrabajo, en las ofertas aceptadas por descripción. En las de Computrabajo aceptadas por título queda vacía (entre el 31% y el 74% de las de ese portal en nuestras pruebas, según la búsqueda), porque el listado no trae ningún extracto y abrir cada ficha encarecería el run.
- **Nombres de empresa:** se entregan como los publica cada portal ("MANPOWER" y "Manpower Group Colombia" cuentan por separado en `companyOpenRolesInRun`).
- **ElEmpleo** solo cubre Colombia.

### Úsalo desde código, n8n o Make

```bash
curl -X POST "https://api.apify.com/v2/acts/radar-scraper~latam-jobs-hiring-signals/run-sync-get-dataset-items?token=<TU_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"searchKeyword": "analista de datos", "country": "CO", "maxItems": 200, "incrementalMode": true}'
```

### Preguntas frecuentes

**¿Inicia sesión en los portales?** No. Solo lee lo que ve cualquier visitante anónimo.
**¿Por qué recibí menos ofertas que `maxItems`?** Porque los resultados relevantes de esa búsqueda se agotaron (el mensaje del run lo dice) o porque no había más. No te cobramos relleno.
**¿Puedo buscar por ciudad?** Todavía no: la búsqueda es por palabra clave y país. Puedes filtrar `location.city` en el dataset.

### Opiniones y soporte

Si este Actor te ahorra tiempo, una reseña corta en su página de la Store ayuda a que otros lo encuentren; queremos tu opinión honesta, buena o mala. ¿Algo no funciona? Abre un issue en la página del Actor y te respondemos en menos de 48 horas.

### ⚖️ Aviso legal y de datos

Este Actor extrae información pública, visible para cualquier visitante anónimo de los sitios de origen. No inicia sesión, no evade muros de pago y no accede a áreas privadas. No entrega datos de contacto de personas. Eres responsable de que el uso que hagas de los datos cumpla la ley aplicable (incluidas la Ley 1581 de 2012 de Colombia y el GDPR) y los términos de los sitios de origen. Si tienes dudas, consulta con un abogado.

***

### 🇬🇧 English

**Scrape job offers from Computrabajo (18 Latin American countries) and ElEmpleo (Colombia) by keyword:** title, company, city, normalized salary, work modality, seniority, contract type, dates and **hiring signals** (how many openings each company has in your results).

- **Every job matches your search, according to the portal's own data.** The portals' searches are broad; deeper pages return unrelated jobs. We drop them and **do not charge for them**. Real runs: ElEmpleo "analista de datos" — 440 returned, 250 relevant (43% dropped); Computrabajo Argentina "python" — 76 reviewed, 51 relevant, and the cut rule stopped the search when results stopped matching (without it, pages 4–6 had 0 of 60 related jobs).
- **Cut rule:** when 2 pages in a row of a portal have fewer than 20% relevant jobs, that portal stops and the run says "relevant results exhausted for this search".
- **Dates:** `publishedDate` is the listing date (Computrabajo resets it when a job is republished); `originalPostedDate` is the first publication date from the job page, when it was opened. Expired jobs are not delivered: jobs accepted by description are checked one by one on their job page; for jobs accepted by title this was verified by sampling (0 expired in 32 job pages with an expiry date, 2026-10-20).
- **Cross-portal duplicates** are delivered once, and so is the same vacancy republished on one portal (identical description). `descriptionSnippet` is empty for Computrabajo jobs accepted by title (the listing has no excerpt). **Incremental mode** returns only new jobs; already-delivered jobs are not charged.
- **No recruiter contact data** is delivered.
- **Price:** $2 per 1,000 jobs, plus Apify's standard small fee per run start. A 500-job run in Colombia takes about 13 minutes.

**Feedback:** if the Actor saves you time, a short review helps other buyers find it. Something not working? Open an issue and we will answer within 48 hours.

**Legal notice:** this Actor extracts publicly available information visible to any anonymous visitor. It does not log in, bypass paywalls or access private areas, and it delivers no personal contact data. You are responsible for complying with applicable laws (including GDPR and Colombia's Law 1581 of 2012) and the source websites' terms.

# Actor input Schema

## `searchKeyword` (type: `string`):

Job title, skill or role (e.g. 'desarrollador', 'python', 'analista de datos', 'contador'). Every job delivered matches it in the portal's own title, position or description; the rest is dropped and not charged.

## `country` (type: `string`):

Country to search. Colombia uses Computrabajo and ElEmpleo; the other 17 countries use Computrabajo.

## `portals` (type: `array`):

Portals to use. ElEmpleo covers Colombia only.

## `maxItems` (type: `integer`):

Maximum number of jobs to return and charge.

## `incrementalMode` (type: `boolean`):

When enabled, job offers delivered by a previous run of the same search are skipped: not returned and not charged. The history is kept in a named key-value store in your Apify account. The search is identified by Keyword, Country and Portals; changing Max Items or the proxy keeps the history. Two runs of the same search at the same time may re-deliver a few items on the next run.

## `stateKey` (type: `string`):

Optional name for the incremental history (letters, digits and ! - \_ . ' ( ) only). Leave empty to derive it from the search. Set it to keep one history across searches.

## `resetIncrementalState` (type: `boolean`):

Deletes the incremental history of this search before running, so every item is delivered as new.

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

Optional. By default Apify datacenter proxies are used; Computrabajo blocks them, so the Actor switches to a residential proxy automatically.

## Actor input object example

```json
{
  "searchKeyword": "desarrollador",
  "country": "CO",
  "portals": [
    "COMPUTRABAJO",
    "ELEMPLEO"
  ],
  "maxItems": 30,
  "incrementalMode": false,
  "resetIncrementalState": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `outputStats` (type: `string`):

No description

## `runReport` (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 = {
    "searchKeyword": "desarrollador",
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("radar-scraper/latam-jobs-hiring-signals").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 = {
    "searchKeyword": "desarrollador",
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("radar-scraper/latam-jobs-hiring-signals").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 '{
  "searchKeyword": "desarrollador",
  "maxItems": 30
}' |
apify call radar-scraper/latam-jobs-hiring-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,radar-scraper/latam-jobs-hiring-signals"
        }
    }
}
```

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/jFgx3SAEMfEoyEvuj/builds/bT7IF6I9G6OblBOvr/openapi.json
