# Gupy.io Jobs Scraper (`parsebird/gupy-io-jobs-scraper`) Actor

Fast HTTP-only scraper for Gupy.io, Brazil's largest hiring platform. Extracts full job descriptions, company info, and location data via Gupy's internal API — no browser required.

- **URL**: https://apify.com/parsebird/gupy-io-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 jobs

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/platform/actors/running/actors-in-store#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

### Gupy.io Jobs Scraper

Extract job postings from [Gupy.io](https://portal.gupy.io/job-search), Brazil's largest hiring and recruitment platform. This is a **fast, HTTP-only scraper**: no Chrome, no browser rendering, no waiting for JavaScript. It talks directly to Gupy's internal job-search API to pull titles, full descriptions, company info, and location data in seconds.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search by keyword, city, or state — or paste a Gupy portal search URL directly — and get full job descriptions, company and career-page details, job type, work model (on-site/hybrid/remote), and location, ready for analysis or integration.
</td>
</tr></table>

##### Copy to your AI assistant

```
Gupy.io Jobs Scraper on Apify (actor ID: parsebird/gupy-io-jobs-scraper) scrapes portal.gupy.io, Brazil's largest hiring platform, via its internal HTTP API — no browser required. Call it with the ApifyClient: `client.actor("parsebird/gupy-io-jobs-scraper").call(run_input={"keyword": "Social Media", "location": "Sao Paulo - SP", "results_wanted": 30, "max_pages": 2})`. Key inputs: url (string, a Gupy search URL copied from portal.gupy.io/job-search — if provided, its filters are used first and keyword/location are ignored), keyword (string, job title or keyword), location (string, city or state such as "Sao Paulo, Sao Paulo - SP", "Sao Paulo - SP", or "Pernambuco"), sortBy (select: publishedDate|relevance|company, default publishedDate), results_wanted (integer, default 20, max jobs to collect), max_pages (integer, default 1, safety cap on search pages fetched), proxyConfiguration (Apify Proxy, off by default — Gupy's search API is public). Output per job: jobId, title, company, companyId, careerPageId, careerPageName, careerPageLogoUrl, careerPageUrl, descriptionHtml, descriptionText, jobType, jobTypeLabel, publishedDate, applicationDeadline, isRemoteWork, workplaceType, workplaceTypeLabel, city, state, country, location, jobUrl, acceptsDisabilities, skills, sourceUrl. Full API spec: https://apify.com/parsebird/gupy-io-jobs-scraper/api. Get an API token at https://console.apify.com/settings/integrations.
```

### What does Gupy.io Jobs Scraper do?

**Gupy.io Jobs Scraper** is a **Gupy API alternative** for anyone who needs structured Brazilian job-market data — recruiters sourcing candidates, HR-tech tools indexing listings, or researchers tracking the labor market. It talks to Gupy's own internal job-search endpoint instead of rendering pages in a browser, which makes it fast and cheap to run at scale.

- 🔍 **Keyword + location search** — search by job title/keyword, and filter by Brazilian city or state.
- 🔗 **URL mode** — paste any `portal.gupy.io/job-search/...` URL you've already filtered in your browser and the actor uses those exact filters.
- 📄 **Full job descriptions** — complete posting text (HTML and plain-text versions), not just a search-result snippet.
- 🏢 **Company and career-page info** — company name, logo, career page URL, and IDs for joining against other data.
- 🧭 **Job type and work model** — employment type (effective, intern, trainee, temporary, and more) and work model (on-site, hybrid, remote).
- ↕️ **Sort by date, relevance, or company** — newest postings first by default.

Runs on the Apify platform, so results are available via **API**, can be **scheduled** to run daily or weekly to track new postings, and can feed directly into **Zapier, Make, Google Sheets, and 1,000+ integrations**. Every new Apify account includes free trial credits.

### What data can you extract from Gupy.io?

| Field | Description |
|-------|-------------|
| `jobId` / `title` / `company` | Unique Gupy job identifier, job title, and employer name |
| `descriptionHtml` / `descriptionText` | Full job description, as returned by Gupy and as cleaned plain text |
| `jobType` / `jobTypeLabel` | Raw vacancy type code (e.g. `vacancy_type_effective`) and a readable label (e.g. "Effective") |
| `workplaceType` / `workplaceTypeLabel` | Raw work-model code and readable label: On-site, Hybrid, or Remote |
| `city` / `state` / `country` / `location` | Job location, individually and as a combined string |
| `publishedDate` / `applicationDeadline` | When the job was posted, and its application deadline |
| `careerPageName` / `careerPageUrl` / `careerPageLogoUrl` | The employer's Gupy career page name, URL, and logo |
| `acceptsDisabilities` | Whether the vacancy is flagged for PWD (Pessoa Com Deficiência) applicants |
| `jobUrl` | Direct link to the vacancy on the employer's Gupy career page |

### How to scrape Gupy.io with this actor

1. Click **Try for free** on the [Gupy.io Jobs Scraper](https://apify.com/parsebird/gupy-io-jobs-scraper) page (a free Apify account includes trial credits).
2. Either paste a **Gupy search URL** you've already filtered at [portal.gupy.io/job-search](https://portal.gupy.io/job-search), or enter a **Keyword** and **Location**.
3. Pick a **Sort by** order — published date (newest first), relevance, or company name.
4. Set **Max results** and **Max pages**, then click **Start**.
5. Open the **Dataset** tab when the run finishes and export as JSON, CSV, or Excel, or pull it via the [Apify API](https://docs.apify.com/api/v2).

### How much does it cost to scrape Gupy.io?

Gupy.io Jobs Scraper uses **Pay Per Event (PPE)** pricing with a single `job-scraped` event that fires once for every job returned.

| Event | Free | Bronze / Silver / Gold |
|-------|------|-------------------------|
| `job-scraped` (per 1,000) | $0.90 | $0.80 |

A run collecting 1,000 jobs costs about $0.90 on the Free plan, or $0.80 on a paid Apify plan. Every new Apify account starts with free trial credits, enough to test the actor at no cost.

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| url | string | No | `https://portal.gupy.io/job-search/sortBy=publishedDate` | Gupy search URL from portal.gupy.io/job-search. If provided, its filters are used first. |
| keyword | string | No | — | Optional job keyword when you do not want to use a full URL |
| location | string | No | — | Optional city or state, e.g. "Sao Paulo, Sao Paulo - SP", "Sao Paulo - SP", or "Pernambuco" |
| sortBy | string | No | `publishedDate` | `publishedDate`, `relevance`, or `company` |
| results\_wanted | integer | No | 20 | Maximum number of jobs to collect |
| max\_pages | integer | No | 1 | Safety cap for pagination |
| proxyConfiguration | object | No | Off | Optional Apify Proxy settings |

See the [Input tab](https://apify.com/parsebird/gupy-io-jobs-scraper/input-schema) for the full schema.

### Output example

```json
{
  "jobId": 11331333,
  "title": "ATENDENTE RESTAURANTE 12X36 ( CENTRO - BELFORD ROXO/RJ)",
  "company": "McDonald's Restaurante - Arcos Dorados",
  "companyId": 68123,
  "careerPageId": 164080,
  "careerPageName": "McDonald's Restaurante - Arcos Dorados",
  "careerPageLogoUrl": "https://attachments.gupy.io/production/companies/68123/career/164080/images/2023-07-20_22-47_companyLogoUrl.png",
  "careerPageUrl": "https://restaurantemc.gupy.io/eyJzb3VyY2UiOiJndXB5X3BvcnRhbCJ9",
  "descriptionHtml": "A gente vai amar muito se voce...",
  "descriptionText": "A gente vai amar muito se voce... Responsabilidades e atribuicoes...",
  "jobType": "vacancy_type_effective",
  "jobTypeLabel": "Effective",
  "publishedDate": "2026-05-21T03:00:25.306Z",
  "applicationDeadline": "2026-07-20",
  "isRemoteWork": false,
  "workplaceType": "on-site",
  "workplaceTypeLabel": "On-site",
  "city": "Belford Roxo",
  "state": "Rio de Janeiro",
  "country": "Brasil",
  "location": "Belford Roxo, Rio de Janeiro, Brasil",
  "jobUrl": "https://restaurantemc.gupy.io/job/eyJqb2JJZCI6MTEzMzEzMzMsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=?jobBoardSource=gupy_portal",
  "acceptsDisabilities": true,
  "skills": [],
  "sourceUrl": "https://portal.gupy.io/job-search/sortBy=publishedDate"
}
```

Download results as **JSON, CSV, Excel, HTML, or XML** from the Dataset tab, or pull them programmatically via the API.

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/gupy-io-jobs-scraper").call(run_input={
    "keyword": "Social Media",
    "location": "Sao Paulo - SP",
    "results_wanted": 30,
    "max_pages": 2,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["company"], item["jobUrl"])
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/gupy-io-jobs-scraper').call({
    location: 'Pernambuco',
    sortBy: 'publishedDate',
    results_wanted: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Use cases

- Source candidates by pulling structured job data for open roles at target companies
- Monitor a competitor's or industry's hiring activity by keyword, city, or state
- Build a job-aggregator or labor-market analytics tool with structured Brazilian job data
- Track new postings over time with a **schedule**, using `sortBy: publishedDate`
- Feed job postings into an ATS, CRM, or recruiting pipeline via the API

### Is it legal to scrape Gupy.io?

Yes. Gupy.io Jobs Scraper only collects publicly available data that anyone can see by visiting [portal.gupy.io](https://portal.gupy.io/job-search). Scraping publicly accessible web data is generally legal, as established in cases such as *hiQ Labs v. LinkedIn* — see Apify's [blog post on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for details. Respect Gupy's terms of use and avoid republishing scraped data in ways that infringe their rights. This actor is not affiliated with, endorsed by, or sponsored by Gupy.

### Related actors

- [InfoJobs Job Scraper](https://apify.com/parsebird/infojobs-job-scraper) — extract job listings from InfoJobs, another major job board used in Brazil and Spain
- [Greenhouse Jobs Scraper](https://apify.com/parsebird/greenhouse-jobs-scraper) — pull listings from companies hiring through Greenhouse
- [Workday Jobs Scraper with Emails](https://apify.com/parsebird/workday-jobs-scraper) — extract listings from companies hiring through Workday

### FAQ

**Does this actor use a browser?**
No. It's a fast, HTTP-only scraper that talks directly to Gupy's internal job-search API — no Chrome, no rendering delay.

**How do I search by both keyword and location?**
Fill in both **Keyword** and **Location** — the actor combines them so only jobs matching both are returned.

**What's the difference between using URL and Keyword/Location?**
**URL** lets you paste any filtered search link from portal.gupy.io/job-search (including filters this actor doesn't expose directly, like work model or job type) and reuses those exact filters. **Keyword**/**Location** is a simpler way to build a basic search without visiting the site first. When URL is set, it always takes priority.

**Why is `location` sometimes not matched exactly?**
Gupy's search treats a full Brazilian state name (or its 2-letter code, like "SP") as a state filter, and anything else as a city filter. City names combined with a keyword must match Gupy's stored capitalization — the actor title-cases city input automatically, but unusual spellings may still return no results. Using **URL** mode with a filter you built directly on the Gupy portal avoids this entirely.

**Can I monitor new postings over time?**
Yes — set **Sort by** to `publishedDate` and run the actor on a [schedule](https://docs.apify.com/platform/schedules) to track newly posted jobs.

**Something broken or missing?**
Open an issue on the actor's **Issues** tab in Apify Console — reports are reviewed regularly.

# Actor input Schema

## `url` (type: `string`):

A search URL copied from portal.gupy.io/job-search, e.g. after applying filters in your browser. If provided, its filters are used first and keyword/location below are ignored.

## `keyword` (type: `string`):

Job title or keyword to search for, e.g. "Social Media". Leave empty to browse all open vacancies. Used only when URL above is empty.

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

City or state to filter by, e.g. "Sao Paulo, Sao Paulo - SP", "Sao Paulo - SP", or "Pernambuco". Used only when URL above is empty.

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

Sort order used when searching with keyword and location.

## `results_wanted` (type: `integer`):

Maximum number of jobs to collect.

## `max_pages` (type: `integer`):

Safety cap on the number of search pages to fetch, regardless of Max results.

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

Optional Apify Proxy settings. Gupy's job-search API is public and does not require a proxy for normal use.

## Actor input object example

```json
{
  "url": "https://portal.gupy.io/job-search/sortBy=publishedDate",
  "sortBy": "publishedDate",
  "results_wanted": 20,
  "max_pages": 1,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "url": "https://portal.gupy.io/job-search/sortBy=publishedDate",
    "results_wanted": 20,
    "max_pages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/gupy-io-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 = {
    "url": "https://portal.gupy.io/job-search/sortBy=publishedDate",
    "results_wanted": 20,
    "max_pages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/gupy-io-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 '{
  "url": "https://portal.gupy.io/job-search/sortBy=publishedDate",
  "results_wanted": 20,
  "max_pages": 1
}' |
apify call parsebird/gupy-io-jobs-scraper --silent --output-dataset

```

## MCP server setup

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