Gupy Jobs Scraper (Vagas de Emprego) - Keyword, City & Company
Pricing
$1.99 / 1,000 jobs
Gupy Jobs Scraper (Vagas de Emprego) - Keyword, City & Company
Search Gupy, Brazil's jobs platform, by keyword, city or company subdomain: title, company, city and state, workplace type, contract type, publish time, application deadline and job URL. No login or cookies. Deduplicated across searches; empty or cut-short searches are free and marked.
Pricing
$1.99 / 1,000 jobs
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Gupy Jobs Scraper (Vagas de Emprego)
A Lantern Lab Actor. Give it keywords, a Brazilian city, or Gupy company subdomains and get Gupy's public job listings (vagas de emprego) back: title, company, city and state, workplace type, contract type, publish time, application deadline, and the job URL. No Gupy login, no cookies, no account of your own.
Pay per job row: USD 1.99 per 1,000 jobs. Search-status rows, the run summary and empty results are free, and there is no run-start fee.
What it does
- Searches each keyword separately and labels every row with the keyword that produced it, so one run can cover many keywords. The city filter, when given, applies to every search in the run.
- Collects a whole company's listings from its Gupy subdomain (the part before
.gupy.io, for exampleambevfor ambev.gupy.io): the Actor resolves the subdomain to the company's exact name on Gupy and searches that board. Keywords and companies mix freely in one run. - Deduplicates across the whole run: a job that matches several of your keywords, or that a company unit and a keyword unit both found, is written once and charged once.
- Keeps the source identifier (
jobId), the platform's own times (publishedAt,applicationDeadline) and our collection time (collectedAt) as separate fields. - Carries Gupy's own enums through untranslated:
workplaceTypeishybrid,on-siteorremote, andtypeis a raw Gupy value such asvacancy_type_effective(effective/CLT role) orvacancy_legal_entity(legal-entity contract). - Writes
countryas the constant"Brazil"on every row: Gupy is a Brazilian jobs platform and serves no other country, so this is a fact of the platform rather than a per-row field. - Says what happened per search unit. A keyword Gupy answered with nothing is recorded as an empty result; a unit cut short by a limit, a refusal or an error is marked
partial: truewith the reason. The two are different records and are never confused. - Caps itself:
maxUpstreamRequestsis a hard ceiling on requests to Gupy for the whole run, derived from your input when you leave it empty, so a run is never unbounded. - Charges only job rows. Empty results, per-unit status rows and the run summary are free.
What it does not do
- No job detail pages beyond the search listing: everything except the description comes from the search itself. The description is included in the listing and written only when you ask for it (
includeDescription, off by default — descriptions are several kilobytes each). - No salary data (Gupy does not publish it on listings) and no applicant or personal data of any kind.
- No other jobs platform, no translation, no login-only content.
- No scheduling or monitoring built in; use Apify schedules.
Input
| Field | Default | Meaning |
|---|---|---|
searchQueries | required* | One keyword per line, in Portuguese or any language Gupy matches: analista de dados, dev jr, vendedor. |
companies | optional* | Gupy company subdomains, the part before .gupy.io of a company's careers page: ambev, afinz. *At least one keyword or one company is required. |
city | empty | Filter every search to one city, as Gupy writes it: São Paulo, Rio de Janeiro. A misspelled city returns an empty result, not an error. |
maxJobs | 100 | Upper bound on rows per keyword or per company, counting only fresh jobs. Capped at 1000. |
includeDescription | false | Write the full description text on every row. Several kilobytes per job; the price per job does not change. |
maxUpstreamRequests | derived | Hard ceiling on requests to Gupy for the whole run. Leave empty and the Actor works one out from your input. |
proxyConfiguration | Apify Proxy | The proxy the requests go through. The datacenter default is what this Actor is measured on. |
{"searchQueries": ["analista de dados", "cientista de dados"],"companies": ["ambev"],"city": "São Paulo","maxJobs": 100}
Output
One row per job, recordType: "job":
| Field | Meaning |
|---|---|
jobId | Gupy's own numeric identifier for the listing; the dedupe key. |
title | The job title as Gupy publishes it. |
company | The company as Gupy names it on its career page. |
city, state | The listing's location as Gupy writes it, or null when the listing names none. |
country | The constant "Brazil" — Gupy operates in Brazil only. |
workplaceType | Gupy's own enum: hybrid, on-site, remote. |
type | Gupy's own contract-type enum, for example vacancy_type_effective or vacancy_legal_entity. |
publishedAt | When Gupy published the listing, as an ISO 8601 instant. |
applicationDeadline | Gupy's application deadline, or null while the listing is open-ended. |
description | The full description text when includeDescription is on, null otherwise. |
url | The listing's URL on the company's board. |
searchQuery / companyBoard | Which unit produced this row: the keyword, or the company subdomain. Exactly one is set. |
rank | Position in that unit's results, counting from 1. |
partial, partialReason | Always false / null on a job row: the row exists because the job was collected. |
collectedAt | Our own collection time, separate from publishedAt. |
One row per search unit, recordType: "search_status", never charged:
| Field | Meaning |
|---|---|
jobsReturned / jobsCharged | Rows this unit wrote and charged. |
duplicatesSkipped | Jobs an earlier unit in the run had already collected. |
pagesFetched | Job-search pages fetched for this unit. |
reportedAvailable | Gupy's own total for the search, which Gupy itself caps at 100 — read it as "at least", not as an exact count. |
company | For a company unit, the exact board name the subdomain resolved to. |
partial / partialReason | true with upstream_request_cap, charge_limit_reached, blocked, upstream_error or not_collected when the unit's results are incomplete. |
statusText | The same thing in a sentence, so the dataset explains itself. |
The last row is recordType: "RUN_SUMMARY" — jobs collected and charged, empty units, partial units by reason, company boards resolved, requests sent by endpoint, bytes moved, and why collection stopped. The same object is also in the run's key-value store under RUN_SUMMARY.
Partial is not empty
jobsReturned: 0 with partial: false means Gupy has no job for that keyword or company. partial: true means the unit's results are incomplete and there may well be more. A run that collected nothing and had partial units fails rather than reporting an empty success.
Limits and boundaries
- Only Gupy's public job search and public company boards. No login, no cookies, no account, no personal or applicant data.
- Gupy serves 12 jobs per page and reports
totalcapped at 100, soreportedAvailableabove 100 is a floor rather than a count; collection pages until yourmaxJobs, the end of the list, or the request ceiling. - A company must be addressed by its exact Gupy subdomain. The name filter behind it is exact-match on Gupy's side; the Actor resolves the subdomain to the exact name for you, and a subdomain that is not a Gupy career board is reported on its status row rather than searched blindly.
cityis matched exactly as Gupy writes the city name.publishedAtandapplicationDeadlineare Gupy's own values and are not re-derived from the page.