# Computrabajo Jobs Scraper — Ofertas MX/CO (`noahadler/computrabajo-jobs`) Actor

Scrape Computrabajo ofertas (México, Colombia and other LATAM sites): title, company, city and offer URL. Salary only when Computrabajo publishes it on the card. HTTP + RESIDENTIAL country of the query (MX default).

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

## Pricing

from $2.00 / 1,000 jobs

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 Scraper — Ofertas MX/CO & salary

**Computrabajo scraper** for LATAM job boards (`mx.computrabajo.com`, Colombia, and sibling country sites). Export **ofertas Computrabajo** as one Dataset row per listing: title, company, city, **salary if public**, offer URL, and **ofertas cerradas** status when you check a public offer page.

HTTP-only (no Playwright): search pages are SSR HTML (`/trabajo-de-{keyword}` + `?p=N`). Cards already carry salary when Computrabajo publishes it. Optional `enrichDetails` opens the oferta for JobPosting JSON-LD. **computrabajo api**-style export — not a multi-board dump.

> Computrabajo returns ~20 ofertas per search page. Paginate with `?p=N` until `maxItems`. **Residential proxy country follows the query** (MX default; CO if you hit `computrabajo.com.co`). Enable it on Apify if you hit 403/captcha.

**Why this Actor:** public salary on the card when shown · **ofertas cerradas** via 410/404 on public offer URLs · country-aware proxy · cheap PPE per Job

***

### Table of contents

1. [What this Actor does](#what-this-actor-does)
2. [What you get](#what-you-get)
3. [Features](#features)
4. [Input](#input)
5. [Output example](#output-example)
6. [Output fields](#output-fields)
7. [Quick start (API)](#quick-start-api)
8. [Use cases](#use-cases)
9. [Limitations](#limitations)
10. [FAQ](#faq)
11. [Keywords](#keywords)

***

### What this Actor does

| Step | Action |
|------|--------|
| 1 | Accept `keyword` + `country` + optional `city`, or paste `searchUrls` |
| 2 | Optional `offerUrls` — GET each oferta (open vs **oferta cerrada**) |
| 3 | `GET` Computrabajo search HTML |
| 4 | Parse each card (`title`, `company`, `city`, `salary`, URL) |
| 5 | Paginate `?p=N` until `maxItems` |
| 6 | If `enrichDetails`, merge JobPosting (description, validThrough, extra salary) |

**Input:** keyword, country, city, search URLs, offer URLs, max items, proxy.\
**Output:** one Dataset row per job.

***

### What you get

**Job**

- `title`, `offerId`, `url`, `country`
- `city`, `remote` when the card shows presencial/remoto

**Pay / company**

- `companyName`, `companyUrl` (when the listing is not a blind “importante empresa”)
- `salary` when Computrabajo shows pay on the card (otherwise `null`)

**Ofertas cerradas**

- `closed` + `status=closed` when the public offer page is **410/404** (or a “ya no está disponible” public page)

**Meta**

- `publishedLabel` (`Hace 51 minutos`), `publishedAt` / `validThrough` if enriched
- `keyword`, `cityQuery`, `searchUrl`, `scrapedAt`

***

### Features

| Capability | Detail |
|------------|--------|
| **Query + country** | Same as picking México vs Colombia on Computrabajo |
| **Search URLs** | Paste the ofertas Computrabajo results link from the browser |
| **Ofertas cerradas** | Public offer URL → open or closed (no login) |
| **No browser** | `curl_cffi` impersonate `chrome124` + `browserforge` headers |
| **Proxy-aware** | Apify RESIDENTIAL + **country of the query** (MX default) |
| **PPE-friendly** | One **Job** event per row |

***

### Input

| Field | Required | Description |
|-------|----------|-------------|
| `keyword` | No\* | e.g. `desarrollador`, `vendedor` |
| `country` | No | `MX` (default), `CO`, `AR`, `PE`, `CL`, … |
| `city` | No | e.g. `Ciudad de México`, `Bogotá` |
| `searchUrls` | No\* | Computrabajo search pages |
| `offerUrls` | No | `/ofertas-de-trabajo/oferta-de-trabajo-…` for closed checks |
| `enrichDetails` | No | Open each oferta (slower) |
| `maxItems` | No | Cap (default 40, max 500) |
| `proxyConfiguration` | No | Default RESIDENTIAL + MX on Store Try it |

\*Provide **keyword/city**, **searchUrls**, and/or **offerUrls**.

#### Example — desarrollador México

```json
{
  "keyword": "desarrollador",
  "country": "MX",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "MX"
  }
}
```

#### Example — paste an ofertas Computrabajo URL (Colombia)

```json
{
  "searchUrls": [
    "https://www.computrabajo.com.co/trabajo-de-desarrollador"
  ],
  "maxItems": 40
}
```

#### Example — check ofertas cerradas

```json
{
  "offerUrls": [
    "https://mx.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-desarrollador-net-en-leon-D86414C48ADBFD7F61373E686DCF3405"
  ]
}
```

***

### Output example

```json
{
  "title": "Desarrollador .net",
  "companyName": "Importante empresa del sector alimenticio",
  "city": "León, Guanajuato",
  "salary": "$ 27,000.00 (Mensual)",
  "url": "https://mx.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-desarrollador-net-en-leon-D86414C48ADBFD7F61373E686DCF3405",
  "offerId": "D86414C48ADBFD7F61373E686DCF3405",
  "country": "MX",
  "closed": false,
  "status": "open",
  "keyword": "desarrollador",
  "scrapedAt": "2026-09-25T00:00:00Z",
  "error": false,
  "errorMessage": null
}
```

***

### Output fields

| Field | Notes |
|-------|--------|
| `title`, `companyName` | Role ≠ employer (semantic check) |
| `city` | City label from the card (not a salary string) |
| `salary` | Present when Computrabajo publishes pay on the listing |
| `url` | Absolute Computrabajo `/ofertas-de-trabajo/` URL |
| `closed` / `status` | `open` on search; `closed` on public 410/404 offer pages |
| `error`, `errorMessage` | Hard failure vs empty search |

***

### Quick start (API)

```bash
curl "https://api.apify.com/v2/acts/noahadler~computrabajo-jobs/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "desarrollador",
    "country": "MX",
    "maxItems": 20
  }'
```

Then fetch the default Dataset items URL from the run object.

***

### Use cases

- **Computrabajo scraper** pipelines for aggregators who already pull InfoJobs / HelloWork.
- **Ofertas Computrabajo** salary research (field is filled only when the board publishes it).
- **Ofertas cerradas** monitoring from a list of offer URLs (ABSENCE / closed check).
- **computrabajo api** lead lists: company + offer URL (no email scrape).

***

### Limitations

- Search list is **live ofertas** — Computrabajo does not list expired jobs in `/trabajo-de-…`. Closed status is a **public offer-page** check (410/404).
- `salary` is null when the employer hides pay.
- Does **not** harvest emails, phones, or CVs.
- 403/captcha → use Apify **RESIDENTIAL** + the **country of the query**. After repeated WAF, the run fails honestly (no fake rows).
- Computrabajo LATAM only. Not LinkedIn, not Indeed, not OCC Mundial.

This Actor is a **catalog / learning** jobs SKU (same HTTP pattern as InfoJobs + HelloWork). It is **not** in the same Store publish wave as those two heroes.

***

### FAQ

**Do I need Playwright?**\
No. v0.1 is HTTP + Chrome TLS impersonation against the public search HTML.

**Can I paste the URL from my browser?**\
Yes. `searchUrls` must be Computrabajo search pages (MX, CO, …).

**Which proxy country?**\
The Actor injects `apifyProxyCountry` from `country` or from the search URL host when you leave it empty. México queries → **MX**.

**Why is salary null?**\
Many ofertas hide pay. The field is filled only when the card (or JobPosting if `enrichDetails`) includes it.

**What is an oferta cerrada?**\
A public `/ofertas-de-trabajo/…` page that returns **410/404** or a “ya no está disponible” message. Search results are open jobs.

**What happens on hard failure?**\
One Dataset row with `error: true` and an actionable `errorMessage` (often “enable RESIDENTIAL + MX”).

***

### Keywords

computrabajo scraper, computrabajo api, ofertas computrabajo, computrabajo mexico, computrabajo colombia, computrabajo jobs, salario computrabajo, bolsa de trabajo México

# Actor input Schema

## `keyword` (type: `string`):

What you type in Computrabajo search (e.g. desarrollador, vendedor, enfermera). Builds /trabajo-de-{slug}.

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

Computrabajo site / Apify proxy country. MX default. Also inferred from searchUrls host (mx.computrabajo.com → MX, co.computrabajo.com → CO).

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

Optional city as on Computrabajo (Ciudad de México, Bogotá, Lima…). Builds /trabajo-de-{kw}-en-{city}.

## `searchUrls` (type: `array`):

Paste a Computrabajo search (e.g. https://mx.computrabajo.com/trabajo-de-desarrollador or https://www.computrabajo.com.co/trabajo-de-desarrollador). Other hosts are rejected.

## `offerUrls` (type: `array`):

Public /ofertas-de-trabajo/oferta-de-trabajo-…-{id} pages. Open offers return salary when published; HTTP 410/404 is marked closed.

## `enrichDetails` (type: `boolean`):

If true, GET each oferta for JSON-LD salary/description/validThrough and closed status. Slower. Search cards already include salary when Computrabajo shows it.

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

Maximum job rows (1–500). Computrabajo search returns ~20 ofertas per page.

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

Computrabajo often works over HTTP. If you see 403/captcha, enable RESIDENTIAL. Country is injected from `country` / URL host when empty (MX default).

## Actor input object example

```json
{
  "keyword": "desarrollador",
  "country": "MX",
  "searchUrls": [
    "https://mx.computrabajo.com/trabajo-de-desarrollador"
  ],
  "enrichDetails": false,
  "maxItems": 40,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "MX"
  }
}
```

# Actor output Schema

## `jobs` (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 = {
    "keyword": "desarrollador",
    "city": "",
    "searchUrls": [
        "https://mx.computrabajo.com/trabajo-de-desarrollador"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("noahadler/computrabajo-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 = {
    "keyword": "desarrollador",
    "city": "",
    "searchUrls": ["https://mx.computrabajo.com/trabajo-de-desarrollador"],
}

# Run the Actor and wait for it to finish
run = client.actor("noahadler/computrabajo-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 '{
  "keyword": "desarrollador",
  "city": "",
  "searchUrls": [
    "https://mx.computrabajo.com/trabajo-de-desarrollador"
  ]
}' |
apify call noahadler/computrabajo-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,noahadler/computrabajo-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/GMHUbjfOogxFAPz4s/builds/aeS3QzDpF4Z5QcoVe/openapi.json
