# Computrabajo LATAM Jobs Scraper (`don.eich/computrabajo-latam`) Actor

Extract job listings from Computrabajo across 19 LATAM countries with structured salary fields (min/max/currency/period), multi-country search in one run, delta monitoring, and webhook alerts.

- **URL**: https://apify.com/don.eich/computrabajo-latam.md
- **Developed by:** [Erick Bonilla](https://apify.com/don.eich) (community)
- **Categories:** Automation, Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.20 / 1,000 job results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 LATAM Jobs Scraper — Delta Mode + Salary Intelligence

**99%+ success rate · Maintained weekly · Delta mode (NEW/UPDATED/REMOVED) · 19 countries · No residential proxy required**

Extract job listings from Computrabajo across 19 LATAM countries with structured salary fields,
multi-country search in a single run, delta monitoring to detect new and changed jobs, and
webhook alerts for real-time integrations.

---

## Computrabajo LATAM Jobs Scraper — Modo Delta + Salary Intelligence

Extrae ofertas de empleo de Computrabajo en 19 paises de LATAM con salarios estructurados
(min/max/moneda/periodo), busqueda multi-pais y multi-keyword en una sola corrida, modo delta
incremental para detectar ofertas nuevas y actualizadas, y alertas por webhook.

---

### Modos de operacion

#### SEARCH (default)

Busca con los filtros del input, descubre ofertas via HTML de listado y las enriquece con el
JSON API de detalle. Ideal para datasets estaticos, analisis salarial de mercado o alimentar
un ATS con ofertas recientes.

#### MONITOR (Delta incremental)

Compara el inventario actual con la corrida anterior y emite solo las ofertas que cambiaron:
`NEW`, `UPDATED` (cambio en salario, contrato o descripcion), `REMOVED`.

El estado persiste en un Named Key-Value Store de Apify entre corridas. La primera corrida
es la linea de base: todas las ofertas se clasifican como `NEW`.

Con `sortBy: publicationtime`, el actor puede parar la paginacion temprano al detectar
que todas las ofertas de una pagina ya estaban en el snapshot.

**Casos de uso del modo MONITOR:**
- Alertas de nuevas vacantes en tiempo real hacia un ATS (Greenhouse, Lever) via webhook
- Feed de ofertas nuevas hacia Slack o email
- Tracking semanal de salarios por sector y pais
- Monitoreo de competencia: que empresas publican mas ofertas

#### DIRECT

Procesa una lista de URLs directas de ofertas individuales o de paginas de busqueda.
Util para verificar el estado (activa/expirada) de una lista conocida de ofertas.

---

### Campos del output

#### Identificacion y origen

| Campo | Descripcion |
|-------|-------------|
| `offer_id` | ID interno de 32 chars hex. Unico por oferta. |
| `offer_url` | URL canonica de la oferta. |
| `apply_url` | URL directa para postular. `null` si blind. |
| `country_code` | Codigo ISO-2 del pais. |
| `country_name` | Nombre del pais en espanol. |
| `portal_id` | ID del portal Computrabajo (1-19). |
| `scrape_mode` | `SEARCH`, `DIRECT` o `MONITOR`. |
| `scraped_at` | Timestamp UTC de extraccion. |
| `delta_status` | `NEW`, `UPDATED`, `UNCHANGED` o `REMOVED`. `null` fuera de MONITOR. |

#### Oferta laboral

| Campo | Descripcion |
|-------|-------------|
| `title` | Titulo del puesto (limpio, sin localidad). |
| `title_full` | Titulo con localidad (como aparece en Computrabajo). |
| `description` | Descripcion completa (texto plano). |
| `category` | Categoria laboral. |
| `subcategory` | Subcategoria. `null` si no aplica. |

#### Salario (campo diferenciador)

| Campo | Descripcion |
|-------|-------------|
| `salary_raw` | Texto del salario (ej. `"$ 34,000.00 (Mensual)"`, `"A convenir"`). |
| `salary_value` | Valor numerico del salario unico. `null` si es rango o a convenir. |
| `salary_min` | Salario minimo del rango. `null` si no es rango. |
| `salary_max` | Salario maximo del rango. `null` si no es rango. |
| `salary_currency` | Codigo ISO-4217 (COP, MXN, PEN, CLP, ARS, etc.). `null` si no determinable. |
| `salary_period` | `monthly`, `hourly`, `annual`, `daily`, `agreed` o `null`. |
| `salary_is_negotiable` | `true` si es "A convenir". |
| `salary_is_hidden` | `true` si el salario esta oculto al publico. |

**Nota de integridad**: `salary_currency` solo se emite si la moneda es determinable con
confianza (por pais + simbolo en salary_raw). Si hay ambiguedad, se emite `null` y
`salary_raw` contiene el texto original. No se fabrican valores.

#### Modalidad y tipo de empleo

| Campo | Descripcion |
|-------|-------------|
| `workplace_type` | `onsite`, `remote`, `hybrid` o `unspecified`. |
| `employment_type` | Tipo de jornada (ej. `"Tiempo Completo"`). |
| `contract_type` | Tipo de contrato (ej. `"Contrato por tiempo indeterminado"`). |
| `is_outstanding` | Oferta destacada/patrocinada. |
| `is_blind` | `true` si la empresa no se muestra. |

#### Fechas

| Campo | Descripcion |
|-------|-------------|
| `published_at` | Fecha de publicacion (ISO8601). |
| `expires_at` | Fecha de expiracion. `null` si no especificada. |
| `updated_at` | Ultima actualizacion. |
| `posted_ago_text` | Texto relativo del listado (ej. `"Hace 2 horas"`). |

#### Empresa

| Campo | Descripcion |
|-------|-------------|
| `company_name` | Nombre de la empresa. `null` si blind. |
| `company_id` | ID interno en Computrabajo. |
| `company_url` | URL del perfil de empresa. |
| `company_is_verified` | Empresa verificada por Computrabajo. |
| `company_rating_culture` | Rating promedio de cultura laboral (0-5). Con `includeCompanyDetails: true`. |
| `company_rating_recommendation` | % que recomendaria trabajar ahi. |
| `company_total_reviews` | Total de valoraciones de empleados. |
| `company_logo_url` | URL del logo. |
| `employee_reviews` | Array de hasta 3 reviews. Con `includeEmployeeReviews: true`. |

#### Skills y requisitos

| Campo | Descripcion |
|-------|-------------|
| `skills` | Array de `{skill_id, skill_name, skill_type}`. Con `includeSkills: true`. |
| `education_required` | Nivel educativo minimo. |
| `experience_years` | Anos de experiencia requeridos. `null` si no especificado. |

#### Solo en modo MONITOR

| Campo | Descripcion |
|-------|-------------|
| `delta_status` | `NEW` / `UPDATED` / `REMOVED` / `UNCHANGED` |
| `delta_detected_at` | Timestamp del cambio detectado. |

---

### Precios (Pay per Event)

| Escenario | Costo |
|-----------|-------|
| 100 ofertas (modo SEARCH) | $0.12 |
| 1,000 ofertas (modo SEARCH) | $1.20 |
| 100 ofertas nuevas (modo MONITOR) | $0.10 |
| 10 ofertas actualizadas (modo MONITOR) | $0.005 |

El precio por oferta ($0.0012) es 40% mas bajo que el incumbente ($0.00199 en shahidirfan/computrabajo-scraper).

---

### Configuracion de proxy

Computrabajo usa AWS ELB **sin Cloudflare**. El actor inyecta un User-Agent de Chrome y
los headers reales del browser — suficiente para pasar el filtro en la mayoria de casos.

Si aparecen 403 persistentes, activar Apify Proxy:

```json
{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

La JSON API de `oferta.computrabajo.com` **no requiere proxy** (CloudFront con CORS abierto,
cache de 24h, acepta cualquier UA).

***

### Modo MONITOR — Primera corrida

La primera corrida no tiene snapshot previo. Todas las ofertas se clasifican como `NEW`
y se guarda el snapshot como linea de base. La corrida siguiente detecta cambios.

**LIMITACION DOCUMENTADA**: La deteccion de REMOVED solo es confiable si el run tiene
`maxJobsPerQuery` sin limite y los mismos keywords/paises que el run anterior. Si se
limitan los resultados, una oferta puede no aparecer por paginacion sin estar realmente
removida. Los items REMOVED incluyen `removal_confidence: "high"` o `"low"` segun si
el run completo la paginacion.

***

### Advertencias de uso

- El modo MONITOR + 19 paises + 10 keywords + sin limite puede generar 190,000+ items
  en un solo run (~$228 USD). Calcular antes de correr sin limite.
- Los datos de empresas son publicos en el sitio. El uso de datos de contacto es
  responsabilidad del usuario final.
- El KV store del modo MONITOR crece con el tiempo (~200 bytes por oferta). 100,000
  ofertas = ~20 MB. El KV store de Apify aguanta GBs sin problema.
- La JSON API de detalle tiene cache de 24h en CloudFront. Cambios recientes en una
  oferta pueden no reflejarse hasta el siguiente dia.

***

### Diferenciadores vs incumbente (shahidirfan)

1. Salario estructurado garantizado: `salary_min`, `salary_max`, `salary_currency`, `salary_period` como campos separados con logica de fallback — el incumbente retorna solo texto.
2. Modo MONITOR con Named KV Store, delta\_status y parada temprana — nadie en el nicho lo tiene.
3. Multi-pais + multi-keyword en una sola corrida desde el input.
4. Webhook con batching y reintentos.
5. Precio 40% mas bajo con mas campos utiles.
6. Proxy opcional (no obligatorio) porque el sitio no tiene Cloudflare.

***

### Roadmap (no incluido en v0.0)

- `deltaRetentionDays`: limpiar registros del KV store mas antiguos que N dias.
- Alive/expired check batch: HEAD request por cada offer\_url.
- Soporte para `candidato.{cc}.computrabajo.com` (requiere autenticacion).

# Actor input Schema

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

SEARCH: descubrimiento completo + enriquecimiento. DIRECT: procesa URLs o IDs especificos. MONITOR: igual a SEARCH con filtro delta, emite solo nuevas/actualizadas/removidas.

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

Palabras clave de busqueda. Se normalizan a slug (espacios -> guiones, minusculas, sin tildes). Ejemplo: \["desarrollador backend", "data analyst"]. Cada keyword se cruza con cada pais seleccionado.

## `countries` (type: `array`):

Paises a consultar. Codigo ISO-2 en minusculas. Cada codigo mapea a {cc}.computrabajo.com.

## `locations` (type: `array`):

Filtro de ubicacion dentro del pais (slug de ciudad/departamento). Se anade como sufijo -en-{location} en la URL. Vacio = sin filtro. Ejemplo: \["bogota-dc", "medellin"].

## `workplaceTypes` (type: `array`):

Modalidad de trabajo. "remote" anade -en-remoto, "hybrid" anade -hibrido. "any" no anade sufijo.

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

Criterio de orden. publicationtime es el mas util para modo MONITOR (ver lo mas nuevo primero y parar la paginacion temprano).

## `maxJobsPerQuery` (type: `integer`):

Maximo de ofertas a procesar por combinacion keyword+pais. 0 = sin limite. Con sort publicationtime y modo MONITOR, el actor puede parar al encontrar el primer ID ya visto.

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

URLs directas de busqueda o de oferta individual. Si se proveen, se ignoran keywords y countries. URL de oferta individual -> modo DIRECT automatico.

## `includeCompanyDetails` (type: `boolean`):

Incluye datos de la empresa (descripcion, website, redes, ratings de empleadores). No requiere requests adicionales (viene en el mismo JSON de detalle).

## `includeEmployeeReviews` (type: `boolean`):

Incluye hasta 3 reviews de empleados. Desactivado por default para mantener el item limpio.

## `includeSalaryIntelligence` (type: `boolean`):

Incluye datos de salary intelligence de mercado (salarios minimo/maximo/promedio para cargos similares). Util para benchmarking salarial.

## `includeSkills` (type: `boolean`):

Incluye array de skills/competencias del objeto sk.sl.

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

URL a la que se hace POST por cada nueva oferta (en MONITOR) o por cada oferta en SEARCH. Payload: el item completo como JSON. Vacio = no se envian webhooks.

## `webhookBatchSize` (type: `integer`):

Numero de items a acumular antes de enviar un batch al webhook. 1 = envio inmediato por cada item.

## `deltaStoreName` (type: `string`):

Nombre del Key-Value Store de Apify para el modo MONITOR. Cambiar permite tener instancias de monitor independientes (ej. una por cliente).

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

Configuracion de proxy. El sitio usa AWS ELB sin Cloudflare, por lo que proxies residenciales NO son necesarios en la mayoria de casos. Si hay 403 persistentes, activar Apify Proxy con grupo RESIDENTIAL.

## `maxConcurrency` (type: `integer`):

Numero maximo de requests simultaneos al HTML de listado. Los requests a la JSON API corren con concurrencia separada (hasta 10).

## `requestDelay` (type: `integer`):

Delay en milisegundos entre requests al HTML de listado. Los requests a la JSON API no tienen delay (CDN cacheable).

## Actor input object example

```json
{
  "mode": "SEARCH",
  "keywords": [
    "programador"
  ],
  "countries": [
    "co",
    "mx",
    "ar"
  ],
  "locations": [],
  "workplaceTypes": [
    "any"
  ],
  "sortBy": "publicationtime",
  "maxJobsPerQuery": 100,
  "startUrls": [],
  "includeCompanyDetails": true,
  "includeEmployeeReviews": false,
  "includeSalaryIntelligence": false,
  "includeSkills": true,
  "webhookUrl": "",
  "webhookBatchSize": 10,
  "deltaStoreName": "computrabajo-delta",
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxConcurrency": 5,
  "requestDelay": 500
}
```

# 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 = {
    "keywords": [
        "programador"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("don.eich/computrabajo-latam").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 = { "keywords": ["programador"] }

# Run the Actor and wait for it to finish
run = client.actor("don.eich/computrabajo-latam").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "programador"
  ]
}' |
apify call don.eich/computrabajo-latam --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=don.eich/computrabajo-latam",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Computrabajo LATAM Jobs Scraper",
        "description": "Extract job listings from Computrabajo across 19 LATAM countries with structured salary fields (min/max/currency/period), multi-country search in one run, delta monitoring, and webhook alerts.",
        "version": "0.0",
        "x-build-id": "m8AoMm5LL9KU4JcZQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/don.eich~computrabajo-latam/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-don.eich-computrabajo-latam",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/don.eich~computrabajo-latam/runs": {
            "post": {
                "operationId": "runs-sync-don.eich-computrabajo-latam",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/don.eich~computrabajo-latam/run-sync": {
            "post": {
                "operationId": "run-sync-don.eich-computrabajo-latam",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Modo de operacion",
                        "enum": [
                            "SEARCH",
                            "DIRECT",
                            "MONITOR"
                        ],
                        "type": "string",
                        "description": "SEARCH: descubrimiento completo + enriquecimiento. DIRECT: procesa URLs o IDs especificos. MONITOR: igual a SEARCH con filtro delta, emite solo nuevas/actualizadas/removidas.",
                        "default": "SEARCH"
                    },
                    "keywords": {
                        "title": "Palabras clave",
                        "type": "array",
                        "description": "Palabras clave de busqueda. Se normalizan a slug (espacios -> guiones, minusculas, sin tildes). Ejemplo: [\"desarrollador backend\", \"data analyst\"]. Cada keyword se cruza con cada pais seleccionado.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "programador"
                        ]
                    },
                    "countries": {
                        "title": "Paises",
                        "type": "array",
                        "description": "Paises a consultar. Codigo ISO-2 en minusculas. Cada codigo mapea a {cc}.computrabajo.com.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ar",
                                "bo",
                                "cl",
                                "co",
                                "cr",
                                "cu",
                                "do",
                                "ec",
                                "gt",
                                "hn",
                                "mx",
                                "ni",
                                "pa",
                                "pe",
                                "pr",
                                "py",
                                "sv",
                                "uy",
                                "ve"
                            ]
                        },
                        "default": [
                            "co",
                            "mx",
                            "ar"
                        ]
                    },
                    "locations": {
                        "title": "Ubicaciones (slug de ciudad)",
                        "type": "array",
                        "description": "Filtro de ubicacion dentro del pais (slug de ciudad/departamento). Se anade como sufijo -en-{location} en la URL. Vacio = sin filtro. Ejemplo: [\"bogota-dc\", \"medellin\"].",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "workplaceTypes": {
                        "title": "Modalidades de trabajo",
                        "type": "array",
                        "description": "Modalidad de trabajo. \"remote\" anade -en-remoto, \"hybrid\" anade -hibrido. \"any\" no anade sufijo.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "any",
                                "onsite",
                                "remote",
                                "hybrid"
                            ]
                        },
                        "default": [
                            "any"
                        ]
                    },
                    "sortBy": {
                        "title": "Ordenar por",
                        "enum": [
                            "relevance",
                            "publicationtime",
                            "salary"
                        ],
                        "type": "string",
                        "description": "Criterio de orden. publicationtime es el mas util para modo MONITOR (ver lo mas nuevo primero y parar la paginacion temprano).",
                        "default": "publicationtime"
                    },
                    "maxJobsPerQuery": {
                        "title": "Maximo de ofertas por consulta",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximo de ofertas a procesar por combinacion keyword+pais. 0 = sin limite. Con sort publicationtime y modo MONITOR, el actor puede parar al encontrar el primer ID ya visto.",
                        "default": 100
                    },
                    "startUrls": {
                        "title": "URLs de inicio",
                        "type": "array",
                        "description": "URLs directas de busqueda o de oferta individual. Si se proveen, se ignoran keywords y countries. URL de oferta individual -> modo DIRECT automatico.",
                        "items": {
                            "type": "object"
                        },
                        "default": []
                    },
                    "includeCompanyDetails": {
                        "title": "Incluir detalles de empresa",
                        "type": "boolean",
                        "description": "Incluye datos de la empresa (descripcion, website, redes, ratings de empleadores). No requiere requests adicionales (viene en el mismo JSON de detalle).",
                        "default": true
                    },
                    "includeEmployeeReviews": {
                        "title": "Incluir reviews de empleados",
                        "type": "boolean",
                        "description": "Incluye hasta 3 reviews de empleados. Desactivado por default para mantener el item limpio.",
                        "default": false
                    },
                    "includeSalaryIntelligence": {
                        "title": "Incluir salary intelligence",
                        "type": "boolean",
                        "description": "Incluye datos de salary intelligence de mercado (salarios minimo/maximo/promedio para cargos similares). Util para benchmarking salarial.",
                        "default": false
                    },
                    "includeSkills": {
                        "title": "Incluir skills",
                        "type": "boolean",
                        "description": "Incluye array de skills/competencias del objeto sk.sl.",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "URL de webhook",
                        "type": "string",
                        "description": "URL a la que se hace POST por cada nueva oferta (en MONITOR) o por cada oferta en SEARCH. Payload: el item completo como JSON. Vacio = no se envian webhooks.",
                        "default": ""
                    },
                    "webhookBatchSize": {
                        "title": "Tamano de batch del webhook",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Numero de items a acumular antes de enviar un batch al webhook. 1 = envio inmediato por cada item.",
                        "default": 10
                    },
                    "deltaStoreName": {
                        "title": "Nombre del KV store delta",
                        "type": "string",
                        "description": "Nombre del Key-Value Store de Apify para el modo MONITOR. Cambiar permite tener instancias de monitor independientes (ej. una por cliente).",
                        "default": "computrabajo-delta"
                    },
                    "proxyConfiguration": {
                        "title": "Configuracion de proxy",
                        "type": "object",
                        "description": "Configuracion de proxy. El sitio usa AWS ELB sin Cloudflare, por lo que proxies residenciales NO son necesarios en la mayoria de casos. Si hay 403 persistentes, activar Apify Proxy con grupo RESIDENTIAL.",
                        "default": {
                            "useApifyProxy": false
                        }
                    },
                    "maxConcurrency": {
                        "title": "Concurrencia maxima",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Numero maximo de requests simultaneos al HTML de listado. Los requests a la JSON API corren con concurrencia separada (hasta 10).",
                        "default": 5
                    },
                    "requestDelay": {
                        "title": "Delay entre requests (ms)",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Delay en milisegundos entre requests al HTML de listado. Los requests a la JSON API no tienen delay (CDN cacheable).",
                        "default": 500
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
