# Gupy Jobs Scraper: Brazil Company Vacancies | $1/1K (`one_dollar_store/gupy-jobs-scraper`) Actor

$1 per 1,000 results, platform usage included. Job vacancies from Gupy in Brazil: title, company, city, state, workplace type, contract type, posting date, deadline, apply link and full text. Filter by keyword, state, city and remote work. No login.

- **URL**: https://apify.com/one_dollar_store/gupy-jobs-scraper.md
- **Developed by:** [One Dollar Store](https://apify.com/one_dollar_store) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $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

## Gupy Jobs Scraper: job vacancies from Brazil's Gupy portal

**$1 per 1,000 vacancies. Platform usage included. No rental, no minimum.**

[Open it in Apify Console](https://console.apify.com/actors/JAdmfbWv0ip2cJvtP/input)

Search the public Gupy job portal (portal.gupy.io) by keyword, state, city, workplace type and contract type, and get the vacancies as clean rows: title, company, city, state, remote or hybrid or on site, contract type, posting date, application deadline, the link where candidates apply, and the full vacancy text. One run covers every company that publishes on the portal. It reads the same public data the portal's own search page loads. There is no login and no API key.

### What it costs

| Vacancies | Price |
|---|---|
| 1,000 | $1.00 |
| 10,000 | $10.00 |
| 100,000 | $100.00 |

Plus $0.001 per run. One flat price, platform usage included, so there is no separate compute or proxy bill. A daily run that collects the 300 newest vacancies for your keywords costs about $0.30, or about $9 a month.

### Why use it

- **Whole portal, not one company.** You search every company that publishes on Gupy at once, instead of looking for each career site one by one.
- **Filters that run before you pay.** Keyword, state, city, workplace type and contract type are applied by Gupy itself, so you are charged only for vacancies that match.
- **Newest first.** The default order is by posting date, so a daily run picks up what appeared since yesterday. Compare `jobId` or `postedAt` with your last run.
- **Several keywords in one run.** Give a list of job titles. Each is searched on its own and a vacancy found twice is returned once.
- **Fast.** A run of 25 vacancies finishes in about 3 seconds.

### Quick start

1. Open the actor, type a job title such as `desenvolvedor`, press **Start**.
2. Or paste this input:

```json
{ "searchTerms": ["desenvolvedor"], "state": "São Paulo", "workplaceType": "remote", "maxItems": 100 }
```

3. Download the results as JSON, CSV or Excel, or read them through the API.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/one_dollar_store~gupy-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["analista de dados"], "maxItems": 50}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("one_dollar_store/gupy-jobs-scraper").call(
    run_input={"searchTerms": ["analista de dados"], "maxItems": 50}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["postedAt"], job["company"], job["title"], job["url"])
```

### Use it from an AI assistant

Claude, ChatGPT, Cursor and other assistants can call this actor through Apify's MCP server. Add it with this server address:

```
https://mcp.apify.com?tools=one_dollar_store/gupy-jobs-scraper
```

Then ask, for example: "Find the 30 newest remote data analyst vacancies on Gupy and list the company and the link to apply."

### Switching from another Gupy actor

Most Gupy actors take a search word and a result limit. Here they are `searchTerms` (a list, so one run can cover many searches) and `maxItems`. The core fields are `title`, `company`, `city`, `state`, `workplaceType`, `postedAt` and `url`.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchTerms` | list of text | none | Job titles or keywords, one per line, up to 25. Each is searched on its own. Leave empty for the newest vacancies of any kind. |
| `state` | choice | `any` | One of the 27 Brazilian states, spelled with accents as Gupy does (`São Paulo`, `Paraná`, `Ceará`). |
| `city` | text | none | A city, spelled in Portuguese, for example `Campinas`. |
| `workplaceType` | choice | `any` | `remote`, `hybrid` or `on-site`. |
| `jobType` | choice | `any` | `effective`, `internship`, `apprentice`, `temporary`, `talent_pool`, `autonomous`, `associate` or `legal_entity`. |
| `sortBy` | choice | `newest` | `newest`, `oldest` or `relevance` (Gupy's best match). |
| `includeDescription` | true or false | true | Adds the full vacancy text as plain text in `description`. Turn it off for smaller rows. |
| `maxItems` | number | 100 | Total vacancies for the run. Minimum 10, maximum 10,000. |

Example with filters:

```json
{
  "searchTerms": ["engenheiro de dados", "analista de dados"],
  "state": "Minas Gerais",
  "workplaceType": "hybrid",
  "jobType": "effective",
  "sortBy": "newest",
  "includeDescription": false,
  "maxItems": 200
}
```

### Output fields

| Field | Meaning |
|---|---|
| `jobId` | Gupy's number for the vacancy. Stable, good for dropping repeats between runs. |
| `title` | Job title as posted. |
| `company` | Name of the company career page that posted the vacancy. Some companies use a campaign name here. Confidential vacancies show the word Confidencial. |
| `companyLogo` | Link to the company logo image. |
| `jobType` | Contract type: `effective` (regular contract), `internship`, `apprentice`, `temporary`, `talent_pool`, `autonomous`, `associate` or `legal_entity`. |
| `workplaceType` | `remote`, `hybrid` or `on-site`. |
| `city`, `state` | Place of the vacancy. Empty for many remote vacancies. |
| `postedAt` | When the vacancy was published, ISO 8601, UTC. |
| `applicationDeadline` | Last day to apply. |
| `openToDisabilities` | True when Gupy marks the vacancy as open to people with disabilities. |
| `url` | The vacancy on the company's own Gupy career site, where candidates apply. |
| `searchTerm` | The keyword that found the vacancy. Empty when no keyword was used. |
| `description` | Full vacancy text as plain text, only when `includeDescription` is on. |

### Sample results

Real rows from a test run on 20 October 2026 (descriptions cut after 110 characters, logo links left out).

```json
[
  {"jobId": "12738083", "title": "DESENVOLVEDOR FULLSTACK PL", "company": "Stefanini Group", "jobType": "effective", "workplaceType": "hybrid", "city": "Brasília", "state": "Distrito Federal", "postedAt": "2026-10-19T19:37:28.398Z", "applicationDeadline": "2026-11-03T00:00:00.000Z", "openToDisabilities": true, "url": "https://stefanini.gupy.io/job/eyJqb2JJZCI6MTI3MzgwODMsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=", "searchTerm": "desenvolvedor", "description": "No Grupo Stefanini, acreditamos no poder da colaboração. Co-criamos soluções inovadoras em parceria com nossos..."},
  {"jobId": "12721072", "title": "Desenvolvedor(a) de Mercado | Varejo 5G", "company": "Brisanet", "jobType": "effective", "workplaceType": "on-site", "city": "João Pessoa", "state": "Paraíba", "postedAt": "2026-10-19T19:34:53.472Z", "applicationDeadline": "2026-12-13T00:00:00.000Z", "openToDisabilities": true, "url": "https://brisanet.gupy.io/job/eyJqb2JJZCI6MTI3MjEwNzIsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=", "searchTerm": "desenvolvedor", "description": "Estamos à procura de um(a) Desenvolvedor(a) de Mercado para realizar visitas aos Pontos de Vendas, inspecionar..."},
  {"jobId": "12748852", "title": "Desenvolvedor Java SR - 100% Remoto", "company": "Stefanini Group", "jobType": "effective", "workplaceType": "remote", "postedAt": "2026-10-19T20:06:11.501Z", "applicationDeadline": "2026-11-20T00:00:00.000Z", "openToDisabilities": true, "url": "https://stefanini.gupy.io/job/eyJqb2JJZCI6MTI3NDg4NTIsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=", "searchTerm": "desenvolvedor", "description": "No Grupo Stefanini, acreditamos no poder da colaboração. Co-criamos soluções inovadoras em parceria com nossos..."},
  {"jobId": "12733280", "title": "Desenvolvedor .NET Sênior (Backend)", "company": "Leega Consultoria", "jobType": "legal_entity", "workplaceType": "hybrid", "city": "São Paulo", "state": "São Paulo", "postedAt": "2026-10-19T13:32:26.913Z", "applicationDeadline": "2026-12-31T00:00:00.000Z", "openToDisabilities": true, "url": "https://leega.gupy.io/job/eyJqb2JJZCI6MTI3MzMyODAsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=", "searchTerm": "desenvolvedor", "description": "A Leega é uma empresa focada no atendimento eficiente e inovador em seus clientes. Isso não poderia ser difere..."}
]
```

### Limits

- The actor reads the portal's search. A vacancy that the portal does not list is not returned.
- The portal returns at most 10,000 results for one search. For a bigger pull, split the work by state, city, contract type or keyword.
- Gupy decides which vacancies match a keyword. When you need to be thorough, add a second wording of the same job title as another entry in `searchTerms`.
- `state` must be one of the 27 state names. `city` is matched as Gupy spells it.
- Salary is not part of the data the portal gives for a search, so there is no salary field. Applicant counts and recruiter names are not included either.
- `company` is the name of the career page. Some companies use a campaign name, and confidential vacancies show Confidencial.
- The description is one block of plain text. Line breaks and bullet lists from the original posting are not kept.
- The data is read live when the run starts. A vacancy that the company closed no longer appears.
- The actor reads one page of up to 100 vacancies at a time with a short pause between pages, and it asks again a few times if the portal is busy.

### FAQ

**How much does it cost to scrape 10,000 Gupy vacancies?**
$10, plus $0.001 for each run.

**Do I pay for compute or proxy on top?**
No. Platform usage is included in the $1 per 1,000 price. The actor calls Gupy's public search directly and uses no proxy.

**Where does the data come from?**
From the public search of the Gupy job portal, the same data its website shows to any visitor. It needs no key and no login.

**How do I get only the new vacancies every day?**
Schedule a daily run with `sortBy` set to `newest` and keep the `jobId` values you already have. You can also compare `postedAt` with yesterday's date.

**Why did I get no rows?**
Your keyword, state, city or contract type matched nothing at that moment. The run still finishes without an error and the status line says "No results for this input." Try a shorter keyword or remove a filter.

**Is it legal?**
The actor reads public data only, with no login. The vacancies are published so that anyone can read them and apply. How you use the data is up to you: follow Gupy's terms and the terms of each company, and the law where you live, including Brazil's data protection law (LGPD) if you combine the data with personal data. Do not use it to send unwanted messages.

**Is this an official Gupy product?**
No. It is an independent tool and is not affiliated with or endorsed by Gupy.

**Do I need an Apify account?**
Yes. Actors run from an Apify account, and a free account is enough to start: it includes $5 of platform usage every month. You can [sign up here](https://www.apify.com?fpr=ymnoit). This is a referral link and it costs you nothing.

**Is there a limit on the free plan?**
Yes. A run started from a free plan account delivers the first 10 results, then ends with a message and a link to the plans. Any paid plan returns everything you ask for, up to your own limit. The price per result is the same on every plan.

### More from The One Dollar Store

Every actor here costs $1 per 1,000 results, platform usage included. See the whole store: https://apify.com/one_dollar_store

**Jobs**

- [Foundit Jobs Scraper](https://apify.com/one_dollar_store/foundit-jobs-search-scraper): Indian jobs with salary and experience filters.
- [Naukri Jobs Scraper](https://apify.com/one_dollar_store/naukri-job-listings-scraper): Naukri.com jobs by keyword, city and experience.
- [Greenhouse Jobs Scraper](https://apify.com/one_dollar_store/greenhouse-jobs-scraper): Open roles from Greenhouse company boards.
- [Lever Jobs Scraper](https://apify.com/one_dollar_store/lever-jobs-scraper): Open roles from Lever company boards.
- [SmartRecruiters Jobs Scraper](https://apify.com/one_dollar_store/smartrecruiters-jobs-scraper): Open roles from SmartRecruiters companies.
- [Remote Jobs Scraper](https://apify.com/one_dollar_store/remote-jobs-scraper): Remote roles from two public job boards.
- [Hirist Jobs Scraper](https://apify.com/one_dollar_store/hirist-jobs-scraper): Tech job listings from hirist.tech.

### Changelog

- October 2026: first release.

# Actor input Schema

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

Words from the job title, in Portuguese or English. Each entry is searched on its own and the results are merged without duplicates. Leave it empty to get the newest vacancies of any kind. Example: desenvolvedor, analista de dados, vendedor.

## `state` (type: `string`):

Only vacancies in this Brazilian state. Choose Any state for all of Brazil.

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

Optional. Only vacancies in this city, spelled as in Portuguese, for example Campinas or Belo Horizonte. Leave empty for all cities.

## `workplaceType` (type: `string`):

Remote, hybrid or on site vacancies.

## `jobType` (type: `string`):

The kind of vacancy as Gupy labels it. Effective means a regular employment contract (CLT).

## `sortBy` (type: `string`):

Newest first is the best choice for monitoring new vacancies.

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

Adds the full vacancy text as plain text in the field description. Turn it off for smaller rows.

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

The run stops after this many vacancies in total. The portal returns at most 10,000 results for one search.

## Actor input object example

```json
{
  "searchTerms": [
    "desenvolvedor"
  ],
  "state": "any",
  "city": "Campinas",
  "workplaceType": "any",
  "jobType": "any",
  "sortBy": "newest",
  "includeDescription": true,
  "maxItems": 25
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "searchTerms": [
        "desenvolvedor"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("one_dollar_store/gupy-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 = {
    "searchTerms": ["desenvolvedor"],
    "maxItems": 25,
}

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

```

## MCP server setup

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