Catho Jobs Scraper - Brazil Job Listings & Salaries
Pricing
from $1.70 / 1,000 job listing delivereds
Catho Jobs Scraper - Brazil Job Listings & Salaries
Search Catho.com.br, one of Brazil's largest job boards, by term and city: job title, hiring company, salary when the ad shows it, city and the listing URL. Blocked pages come back with the reason, not with a wrong answer. No login. US$ 2 per 1,000 jobs; failed items are free.
Pricing
from $1.70 / 1,000 job listing delivereds
Rating
0.0
(0)
Developer
Scrapewise Data
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 hours ago
Last modified
Categories
Share
Catho Jobs Scraper: Brazilian Job Listings and Salaries by Search Term
Searches Catho.com.br for any job title or keyword, in one Brazilian city or across the whole country, and returns one row per job listing with vaga (job title), empresa (company), salario (the pay Catho shows, in Brazilian reais), cidade (city), url and a stable id.
Catho is one of the largest job boards in Brazil, with openings from every sector and a declared salary on a large share of the ads, which is rare on job boards elsewhere. For recruiters and staffing agencies sizing demand for a role, analysts building salary benchmarks in reais, job boards that need Brazilian listings, and anyone outside Brazil who needs local pay data. AI agents can call it through the Apify MCP server.
At a glance
| Apify plan | Per 1,000 jobs |
|---|---|
| Free | US$ 2.00 |
| Bronze | US$ 1.90 |
| Silver | US$ 1.80 |
| Gold and above | US$ 1.70 |
One charge per job row delivered. No monthly fee, no start fee, proxy included. A run that finds nothing fails and charges nothing; duplicates are dropped before delivery; proxy retries cost nothing. 30 jobs cost US$ 0.06 on the Free plan, one role across Brazil (200 jobs) US$ 0.40.
What it fixes
- The city filter really filters. Catho ignores a
?cidade=query string and silently returns nationwide jobs. The Actor puts the city in the URL path (catho.com.br/vagas/vendedor/sao-paulo-sp/), so "São Paulo SP" returns São Paulo jobs. - Salary is filled.
salariocomes from the card's own salary element: all eight fields were filled on 30 of 30 rows in the run below, and on every row of three earlier runs. - No owner CPF in company names. Single person companies (MEI) often show the owner's name with their CPF number attached; the Actor strips any CPF from
empresabefore writing the row. - Deduplicated by Catho's listing id inside the run.
- Blocks are retried, not passed on. A 403 or 429 on a datacenter IP is retried with a fresh proxy session up to 6 times per page.
Input examples
The input form describes each field. Minimal input (city empty means all of Brazil):
{ "termo": "vendedor" }
One city, capped at 30 jobs:
{ "termo": "vendedor", "cidade": "São Paulo SP", "maxItems": 30 }
All of Brazil, larger batch:
{ "termo": "analista de dados", "maxItems": 200 }
termo is in Portuguese, as you would type it on Catho. Both termo and cidade are turned into a URL path segment (accents removed, spaces to hyphens, lowercase), so write the city the way a person would, ideally with the state code: "Rio de Janeiro RJ", "Belo Horizonte MG".
Output example
A real row from the run of 2026-09-14 with the input above (run J7frcZOUkMP45h4iC, 30 jobs in 7 seconds):
{"id": "38361440","vaga": "Vendedor Interno","empresa": "ENTRETEC","salario": "A partir de R$ 3.000,00 + 3 benefícios","cidade": "São Paulo","url": "https://www.catho.com.br/vagas/vendedor-interno/38361440","coletado_em": "2026-09-14T14:42:10.782679+00:00","url_origem": "https://www.catho.com.br/vagas/vendedor-interno/38361440"}
salario reads "starting from R$ 3,000.00 plus 3 benefits". Catho's text is stored as it is, without guessing a number out of it.
Output fields
Field names are in Portuguese because they match the source and stay stable across builds. Fill rates from the run above.
| Field | What it holds | Filled |
|---|---|---|
id | Catho's own listing id, stable while the ad is online | 100% |
vaga | job title as posted | 100% |
empresa | hiring company; "Empresa Confidencial" when hidden, "Cliente" when an agency posts for a client | 100% |
salario | pay text on the card, in reais: a figure ("R$ 2.300"), a floor ("A partir de..."), a ceiling ("Até...") or "A combinar" (negotiable) | 100% |
cidade | city; "São Paulo + 26 cidades" for an ad open in several cities | 100% |
url, url_origem | the public Catho page for the listing | 100% |
coletado_em | ISO 8601 collection time, UTC | 100% |
Fill rates depend on the search term; treat 100% as what these runs measured. To do maths on pay, parse salario with a regular expression over "R$" and keep the original text to tell a floor from a ceiling.
Use cases
- Salary benchmarking in reais. Run the same
termofor a list of cities and storesalariowithcidadeandcoletado_em; repeated monthly, it becomes a series you own. - Sizing a role. How many openings exist now for a title in one city, who is hiring and at what pay. Diff
idbetween runs to see new and removed ads. - Job boards and lead lists.
vaga,empresa,cidade,salarioandurlfeed a board or newsletter; companies posting roles are companies that are growing. - Research from outside Brazil. Compensation studies, relocation and offshoring models, market entry memos.
Speed and reliability
Measured on Apify, 512 MB: 30 jobs in one city in 7 s, 50 jobs nationwide in 6 to 14 s, 10 jobs for "desenvolvedor python" in São Paulo in 13 s. Every run finished with the full number of jobs asked for. Plain HTTP requests and HTML parsing, no browser: Catho serves its results server side.
Use it from code and AI agents
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("scrapewise/catho-vagas").call(run_input={"termo": "vendedor", "cidade": "São Paulo SP", "maxItems": 50})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["vaga"], "|", job["empresa"], "|", job["salario"], "|", job["cidade"])
The same works from Node.js, the HTTP API (run-sync-get-dataset-items, add &format=csv for a spreadsheet), n8n, Make and Zapier. For AI agents: https://mcp.apify.com/?tools=scrapewise/catho-vagas. An empty input still returns a valid sample, because termo has a default.
FAQ
Does it collect personal data? The fields are about the job and the advertiser, never candidates. CPF numbers are removed, but a sole proprietor's name can still appear as a company name; if your use falls under LGPD or GDPR, filter those rows on your side.
Can I get the full description or benefits? No. The Actor reads the search result cards; url opens the full ad.
How many jobs per term? As many as Catho lists, up to maxItems (limit 10,000). Paging stops when a page brings nothing new.
Why does a row say "São Paulo + 26 cidades"? The ad is open in several cities and Catho prints it that way. The text is kept as published; split on " + " if you only need the first city.
How do I keep the cost under control? maxItems is a hard cap on what a run can charge, and Apify Console also lets you set a maximum total charge per run.
How do I run it every day? Save a Task with your input, attach a Schedule, and compare id values between runs to keep only new ads.
Is it legal? It reads public search pages without login and collects business information about job openings. You are responsible for complying with Catho's terms and the laws that apply to you.
Limitations
- Search result cards only: no description, benefits list, posting date, contract type, seniority or remote flag.
salariois Portuguese text, not a number, and some ads show no pay.- One term and one city per run; run several in parallel through the API for a matrix of roles and cities.
- Deduplication by
idis per run; deduplicate on your side when you merge runs.
Errors
The run fails loudly, and charges nothing, when termo is empty, when Catho answers with an unexpected status code, when the first result page has no recognizable job card (how a layout change shows up; the message names the selector) and when the search ends with zero jobs. Something broke or a field is missing? Open an issue on the Issues tab.
Changelog
- 2026-09-14: discounts by plan;
termogot a default so an empty API or MCP call runs instead of failing. - 2026-09-11: first public release, with the city filter in the URL path,
salariofrom the card's salary element, CPF stripped fromempresaand up to 6 proxy sessions per page.