# Bumeran LATAM Jobs Scraper (`1mp/bumeran-jobs`) Actor

Public job postings from Bumeran, Laborum, Multitrabajos, Konzerta and ZonaJobs in 7 LATAM countries: keyword and country in, one row per posting with company, location, salary when shown and description. $1 per 1,000 jobs.

- **URL**: https://apify.com/1mp/bumeran-jobs.md
- **Developed by:** [Jesse Hawkins](https://apify.com/1mp) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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/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

## Bumeran LATAM Jobs Scraper

Public job postings from the Bumeran group's job boards in seven
Latin American countries. Give a keyword and a country; get one row
per posting with title, company, location, work modality, job type,
area, seniority, dates, the salary when the posting shows one, the
full description and the posting's URL.

It asks the same JSON API the sites' own search pages call, so there
is no browser and no HTML parsing. $1.00 per 1,000 postings.

| `country` | Board | Site |
|---|---|---|
| `AR` | Bumeran Argentina, with ZonaJobs postings | www.bumeran.com.ar |
| `CL` | Laborum | www.laborum.cl |
| `EC` | Multitrabajos | www.multitrabajos.com |
| `MX` | Bumeran Mexico | www.bumeran.com.mx |
| `PA` | Konzerta | www.konzerta.com |
| `PE` | Bumeran Peru | www.bumeran.com.pe |
| `VE` | Bumeran Venezuela | www.bumeran.com.ve |

### Input

```json
{
  "query": "developer",
  "country": "AR",
  "location": "Buenos Aires",
  "sort": "RECIENTES",
  "maxResults": 100,
  "includeDetails": true
}
```

- **query**: the words you would type in the site's search box. For
  several searches in one run, a JSON array:
  `["python developer", "data engineer"]`. A posting two searches
  find is returned once. Empty returns every posting on the board.
- **country**: `AR`, `CL`, `EC`, `MX`, `PA`, `PE` or `VE`.
- **location**: optional. A province or region the site lists for
  the search, such as `Córdoba`, `Lima` or `Jalisco`; accents and
  case do not matter. A name that is not a listed province (a city,
  say) is matched against each posting's location text instead.
- **sort**: `RELEVANTES` (the site's order) or `RECIENTES` (newest).
- **maxResults**: stop after this many postings across all searches.
  `0` returns every posting the searches list. This is your cost
  control.
- **includeDetails**: on by default. One more request per posting
  adds the description's paragraphs, subarea, seniority, contract
  type, expiry date, company industry and size, and the salary. Same
  price. Off is faster; the description still comes back, as one
  paragraph.
- **descriptionMaxLength**: cut each description to this many
  characters. `0` keeps it whole.
- **compact**: only `id`, `title`, `company`, `location`, `country`,
  `modality`, `type`, `publishedAt`, the salary fields and `url`.
  For AI agents and small payloads.
- **proxyConfiguration**: off by default. See "Routes" below.

The input names are the ones the most-used Bumeran Actor on the
Store takes, so an existing input runs unchanged. Its incremental
mode and notification fields are accepted and ignored.

### Output

One row per posting. A real row from 2026-10-04, description cut:

```json
{
  "id": 1118458287,
  "title": "IoT Developer",
  "company": "NUMAN Headhunter Industrial",
  "companyId": 13024592,
  "isConfidential": false,
  "location": "General Pacheco, Buenos Aires",
  "city": "General Pacheco",
  "province": "Buenos Aires",
  "country": "AR",
  "modality": "Presencial",
  "type": "Full-time",
  "area": "Producción y Manufactura",
  "subarea": "Otra",
  "seniority": "Semi Sr",
  "contractType": "Indeterminado",
  "vacancies": 1,
  "publishedAt": "2026-09-28T10:33:05",
  "modifiedAt": "2026-09-30T20:01:19",
  "expiresAt": "2026-11-27",
  "salaryMin": null,
  "salaryMax": null,
  "salaryPeriod": null,
  "salaryType": null,
  "currency": null,
  "companyIndustry": "Consultora de Recursos Humanos",
  "companySize": "Entre 1 y 10",
  "isDisabilityFriendly": false,
  "quickApply": false,
  "url": "https://www.bumeran.com.ar/empleos/iot-developer-numan-headhunter-industrial-1118458287.html",
  "portal": "bumeran",
  "site": "www.bumeran.com.ar",
  "description": "Reportando al Líder de Desarrollo, sus...",
  "searchQuery": "developer",
  "detailFetched": true
}
```

- **Salary** fields are filled only when the posting's own page
  shows a salary, as it shows it: `salaryMin`, `salaryMax`,
  `salaryPeriod` (`month`, `hour`...), `salaryType` (`gross` or
  `net`) and `currency`, the code the site's page uses for that
  country (ARS, CLP, USD, MXN, PAB, PEN, VES). They need
  `includeDetails`.
- **company** is `confidential` when the employer hides its name,
  as the site does. It is the name the employer's account publishes.
- **Dates** are the site's own local time, as it shows them.
- **portal** is `zonajobs` for the ZonaJobs postings Bumeran
  Argentina's search returns; their `url` is on www.zonajobs.com.ar.
- **detailFetched** is `false` when the detail request was refused
  or `includeDetails` was off; the row then carries the search
  fields only.

### Price

$1.00 per 1,000 postings returned: $0.001 a row. Details cost
nothing extra. Searches that find nothing cost nothing.

### Routes

Requests go from Apify's own IP first. On 2026-10-04 Argentina,
ZonaJobs, Mexico, Panama and Venezuela answered every request that
way. Chile, Ecuador and Peru answered Apify's own IP with a
Cloudflare challenge and answered every request through Apify Proxy,
so for those the Actor moves to Apify Proxy (data-centre, then
residential) by itself after the first refusal. That proxy is on us,
not on your bill. If you set your own proxy, it replaces Apify Proxy.

The run's status message counts the replies by route, so a refused
run explains itself.

### What it will not do

- **No personal data.** It reads no recruiter or contact field.
  E-mail addresses, phone numbers, WhatsApp links and personal
  LinkedIn profile links inside descriptions and titles are replaced
  with `[removed]`. Money amounts, dates and years stay.
- No candidate profiles, no applying, nothing behind a login.
- No incremental mode or alerts. Schedule a run and compare `id`s.

### Limits

- The sites page their search 20 postings at a time; the Actor
  pauses about a second between pages, and asks for details three
  at a time.
- A location that is not a listed province reads at most 25 pages
  of the search.
- Postings leave the site when they expire; a run returns what the
  site lists at that moment.

Questions or a field you need: open an issue on the Issues tab. We
answer within 14 days. Not affiliated with Bumeran, Laborum,
Multitrabajos, Konzerta or ZonaJobs.

# Actor input Schema

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

What to search for, as on the site's own search box, e.g. developer, analista, ventas. Several searches in one run: a JSON array, e.g. \["developer", "data engineer"]; a posting found by two searches is returned once. Empty: every posting on the board, newest or most relevant first.

## `country` (type: `string`):

Which board to search: AR bumeran.com.ar (with its sister board ZonaJobs), CL laborum.cl, EC multitrabajos.com, MX bumeran.com.mx, PA konzerta.com, PE bumeran.com.pe, VE bumeran.com.ve.

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

Optional. A province or region the site lists for your search, e.g. Buenos Aires, Córdoba, Lima, Jalisco. Accents and case do not matter. A name the site does not list as a province is matched against each posting's location text instead.

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

RELEVANTES: the site's relevance order. RECIENTES: newest first.

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

Stop after this many postings across all searches. 0 returns every posting the searches list. Each posting returned is one billed result.

## `includeDetails` (type: `boolean`):

On (default): one more request per posting adds the description's paragraphs, subarea, seniority, contract type, expiry date, company industry and size, and the salary when the posting shows one. Same price. Off: faster; the description is still returned, as one paragraph.

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

Cut each description to this many characters. 0 keeps the whole text.

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

On: each row carries only id, title, company, location, country, modality, type, publishedAt, salaryMin, salaryMax, salaryPeriod, currency and url. For AI agents and small payloads.

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

Off by default: requests go from Apify's own IP. Set Apify Proxy here only if runs are refused; it is then tried after the direct route.

## Actor input object example

```json
{
  "query": "developer",
  "country": "AR",
  "sort": "RELEVANTES",
  "maxResults": 20,
  "includeDetails": true,
  "descriptionMaxLength": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Every posting found, one item each, as JSON from the run's default dataset.

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

The same postings in the dataset's overview view: title, company, location, modality, type, area, published date, salary and URL.

# 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": "developer",
    "country": "AR",
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("1mp/bumeran-jobs").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": "developer",
    "country": "AR",
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("1mp/bumeran-jobs").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": "developer",
  "country": "AR",
  "maxResults": 20
}' |
apify call 1mp/bumeran-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,1mp/bumeran-jobs"
        }
    }
}
```

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/BaPhQEmTJKoC47W9G/builds/FRxpVxL5S182z5eop/openapi.json
