# Computrabajo Job Scraper — 19 LATAM Countries + Change Feed (`corvuslab/computrabajo`) Actor

Scrape Computrabajo job offers across 19 Latin American countries by keyword, location and filters. Get structured salary min/max/currency, company, contract and contacts, plus an incremental NEW/UPDATED/EXPIRED change feed and instant alerts.

- **URL**: https://apify.com/corvuslab/computrabajo.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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.

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 Job Scraper — 19 LATAM Countries + Change Feed

### What does the Computrabajo Job Scraper do?

> **Track every Computrabajo job across Latin America and pay only for what changes — new, updated or expired.**

Scrape job offers from **Computrabajo** across **19 Latin American countries** — México, Colombia, Perú, Argentina, Chile and more — by keyword, location and on-site filters, or by pasting search and offer URLs. Every record comes back clean and typed: **title, company, structured salary (min / max / currency / period), contract type, experience, education, location and the full description** in text, HTML and Markdown. Turn on **incremental monitoring** and each scheduled run emits only the offers that are **NEW, UPDATED or EXPIRED** — unchanged offers are skipped before their page is even fetched, so a daily watch costs almost nothing. No code needed; export to JSON, CSV, Excel or API, or wire it into your AI agent.

**Why this scraper**

- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (NEW / UPDATED / EXPIRED); recurring runs cost a fraction of a full pull.
- ⚡ **Fast & low-cost** — runs out of the box with no proxy at typical volumes, so large pulls stay cheap.
- 🧾 **Rich, typed records** — ~40 structured fields per offer, including salary min/max/currency/period, not raw HTML.
- 📇 **Lead-gen built in** — emails, phones, URLs and social profiles pulled from each offer, with a `requireContact` gate.
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI- & API-ready** — compact + drop-empty output modes keep payloads small for LLMs and MCP.

***

### ✨ Key features

- ♻️ **Incremental monitoring** — schedule it and get only what changed. Each run tags every offer with a `changeType` (NEW / UPDATED / UNCHANGED / EXPIRED) and **suppresses unchanged offers before their detail page is fetched**, so a daily or hourly watch bills almost nothing.
- 🌎 **19 country markets** — search any Computrabajo country site: México, Colombia, Perú, Argentina, Chile, Ecuador, Venezuela, Costa Rica, Guatemala, El Salvador, Uruguay, Paraguay, Panamá, Honduras, Nicaragua, República Dominicana, Bolivia, Cuba and Puerto Rico.
- 🔎 **Search or URL scraping** — run a keyword + location search, or paste Computrabajo search and offer URLs directly.
- 🎚️ **Rich on-site filters** — date posted, contract type, experience level, minimum salary bracket and sort order, all applied by Computrabajo itself.
- 💰 **Structured salary** — parsed `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` alongside the raw salary text, so you can sort and compare pay without regex.
- 📇 **Lead-gen contact extraction** — emails, phones, URLs and social profiles auto-pulled from every offer, plus a `requireContact` gate that keeps only reachable offers and trims what you're billed for.
- 🔁 **Repost detection** — offers re-listed across runs are flagged with `isRepost` and `repostOfId`, so you don't count the same job twice.
- 🔔 **Notifications** — push matched offers to Telegram, Slack, Discord or any HTTPS webhook (n8n / Make / Zapier).
- 🤖 **AI-ready output** — compact mode returns core fields only and `excludeEmptyFields` drops nulls, keeping payloads lean for LLM and MCP clients.

***

### 📤 Example output

```json
{
  "id": "A46AF8066FA3F4B561373E686DCF3405",
  "title": "Desarrollador Web",
  "url": "https://mx.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-desarrollador-web-en-cuauhtemoc-A46AF8066FA3F4B561373E686DCF3405",
  "company": "Importante empresa del sector",
  "isVerifiedAdvertiser": false,
  "location": "Cuauhtémoc, Ciudad de México DF",
  "country": "México",
  "countryCode": "mx",
  "salaryText": "$ 35,000.00 (Mensual)",
  "salaryMin": 35000.0,
  "salaryMax": 35000.0,
  "salaryPeriod": "month",
  "contractType": "Contrato por tiempo indeterminado",
  "workingHours": "Tiempo Completo",
  "minEducation": "Educación superior - Licenciatura",
  "minExperience": "2 años de experiencia",
  "postedText": "Hace 4 horas",
  "description": "Importante empresa líder en su sector busca incorporar a su equipo un/a Desarrollador/a Web… (full text, HTML and Markdown available)",
  "source": "computrabajo.com",
  "searchKeyword": "desarrollador",
  "scrapedAt": "2026-08-17T19:00:52.420062+00:00",
  "detailFetched": true,
  "contentHash": "dc50985fcbff27292ab0772f747ce4b159f45083"
}
```

Descriptions are available as plain **text**, **HTML** and **Markdown** — pick one or all three.

***

### 📚 What data can you extract from Computrabajo?

- **Core** — `id`, `title`, `url`, `company`, `location`, `country`, `countryCode`, `postedText`, `postedDate`, `validThrough`, `directApply`, `searchKeyword`, `scrapedAt`.
- **Salary** — `salaryText` plus structured `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`.
- **Job details** (with **Fetch full details**) — `description`, `descriptionHtml`, `descriptionMarkdown`, `contractType`, `employmentType`, `workingHours`, `workArrangement`, `minEducation`, `minExperience`.
- **Company** — `companyUrl`, `companyRating`, `companyIndustry`, `companyLogo`, `isVerifiedAdvertiser`.
- **Contacts & lead-gen** — `extractedEmails`, `extractedPhones`, `extractedUrls`, `socialProfiles`.
- **Monitoring & dedup** — `changeType` (NEW / UPDATED / UNCHANGED / EXPIRED), `contentHash`, `isRepost`, `repostOfId`, `repostDetectedAt`, `detailFetched`.

Every field is present in standard mode (missing values are `null`); **compact mode** returns the core fields only, for lean AI/MCP payloads.

***

### ⚙️ Input

Configure it in the visual editor — no code needed — or pass JSON via the API.

| Field | What it does |
|---|---|
| `query` | Keyword search, e.g. `desarrollador` (comma-separate for multiple searches). |
| `country` | Which of the 19 Computrabajo country sites to search (default `mx`). |
| `location` | City, state or region to narrow the search within the country. |
| `startUrls` | Scrape specific Computrabajo search or offer URLs directly. |
| `datePosted` · `contractType` · `experienceLevel` · `minSalary` · `sortBy` | On-site filters applied by Computrabajo. |
| `requireContact` | Keep only offers with an email / phone (lead-gen gate). |
| `includeDetails` | Fetch each offer's page for the richer fields. |
| `incrementalMode` | Emit only what changed since the last run. |
| `maxResults` | Cap the number of records (0 = unlimited). |

…and **31 inputs** in total — the table shows the essentials; the rest cover notification channels (Telegram / Slack / Discord / webhook), output & AI modes (`compact`, `descriptionFormat`, `excludeEmptyFields`), incremental tuning (`stateKey`, `emitUnchanged`, `emitExpired`) and advanced settings, all in the visual editor.

***

### 📥 Example input

A few ready-to-run configurations — set these in the visual editor or pass them as JSON via the API:

Basic keyword search in México:

```json
{ "query": "desarrollador", "country": "mx", "maxResults": 100 }
```

Filtered lead-gen search in Colombia (recent, permanent, with a contact):

```json
{
  "query": "contador",
  "country": "co",
  "location": "Bogotá",
  "datePosted": "7d",
  "contractType": "permanent",
  "sortBy": "recent",
  "includeDetails": true,
  "requireContact": "either"
}
```

Scheduled incremental monitoring with a Telegram alert:

```json
{
  "query": "enfermería",
  "country": "pe",
  "incrementalMode": true,
  "emitExpired": true,
  "telegramToken": "123456:ABC-your-bot-token",
  "telegramChatId": "@your_channel"
}
```

***

### 💡 What can you do with Computrabajo data?

- **Lead generation** — pull reachable recruiter emails, phones and social profiles from live offers and gate on `requireContact`.
- **Recruitment & sourcing** — track new openings by role, city and country the moment they post.
- **Market & salary research** — compare structured salary bands, contract types and demand across 19 LATAM markets.
- **Vacancy monitoring** — schedule it with incremental mode + notifications for a live change feed of NEW / UPDATED / EXPIRED offers.
- **Enrichment & aggregation** — feed clean, typed job data into your own app, sheet, ATS or warehouse.
- **AI agents & pipelines** — compact output plugs straight into LLM / MCP workflows.

***

### ♻️ Incremental monitoring — pay for changes, not repeats

Schedule the actor and turn on **incremental mode**: each run compares against the last and emits only **NEW / UPDATED / EXPIRED** records — unchanged offers are skipped *before* their detail page is fetched, so a daily watch costs a fraction of a full re-scrape.

| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | **95 %** |
| 15 % | 1,000 | 150 | **85 %** |
| 30 % | 1,000 | 300 | **70 %** |

The first run seeds the baseline and bills in full; every run after that bills only the delta. Reposted offers are flagged with `isRepost` / `repostOfId` so a re-listed job doesn't read as new.

***

### 🚀 How to scrape Computrabajo

1. Open the actor, pick a **country** and enter a **search keyword** (e.g. `desarrollador`) and/or a **location** — or paste a Computrabajo URL.
2. (Optional) Add **filters** (date posted, contract type, experience, salary bracket, sort).
3. Set **Max results** and choose whether to **Fetch full details**.
4. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
5. Click **Start**, then download the data as **JSON, CSV or Excel**, or pull it from the **API**.

New to Apify? Create a free account — it comes with monthly credit, no credit card required.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, sends alerts to **Telegram, Slack, Discord or any webhook**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### ❓ FAQ

**Which countries are supported?** All 19 Computrabajo markets: México, Colombia, Perú, Argentina, Chile, Ecuador, Venezuela, Costa Rica, Guatemala, El Salvador, Uruguay, Paraguay, Panamá, Honduras, Nicaragua, República Dominicana, Bolivia, Cuba and Puerto Rico.

**Do I need a proxy or login?** No — it runs out of the box; Apify Proxy is available under Advanced for high-volume runs.

**Can I get only new offers on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed (NEW / UPDATED / EXPIRED) and can notify your channel.

**Can I get recruiter contact details?** Where an offer includes them, emails, phones, URLs and social profiles are extracted automatically; set `requireContact` to keep only reachable offers.

**What formats can I export?** JSON, CSV, Excel, HTML table, or via the API.

**Is it good for AI agents?** Yes — enable compact mode and `excludeEmptyFields`; the output is MCP-friendly.

**How many records can I get?** As many as the search returns — set `maxResults` (0 = unlimited).

**Is scraping Computrabajo legal?** The actor collects only **publicly available** data. You are responsible for how you use it, including any personal data and GDPR-style obligations.

***

### ⚖️ Is it legal to scrape Computrabajo?

This actor accesses only publicly available data on Computrabajo. You are responsible for how you use the extracted data — in particular any personal information — and for complying with the site's terms and applicable law (including the GDPR where it applies). Not affiliated with, endorsed by, or sponsored by Computrabajo.

***

**Keywords:** Computrabajo scraper · Computrabajo job scraper · Computrabajo api · computrabajo.com scraper · Computrabajo México · Computrabajo Colombia · LATAM jobs scraper · Latin America job scraper · job listings scraper · recruitment data · salary data scraper · job lead generation · vacancy monitoring · job change feed · export jobs to CSV Excel JSON · no-code job scraper · MCP tool for AI agents

# Actor input Schema

## `query` (type: `string`):

Keywords to search for (e.g. "desarrollador", "contador"). Separate multiple searches with commas — each runs as its own search and the results are merged and de-duplicated.

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

Which Computrabajo country site to search. Each country is a separate subdomain with its own listings.

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

Optional. City, state or region to narrow the search within the country (e.g. "Guadalajara", "Bogotá"). Leave empty to search the whole country.

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

Paste Computrabajo search or listing URLs to scrape directly. Individual offer (detail-page) URLs work here too.

## `maxResults` (type: `integer`):

Maximum number of records to return per run. Set 0 for unlimited (bounded by how many the search has).

## `ignoreUrlFailures` (type: `boolean`):

Skip start URLs that cannot be interpreted instead of failing the whole run.

## `datePosted` (type: `string`):

Only offers published within this window.

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

Only offers with this contract type.

## `experienceLevel` (type: `string`):

Only offers asking for this experience level.

## `minSalary` (type: `string`):

Only offers at or above this salary bracket. Brackets are ascending bands in each country's local currency (1 = lowest floor, 10 = highest).

## `sortBy` (type: `string`):

Order the search results.

## `requireContact` (type: `string`):

Keep only records that include a contact. off = keep everything; email / phone = require that channel; either = at least one; both = email and phone. Screened at emit time, so it also trims what you're billed for. (Requires "Fetch full details".)

## `includeDetails` (type: `boolean`):

Fetch each offer's detail page for the richer fields (full description, structured salary, contract type, education, experience, company industry, contacts). Turn off for the fastest, cheapest runs.

## `descriptionFormat` (type: `string`):

Which representation(s) of the offer description to include.

## `descriptionMaxLength` (type: `integer`):

Optional. Truncate each description to at most this many characters. Leave empty for the full text.

## `compact` (type: `boolean`):

Emit only the core fields (id, title, url, company, location, salary, dates). Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-array fields from each record.

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

Track state between runs and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED). Unchanged offers are suppressed before their detail page is fetched, so recurring runs cost almost nothing.

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

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit records that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit records for offers present last run but gone now (changeType = EXPIRED).

## `telegramToken` (type: `string`):

Bot token from @BotFather.

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

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

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

Any HTTPS endpoint. Receives a JSON POST with the matched records — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many records to include in each notification message.

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

Optional. Computrabajo runs fine with no proxy (the default), which is the cheapest and fastest. Enable Apify Proxy only if you hit rate limits at high volume.

## `detailConcurrency` (type: `integer`):

How many offer detail pages to fetch in parallel.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "query": "desarrollador",
  "country": "mx",
  "maxResults": 25,
  "ignoreUrlFailures": true,
  "datePosted": "",
  "contractType": "",
  "experienceLevel": "",
  "minSalary": "",
  "sortBy": "relevance",
  "requireContact": "off",
  "includeDetails": true,
  "descriptionFormat": "all",
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "detailConcurrency": 6,
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (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 = {
    "query": "desarrollador"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/computrabajo").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 = { "query": "desarrollador" }

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/computrabajo").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 '{
  "query": "desarrollador"
}' |
apify call corvuslab/computrabajo --silent --output-dataset

```

## MCP server setup

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

```

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/VBUnDTqgh2ulwKh2u/builds/CERJfKr6XVPIcw8j9/openapi.json
