# Vagas.com.br Scraper - Salary, Benefits, No Duplicates (`gio21/vagas-scraper`) Actor

Search Vagas.com.br by one or more Brazilian job keywords and get salary, benefits, contract type and full description per listing. $0.005 per job, no duplicate charges.

- **URL**: https://apify.com/gio21/vagas-scraper.md
- **Developed by:** [Gio](https://apify.com/gio21) (community)
- **Categories:** Jobs
- **Features:** Limited permissions
- **Stats:** 17 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 job scrapeds

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

## Vagas.com.br Scraper - Salary, Benefits, No Duplicates

### Why use this scraper

Vagas.com.br is one of Brazil's oldest and largest job boards, and its
listings carry details (disclosed salary ranges, full benefit lists,
contract type) that recruiters, researchers and job aggregators need in
bulk, not one tab at a time. Vagas.com.br has no public API, so pulling
that data at scale means scraping the site and keeping the scraper working
as its pages change. This actor does that for you: give it one or more
Brazilian job-search keywords and get back every matching listing as
clean JSON, with full detail pages included when you want them.

### Overview

Input is a list of search keywords. Output is one JSON item per job
listing found for each keyword, with duplicate job IDs across keywords or
pages automatically detected and skipped so you are never billed twice
for the same listing. With `includeDetails` on, the actor opens each
job's own page to pull the full description, benefits and contract type;
with it off, it reads only the search result cards, which is faster and
cheaper when you just need titles, companies and locations.

### Supported inputs

- **searchTerms** (required array, e.g. `["desenvolvedor", "analista de
  dados", "marketing"]`) - each term runs its own search on Vagas.com.br;
  results from all terms land in the same dataset, tagged with the term
  that found them.
- **maxItems** - caps how many listings come back in total (0 for no
  limit).
- **includeDetails** - `true` visits each job's detail page for full
  description, benefits and contract type; `false` returns only what the
  search results list shows, for a faster and cheaper run.
- **proxy** - optional; Vagas.com.br generally works without one, but
  residential proxy can be enabled for reliability.

### Use cases

- **Job market research:** track which roles, skills and seniority levels
  Brazilian employers are hiring for right now, by keyword.
- **Recruiting and sourcing:** build a live feed of open positions for a
  role to map which companies are actively hiring.
- **Salary benchmarking:** collect the salary ranges that employers choose
  to disclose, by role, region and contract type.
- **Lead generation:** identify companies hiring for roles related to your
  product or service and reach out while the need is live.
- **Talent analytics dashboards:** feed structured listings into a BI tool
  to track hiring demand and location trends over time.
- **Competitive hiring intelligence:** watch a specific competitor's open
  roles by running their known hiring keywords on a schedule, to see
  where and how fast they are growing a team.

### How it works

The actor searches Vagas.com.br for each keyword you provide and reads the
result pages directly from the site's own listing data rather than
scraping rendered text, which keeps fields consistent even when the page
design changes. When `includeDetails` is on, it visits each individual
job page in turn to pull the full description, the complete benefits
list and contract type, then merges that into the same record as the
search result fields. A job ID seen more than once, whether from
pagination or from overlapping keywords, is recorded once and never
billed twice.

### Input configuration

Single keyword, full details:

```json
{
  "searchTerms": ["desenvolvedor"],
  "maxItems": 50,
  "includeDetails": true
}
```

Multiple keywords in one run:

```json
{
  "searchTerms": ["desenvolvedor", "analista de dados", "marketing"],
  "maxItems": 100,
  "includeDetails": true
}
```

Fast, lighter run without detail pages:

```json
{
  "searchTerms": ["recursos humanos"],
  "maxItems": 30,
  "includeDetails": false
}
```

### Output sample

Real items from a production run (October 2026), keyword
`"desenvolvedor"`:

```json
[
  {
    "id": "v2835043",
    "url": "https://www.vagas.com.br/vagas/v2835043/desenvolvedor-java",
    "title": "Desenvolvedor Java",
    "company": "Synchro",
    "seniorityLevel": "Pleno",
    "location": "100% Home Office",
    "salary": "a combinar",
    "contractType": "Regime CLT",
    "description": "Descricao: A Synchro Solucoes Fiscais esta em busca de um(a) Desenvolvedor(a) Java para fazer parte do nosso time de tecnologia...",
    "requirements": null,
    "benefits": [],
    "publishedDate": "15/09/2026",
    "searchTerm": "desenvolvedor",
    "scrapedAt": "2026-10-03T09:31:32.408Z"
  },
  {
    "id": "v2831921",
    "url": "https://www.vagas.com.br/vagas/v2831921/desenvolvedor-a-backend-net-senior-c",
    "title": "Desenvolvedor(a) Backend .net Senior | C#",
    "company": "be3 health tech",
    "seniorityLevel": "Senior",
    "location": "Sao Paulo A empresa aceita apenas candidaturas de Sao Paulo",
    "salary": "a combinar",
    "contractType": "Pessoa Juridica",
    "description": "Descricao: Atividades e Responsabilidades A Be3 Health Tech esta em busca de um(a) Desenvolvedor(a) Full Stack Senior, com forte atuacao em Backend...",
    "requirements": null,
    "benefits": [],
    "publishedDate": "24/08/2026",
    "searchTerm": "desenvolvedor",
    "scrapedAt": "2026-10-03T09:31:35.105Z"
  }
]
```

### Key output fields

| Field | Type | Description |
|---|---|---|
| `id` | string | Vagas.com.br's own job id (e.g. `v2835043`). |
| `url` | string | Direct link to the listing. |
| `title` | string | Job title as posted. |
| `company` | string | Employer name, or `"Confidencial"` when the employer withholds it. |
| `seniorityLevel` | string | Seniority as classified by the listing (e.g. Pleno, Senior, Junior/Trainee). |
| `location` | string | Work location or remote-work note. |
| `salary` | string | Disclosed salary range, or `"a combinar"` when the employer does not disclose it. |
| `contractType` | string | Regime CLT, Pessoa Juridica, or other contract type listed. |
| `description` | string | Full job description (requires `includeDetails: true`). |
| `requirements` | null | Always `null`; Vagas.com.br folds requirements text into `description` rather than a separate field. |
| `benefits` | array | List of disclosed benefits (requires `includeDetails: true`); empty otherwise. |
| `publishedDate` | string | Date the listing was published, as shown on the site. |
| `searchTerm` | string | The keyword that found this listing. |
| `scrapedAt` | string | ISO timestamp of when the item was scraped. |

### Pricing

| Event | Price |
|---|---|
| Job scraped (each listing returned) | $0.005 |

Pay per result only. Duplicate job IDs found again across pages or
keywords are skipped and never billed twice.

### What makes this richer than the competition

Two other scrapers on the Apify Store cover Vagas.com.br, by users in the
last 30 days: `viralanalyzer/brazil-jobs-scraper` (34, which spans Vagas
plus InfoJobs, Gupy, APInfo and LinkedIn Jobs at the same $0.005 per job)
and `latinamericadata/gupy-vagas-brasil` (6, cheaper at $0.003 per result
but focused primarily on Gupy). This actor is built specifically for
Vagas.com.br with built-in duplicate protection across keywords and pages,
so running several related search terms in one call never double-charges
for the same listing, and the `includeDetails` toggle lets you choose
between a fast, cheap listing-only pull or the full job page with
benefits and contract type, in the same input.

### Notes & limitations

- `requirements` is always `null`; Vagas.com.br does not separate
  requirements from the job description, so that text lives inside
  `description` instead.
- `salary`, `contractType`, full `description` and `benefits` are only
  populated when `includeDetails` is `true`. With it `false`, those fields
  come back `null` or empty and the run is faster and cheaper.
- `salary` reflects only what the employer chose to disclose on the
  listing; most Brazilian job posts show `"a combinar"` (negotiable)
  instead of a number.
- Results reflect Vagas.com.br's own search ranking and relevance for
  each keyword; the actor does not re-sort or filter results itself.
- `company` returns `"Confidencial"` when the employer chose not to
  disclose its name on the listing, which is common for recruiting
  agencies posting on a client's behalf; this is the site's own label,
  not a scraping gap.

### FAQ

**Can I search for more than one role in a single run?**
Yes, `searchTerms` accepts a list; every result is tagged with the exact
keyword that found it.

**Why is `salary` often `"a combinar"`?**
Brazilian employers frequently choose not to publish a number. The field
returns the site's own text, which is `"a combinar"` (negotiable) when no
figure is given.

**Does `includeDetails: false` still return the full job description?**
No, only the fields visible on the search result card (title, company,
seniority, location, published date). Turn `includeDetails` on for the
full description and benefits.

**Will I be charged twice if two keywords return the same job?**
No, job IDs are deduplicated automatically across keywords and pages
within a run.

**Can I filter by city or remote work before scraping?**
Not as a separate input field; filter the `location` field in the output
after the run, or use a more specific search keyword.

**Does the actor stop at the first page of results?**
No, it paginates through Vagas.com.br's results automatically for each
keyword until it reaches `maxItems` or runs out of listings.

### For AI Agents & LLM Apps

This actor is callable directly from an MCP-compatible client at
`mcp.apify.com`, or via the standard Apify API. Example with the
run-sync-get-dataset-items endpoint, which runs the actor and returns the
dataset items in one call:

```bash
curl "https://api.apify.com/v2/acts/gio21~vagas-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["desenvolvedor"], "maxItems": 50, "includeDetails": true}'
```

### Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by,
or sponsored by Vagas.com.br or any of its subsidiaries. All trademarks
mentioned are the property of their respective owners.

### SEO Keywords

vagas.com.br scraper, brazilian jobs scraper, vagas scraper api, brazil
job listings api, vagas emprego scraper, brazilian job board data

# Actor input Schema

## `searchTerms` (type: `array`):

List of job search keywords (e.g., 'desenvolvedor', 'analista de dados', 'marketing'). Each term generates a separate search on Vagas.com.br.

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

Maximum number of job listings to scrape. Set 0 for unlimited.

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

When enabled, the scraper visits each job's detail page to extract full description, benefits, salary, and contract type. Slower but richer data.

## `proxy` (type: `object`):

Proxy settings. Vagas.com.br generally works without proxies, but you can enable them for reliability.

## Actor input object example

```json
{
  "searchTerms": [
    "desenvolvedor",
    "analista de dados"
  ],
  "maxItems": 50,
  "includeDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchTerms": [
        "desenvolvedor"
    ],
    "maxItems": 50,
    "includeDetails": true,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gio21/vagas-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 = {
    "searchTerms": ["desenvolvedor"],
    "maxItems": 50,
    "includeDetails": True,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("gio21/vagas-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 '{
  "searchTerms": [
    "desenvolvedor"
  ],
  "maxItems": 50,
  "includeDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call gio21/vagas-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gio21/vagas-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/z45yE7meQAnoZS1Yn/builds/4gfIw3m95TzaxfOlj/openapi.json
