Catho Jobs Scraper - Brazil Job Listings & Salaries avatar

Catho Jobs Scraper - Brazil Job Listings & Salaries

Pricing

from $1.70 / 1,000 job listing delivereds

Go to Apify Store
Catho Jobs Scraper - Brazil Job Listings & Salaries

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

Scrapewise Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

16 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 planPer 1,000 jobs
FreeUS$ 2.00
BronzeUS$ 1.90
SilverUS$ 1.80
Gold and aboveUS$ 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. salario comes 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 empresa before 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.

FieldWhat it holdsFilled
idCatho's own listing id, stable while the ad is online100%
vagajob title as posted100%
empresahiring company; "Empresa Confidencial" when hidden, "Cliente" when an agency posts for a client100%
salariopay text on the card, in reais: a figure ("R$ 2.300"), a floor ("A partir de..."), a ceiling ("Até...") or "A combinar" (negotiable)100%
cidadecity; "São Paulo + 26 cidades" for an ad open in several cities100%
url, url_origemthe public Catho page for the listing100%
coletado_emISO 8601 collection time, UTC100%

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 termo for a list of cities and store salario with cidade and coletado_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 id between runs to see new and removed ads.
  • Job boards and lead lists. vaga, empresa, cidade, salario and url feed 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 ApifyClient
client = 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.
  • salario is 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 id is 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; termo got 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, salario from the card's salary element, CPF stripped from empresa and up to 6 proxy sessions per page.