# Computrabajo Job Listings Scraper (`crawlerbros/computrabajo-scraper`) Actor

Scrape live job postings from Computrabajo, Latin America's largest job board. Search by keyword, browse by category, or fetch full job details by URL across 19 countries - titles, salaries, companies, locations, requirements, and skills.

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

## Pricing

from $3.00 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Scraper

Scrape live job postings from **Computrabajo**, Latin America's largest job board, covering 19 countries. Search by keyword, browse by fixed job category, list every open role from one employer, or fetch full posting details (description, salary, requirements, skills) for specific job URLs. No login, no API key, no cookies required.

### What this actor does

- **Five modes:** `search` (keyword search), `byCategory` (browse a fixed taxonomy without a keyword), `byCity` (browse every open posting in one city, any category/keyword), `byCompany` (all active postings from one employer's company page), `jobDetails` (fetch full details for specific job URLs)
- **19 countries:** Argentina, Bolivia, Chile, Colombia, Costa Rica, Cuba, República Dominicana, Ecuador, El Salvador, Guatemala, Honduras, México, Nicaragua, Panamá, Paraguay, Perú, Puerto Rico, Uruguay, Venezuela
- **Filters:** city/region, workplace type (remote/hybrid), date posted, sort order, experience required, minimum salary tier, disability-inclusive postings, contract type / work schedule text match
- **Full detail enrichment (optional):** visits each job posting page for description, salary, contract type, work schedule, education level, experience required, languages, skills, and keywords
- **Empty fields are omitted** — every returned field has a real, non-null value

### Output per job

- `offerId` — Computrabajo internal offer ID
- `title` — job title
- `companyName`, `companyUrl`, `companyLogoUrl`
- `city`, `region`, `country`, `countryCode`
- `workplaceType` — `remote` / `hybrid` (omitted when on-site / not indicated)
- `description` — full job description text
- `industry`
- `employmentType` — e.g. `FULL_TIME`
- `contractType` — e.g. "Contrato a término indefinido"
- `workSchedule` — e.g. "Tiempo Completo"
- `educationLevel`, `experienceRequired`, `ageRequired` — e.g. "entre 30 y 48 años" (omitted when the posting has no age requirement / "Indiferente")
- `drivingLicense[]` — required driving-license categories, e.g. `["A1", "A2"]` (omitted when the posting has no license requirement)
- `travelRequired` — "Si" / "No" willingness-to-travel requirement (omitted when the posting has no travel-availability bullet)
- `languages[]`, `knowledge[]`, `keywords[]`
- `skills[]` — additional named skill tags beyond `knowledge` (omitted when the posting's skill tags are already fully covered by `knowledge`, which is the common case)
- `offerTags[]` — any other posting badges/chips Computrabajo shows that don't map to a dedicated field (e.g. "Turno Nocturno", vacancy-count badges); omitted when the posting has none beyond contract type/schedule/workplace/salary, which are already captured in their own fields
- `salaryAmount`, `salaryCurrency`, `salaryPeriod` — only present when the employer discloses a real salary (Computrabajo shows "A convenir" for undisclosed pay, which is never emitted as a fake `0`)
- `datePosted`, `validThrough` — ISO dates
- `postedRelative` — e.g. "Hace 3 días"
- `sourceUrl` — canonical job posting URL
- `recordType: "jobListing"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `byCity` / `byCompany` / `jobDetails` |
| `country` | string | `co` | Two-letter country code (mode=search/byCategory/byCity) |
| `searchQuery` | string | `vendedor` | Keyword, job title, or skill (mode=search) |
| `category` | string | `informatica-y-telecom` | Fixed job category slug (mode=byCategory) |
| `jobUrls` | array | – | Full job posting URLs (mode=jobDetails) |
| `companyUrl` | string | – | Full Computrabajo company page URL (mode=byCompany), e.g. the `companyUrl` field from a search/byCategory result. Both URL shapes Computrabajo uses are supported. |
| `city` | string | – | City / department name, e.g. `bogota-dc`, `lima`. **Required for mode=byCity** (browses every posting in that city); optional narrowing filter for mode=search/byCategory |
| `workplaceType` | string | `any` | `any` / `remote` / `hybrid` — enforced at the source URL in `search` mode; strictly excludes untagged records in `byCategory`/`byCity`/`byCompany` modes |
| `datePosted` | string | `any` | `any` / `urgent` / `today` / `3days` / `week` / `15days` / `month` |
| `sortBy` | string | `relevance` | `relevance` / `date` / `salary` |
| `experienceLevel` | string | `any` | Required experience: `any` / `noExperience` / `1year` / `2years` / `3to4years` / `5to10years` / `10plusYears` (mode=search/byCategory/byCity) |
| `minSalaryTier` | integer | `0` | Minimum disclosed-salary tier, `0`–`17` (mode=search/byCategory/byCity). Tiers are relative to each country's local currency — 0 disables the filter |
| `disabilityInclusive` | boolean | `false` | Only return postings explicitly tagged as open to candidates with disabilities (mode=search/byCategory/byCity) |
| `contractTypeContains` | string | – | Free-text, case/accent-insensitive substring filter on the `contractType` output field, e.g. `indefinido`, `temporal` (requires `fetchFullDetails=true`) |
| `workScheduleContains` | string | – | Free-text, case/accent-insensitive substring filter on the `workSchedule` output field, e.g. `tiempo completo`, `medio tiempo`, `tiempo parcial` (requires `fetchFullDetails=true`) |
| `fetchFullDetails` | boolean | `true` | Visit each job page for full description/salary/skills |
| `maxItems` | integer | `20` | Hard cap on returned records (1–500) |

#### Example: search remote data jobs in Colombia posted this week

```json
{
  "mode": "search",
  "country": "co",
  "searchQuery": "data scientist",
  "workplaceType": "remote",
  "datePosted": "week",
  "maxItems": 30
}
```

#### Example: browse the IT category in Mexico, sorted by salary

```json
{
  "mode": "byCategory",
  "country": "mx",
  "category": "informatica-y-telecom",
  "sortBy": "salary",
  "maxItems": 50
}
```

#### Example: every job in a city, any category

```json
{
  "mode": "byCity",
  "country": "co",
  "city": "medellin",
  "datePosted": "week",
  "maxItems": 30
}
```

#### Example: list all open roles at one company

```json
{
  "mode": "byCompany",
  "companyUrl": "https://co.computrabajo.com/empresas/ofertas-de-trabajo-de-as-talento-sas-06CFD3F8EEA8A8FD",
  "maxItems": 50
}
```

#### Example: fetch full details for specific job URLs

```json
{
  "mode": "jobDetails",
  "jobUrls": [
    "https://co.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-cientifico-de-datos-python-y-r-python-y-r-en-bogota-dc-A07C908FD7DDE2D261373E686DCF3405"
  ]
}
```

### Use cases

- **Job market research** — track salary ranges, in-demand skills, and hiring volume by category or city across Latin America
- **Recruiting & sourcing** — pull fresh openings matching a role or skill set
- **Competitive intelligence** — monitor which companies are hiring and for what roles
- **Labor market dashboards** — feed structured job data into BI tools

### FAQs

**Does this actor require login, cookies, or an API key?**
No. It scrapes publicly available job listing pages.

**Which countries are supported?**
All 19 countries Computrabajo operates in — pick the country via the `country` input field.

**Why do some jobs have no salary field?**
Most employers on Computrabajo list salary as "A convenir" (negotiable/undisclosed). The actor only includes `salaryAmount` when a real number is published — it never fabricates a placeholder value.

**How many jobs can I scrape per run?**
Up to 500 per run via `maxItems`. For larger volumes, run the actor multiple times with different search queries, categories, or cities.

**What does `fetchFullDetails` control?**
When `true` (default), the actor visits each job's individual page to extract the full description, salary, requirements, and skills — more complete data, more requests. Set to `false` for a faster run that returns only listing-page fields (title, company, city, workplace type).

**How do I get all jobs from a specific employer?**
Run once with `mode=search` or `mode=byCategory`, copy the `companyUrl` field from a result posted by the employer you want, then run again with `mode=byCompany` and that `companyUrl` — this returns every currently active posting from that company.

**Why are `contractTypeContains`/`workScheduleContains` text filters instead of dropdowns?**
Computrabajo's exact contract-type and work-schedule wording differs by country (e.g. Colombia's "Contrato a término indefinido" vs. Mexico's "Contrato por tiempo indeterminado" describe the same concept). A case/accent-insensitive substring match works across every country's phrasing without needing a 19-country enum. Both require `fetchFullDetails=true`, since that's where these fields are parsed from.

**How does `minSalaryTier` work if I don't know local currency amounts?**
Computrabajo groups disclosed salaries into 17 tiers per country, each scaled to that country's local currency (e.g. tier 1 is the lowest published threshold in Colombian pesos on `co.computrabajo.com`, and the lowest threshold in Mexican pesos on `mx.computrabajo.com`). You don't need to know the exact amount — just pick a relative tier (1 = lowest, 17 = highest) to filter for better-paying postings within whichever country you're searching.

# Actor input Schema

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

What to fetch. `search` = keyword search, `byCategory` = browse a fixed job category with no keyword, `byCity` = browse every open posting (any category/keyword) in one city, `jobDetails` = fetch full details for specific job posting URLs, `byCompany` = list all active postings from one employer's Computrabajo company page.

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

Computrabajo country site to search (mode=search, byCategory, or byCity).

## `searchQuery` (type: `string`):

Keyword, job title, or skill to search for (mode=search). Example: `vendedor`, `contador`, `python`.

## `category` (type: `string`):

Job category to browse (mode=byCategory).

## `jobUrls` (type: `array`):

Full Computrabajo job posting URLs to fetch (mode=jobDetails). Example: `https://co.computrabajo.com/ofertas-de-trabajo/oferta-de-trabajo-de-...`.

## `companyUrl` (type: `string`):

Full Computrabajo company page URL to list all of that employer's active postings (mode=byCompany) — copy this from the `companyUrl` field of a search/byCategory result. Accepts both URL shapes Computrabajo uses: `https://co.computrabajo.com/empresas/ofertas-de-trabajo-de-as-talento-sas-06CFD3F8EEA8A8FD` and the shorter `https://co.computrabajo.com/some-employer`.

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

City or department/state name (e.g. `bogota-dc`, `guadalajara`, `lima`). Required for mode=byCity (browses every posting in that city). Optional for mode=search/byCategory, where it narrows results to that city instead. Leave empty for all locations in the selected country.

## `workplaceType` (type: `string`):

Filter by remote / hybrid / any workplace arrangement. Enforced at the source URL in `search` mode; in `byCategory`/`byCity`/`byCompany` modes it strictly keeps only records Computrabajo explicitly tags as remote/hybrid (untagged on-site jobs are excluded).

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

Only show jobs posted within this window.

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

Result ordering.

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

Filter by the years of experience the posting requires (mode=search, byCategory, or byCity).

## `minSalaryTier` (type: `integer`):

Filter to jobs with a disclosed salary at or above this tier (mode=search, byCategory, or byCity). Computrabajo defines 17 salary tiers per country, scaled to that country's local currency (tier 1 is the lowest threshold, 17 the highest) — the same relative tier means a different absolute amount in each country. 0 = no filter.

## `disabilityInclusive` (type: `boolean`):

Only return postings Computrabajo explicitly tags as open to candidates with disabilities (mode=search, byCategory, or byCity).

## `contractTypeContains` (type: `string`):

Optional free-text filter on the `contractType` field (case/accent-insensitive substring match), e.g. `indefinido`, `temporal`, `prestación de servicios`. Contract-type wording varies by country, so this is a text match rather than a fixed dropdown. Only affects records where `contractType` was populated (requires `fetchFullDetails=true`) — leave empty for no filter.

## `workScheduleContains` (type: `string`):

Optional free-text filter on the `workSchedule` field (case/accent-insensitive substring match), e.g. `tiempo completo`, `medio tiempo`, `tiempo parcial`, `por horas`. Only affects records where `workSchedule` was populated (requires `fetchFullDetails=true`) — leave empty for no filter.

## `fetchFullDetails` (type: `boolean`):

For each search/category result, also visit the job posting page for full description, salary, requirements, and skills (slower, more requests). If off, only listing-page fields are returned.

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

Hard cap on the number of job records returned.

## Actor input object example

```json
{
  "mode": "search",
  "country": "co",
  "searchQuery": "vendedor",
  "category": "informatica-y-telecom",
  "jobUrls": [],
  "workplaceType": "any",
  "datePosted": "any",
  "sortBy": "relevance",
  "experienceLevel": "any",
  "minSalaryTier": 0,
  "disabilityInclusive": false,
  "fetchFullDetails": true,
  "maxItems": 20
}
```

# Actor output Schema

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

Dataset containing all scraped Computrabajo job postings.

# 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 = {
    "mode": "search",
    "country": "co",
    "searchQuery": "vendedor",
    "category": "informatica-y-telecom",
    "jobUrls": [],
    "workplaceType": "any",
    "datePosted": "any",
    "sortBy": "relevance",
    "experienceLevel": "any",
    "minSalaryTier": 0,
    "disabilityInclusive": false,
    "fetchFullDetails": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/computrabajo-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 = {
    "mode": "search",
    "country": "co",
    "searchQuery": "vendedor",
    "category": "informatica-y-telecom",
    "jobUrls": [],
    "workplaceType": "any",
    "datePosted": "any",
    "sortBy": "relevance",
    "experienceLevel": "any",
    "minSalaryTier": 0,
    "disabilityInclusive": False,
    "fetchFullDetails": True,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/computrabajo-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 '{
  "mode": "search",
  "country": "co",
  "searchQuery": "vendedor",
  "category": "informatica-y-telecom",
  "jobUrls": [],
  "workplaceType": "any",
  "datePosted": "any",
  "sortBy": "relevance",
  "experienceLevel": "any",
  "minSalaryTier": 0,
  "disabilityInclusive": false,
  "fetchFullDetails": true,
  "maxItems": 20
}' |
apify call crawlerbros/computrabajo-scraper --silent --output-dataset

```

## MCP server setup

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