# Bumeran Scraper — 8 LATAM Job Boards in One Actor (`unfenced-group/bumeran-scraper`) Actor

Scrape all 8 Bumeran Group job boards across 7 LATAM countries. Keyword, location, sector & modality filters. Skills, screening questions, expiry dates.

- **URL**: https://apify.com/unfenced-group/bumeran-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 35 total users, 7 monthly users, 46.2% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Bumeran Group Scraper

![Bumeran Group Scraper — 8 LATAM Job Boards](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/bumeran-scraper)

Extract structured job listings from all **8 Bumeran Group brands** across 7 Latin American countries — Argentina (Bumeran + ZonaJobs), Chile (Laborum), Ecuador (Multitrabajos), Mexico (Bumeran), Panama (Konzerta), Peru (Bumeran), and Venezuela (Bumeran). 52,000+ active listings combined. No API key required.

***

### Why this scraper?

#### 🌎 8 brands, 7 countries — one actor

Switch between Bumeran Argentina, ZonaJobs, Laborum (Chile), Multitrabajos (Ecuador), Bumeran Mexico, Konzerta (Panama), Bumeran Peru, and Bumeran Venezuela with a single input field.

#### ⚡ Zero proxy cost

All brands respond without a proxy from standard datacenter IPs. No residential proxy fees — ever.

#### 🔍 Rich filtering

Filter by keyword, province/region, job sector, employment type (full-time, part-time, by the hour), and work modality (remote, hybrid, on-site).

#### 📄 Full job details on demand

Enable `fetchDetails` to retrieve the complete HTML job description, seniority level, contract type, education requirements, and employer benefits for each listing.

#### 🔁 90-day cross-run deduplication

A persistent repost memory across runs flags jobs you have already collected and lets you skip them — essential for daily-feed pipelines.

#### 🛡️ Self-healing with circuit breaker

Automatic retry with exponential backoff, circuit breaker to stop on sustained failures, and a health signal written to the KV store after every run.

***

### Brands covered

| Brand | Domain | Country | Listings |
|-------|--------|---------|----------|
| Bumeran | bumeran.com.ar | 🇦🇷 Argentina | 10,000+ |
| ZonaJobs | zonajobs.com.ar | 🇦🇷 Argentina | 10,000+ |
| Laborum | laborum.cl | 🇨🇱 Chile | 16,000+ |
| Multitrabajos | multitrabajos.com | 🇪🇨 Ecuador | 5,700+ |
| Bumeran | bumeran.com.mx | 🇲🇽 Mexico | 2,100+ |
| Konzerta | konzerta.com | 🇵🇦 Panama | 2,800+ |
| Bumeran | bumeran.com.pe | 🇵🇪 Peru | 34,000+ |
| Bumeran | bumeran.com.ve | 🇻🇪 Venezuela | 600+ |

***

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `keyword` | string | `""` | Job title, skill, or keyword. Leave empty to browse all listings. |
| `brand` | select | `bumeran-ar` | Which brand/country to scrape. See brands table above. |
| `location` | string | `""` | Province semantic ID, e.g. `argentina\|buenos-aires`. Leave empty for all regions. |
| `workArea` | string | `""` | Sector semantic ID, e.g. `sistemas-y-tecnologia`. Leave empty for all sectors. |
| `workType` | select | `""` | Employment type: `full-time`, `part-time`, `por-horas`, or empty for all. |
| `workModality` | select | `""` | Work modality: `presencial`, `hibrido`, `remoto`, or empty for all. |
| `daysOld` | integer | `0` | Only return jobs posted within this many days. `0` disables the filter. Values 1–3 use the platform native filter; higher values apply client-side filtering. |
| `maxResults` | integer | `100` | Maximum number of listings to return. |
| `fetchDetails` | boolean | `false` | Fetch full description, seniority, contract type, education, and benefits per listing (~1 extra request per job). |
| `skipReposts` | boolean | `false` | Skip jobs already seen in previous runs (90-day memory). |
| `startUrls` | array | `[]` | Specific job page URLs to scrape directly, bypassing the search. |
| `requestDelayMs` | integer | `1000` | Minimum delay between requests in milliseconds. |
| `respectRobotsTxt` | boolean | `true` | Honour `Crawl-delay` from robots.txt. |

***

### Output schema

#### Always present

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique Bumeran job ID. |
| `url` | string | Full URL to the job listing page. |
| `title` | string | Job title as published. |
| `company` | string|null | Employer name. `null` for confidential listings. |
| `isConfidential` | boolean | `true` when the employer name is hidden. |
| `brand` | string | Source brand/domain key, e.g. `bumeran.com.ar`. |
| `city` | string|null | City where the job is located. |
| `province` | string|null | Province or state. |
| `countryName` | string|null | Country name (full text). |
| `workType` | string|null | Employment type, e.g. `Full-time`. |
| `workModality` | string|null | Work modality, e.g. `Remoto`. |
| `vacancies` | integer|null | Number of open positions (null if not specified by employer). |
| `isAccessible` | boolean | `true` if the position is open to candidates with disabilities. |
| `planType` | string|null | Bumeran publication plan tier. |
| `publishDate` | string|null | Publication date in `YYYY-MM-DD` format. |
| `publishDateISO` | string|null | Publication date and time in ISO 8601 format. |
| `descriptionText` | string|null | Short plain-text card summary. Full description requires `fetchDetails: true`. |
| `descriptionHtml` | null | `null` without `fetchDetails: true`. |
| `descriptionMarkdown` | null | `null` without `fetchDetails: true`. |
| `area` | null | Job sector — populated with `fetchDetails: true`. |
| `subArea` | null | Job sub-sector — populated with `fetchDetails: true`. |
| `seniority` | null | Seniority level — populated with `fetchDetails: true`. |
| `contractType` | null | Contract type — populated with `fetchDetails: true`. |
| `educationLevel` | null | Education requirement — populated with `fetchDetails: true`. |
| `benefits` | array | Always `[]` without `fetchDetails: true`. |
| `isRepost` | boolean | `true` if this job was seen in a previous run. |
| `originalPublishDate` | string|null | ISO date of first observation (non-null for reposts). |
| `originalUrl` | string|null | URL from first observation (non-null for reposts). |
| `contentHash` | string | 16-character MD5 fingerprint for change detection. |
| `source` | string | Source domain URL, e.g. `https://www.bumeran.com.ar`. |
| `scrapedAt` | string | ISO 8601 timestamp when this record was collected. |

#### With `fetchDetails: true`

| Field | Type | Description |
|-------|------|-------------|
| `descriptionHtml` | string|null | Full job description as raw HTML. |
| `descriptionText` | string|null | Full job description as plain text (tags stripped). |
| `descriptionMarkdown` | string|null | Full job description converted to Markdown. |
| `area` | string|null | Job sector, e.g. `Sistemas y Tecnología`. |
| `subArea` | string|null | Job sub-sector, e.g. `Desarrollo de Software`. |
| `seniority` | string|null | Seniority level, e.g. `Senior / Semi-Senior`. |
| `contractType` | string|null | Contract type, e.g. `Indeterminado`. Null if not specified by employer. |
| `educationLevel` | string|null | Minimum education required, e.g. `Universitario`. |
| `benefits` | array | Standardised list of employer benefit names, e.g. `["Prepaga médica", "Home office"]`. |

#### Example output record

```json
{
  "id": "1118272121",
  "url": "https://www.bumeran.com.ar/empleos/python-engineer-genai-mercado-libre-1118272121.html",
  "title": "Python Software Engineer (GenAI)",
  "company": "Mercado Libre",
  "isConfidential": false,
  "brand": "bumeran.com",
  "city": "Capital Federal",
  "province": "Buenos Aires",
  "countryName": "Argentina",
  "workType": "Full-time",
  "workModality": "Remoto",
  "vacancies": 3,
  "isAccessible": false,
  "planType": "publicacion-premium",
  "publishDate": "2026-05-01",
  "publishDateISO": "2026-05-01T08:52:28.000Z",
  "descriptionHtml": "<p>We are looking for a Senior Python Engineer to join our GenAI team...</p>",
  "descriptionText": "We are looking for a Senior Python Engineer to join our GenAI team...",
  "descriptionMarkdown": "We are looking for a Senior Python Engineer to join our GenAI team...",
  "area": "Sistemas y Tecnología",
  "subArea": "Desarrollo de Software",
  "seniority": "Senior / Semi-Senior",
  "contractType": "Indeterminado",
  "educationLevel": "Universitario",
  "benefits": ["Prepaga médica", "Home office", "Bono anual"],
  "isRepost": false,
  "originalPublishDate": null,
  "originalUrl": null,
  "contentHash": "a1b2c3d4e5f67890",
  "source": "https://www.bumeran.com.ar/",
  "scrapedAt": "2026-05-01T10:00:00.000Z"
}
```

***

### Examples

**Tech jobs in Buenos Aires (Argentina):**

```json
{
  "keyword": "programador",
  "brand": "bumeran-ar",
  "location": "argentina|buenos-aires",
  "workModality": "remoto",
  "maxResults": 200,
  "fetchDetails": true
}
```

**Full-time jobs in Chile with details:**

```json
{
  "keyword": "marketing digital",
  "brand": "laborum",
  "workType": "full-time",
  "workModality": "hibrido",
  "daysOld": 7,
  "maxResults": 100,
  "fetchDetails": true
}
```

**Scrape specific job URLs directly:**

```json
{
  "brand": "bumeran-pe",
  "startUrls": [
    { "url": "https://www.bumeran.com.pe/empleos/data-analyst-empresa-xyz-1118100001.html" },
    { "url": "https://www.bumeran.com.pe/empleos/devops-engineer-acme-1118200002.html" }
  ],
  "fetchDetails": true
}
```

**Daily new-listings feed (schedule this run daily):**

```json
{
  "brand": "bumeran-ar",
  "workArea": "sistemas-y-tecnologia",
  "daysOld": 1,
  "skipReposts": true,
  "maxResults": 500
}
```

***

### 💰 Pricing

**$0.99 per 1,000 results** — you only pay for successfully retrieved listings. Failed retries and filtered reposts are never charged.

| Results | Cost |
|---------|------|
| 100 | ~$0.10 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.90 |
| 100,000 | ~$99.00 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | No `fetchDetails` | With `fetchDetails` |
|----------|-------------------|---------------------|
| 100 jobs | ~15 sec | ~2 min |
| 500 jobs | ~1 min | ~8 min |
| 2,000 jobs | ~3 min | ~30 min |
| 10,000 jobs | ~12 min | ~2.5 hr |

***

### Known limitations

- Publication date filtering is natively limited to 1, 2, or 3 days. Values above 3 use client-side filtering, which may slightly reduce throughput.
- Salary data is not published by the vast majority of employers on Bumeran Group platforms and is therefore not included in the output.
- Benefits, seniority, contract type, and education requirements are only available with `fetchDetails: true`.
- Contact details (recruiter name, email, phone) are not included in output in compliance with PII policy.
- ZonaJobs and Bumeran Argentina share the same listing database — running both will return duplicate jobs.

***

### Technical details

- **Source:** bumeran.com.ar / zonajobs.com.ar / laborum.cl / multitrabajos.com / bumeran.com.mx / konzerta.com / bumeran.com.pe / bumeran.com.ve
- **Memory:** 512 MB
- **Repost storage:** KeyValueStore `bumeran-scraper-job-dedup`, 90-day TTL
- **Retry:** Automatic retry on network errors, exponential backoff, 3 attempts per request

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

### Related scrapers

Other scrapers in our **Jobs — Americas** collection:

- [Computrabajo.com Job Scraper](https://apify.com/unfenced-group/computrabajo-com-job-scraper)
- [Gupy.io Scraper — Brazil Job Board](https://apify.com/unfenced-group/gupy-scraper)
- [Eluta.ca Scraper](https://apify.com/unfenced-group/eluta-ca-scraper)

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Job title, skill, or keyword. Leave empty to browse all listings.

## `brand` (type: `string`):

Which Bumeran Group brand to scrape.

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

Province semantic ID, e.g. 'argentina|buenos-aires'. Leave empty for all regions.

## `workArea` (type: `string`):

Sector semantic ID, e.g. 'sistemas-y-tecnologia'. Leave empty for all sectors.

## `workType` (type: `string`):

Filter by employment type. Leave empty for all types.

## `workModality` (type: `string`):

Filter by work modality.

## `sort` (type: `string`):

Sort search results. RECIENTES = newest first. RELEVANTES = most relevant first.

## `daysOld` (type: `integer`):

Only return jobs posted within this many days. 0 disables the filter. Values 1–3 use the platform native filter; higher values apply client-side filtering.

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

Maximum number of job listings to return.

## `fetchDetails` (type: `boolean`):

ON: fetches full job description, salary, company info, and all details. OFF: returns basic listing info only (faster, lower cost).

## `skipReposts` (type: `boolean`):

Skip jobs already seen in previous runs (cross-run, 90-day memory).

## `onlyNew` (type: `boolean`):

Skip UNCHANGED and REPOST jobs — only emit listings with changeStatus=NEW. Ideal for daily feed pipelines where you only want genuinely new jobs.

## `compactMode` (type: `boolean`):

Strip null fields and empty arrays from output. Drops HTML and Markdown description variants (keeps plain text only). Produces ~60% smaller payloads — optimised for AI-agent and LLM pipelines.

## `maxDescriptionLen` (type: `integer`):

Truncate descriptionText to this many characters. 0 = no truncation. Only applies when compactMode is enabled.

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

Minimum delay between requests in milliseconds.

## `respectRobotsTxt` (type: `boolean`):

Honour Crawl-delay directive from robots.txt.

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

Specific Bumeran job page URLs to scrape directly, bypassing the search.

## Actor input object example

```json
{
  "searchQuery": "developer",
  "brand": "bumeran-ar",
  "location": "",
  "workArea": "",
  "workType": "",
  "workModality": "",
  "sort": "RECIENTES",
  "maxResults": 100,
  "fetchDetails": false,
  "skipReposts": false,
  "onlyNew": false,
  "compactMode": false,
  "maxDescriptionLen": 0,
  "requestDelayMs": 1000,
  "respectRobotsTxt": true,
  "startUrls": []
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "developer",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/bumeran-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 = {
    "searchQuery": "developer",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/bumeran-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 '{
  "searchQuery": "developer",
  "maxResults": 100
}' |
apify call unfenced-group/bumeran-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,unfenced-group/bumeran-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/6oucCBLUCmWr6IWeL/builds/PHep4Hfy4g2AioF9M/openapi.json
