# Google Jobs Scraper - Latin America (`jgapis/google-jobs-latam-scraper`) Actor

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

## Pricing

from $2.00 / 1,000 job 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Jobs Scraper – Latin America 🌎

Scrape **Google Jobs** in **every Latin American country** – Colombia, Mexico, Brazil, Argentina, Chile, Peru and 14 more – in Spanish or Portuguese. Get title, company, location, the **source portal** (LinkedIn, Computrabajo, Indeed, Bumeran, ZonaJobs, OCC, El Empleo, Gupy, Catho…), **real apply links**, posted date, employment type, remote flag, full description and **salary parsed and converted to USD**.

Built for reliability: it uses Apify's **GOOGLE_SERP proxy** (no browser, 256 MB of memory), retries every page with a fresh session, de-duplicates jobs that appear on several portals, and has a **monitor mode** that returns only new jobs on scheduled runs.

### Why this Actor

- **All of LatAm**: 20 countries plus presets: `LATAM_ALL`, `LATAM_CORE` (CO, MX, BR, AR, CL, PE), `SOUTH_AMERICA`, `CENTRAL_AMERICA_CARIBBEAN`, `ANDEAN`, `SOUTHERN_CONE`.
- **Right language automatically**: Brazil in Portuguese (`pt-BR`), the rest in Latin American Spanish (`es-419`).
- **Salary in USD**: parses labels such as `De COP 2,500,001 a COP 3,000,000 por mes`, `MXN 15 k por mes` and `R$ 7,5 mil a R$ 12 mil por mês`. You get min/max, currency, period, USD values and a yearly USD estimate, using live exchange rates.
- **Source portal + real apply URLs**: Google's redirect links are resolved to the real LinkedIn, Computrabajo or Indeed URL.
- **More than 10 jobs per search**: Google shows about 10 jobs per page. The Actor runs related searches (main cities, then "remoto", "junior", "senior"…), de-duplicates, and stops when new jobs dry up so you don't pay for duplicates.
- **Monitor mode**: schedule the Actor daily and get only jobs you haven't seen before.
- **Transparent run report**: the `OUTPUT` record shows pages fetched/failed, retries, timeouts, duplicates and the FX source.

### Use cases

- Job boards and aggregators for LatAm markets.
- Salary benchmarking across countries in one currency (USD).
- Recruiting/sales intelligence: which companies are hiring, where and through which portals.
- Labour-market research by city, role and portal.
- Alerts: daily new jobs for a role in a city (monitor mode + schedule + Slack/email integration).

### Input

| Field | Description |
|---|---|
| `queries` | Job titles/keywords, e.g. `desarrollador python`, `contador`, `vendedor`, `desenvolvedor`. |
| `countries` | ISO codes (`CO`, `MX`, `BR`…) or presets (`LATAM_CORE`, `LATAM_ALL`…). Default `CO`. |
| `locations` | Optional cities, e.g. `Bogotá`, `Medellín`. Use them with a single country. Empty = whole country. |
| `language` | `auto` (recommended), `es-419`, `es`, `pt-BR`, `en`. |
| `maxJobsPerSearch` | Jobs per query × location × country (default 30). |
| `maxPagesPerSearch` | Max Google result pages (related searches) per search (default 8). |
| `maxTotalJobs` | Stop the run after N jobs (0 = no limit). |
| `datePosted` | `ANY`, `TODAY`, `3DAYS`, `WEEK`, `MONTH`. |
| `employmentTypes` | `FULL_TIME`, `PART_TIME`, `CONTRACTOR`, `TEMPORARY`, `INTERN`. |
| `remoteOnly` / `onlyWithSalary` | Keep only remote jobs / jobs with a salary. |
| `includeDescription` | Full description and highlights (default on). |
| `resolveApplyLinks` | Resolve Google redirect links to portal URLs (default on). |
| `monitorMode` / `monitorKey` | Output only jobs not seen in previous runs with the same key and searches. |
| `proxyConfiguration` | Defaults to Apify Proxy **GOOGLE_SERP** (required for reliable results). |

Example:

```json
{
  "queries": ["desarrollador python", "analista de datos"],
  "countries": ["LATAM_CORE"],
  "maxJobsPerSearch": 30,
  "datePosted": "WEEK"
}
```

### Output

One dataset item per job. Views: **Jobs overview**, **Salaries (USD)**, **Full details**. Real example (Mexico, shortened):

```json
{
  "jobId": "e0Tvllr2TxFjt_W4AAAAAA==",
  "title": "Contador General - Contralor Administrativo",
  "companyName": "TALING CONSULTING",
  "location": "Santa Rosa Jáuregui, Qro.",
  "detailLocation": "Santa Rosa Jáuregui, Qro.",
  "sourcePortal": "LinkedIn",
  "postedText": "hace 3 días",
  "scheduleTypeText": "Tiempo completo",
  "scheduleType": "FULL_TIME",
  "isRemote": false,
  "degreeText": null,
  "chips": [
    "hace 3 días",
    "De MXN 24,400 a MXN 28,131 por mes",
    "Tiempo completo"
  ],
  "applyOptions": [
    {
      "portal": "LinkedIn",
      "url": "https://mx.linkedin.com/jobs/view/contador-general-contralor-administrativo-at-taling-consulting-4475357775?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
      "googleRedirectUrl": "https://www.google.com/goto?url=CAES9gEB6zswFa8yBYupTIWiaFhw…",
      "domain": "mx.linkedin.com"
    }
  ],
  "description": "TALING Consulting busca Contador General - Contralor Administrativo en Querétaro, Querétaro\nContador General / Contralor Administrativo\nUbicación: Querétaro, Qro.\nModalidad: Presencial\nEmpresa mexicana en crecimiento, dedicada a la comercialización de productos de cuidado persona…",
  "highlights": {},
  "googleJobUrl": "https://www.google.com/search?ibp=htl;jobs&q=contador+M%C3%A9xico&htidocid=e0Tvllr2TxFjt_W…",
  "salaryText": "De MXN 24,400 a MXN 28,131 por mes",
  "salary": {
    "raw": "De MXN 24,400 a MXN 28,131 por mes",
    "min": 24400,
    "max": 28131,
    "currency": "MXN",
    "period": "MONTH",
    "minUsd": 1339.62,
    "maxUsd": 1544.46,
    "yearlyMinUsd": 16075,
    "yearlyMaxUsd": 18533,
    "fxSource": "open.er-api.com",
    "fxDate": "Sun, 04 Oct 2026 00:02:32 +0000"
  },
  "postedDaysAgo": 3,
  "postedDateApprox": "2026-10-01",
  "country": "MX",
  "countryName": "México",
  "applyUrl": "https://mx.linkedin.com/jobs/view/contador-general-contralor-administrativo-at-taling-consulting-4475357775?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
  "dedupeKey": "e59647e6cf052ee1",
  "search": {
    "query": "contador",
    "location": "México",
    "modifier": null,
    "googleQuery": "contador México",
    "language": "es-419"
  },
  "scrapedAt": "2026-10-04T16:25:41.534024Z"
}

```

### Tested on the Apify platform (Oct 2026)

These are real numbers from test runs with default settings (256 MB):

| Run | Jobs | Result pages | Failed pages | Duration |
|---|---|---|---|---|
| `desarrollador python`, CO | 22 | 6 | 0 | 47 s |
| `contador`, MX | 30 | 4 | 0 | 26 s |
| `vendedor`, AR | 30 | 4 | 0 (1 timeout recovered by retry) | 117 s |
| `desenvolvedor`, BR | 30 | 3 | 0 | 20 s |
| `vendedor`, LATAM_CORE (6 countries) | 120 | 16 | 0 | 42 s |

Across all test runs, **0 pages were lost**: one timeout in about 60 requests was recovered automatically by a retry. Apply links were resolved to the portal URL for 100% of the jobs, and roughly 40% of LatAm jobs had a salary.

### Pricing (pay per event)

- **$0.002 per job** saved ($2.00 per 1,000 jobs).
- **$0.005 per run start.**

Proxy and compute costs are included. Example: 1,000 jobs ≈ $2.01.

### Limitations

- Google Jobs shows about 10 jobs per result page, and the Actor cannot request page 2 through the SERP proxy. It reaches more jobs through related searches, so very niche queries may return fewer jobs than `maxJobsPerSearch`.
- Salaries are shown only when the portal publishes them. USD values use daily FX rates (open.er-api.com, with a built-in fallback table) and are estimates.
- Posted dates are approximate (from "hace 3 días").
- Google can change its page layout. The parser has fallbacks and saves a debug snapshot if it ever finds jobs it cannot read.

***

### 🇪🇸 En español

**Scraper de Google Jobs para toda Latinoamérica**: Colombia, México, Brasil, Argentina, Chile, Perú y 14 países más. Usa presets como `LATAM_CORE` o `LATAM_ALL` y busca en español o portugués (Brasil se busca automáticamente en `pt-BR`).

**Qué obtienes por cada empleo**: título, empresa, ubicación, **portal de origen** (LinkedIn, Computrabajo, Indeed, Bumeran, OCC, El Empleo, Gupy…), **enlaces reales para postularse**, fecha de publicación aproximada, tipo de contrato, si es remoto, descripción completa y **salario normalizado a USD** (mínimo, máximo, moneda, periodo y estimado anual).

**Casos de uso**:

- Portales de empleo y agregadores.
- Comparación salarial entre países en dólares.
- Inteligencia de reclutamiento y ventas: qué empresas contratan y dónde.
- Estudios del mercado laboral.
- Alertas diarias de vacantes nuevas con el **modo monitor**.

**Entrada mínima**:

```json
{ "queries": ["contador"], "countries": ["CO"], "maxJobsPerSearch": 30 }
```

Puedes añadir ciudades (`locations`), filtros por fecha (`datePosted`), tipo de empleo, solo remotos o solo con salario.

**Confiabilidad**: usa el proxy GOOGLE_SERP de Apify (sin navegador, 256 MB) y reintenta con una sesión nueva. En las pruebas en la plataforma, 0 páginas se perdieron (un timeout se recuperó solo). Elimina duplicados entre portales.

**Precio**: **US$0.002 por empleo** (US$2 por 1.000) + **US$0.005 por ejecución**. El proxy está incluido.

**Limitaciones**:

- Google muestra unos 10 empleos por página. Para conseguir más, el Actor hace búsquedas relacionadas (ciudades principales, "remoto", "junior"…), así que en búsquedas muy específicas puede traer menos de lo pedido.
- El salario aparece solo si el portal lo publica.
- La conversión a USD es una estimación con tasas del día.

# Actor input Schema

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

Job titles or keywords, in Spanish or Portuguese (e.g. "desarrollador python", "contador", "vendedor", "desenvolvedor"). Each query is searched in every selected country/location.

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

ISO country codes or presets. Brazil is searched in Portuguese automatically, the rest in Latin American Spanish.

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

Optional cities or regions, e.g. "Bogotá", "Medellín". Each location replaces the country name in the search, so list cities of the selected country (use one country when you add cities). Empty = whole country.

## `language` (type: `string`):

Interface language sent to Google. Auto is recommended.

## `maxJobsPerSearch` (type: `integer`):

Maximum jobs saved per query × location × country. Google shows ~10 jobs per results page, so the Actor runs extra related searches (e.g. "... remoto", "... junior") and de-duplicates until this number is reached or results run out.

## `maxPagesPerSearch` (type: `integer`):

Upper bound of Google result pages (related searches) fetched per query × location × country.

## `maxTotalJobs` (type: `integer`):

Stop the whole run after this many jobs.

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

Keep only jobs posted within this period (based on Google's "hace X días" label; jobs without a date are dropped when a filter is set).

## `employmentTypes` (type: `array`):

Keep only these employment types (empty = all).

## `remoteOnly` (type: `boolean`):

Adds "remoto" to searches and keeps only jobs marked as remote / work from home.

## `onlyWithSalary` (type: `boolean`):

Keep only jobs where Google shows a salary.

## `includeDescription` (type: `boolean`):

Include the full job description and highlights (requirements, responsibilities).

## `resolveApplyLinks` (type: `boolean`):

Turn Google's redirect links into the real portal/employer URLs (LinkedIn, Computrabajo, Indeed, Gupy...).

## `monitorMode` (type: `boolean`):

Remember jobs from previous runs (in a named key-value store) and output only jobs not seen before. Ideal for scheduled daily runs.

## `monitorKey` (type: `string`):

Name for this monitor. Use different keys to keep independent histories for different schedules.

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

Apify Proxy GOOGLE_SERP group is required for reliable results (Google serves JavaScript-only pages to normal IPs). Included in all Apify plans.

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

Parallel searches.

## `maxRetries` (type: `integer`):

Retries with a fresh proxy session when a page times out or comes back invalid.

## Actor input object example

```json
{
  "queries": [
    "desarrollador python"
  ],
  "countries": [
    "CO"
  ],
  "language": "auto",
  "maxJobsPerSearch": 30,
  "maxPagesPerSearch": 8,
  "maxTotalJobs": 0,
  "datePosted": "ANY",
  "remoteOnly": false,
  "onlyWithSalary": false,
  "includeDescription": true,
  "resolveApplyLinks": true,
  "monitorMode": false,
  "monitorKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  },
  "maxConcurrency": 5,
  "maxRetries": 4
}
```

# Actor output Schema

## `overview` (type: `string`):

All scraped jobs.

## `salaries` (type: `string`):

Parsed salaries normalised to USD.

## `details` (type: `string`):

Descriptions and all apply options.

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

Jobs saved, new jobs (monitor), duplicates, page success rate, timings, FX source and per-search stats.

# 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 = {
    "queries": [
        "desarrollador python"
    ],
    "countries": [
        "CO"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "GOOGLE_SERP"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jgapis/google-jobs-latam-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 = {
    "queries": ["desarrollador python"],
    "countries": ["CO"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["GOOGLE_SERP"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jgapis/google-jobs-latam-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 '{
  "queries": [
    "desarrollador python"
  ],
  "countries": [
    "CO"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "GOOGLE_SERP"
    ]
  }
}' |
apify call jgapis/google-jobs-latam-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jgapis/google-jobs-latam-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/DwmnmxhHDEju4JlQ0/builds/TkVc2Ql9ndHglQTMt/openapi.json
