# OCC Mundial Jobs Search Scraper (`jobsapi/occ-mundial-jobs-search-scraper`) Actor

Extract rich OCC Mundial job postings including compensation, location, company, employment details, skills, dates, full descriptions, benefits, and published contact information.

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

## Pricing

from $2.99 / 1,000 job details

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## OCC Mundial Jobs Search Scraper

This Apify Actor extracts complete, source-verified job postings from the official [OCC Mundial](https://www.occ.com.mx) public listing and detail routes.

The implementation supports bounded local and Apify Cloud runs: it uses bounded native HTTPS requests and Cheerio, accepts only official OCC HTTPS URLs, and never uses a proxy, Jina Reader, browser automation, or an access-control bypass. If the official site returns an access challenge, the Actor fails closed, emits no unverifiable dataset rows, and records a structured diagnostic in `RUN_DIAGNOSTICS`.

### What it extracts

Each emitted row is a complete job record enriched from the detail page. Depending on what OCC publishes, this includes:

- title, job ID, canonical URL, company, company URL/logo, verification flags, and location;
- salary text and structured salary values, benefits, category, education, employment type, schedule, workplace type, and skills;
- posted/expiry dates, listing state, application routing, sanitized description HTML/text, and source metadata;
- request receipts, verification flags, retrieval metadata, and quality counters.

Recruiter contact values are never published. Any email address or phone number found in detail text is redacted, while `contactRedacted` and `applicationContactRedacted` preserve the fact that contact information was present.

### Supported input modes

Input is defined in `.actor/input_schema.json`.

| Mode | Purpose |
| --- | --- |
| `search` | Search one query and location on the official OCC listing route. |
| `searchMultiple` | Run a bounded set of queries for the same location. |
| `single` | Fetch one exact official detail URL or numeric job ID. |
| `multiple` | Fetch several exact official detail URLs or numeric job IDs. |
| `startUrls` | Process a bounded mixture of official listing and detail URLs. |

Example search input:

```json
{
  "mode": "search",
  "query": "desarrollador",
  "location": "Ciudad de Mexico",
  "maxPages": 2,
  "maxItems": 3,
  "maxCandidates": 40,
  "maxRequests": 20,
  "retries": 1
}
```

The Actor clamps page, item, candidate, request, response-size, timeout, and retry settings to safe bounds. Every request is subject to the request budget and a three-minute run deadline.

### Output and run storage

Dataset rows follow `.actor/dataset_schema.json`. The schema requires identity, source, canonical/detail verification, complete description, posting dates, request receipts, and quality metadata. Empty values and placeholder strings are omitted.

The Actor also writes:

- `RUN_SUMMARY` — mode, counts, request budget, duration, and status;
- `RUN_DIAGNOSTICS` — structured HTTP, access, parse, budget, and deadline diagnostics;
- `RUN_METADATA` — actor identity, official origin, supported modes, and normalized input;
- `RUN_HEALTH` — compact local-run health state.

### Local development

From this directory:

```text
npm ci --ignore-scripts --no-audit --no-fund
npm run check
npm test
npm run validate
apify validate-schema .actor/input_schema.json
apify run --purge --input-file=INPUT.json
```

`INPUT-single.json`, `INPUT-multiple.json`, `INPUT-search-multiple.json`, `INPUT-start-urls.json`, and `INPUT-negative.json` exercise the other supported paths. The fixtures and tests verify parsing without depending on live OCC access.

Do not use `apify push` or `apify call` from this local audit workflow. Respect OCC Mundial's terms, robots directives, and applicable data-protection requirements; do not collect authenticated data or use this Actor to harvest personal contact information.

Cloud and local records expose a truthful localOnly provenance flag. Diagnostics remain KVS-only, and raw input is not persisted.

# Actor input Schema

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

Search, multiple queries, one exact job, several exact jobs, or mixed official start URLs.

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

Keyword or job phrase for official OCC search.

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

Mexican city, state, or region used by the official OCC route.

## `queries` (type: `array`):

Query strings used by searchMultiple mode.

## `searchQueries` (type: `array`):

Alias for queries in searchMultiple mode.

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

Official HTTPS /empleos listing or /empleo/oferta detail URLs for startUrls mode.

## `start_urls` (type: `array`):

Snake-case alias for startUrls.

## `url` (type: `string`):

Single official OCC detail URL alias.

## `jobUrl` (type: `string`):

One official OCC /empleo/oferta detail URL.

## `job_url` (type: `string`):

Snake-case exact job URL alias.

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

Official OCC detail URLs for multiple mode.

## `job_urls` (type: `array`):

Snake-case exact job URLs alias.

## `jobId` (type: `string`):

One numeric OCC vacancy ID for single mode.

## `job_id` (type: `string`):

Snake-case numeric job ID alias.

## `jobIds` (type: `array`):

Numeric OCC vacancy IDs for multiple mode.

## `job_ids` (type: `array`):

Snake-case numeric job IDs alias.

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

Maximum official listing pages per query.

## `max_pages` (type: `integer`):

Snake-case page limit alias.

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

Maximum complete detail records emitted.

## `max_items` (type: `integer`):

Snake-case record limit alias.

## `maxCandidates` (type: `integer`):

Maximum unique listing candidates retained before detail enrichment.

## `max_candidates` (type: `integer`):

Snake-case candidate limit alias.

## `maxRequests` (type: `integer`):

Hard cap on all native HTTPS attempts, including redirects and retries.

## `max_requests` (type: `integer`):

Snake-case request limit alias.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each official page request.

## `timeoutSecs` (type: `integer`):

Alias for requestTimeoutSecs.

## `retries` (type: `integer`):

Bounded retries for transient native HTTPS errors.

## `maxResponseBytes` (type: `integer`):

Bound on each downloaded public HTML response.

## `deadlineSeconds` (type: `integer`):

Hard wall-clock deadline for the complete run.

## Actor input object example

```json
{
  "mode": "search",
  "query": "desarrollador",
  "location": "Ciudad de Mexico",
  "startUrls": [],
  "maxPages": 2,
  "max_pages": 2,
  "maxItems": 3,
  "max_items": 3,
  "maxCandidates": 40,
  "max_candidates": 40,
  "maxRequests": 20,
  "max_requests": 20,
  "requestTimeoutSecs": 15,
  "timeoutSecs": 15,
  "retries": 1,
  "maxResponseBytes": 12000000,
  "deadlineSeconds": 120
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `runDiagnostics` (type: `string`):

No description

## `runHealth` (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 = {};

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

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

```

## MCP server setup

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