# Bumeran Jobs Scraper (Argentina) + CUIT Company Match (`latsouth/bumeran-jobs-scraper`) Actor

Scrape Bumeran job postings in Argentina, Peru and Mexico (100 per request, newest first) with the hiring company joined to the official registry (CUIT, RUC, DENUE), match confidence and confidential flag. ES: avisos Bumeran con CUIT/RUC.

- **URL**: https://apify.com/latsouth/bumeran-jobs-scraper.md
- **Developed by:** [LatSouth Data](https://apify.com/latsouth) (community)
- **Categories:** Lead generation, Jobs
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job postings

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 Jobs Scraper: postings + the hiring company's registry record

**By [LatSouth](https://latsouth.com).** Scrape **Bumeran** job postings (Argentina, Peru, Mexico) and get each posting
normalized **plus the hiring company's record from the official company registry**, with the match method and a
confidence score. Or switch to `hiring_companies` mode and get **one row per company that is hiring** (open jobs,
areas, seniority, locations, latest posting): a ready-made hiring-intent signal for B2B prospecting.

Bumeran is a leading job board in Argentina and Peru (also Mexico). Postings carry the company name unless confidential, but no website, so the registry match is by exact company name; Mexico matches rarely because its registry (DENUE) lists establishment names.

| | |
|---|---|
| Board | Bumeran (Argentina, Peru, Mexico) |
| Registry AR | Registro Nacional de Sociedades (CUIT, legal name, legal form, CLAE activity) |
| Registry PE | SUNAT Padron RUC (RUC, legal name, CIIU activity, workers) |
| Registry MX | INEGI DENUE (establishment id, legal name, SCIAN activity, size bracket; no RFC) |
| Price | **US$0.0015 per posting** (`job-result`) · **US$0.008 per hiring company** (`company-result`) |
| Measured (real sample, N = 300 postings) | 11% postings hide the company · 26.9% AR, 38.9% PE, 2.6% MX of named companies matched · precision 30/30 on a manual review |

### Use cases

- **Hiring-intent prospecting**: companies opening sales, data or engineering roles this week, with tax id, size and
  activity, ready for outbound or account scoring.
- **Recruiting and HR-tech market maps**: who hires what, where, by seniority and workplace type.
- **Labour-market research**: postings by city, area and date, deduplicated across keywords.

### Input examples

**Postings of the last 7 days**

```json
{"keywords": ["analista contable", "vendedor"], "posted_within_days": 7, "max_results": 200, "sources": ["bumeran_ar", "bumeran_mx"]}
```

**Who is hiring (one row per company)**

```json
{"mode": "hiring_companies", "keywords": ["ventas", "ejecutivo comercial"], "max_jobs_scanned": 1000, "max_results": 200, "sources": ["bumeran_ar"]}
```

| Field | What it does |
|---|---|
| `mode` | `jobs` (default): one row per posting. `hiring_companies`: postings grouped by company. |
| `keywords` | One search per keyword; results deduplicated. Empty = newest postings. |
| `sources` | `bumeran_ar` / `bumeran_pe` / `bumeran_mx` (default `bumeran_ar` + `bumeran_mx`; `max_results` is split evenly). `bumeran_pe` answers HTTP 403 to cloud IPs (2026-11-05): selectable, reported as failed and not charged |
| `workplace_types` | `remote`, `hybrid`, `onsite` (empty = all) |
| `city` | City as written on the board |
| `posted_within_days` | Only postings of the last N days |
| `max_results` | Rows to return (postings or companies); you pay per row. Default 25: an empty input `{}` returns 25 postings (about US$0.05), each with the hiring company's registry match in `company`; company rows (`company-result`) come only in `hiring_companies` mode |
| `max_jobs_scanned` | `hiring_companies` mode: postings read before grouping (scanning is free) |
| `enrich` | Registry join (default `true`) |
| `include_description` | First 600 characters, HTML removed, e-mails and phone numbers scrubbed |
| `proxyConfiguration` | Optional Apify Proxy (default off), **datacenter only**: a `RESIDENTIAL` group or custom proxy URLs are rejected. IP location and request spreading only, no captcha or bot-challenge solving |

### Output

**Posting row** (`jobs` mode): `board`, `country`, `job_id`, `url`, `title`, `company_name` (as shown on the board; null
when confidential), `company_board_id`, `company_website`, `city`, `state`, `workplace_type`, `contract_type`,
`seniority` (from the title only), `published_at`, salary fields (only when the board shows a salary), `description`,
`accepts_pwd`, `scraped_at` and `company`. Fields a board does not publish are null.

**Company row** (`hiring_companies` mode): `company_name`, `career_page_url`, `company_website`, `n_open_jobs`,
`titles_sample`, `seniority_mix`, `workplace_mix`, `contract_mix`, `locations`, `most_recent_posting_at`,
`job_urls_sample` and `company`. Sorted by open jobs, then latest posting.

**`company` block**: `match_status` (`matched`, `low_confidence`, `ambiguous` with `candidate_tax_ids`, `not_found`,
`skipped`), `match_method`, `match_confidence` (0-1), `match_note`, then the registry record: `tax_id`,
`tax_id_formatted`, `legal_name`, `trade_name`, `legal_form`, `status`, activity code and label (local + ISIC), size,
region, city, `website`, `data_as_of`, `source`, `source_license`.

### How the registry match works on Bumeran

Order of evidence: the **exact company name** shown on the board, accepted only when exactly one registry company carries it (the board shows no company website).
A name or domain shared by several registry companies is never guessed: `ambiguous` with the candidates. Confidential
postings, and employers whose name is a private person's name (sole traders), are returned without a company name and
are never matched. Many postings are published by recruiting agencies: the match is then the agency (the poster).

### Data and compliance

Company data only. E-mail addresses, phone numbers and personal ids are scrubbed from descriptions; recruiter and
candidate data are never collected. No login, no captcha, at most 2 requests per second. Registry records carry their
official source and licence (`company.source`, `company.source_license`).

### Pricing

Pay per event: **US$0.0015 per posting** and **US$0.008 per hiring company**, plus the standard Apify actor start. The run
stops at your spending limit. Scanning postings in `hiring_companies` mode is free; you pay per company row.

**Never charged for a broken run**: if Bumeran blocks the run or changed its layout (the first search page cannot
be read and is not the board's own "no results" page), the run fails with that reason and nothing is charged; a search
that simply has no postings succeeds with 0 rows. With `enrich: true` and the registry unreachable, the run fails before
reading the board. In `jobs` mode rows are pushed as they are ready (the first ones after the first page).

### More boards

Need several boards in one run (Gupy, InfoJobs, Catho, Computrabajo, Bumeran, OCC)? Use
[LATAM Jobs & Hiring Signals](https://apify.com/latsouth/latam-jobs-hiring-signals): same output, all boards.

### En español

Extrae avisos de **Bumeran** (Argentina, Peru, Mexico) y recibe en cada aviso **el registro oficial de la empresa que contrata** (CUIT, RUC, NIT, RUT o DENUE según el país: razón social, actividad, tamaño) con método y confianza del match. En modo `hiring_companies`, una fila por empresa que contrata (vacantes abiertas, áreas, ciudades): señal de intención para prospección B2B. Los avisos confidenciales y los empleadores persona física salen sin nombre y sin match. Precio: US$0,0015 por aviso y US$0,008 por empresa.

# Actor input Schema

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

`jobs`: each posting with the hiring company's registry record. `hiring_companies`: postings grouped by company (number of open jobs, areas, seniority, locations, latest posting) = hiring-intent signal.

## `keywords` (type: `array`):

One search per keyword (Bumeran searches job titles), results deduplicated. Empty = newest postings of the whole board.

## `sources` (type: `array`):

Bumeran country boards to search (`max_results` is split evenly).

## `workplace_types` (type: `array`):

Empty = all.

## `city` (type: `string`):

Keep postings in this city only (as written on the board), e.g. Rosario.

## `posted_within_days` (type: `integer`):

Only postings published in the last N days. Empty = any date.

## `max_results` (type: `integer`):

Postings (jobs mode) or companies (hiring_companies mode) to return. You pay per row. Default 25: a first run costs about US$0.05 and every posting already carries the hiring company's registry record (`company`: tax id, legal name, size, activity).

## `max_jobs_scanned` (type: `integer`):

How many postings to read before grouping them by company. Scanning is free; you pay per company row.

## `enrich` (type: `boolean`):

Join each company to the official registry (AR, PE, MX) with match method and confidence.

## `include_description` (type: `boolean`):

First 600 characters, HTML removed, e-mails and phone numbers scrubbed.

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

Off by default (direct requests). Optional Apify Proxy, datacenter only (a RESIDENTIAL group or custom proxy URLs are rejected: only Apify datacenter proxy is supported), only to choose the IP location and spread the request rate. Same headers and the same limit of 2 requests per second either way; it does not solve captchas or bot challenges: a board that blocks the run is reported as failed, never worked around.

## Actor input object example

```json
{
  "mode": "jobs",
  "keywords": [
    "analista"
  ],
  "sources": [
    "bumeran_ar",
    "bumeran_mx"
  ],
  "max_results": 25,
  "max_jobs_scanned": 1000,
  "enrich": true,
  "include_description": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `rows` (type: `string`):

Download as JSON, CSV, Excel or XML via the dataset API (CSV flattens `company.*`).

## `summary` (type: `string`):

Pages and postings read per board, companies, enrichment status counts, timings, HTTP requests and whether the run stopped at the buyer's budget cap.

# 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 = {
    "keywords": [
        "analista"
    ],
    "max_results": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("latsouth/bumeran-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 = {
    "keywords": ["analista"],
    "max_results": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("latsouth/bumeran-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 '{
  "keywords": [
    "analista"
  ],
  "max_results": 25
}' |
apify call latsouth/bumeran-jobs-scraper --silent --output-dataset

```

## MCP server setup

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