# Computrabajo Jobs Scraper (19 Latin American countries) (`datahamster/computrabajo-latam-jobs`) Actor

Job listings from Computrabajo — the largest job board in Latin America — for Mexico, Colombia, Argentina, Peru, Chile and 14 more countries: keyword and city search, salary, work mode (remote/on-site), company, urgency and featured flags. Monitor mode alerts on new jobs. No login, no proxy.

- **URL**: https://apify.com/datahamster/computrabajo-latam-jobs.md
- **Developed by:** [Viktor Dubnytskiy](https://apify.com/datahamster) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 result items

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Computrabajo Jobs Scraper: empleos, 19 countries (city, alerts)

Computrabajo runs the largest job boards in Latin America. This actor searches any of its 19 country sites — Mexico, Colombia, Argentina, Peru, Chile and 14 more — by keyword and city, and returns one flat row per empleo with the company, salary and posting age. No login, no proxy.

### What you get (example output)

One row per job card. Real values from a run of this actor on the Mexican site:

| Field | Example value |
|---|---|
| `title` | `MERN / Python Full Stack Developer Jr.` |
| `company` / `companyVerified` | `ManpowerGroup` / `true` |
| `salaryText` | `$ 30,000.00 (Mensual)` |
| `salary` / `salaryPeriod` | `30000` / `monthly` |
| `postedText` | `Hace 1 hora` |
| `country` | `mx` |
| `isUrgent` / `isFeatured` | `false` / `false` |
| `companyUrl` | `https://co.computrabajo.com/empresas/ofertas-de-trabajo-de-porcicarnes-3B04126F4D4ECF9B` |
| `url` | `https://co.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-desarrollador-backend-python-en-medellin-24E2A6E04217F0F061373E686DCF3405` |

Also on every row: `jobId`, `location`, `workMode`, `keyword`, `page`, `rank`, `scrapedAt`.

### Use cases

- **LatAm job aggregators**: pull recent empleos for a country and keyword set into one schema, with the salary already parsed into a number and a period.
- **Salary research**: compare published salary ranges by role and country across the 19 Computrabajo sites.
- **Recruiting and market monitoring**: run monitor mode daily to see which employers post new vacancies, and how many are marked urgent or featured.

### How it works

1. Each keyword is turned into a search URL on the chosen country's Computrabajo site (`city` narrows it), then paginated, 20 job cards per page, up to `maxPages`.
2. Every card is parsed into a flat row; `salaryText` is also parsed into a numeric `salary` and a `salaryPeriod` where Computrabajo publishes one.
3. Results from several keywords are merged and deduplicated on the Computrabajo offer id, so overlapping searches are not charged twice.
4. In `monitor` mode the run compares against the previous run of the same task and returns only new or changed listings, optionally posting a summary to a webhook or Telegram chat.

### Input

| Field | Meaning | Default |
|---|---|---|
| `country` | Country site: `mx`, `co`, `ar`, `pe`, `cl`, `ec`, `ve`, `cr`, `gt`, `sv`, `hn`, `ni`, `pa`, `do`, `uy`, `py`, `bo`, `pr`, `cu` | `mx` |
| `keywords` | Job title keywords, normally in Spanish; each paginated separately | `["python"]` |
| `city` | City filter as spelled on Computrabajo (`Ciudad de México`, `Bogotá`, `Lima`) | empty |
| `maxPages` | Result pages per keyword (20 job cards per page) | `3` |
| `maxItems` | Stop after this many listings | `20` |
| `mode` | `scrape` or `monitor` (only new/changed since the previous run) | `scrape` |
| `monitorKey` | State key for monitor mode outside a saved task | empty |
| `webhookUrl` | HTTPS endpoint for the monitor-mode change summary | empty |
| `telegramBotToken` / `telegramChatId` | Send the monitor-mode summary to Telegram | empty |

### Pricing

| Event | Price |
|---|---|
| result | $0.0005 per job ($0.50 per 1,000) |
| monitor-check | $0.005 per monitor run |
| change | $0.0005 per new/changed job |

Charged only for jobs actually pushed. No proxy needed.

### Why this actor

- All 19 Computrabajo country sites behind one input; switch market by changing two letters.
- Salary arrives both as the original text and as a parsed number with its period, so you can aggregate without regexes.
- No login and no proxy, which keeps runs cheap.
- Several keywords per run, deduplicated on the offer id.
- You pay per pushed row; an empty run costs nothing beyond platform usage, and `RUN_SUMMARY` says why (`no_matches`, `blocked`, `rate_limited`, `invalid_input`, `upstream_error`).
- Monitor mode with webhook and Telegram alerts for new vacancies.

### Limits

- Listing cards only: the full description and the application form are not opened (`url` leads to the offer).
- **Some postings are published without a company name.** Computrabajo allows confidential vacancies, so `company` and `companyUrl` come back empty on a minority of rows — in a recent 20-row run, 3 rows. This is the source's behaviour, not a parsing failure.
- Salary is empty wherever the employer did not publish one.
- `workMode` is filled only for cards that carry the remote/hybrid badge.
- `postedText` is the site's relative text ("Hace 17 horas"), not an absolute timestamp.
- `location` is taken from the card's secondary line and on current Computrabajo layouts often contains the employer's star rating rather than the city; use the `city` input to constrain geography, and the offer `url`, which carries the city slug. A fix is on the backlog — reports on the Issues tab are welcome.

### FAQ

**Which countries does the Computrabajo scraper cover?**
Nineteen: Mexico, Colombia, Argentina, Peru, Chile, Ecuador, Venezuela, Costa Rica, Guatemala, El Salvador, Honduras, Nicaragua, Panama, Dominican Republic, Uruguay, Paraguay, Bolivia, Puerto Rico and Cuba. One country per run, selected with `country`.

**Why do some rows have no company name?**
Because the employer posted the vacancy confidentially. Computrabajo shows those offers without an employer, and the row keeps everything else (title, salary, city, posting age).

**Can I get an alert for new empleos every morning?**
Yes: save the actor as a task with `mode: monitor`, schedule it daily, and set `webhookUrl` or the two Telegram fields. Each run returns only the listings added since the previous run.

### Changelog

- 0.1: initial release.

***

If this actor is useful, a review on its Apify Store page helps other people find it. For bugs or missing fields, open a ticket on the **Issues** tab of this actor.

# Actor input Schema

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

Which Computrabajo country site to search, as a two-letter code: mx (Mexico), co (Colombia), ar (Argentina), pe (Peru), cl (Chile), ec, ve, cr, gt, sv, hn, ni, pa, do, uy, py, bo, pr, cu. One country per run. Example: "mx".

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

Job title or skill keywords, normally in Spanish; each keyword is searched and paginated separately and results are merged and deduplicated. Leave empty for the most recent jobs of the country site. Example: \["python"] or \["contador", "ventas"].

## `city` (type: `string`):

Filter by city, spelled as Computrabajo spells it in Spanish (accents are handled). One city per run. Example: "Ciudad de Mexico", "Bogota", "Lima".

## `maxPages` (type: `integer`):

How many result pages to request per keyword, 1 to 100. One page is 20 job cards, so maxPages 3 covers up to 60 jobs per keyword. Example: 1.

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

Stop after this many job listings in total. Integer, example: 20. You are charged only for listings actually pushed to the dataset.

## `mode` (type: `string`):

"scrape" returns every matching listing. "monitor" returns only listings that are new or changed since the previous run of the same task and adds changeType, changedFields and previous. Example: "scrape".

## `monitorKey` (type: `string`):

Optional name for the monitor-mode state when the actor is not started from a saved task; runs sharing this key compare against each other. Example: "empleos-mx-python".

## `webhookUrl` (type: `string`):

Optional HTTPS endpoint that receives a POST with a JSON summary of new and changed listings at the end of a monitor-mode run. Example: "https://hooks.example.com/computrabajo".

## `telegramBotToken` (type: `string`):

Optional Telegram bot token (from @BotFather) used to send the monitor-mode change summary. Format: "123456789:AA...".

## `telegramChatId` (type: `string`):

Optional Telegram chat id that receives the monitor-mode summary; use a negative id for a group. Example: "-1001234567890".

## Actor input object example

```json
{
  "country": "mx",
  "keywords": [
    "python"
  ],
  "maxPages": 1,
  "maxItems": 20,
  "mode": "scrape"
}
```

# Actor output Schema

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

All pushed rows (dataset, JSON)

## `resultsTable` (type: `string`):

Dataset in the Console viewer

## `runSummary` (type: `string`):

RUN\_SUMMARY record (pushed, skipped, emptyReason)

# 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 = {
    "country": "mx",
    "keywords": [
        "python"
    ],
    "maxPages": 1,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("datahamster/computrabajo-latam-jobs").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 = {
    "country": "mx",
    "keywords": ["python"],
    "maxPages": 1,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("datahamster/computrabajo-latam-jobs").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 '{
  "country": "mx",
  "keywords": [
    "python"
  ],
  "maxPages": 1,
  "maxItems": 20
}' |
apify call datahamster/computrabajo-latam-jobs --silent --output-dataset

```

## MCP server setup

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

```

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/mZlEQRYUuiu6FmKhO/builds/BUCw57HWZNtFTDlNa/openapi.json
