Catho Jobs Scraper
Scrape Catho job listings across Brazil: title, company, city, state, salary, contract type, benefits, full description and posting date. No login needed.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searches,city,state(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0014 per job = $1.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Job returned | One job listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged. | $0.0014 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searches | Job titles, roles or skills, one per line, up to 10. Each line is its own search on Catho, written the way you would type it into Catho's own box: desenvolvedor, analista de dados, tecnico de enfermagem. Accents are optional. English words work where Catho's employers use them. | array |
city | Only jobs in this city, with its two-letter state: "São Paulo, SP". The state matters — Catho has more than one city of most names and picks a small one otherwise. Leave it empty for a whole state, or for the whole country. | string |
state | Only jobs in this state. Used on its own for a whole state, or together with a city that has no state written on it. | string |
workModel | Catho's own Modalidade filter. This is the only place Catho publishes a job's work model — it is not on the job card, not in the job's own data and not in its page markup — so rows carry a work model only when you pick one here. Leave it on Any and the workModel and homeOffice fields come back empty rather than guessed. | string |
sortBy | Catho's own two orders. Most recent first is what you want for a daily feed; Catho's relevance order mixes older jobs in. | string |
maxResults | The most jobs returned in one run, across all your searches. Each job returned is charged once. Catho pages about 20 jobs at a time and most searches run dry somewhere between 300 and 900 jobs, whatever the results count at the top of its page claims. | integer |
includeDescription | Opens each job's own record for the full description, the state, contract type, benefits, the exact salary when the employer published one, Catho's salary band, the area it is filed under and the posting date. Switch it off and only what the search card shows comes back — title, company, city, the salary line and a rough posting tag — which reads about six times less. | boolean |
What you get
A structured dataset — each result includes fields like:
titlecompanycitystatesalaryTextcontractTypesenioritypostedAturlsalaryMinsalaryMaxsalaryBandcontractTypesworkSchedulebenefitscategorysubCategoryopeningsworkModeldescriptionExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Catho Jobs Scraper: Brazilian job listings with salary, contract, benefits and the full description
Type what you would type into Catho's own search box, analista de dados or motorista, add a city or a state if you want one, and every matching job comes back as a row: title, company, city and state, the salary Catho shows, the contract, the benefits, the full description and when it went up. No Catho account and no cookies. Two things catch people out: most employers publish a salary band rather than a number, and Catho only reveals a job's work model through its own filter, so workModel and homeOffice stay empty unless you filter on one.
| Input | Search words, up to 10, with an optional city, state or work model |
| Output | One row per job |
| Ceiling | 20,000 per run, though one search usually runs dry somewhere between 300 and 900 jobs |
| Account needed | None |
| Price | $1.40 per 1,000 jobs, flat on every plan |
🔍 What Catho Jobs Scraper does
Each line of search words is its own Catho search, and a job found by two of them is kept once. With Full job details on, the default, it opens each job's own record for the description, contract, benefits, salary band and dates. Off, you get only what the search card shows, which reads about six times less.
A city needs its two-letter state: São Paulo, SP. Catho has more than one city of most names and picks a small one if the state is missing, so a bare city is refused before anything is searched. Catho also answers a place it does not recognise with jobs from the whole of Brazil, so the run checks which place Catho actually applied, and if it was not yours, that search stops with a free row instead of a nationwide crawl you did not ask for.
The home office point, plainly: Catho does not put a work model on the job card, in the job's own record or in the page markup. The only place it exists is Catho's own Modalidade filter. Set workModel to remote and every row is a job Catho files as home office, with homeOffice: true on it. Leave it on any and both fields come back null, because guessing from the description would be making it up.
Salary is mostly a band. Across 120 jobs from a broad nursing search, salaryBand was filled on every row and salaryMin, an actual figure, on 26%. Catho shows a signed-out visitor the same salary it shows everyone else; often there is just no number to show.
📥 What you give it
{
"searches": ["analista de dados", "cientista de dados"],
"city": "São Paulo, SP",
"workModel": "remote",
"sortBy": "recent",
"maxResults": 200,
"includeDescription": true
}
With no search words at all, the run returns one sample job from Catho's own list, labelled and free.
| Field | When left out | What it is |
|---|---|---|
searches | none | Job titles, roles or skills, one per line, up to 10. Accents are optional, and English works where employers use it. |
city | none | A city with its two-letter state, such as São Paulo, SP. |
state | ANY | A state such as SP or RJ, for the whole state, or alongside a city written without one. |
workModel | ANY | remote, hybrid or presential, through Catho's own Modalidade filter. |
sortBy | relevance | relevance, or recent for newest first. |
maxResults | 100 | 1 to 20,000 jobs across all your searches. |
includeDescription | true | Opens each job's record for the full details. Off returns the card only: title, company, city, the salary line and a rough posting tag. |
proxyConfiguration | not needed | Optional. Servers of your own for the run to use. |
A city without its state stops the run before anything is searched, with a message saying what to fix.
📤 What you get back
A real row from a run on 30 September 2026, with the description cut short:
{
"jobId": "38566637",
"title": "Analista de Dados",
"company": "RANDSTAD SP",
"confidentialCompany": false,
"city": "São Paulo",
"state": "SP",
"stateName": "São Paulo",
"country": "Brasil",
"otherLocations": [],
"seniority": null,
"workModel": null,
"homeOffice": null,
"salaryText": "R$ 4.000",
"salaryMin": 4000,
"salaryMax": null,
"salaryBand": "A partir de R$ 3.000,00",
"salaryCurrency": "BRL",
"contractType": "CLT (Efetivo)",
"contractTypes": ["CLT (Efetivo)"],
"workSchedule": "Período Integral",
"benefits": [],
"category": "Informática",
"subCategory": "Informática /TI / Engenharia da Computação",
"roles": ["Analista de Banco de Dados"],
"openings": 1,
"sponsored": false,
"hasScreeningQuestions": false,
"screeningQuestionCount": 0,
"description": "A Randstad é líder global em soluções de Recursos Humanos, atuando como um parceiro do talento em toda a sua jornada profissional...",
"postedAt": "2026-09-25T16:32:19",
"postedText": "Publicada em 25/09",
"updatedAt": "2026-09-25T16:32:19",
"expiresAt": "2026-12-24T16:32:19",
"url": "https://www.catho.com.br/vagas/analista-de-dados/38566637",
"searchTerm": "analista de dados",
"detailsLoaded": true,
"scrapedAt": "2026-09-30T02:24:49.966Z"
}
| Field | What it is |
|---|---|
jobId, url | Catho's job id and the listing. jobId is the key for joining today's pull onto yesterday's. |
title, company, confidentialCompany | Where company is empty, confidentialCompany is true: Catho's "Empresa Confidencial", an employer that chose not to be named. |
city, state, stateName, country, otherLocations | Where the job is. |
seniority | Read off the job title, since Catho has no such field: Júnior, Pleno, Sênior, Estágio and so on. Null when the title carries none. |
workModel, homeOffice | Filled only when you filter on a work model. |
salaryText, salaryMin, salaryMax, salaryBand, salaryCurrency | The salary line as shown, the figure when the employer published one, and Catho's band. |
contractType, contractTypes, workSchedule, benefits | The contract, such as CLT (Efetivo), the hours and the benefits. Hours and benefits are empty more often than not. |
category, subCategory, roles, openings | Where Catho files the job, and how many openings it has. |
sponsored, hasScreeningQuestions, screeningQuestionCount | A paid listing, and whether applying means answering questions. |
description, postedAt, updatedAt, expiresAt, postedText | The full text and the dates, from the job's own record. postedText is the card's own tag and is always there. |
searchTerm, detailsLoaded, scrapedAt | Which of your searches found it, whether its full record loaded, and when it was read. |
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A job | no _sample and no _diagnostic field | yes |
| The sample job | _sample: true and charged: false, plus a note. Only when there were no search words | no |
| A place Catho did not recognise | _diagnostic: true, charged: false, the searchTerm, the place and a note saying what to fix | no |
Real jobs carry no charged field. The sample is a real job from Catho's list, so drop rows with _sample or _diagnostic rather than looking at the job itself.
A search with no jobs writes nothing to the dataset and costs nothing; the status message names it. Every run also writes a RUN_REPORT record to its key-value store with, per search, the jobs Catho claimed, pages read, jobs returned, repeats skipped, jobs without details, and why it stopped.
▶️ How to run it
1. Open Catho Jobs Scraper and click Try for free. 2. Type one search per line into Search words. 3. Add a City with its state, a State, or a Work model if you want one. 4. Set Maximum jobs, and pick Order if you want the newest first. 5. Click Start, then download the dataset as JSON, CSV or Excel.
The form arrives with analista de dados filled in and a cap of 100, so a run started without editing it is a real search.
💰 How much does it cost?
$1.40 per 1,000 jobs, flat on every Apify plan, with no volume tiers. That is $0.0014 a job.
Not charged: the sample job, a search that finds nothing, a job an earlier search in the same run already delivered, a job whose full record did not load when you asked for details, and a search stopped because Catho did not recognise the place. If you set a maximum charge on the run, it is read before the first request and the run stops at it.
💡 What people use it for
- A morning feed of new postings:
sortByset torecent, a modestmaxResults, andjobIdto skip what you had
yesterday.
- A home-office job list, through
workModelset toremote, which is the only honest way to get one from Catho. - Reading salary bands for a role across states, from
salaryBandandsalaryMin. - Seeing which employers in a field post as "Empresa Confidencial".
🚧 What it does not do
- It does not invent a work model. Null wherever Catho says nothing.
- Catho's results count is not what you can get. Its page claimed 8,782 results for
desenvolvedor; paging end to
end gave 763 distinct jobs. The run stops after two pages with nothing new rather than paying for repeats.
- No other filters. Catho's contract, salary-band and posting-date filters have no working form, fourteen shapes
were tried and every one was ignored, so they are not offered. Filter contractType and postedAt on the rows.
seniorityis only there when the title says so: about a fifth of jobs on a broad search, half on developer
searches.
- No résumés, candidates or employer contact details. Job listings only.
🧭 Which jobs scraper do you need?
| If you want | Use |
|---|---|
| Catho jobs in Brazil, with the salary Catho shows | This one |
| Freelance projects from Brazilian clients on Workana's Portuguese board | Workana Jobs Scraper |
| Public LinkedIn jobs by keyword and location | LinkedIn Jobs Scraper |
| Indeed jobs on its 11 country sites | Indeed Jobs Scraper |
| Listings from Google Jobs, with the site each job came from | Google Jobs Scraper |
❓ Questions people ask
How do I get only home-office jobs? Set workModel to remote. That is Catho's own Modalidade filter.
How many jobs can I pull for one search term? As many as Catho will page: 763 for desenvolvedor, over 880 for enfermeiro. The number Catho prints above its list is much bigger than what it serves.
Does it work for terms in English? Where Brazilian employers post in English, yes. software engineer returns real listings, and Portuguese terms return far more.
Why did my run stop straight away? A city was given without its state, or the maximum charge set for the run did not cover a single job. The run's message says which.
🆘 If something breaks
Open the Issues tab on the actor page. Send the input you used and the run ID, and the RUN_REPORT record if you can.