# OCC Mundial Jobs Scraper — Full Details, Salary & Alerts (`corvuslab/occ-mundial-jobs-scraper`) Actor

Search occ.com.mx by keyword and Mexican state or city and export every job in full — title, employer, monthly salary in MXN, city, work modality, employment type, posted and expiry dates, verified-employer flag and description in text, HTML and Markdown. Plus incremental monitoring and alerts.

- **URL**: https://apify.com/corvuslab/occ-mundial-jobs-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 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/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

## OCC Mundial Scraper

> **Turn every live OCC Mundial listing into a clean, fully-detailed job record — salary, employer, location and description included, in seconds.**

Scrape job postings from **OCC Mundial (occ.com.mx)**, Mexico's largest job board, and get **every job fully detailed** — job title, employer name, **monthly salary range in MXN**, city and state, **work modality** (Presencial / Híbrido / Home office), employment type, posted and expiry dates, a **verified-employer** flag, and the full job description in **text, HTML and Markdown**. Search by keyword and Mexican state or city, run it with no code, and export to JSON, CSV, Excel or the API — with built-in **incremental monitoring** and **Telegram / Slack / Discord / webhook** alerts.

**Why this scraper**

- ⚡ **Fast & low-cost** — a lean, direct data path keeps large runs cheap.
- 🧾 **Rich, typed records** — 30+ structured fields per job, not raw HTML.
- ♻️ **Cheap to monitor** — incremental mode re-scrapes only what changed (see below).
- 🔔 **Notifications built in** — Telegram, Slack, Discord or any webhook.
- 🤖 **AI- & API-ready** — compact output, MCP-friendly, one-click integrations.

***

### ✨ Key features

- 🔎 **Search or URL scraping** — run a keyword search (optionally narrowed to a Mexican state or city), or paste OCC search and job URLs directly.
- 🧾 **Every job fully detailed** — because each record is enriched from its own job page, you always get the title, employer, salary, location, modality, dates and full description — never a thin listing card.
- 💰 **Monthly salary range in MXN** — `salaryMin`, `salaryMax`, currency and period, parsed even when OCC hides the amount from its structured data; `salaryShown` tells you which jobs disclose pay.
- 🏢 **Work modality & verified employer** — Presencial / Híbrido / Home office as a first-class field, plus a `companyVerified` flag for OCC's "Empresa verificada" badge.
- 🗓️ **Freshness dates** — `datePosted` and `validThrough` (offer expiry) on every job, so you can filter for what's fresh.
- 📝 **Descriptions in three formats** — plain text, HTML and Markdown, so the same record drops straight into a sheet, a website or an LLM.
- ♻️ **Incremental monitoring** — schedule it and get only new jobs (NEW / UNCHANGED / EXPIRED); already-seen offers are skipped before their page is even fetched.
- 🔔 **Notifications** — Telegram, Slack, Discord or any webhook (n8n / Make / Zapier).
- 🤖 **AI-ready** — compact and drop-empty output modes keep payloads small for LLMs and MCP.

***

### ⚙️ Input & output

#### 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. |
| `location` | Restrict to a Mexican state or city (e.g. `jalisco`, `ciudad de mexico`). |
| `startUrls` | Scrape specific OCC search or job URLs directly. |
| `maxResults` | Cap the number of jobs (0 = unlimited). |
| `descriptionFormat` | Return the description as text, HTML, Markdown, or all three. |
| `incrementalMode` | Emit only new jobs since the last run. |
| `compact` | Core fields only — ideal for AI agents and MCP. |
| `proxyConfiguration` | Optional — runs without a proxy at typical volumes. |

…and **24 inputs** in total — the table shows the essentials; the rest cover notification channels, output/AI modes and advanced tuning, all in the visual editor.

**Example inputs**

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

```json
{ "query": "contador, gerente de ventas", "location": "jalisco", "descriptionFormat": "markdown" }
```

```json
{ "query": "enfermera", "location": "nuevo leon", "incrementalMode": true, "telegramToken": "…", "telegramChatId": "@my_jobs" }
```

#### Output

Most OCC scrapers hand you a listing card — title, company, maybe a city — and stop there. This scraper **visits every job page** so each record ships fully detailed: parsed salary range, work modality, verified-employer flag, freshness dates and the full description in three formats, ready to use without a second request.

- **Core** — `id`, `url`, `title`, `company`, `companyVerified`.
- **Location** — `city`, `state`, `country`, and a combined `location` string.
- **Salary** — `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryShown`, `salaryText` (monthly ranges in MXN).
- **Job details** — `employmentType`, `workModality` (Presencial / Híbrido / Home office), `remote`, `datePosted`, `validThrough`, and `description` in text, HTML and Markdown.
- **Search & monitoring meta** — `keyword`, `rank`, `searchLocation`, `source`, `scrapedAt`, plus `changeType`, `isRepost` and hashes for incremental runs.

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

**Example output**

```json
{
  "id": "21295651",
  "url": "https://www.occ.com.mx/empleo/oferta/21295651-radio-operador",
  "title": "Radio operador",
  "company": "RAMHNO SA DE CV",
  "companyVerified": false,
  "city": "Miguel Hidalgo",
  "state": "Ciudad de México",
  "country": "MX",
  "location": "Miguel Hidalgo, Ciudad de México",
  "salaryMin": 10000,
  "salaryMax": 11000,
  "salaryCurrency": "MXN",
  "salaryPeriod": "monthly",
  "salaryShown": true,
  "salaryText": "$10,000 - $11,000 Mensual MXN",
  "employmentType": "Tiempo completo",
  "workModality": "Presencial",
  "remote": false,
  "datePosted": "2026-08-14",
  "validThrough": "2026-10-13",
  "description": "Principales responsabilidades\n- Tomar y registrar la asistencia del personal de seguridad… Perfil requerido\n- Bachillerato terminado o equivalente…",
  "descriptionHtml": "<p>Principales responsabilidades</p>…",
  "descriptionMarkdown": "Principales responsabilidades\n\n- Tomar y registrar la asistencia…",
  "keyword": "operador",
  "rank": 8,
  "source": "occ",
  "scrapedAt": "2026-08-19T06:09:13Z"
}
```

The `description` field ships as plain **text**, **HTML** (`descriptionHtml`) and **Markdown** (`descriptionMarkdown`) — pick one or keep all three.

***

### 💡 What can you do with OCC Mundial data?

- **Talent sourcing & recruiting** — pull fresh openings by role and Mexican region, complete with employer, salary and modality.
- **Salary & labour-market research** — analyse monthly MXN salary ranges across cities, states and job categories.
- **Job aggregation & boards** — feed clean, fully-detailed listings into your own site, app or sheet.
- **Vacancy monitoring** — schedule it with incremental mode + notifications for a live feed of new jobs.
- **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** (and optionally UNCHANGED / EXPIRED) jobs — already-seen offers are skipped *before* their 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.

***

### 🚀 How to scrape OCC Mundial

1. Open the actor and enter a **search keyword** (e.g. `desarrollador`) and, optionally, a **Mexican state or city** — or paste an OCC URL.
2. Set **Max results** and choose a **description format**.
3. (Optional) Turn on **incremental mode** and a **notification** channel, then **Schedule** it.
4. Click **Start**.
5. 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**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### ❓ FAQ

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

**Does it get the salary?** Yes, whenever the employer discloses it — `salaryMin`, `salaryMax`, currency and period are parsed even when OCC keeps the amount out of its structured data. `salaryShown` flags the jobs that hide pay.

**Can I search a specific city or state?** Yes — set `location` to any Mexican state or city (accent- and case-insensitive), or leave it empty to search all of Mexico.

**Can I get only new jobs on a schedule?** Yes — turn on incremental mode and schedule it; each run emits only what changed and can notify your channel.

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

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

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

**What makes this scraper different from other OCC scrapers?** Most OCC scrapers return thin listing cards — title, company and city. This one visits every job page and parses 30+ structured fields per record: salary range, work modality, verified-employer flag, freshness dates and the full description in text, HTML and Markdown — plus incremental monitoring so scheduled runs only bill for what changed.

***

### ⚖️ Is it legal to scrape OCC Mundial?

This actor accesses only publicly available data on occ.com.mx. 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 OCC Mundial.

***

**Keywords:** OCC scraper · OCC Mundial scraper · occ.com.mx scraper · OCC Mundial API · Mexico job scraper · Mexico jobs API · empleos Mexico scraper · Mexican job board scraper · job postings Mexico · scrape jobs Mexico · salary data Mexico · MXN salary scraper · job monitoring · vacancy monitoring · export jobs to CSV Excel JSON · no-code job scraper · MCP tool for AI agents · Jalisco Nuevo Leon CDMX jobs

# Actor input Schema

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

Job title, role or skill to search for on OCC (e.g. 'desarrollador', 'contador', 'gerente de ventas'). Separate multiple searches with commas — each runs on its own and the results are merged and de-duplicated.

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

Optional. Restrict results to a Mexican state or city, e.g. 'jalisco', 'nuevo leon', 'ciudad de mexico', 'guadalajara'. Leave empty to search all of Mexico. Accent- and case-insensitive.

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

Paste OCC search URLs (…/empleos/de-…/) or job URLs (…/empleo/oferta/…) to scrape directly. Combined with the keyword search above.

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

Maximum number of jobs to return across all searches. Set 0 for unlimited (bounded by how many the search has).

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

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

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

Truncate each description to this many characters. 0 = no limit.

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

Emit only the core fields (id, title, company, location, salary, modality, date). 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 / UNCHANGED / EXPIRED).

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

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

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

Also emit jobs that were already seen in a previous run (fetches their details again).

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

Emit a record for jobs 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 jobs — 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 jobs to include in each notification message.

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

Optional. The scraper runs on Apify's direct egress by default, which is the cheapest and clears OCC reliably; it will automatically fall back to residential proxies if that egress is ever blocked. Only set this if you specifically need to route through a proxy.

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

Safety cap on how many result pages to walk per search (each page ≈ 20 jobs).

## `pageConcurrency` (type: `integer`):

How many search-result pages to fetch at once.

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

How many job detail pages to fetch at once.

## `requestDelayMs` (type: `integer`):

Minimum delay between requests. Raise this if you ever see the run getting blocked.

## Actor input object example

```json
{
  "query": "desarrollador",
  "location": "jalisco",
  "maxResults": 100,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notificationLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "maxPages": 300,
  "pageConcurrency": 3,
  "detailConcurrency": 6,
  "requestDelayMs": 350
}
```

# 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",
    "location": ""
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/occ-mundial-jobs-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/0ybJUTiHC3jWSHlf3/builds/UnqOt3ckQLZYDQpqf/openapi.json
