Gupy Jobs Scraper: Brazil Job Listings avatar

Gupy Jobs Scraper: Brazil Job Listings

Pricing

Pay per event

Go to Apify Store
Gupy Jobs Scraper: Brazil Job Listings

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

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Security

Limited permissions

Share

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

FieldTypeDescription
searchQueriesstring[]Keywords or job titles, one search each (default python). Portuguese keywords find the most jobs
statestringBrazilian state, for example São Paulo. Combined with every keyword
citystringCity, for example Belo Horizonte. Combined with every keyword
workplaceTypestringremote, hybrid or on-site. Portuguese words (remoto, híbrido, presencial) are accepted
includeDetailsbooleanOpen each job page for extra fields (default false)
maxResultsPerQueryintegerCap per keyword, 1 to 1000 (default 50)
maxResultsintegerCap 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.

FieldDescription
idGupy job id. The dedup key
titleJob title
company_name, company_logo_urlHiring company and its logo
company_id, career_page_idGupy 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_subdomainThe company's career page on gupy.io
job_type, job_type_raw, job_type_ptReadable 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_remoteremote, hybrid or on-site, and a remote flag
location, city, stateWhere the job is. City and state are empty (null) for remote jobs
published_at, application_deadlinePublication time and last day to apply (ISO 8601)
description, description_textFull job description as HTML and as plain text
open_to_disabilities, badge_pwd, badge_friendlyOpen to people with disabilities (PcD), Gupy PcD badge, Gupy feedback badge. The badges are null when the listing carries none
job_urlJob page on the company career page. Apply there
search_query, source, scraped_atKeyword 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):

FieldDescription
address, state_code, country, country_codeStreet address as published, state code (MG), country (Brasil, BR)
employment_typeschema.org employment type (FULL_TIME, ...)
expires_atDate the posting expires
requirements, requirements_textRequirements and qualifications (HTML and text)
responsibilities, responsibilities_textResponsibilities and assignments (HTML and text)
additional_info, additional_info_textAdditional information block (HTML and text): workplace, hours, salary and benefits when the company writes them
salary_textThe 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
benefitsBenefits listed under a Benefícios heading, as a list
selection_stepsStages of the hiring process (name, order, type, category)
job_code, status, opening_reason, quick_apply, publication_type, is_internal_mobilityPosting data from the job page
company_about, company_about_text, company_website, company_linkedin, company_instagram, company_banner_url, company_timezoneCompany profile from the career page
details_fetchedtrue 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&nbsp;<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.