Gupy Jobs Scraper: Brazil Job Listings
Pricing
Pay per event
Gupy Jobs Scraper: Brazil Job Listings
Scrape Brazilian job listings from the Gupy job portal. Search by keyword, state, city and work mode and get title, company, location, job type, dates, full description and job link. Listings are in Portuguese.
Pricing
Pay per event
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Security
Limited permissionsShare
Gupy Jobs Scraper: Job Listings in Brazil
Get job listings from Gupy, Brazil's largest job portal for company career pages, as clean dataset rows. The listings are Brazilian jobs and are written in Portuguese. Search by keyword and narrow the search by state, city and work mode (remote, hybrid, on-site). Each row has the title, company, location, job type, publication date, deadline, the full description and the link to the job page.
What you can do with it
- Build a list of companies that are hiring in Brazil, by city, state or role, for recruiting, sales or market research.
- Track the Brazilian job market over time: run it on a schedule and watch new jobs, work modes and job types.
- Feed a job board, newsletter or alert service with current Gupy jobs.
- Count open jobs per keyword, state or company type (internship, trainee, apprentice, full-time employee).
Input
| Field | Type | Description |
|---|---|---|
searchQueries | string[] | Keywords or job titles, one search each (default python). Portuguese keywords find the most jobs |
state | string | Brazilian state, for example São Paulo. Combined with every keyword |
city | string | City, for example Belo Horizonte. Combined with every keyword |
workplaceType | string | remote, hybrid or on-site. Portuguese words (remoto, híbrido, presencial) are accepted |
includeDetails | boolean | Open each job page for extra fields (default false) |
maxResultsPerQuery | integer | Cap per keyword, 1 to 1000 (default 50) |
maxResults | integer | Cap for the whole run (0 = no limit) |
Without keywords but with a state, city or work mode, the actor runs one search for that filter alone. With no input at all it runs the sample below.
Example
{"searchQueries": ["python"], "maxResults": 20}
What you get
One dataset row per job. A job found by several keywords is returned once, and duplicates are removed before anything is charged, so the number of rows is the number of results you pay for. Missing values are null, never an empty text.
| Field | Description |
|---|---|
id | Gupy job id. The dedup key |
title | Job title |
company_name, company_logo_url | Hiring company and its logo |
company_id, career_page_id | Gupy ids of the company and its career page. They are read from the logo address of the listing, so they are filled without includeDetails. Null when the company uses a default logo |
company_career_page_url, company_subdomain | The company's career page on gupy.io |
job_type, job_type_raw, job_type_pt | Readable job type (Full-time employee (CLT), Internship, Apprentice (Jovem Aprendiz), Trainee program, Temporary, Freelancer, Talent pool, Self-employed, Lecturer and more), the raw Gupy code (vacancy_type_effective) and the Portuguese label (Efetivo) |
workplace_type, is_remote | remote, hybrid or on-site, and a remote flag |
location, city, state | Where the job is. City and state are empty (null) for remote jobs |
published_at, application_deadline | Publication time and last day to apply (ISO 8601) |
description, description_text | Full job description as HTML and as plain text |
open_to_disabilities, badge_pwd, badge_friendly | Open to people with disabilities (PcD), Gupy PcD badge, Gupy feedback badge. The badges are null when the listing carries none |
job_url | Job page on the company career page. Apply there |
search_query, source, scraped_at | Keyword that found the job (null for a search without keyword), source site, scrape time (UTC) |
With includeDetails on, each job page is read and these fields are filled as well (otherwise null, or an empty list):
| Field | Description |
|---|---|
address, state_code, country, country_code | Street address as published, state code (MG), country (Brasil, BR) |
employment_type | schema.org employment type (FULL_TIME, ...) |
expires_at | Date the posting expires |
requirements, requirements_text | Requirements and qualifications (HTML and text) |
responsibilities, responsibilities_text | Responsibilities and assignments (HTML and text) |
additional_info, additional_info_text | Additional information block (HTML and text): workplace, hours, salary and benefits when the company writes them |
salary_text | The salary as the company wrote it (for example R$ 4.000,00), only when the posting has a Salário or Remuneração line. Gupy has no structured salary and nothing is estimated |
benefits | Benefits listed under a Benefícios heading, as a list |
selection_steps | Stages of the hiring process (name, order, type, category) |
job_code, status, opening_reason, quick_apply, publication_type, is_internal_mobility | Posting data from the job page |
company_about, company_about_text, company_website, company_linkedin, company_instagram, company_banner_url, company_timezone | Company profile from the career page |
details_fetched | true when the job page was read for the row. A job page that cannot be read (for example because the job was closed) still gives a row from the search data |
Arrays are always arrays ([] when empty). Reading job pages makes the run slower, because each job is one more request. The search already returns the full description, so turn includeDetails on only if you need the extra fields.
Sample output
{"id": "12843282","title": "DESENVOLVEDOR PYTHON","company_name": "Grupo Roma Brasil","company_id": 40198,"career_page_id": 85814,"company_logo_url": "https://attachments.gupy.io/production/companies/40198/career/85814/images/2022-08-19_12-02_logo.png","company_career_page_url": "https://gruporomabrasil.gupy.io","company_subdomain": "gruporomabrasil","company_about": "<p class=\"ql-align-justify\"><span style=\"color: rgb(58, 58, 58);\">Somos uma das maiores empresas do Brasil que...","company_about_text": "Somos uma das maiores empresas do Brasil que atua no segmento automotivo!\nCom uma história de mais de 40 anos,...","company_website": "https://www.gruporomabrasil.com.br/","company_linkedin": "https://www.linkedin.com/company/grupo-roma-brasil/mycompany/?viewAsMember=true","company_instagram": "https://www.instagram.com/gruporomabrasil/","company_banner_url": "https://attachments.gupy.io/production/companies/40198/career/85814/images/2026-02-12_15-48_bannerUrl.png","company_timezone": "America/Sao_Paulo","job_type": "Full-time employee (CLT)","job_type_raw": "vacancy_type_effective","job_type_pt": "Efetivo","employment_type": "FULL_TIME","workplace_type": "on-site","is_remote": false,"location": "Belo Horizonte, Minas Gerais","city": "Belo Horizonte","state": "Minas Gerais","state_code": "MG","country": "Brasil","country_code": "BR","address": "Avenida do Contorno, Belo Horizonte, Minas Gerais, Brasil, 30110-043","published_at": "2026-11-05T18:48:01.505Z","application_deadline": "2027-01-31T00:00:00.000Z","expires_at": "2027-01-25","description": "Você é apaixonado pela área de Tecnologia da Informação?Gostaria de trabalhar em uma grande empresa?Então venh...","description_text": "Você é apaixonado pela área de Tecnologia da Informação?Gostaria de trabalhar em uma grande empresa?Então venh...","requirements": "<ul><li>Ensino Superior completo ou cursando em <span style=\"color: rgb(0, 0, 0);\">Ciências da Computação...","requirements_text": "- Ensino Superior completo ou cursando em Ciências da Computação ou Sistemas de informação;\n- Experiência prát...","responsibilities": "<ul><li><p></p>Desenvolver scripts e aplicações utilizando Python para automação e otimização de processos int...","responsibilities_text": "- Desenvolver scripts e aplicações utilizando Python para automação e otimização de processos internos ;\n- Uti...","additional_info": "<p class=\"ql-align-justify\"><strong>Local de trabalho: </strong>Belo Horizonte/MG</p><p class=\"ql-align-justif...","additional_info_text": "Local de trabalho: Belo Horizonte/MG\nHorário: Segunda a Sexta-feira de 08h as 18h.\nSalário: R$ 4.000,00\nBenefí...","salary_text": "R$ 4.000,00","benefits": ["Vale-transporte","Vale-refeição","Plano de saúde"],"selection_steps": [{"name": "Cadastro","order": 0,"type": "register","category": "registration"},{"name": "Entrevista com R.H","order": 2,"type": "offline","category": "interview"}],"job_code": "40198-12843282","status": "published","opening_reason": "staff_increase","quick_apply": false,"publication_type": "external","is_internal_mobility": false,"open_to_disabilities": true,"badge_pwd": true,"badge_friendly": true,"job_url": "https://gruporomabrasil.gupy.io/job/eyJqb2JJZCI6MTI4NDMyODIsInNvdXJjZSI6Imd1cHlfcG9ydGFsIn0=?jobBoardSource=gupy_portal","details_fetched": true,"search_query": "python","source": "portal.gupy.io","scraped_at": "2026-11-06T09:00:00Z"}
The sample is a run with includeDetails on, shortened. Without it the detail fields are null.
Pricing (Pay-per-event)
Price: $0.001 start fee per run, then $0.002 per job result ($2.00 per 1,000 jobs).
The start fee is charged on top of the results. Duplicates are never charged. Set a maximum total charge on the run to stop at a budget: the run ends cleanly when it is reached, and the status message says how many jobs were delivered. The pricing box on the actor page always shows the current rates.
FAQ
Are the listings in English?
No. Gupy is a Brazilian platform and the job texts are written in Portuguese. Field names and the readable job type are in English. Use Portuguese keywords (for example desenvolvedor, enfermeiro, analista de dados) to find the most jobs.
How many jobs can one keyword return? Up to 1000 per keyword (default 50). The portal returns 10 jobs per page and the actor reads as many pages as the limit needs. For more jobs, split the search by state or city.
What happens when nothing matches?
The run ends with the status 0 jobs found for <keywords> and exit code 0. If the portal blocks or fails every search request, the run fails with a clear status instead, so an empty dataset is never mistaken for a quiet market.
Does it find salaries?
Gupy has no salary field. When a company writes the salary in the posting, salary_text shows that line (needs includeDetails). Many postings state no salary.
You are responsible for using the data lawfully, including the LGPD and the GDPR, national data-protection laws and unfair-competition rules for marketing and outreach.