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
Catho is where most of Brazil's hiring is posted, and its search box is not built for anyone who wants the whole list. You get twenty cards at a time, no export, and the description only after a click.
This actor gives you the list. Type what you would type into Catho: analista de dados, tecnico de enfermagem, motorista. Add a city or a state if you want one. Every matching job comes back as a row: title, company, where it is, what it pays, the contract, the benefits, the full description, and when it went up.
No Catho account. No cookies to paste. Nothing to log into.
---
What a row looks like
A real one, copied out of a run on 20 September 2026. Only the description is cut short. It runs to 822 characters:
{
"jobId": "38432753",
"title": "Enfermeiro para Cirurgia Plástica",
"company": "Cirurgia Plástica",
"confidentialCompany": false,
"city": "São Paulo",
"state": "SP",
"stateName": "São Paulo",
"country": "Brasil",
"otherLocations": [],
"seniority": "Pleno",
"workModel": null,
"homeOffice": null,
"salaryText": "R$ 6.500",
"salaryMin": 6500,
"salaryMax": null,
"salaryBand": "A partir de R$ 6.000,00",
"salaryCurrency": "BRL",
"contractType": "CLT (Efetivo)",
"contractTypes": ["CLT (Efetivo)"],
"workSchedule": "2a a sábado",
"benefits": ["Seguro saúde", "Assistência médica / Medicina em grupo", "Assistência odontológica", "Vale-transporte"],
"category": "Saúde",
"subCategory": "Enfermagem",
"roles": ["Enfermeiro de Centro Cirúrgico"],
"openings": 1,
"sponsored": true,
"hasScreeningQuestions": true,
"screeningQuestionCount": 4,
"description": "Orientar e preparar o paciente no pré-operatório\nConferir exames, documentos e protocolos cirúrgicos\nAuxiliar a equipe m…",
"postedAt": "2026-09-16T10:47:24",
"postedText": "Publicada em 16/09",
"updatedAt": "2026-09-16T10:47:24",
"expiresAt": "2026-12-15T10:47:24",
"url": "https://www.catho.com.br/vagas/enfermeiro-para-cirurgia-plastica/38432753",
"searchTerm": "enfermeiro",
"detailsLoaded": true,
"scrapedAt": "2026-09-20T00:33:14.368Z"
}
That is a well-filled row. Plenty are thinner. workSchedule, benefits and salaryMin are empty more often than not, and the table further down says how often.
---
Input
{
"searches": ["analista de dados", "cientista de dados"],
"city": "São Paulo, SP",
"workModel": "remote",
"sortBy": "recent",
"maxResults": 200,
"includeDescription": true
}
| Field | What it does |
|---|---|
searches | Up to 10 lines. Each is its own Catho search. Accents optional. |
city | "São Paulo, SP", with the two-letter state. Catho has more than one city of most names, and picks a small one if you leave the state off. This actor refuses a bare city name rather than quietly returning the wrong town. |
state | Used on its own for a whole state, or alongside a city written without one. |
workModel | remote, hybrid, presential, or any. This is Catho's own Modalidade filter. There is a note below on why it matters. |
sortBy | recent for newest first, or Catho's relevance order. |
maxResults | Across all your searches. Each job returned is charged once. |
includeDescription | On by default. Off returns only what the search card shows and reads about six times less. |
Run it with no searches at all and you get one example row, marked _sample, free, so you can see the shape before you commit to anything.
---
The one thing to know about "home office"
Catho does not put a work model on the job. Not on the card, not in the job's own record, not in the page markup. We looked in all three. The only place it exists is Catho's own Modalidade filter.
So: set workModel to remote and every row you get back is a job Catho itself files as home office, with workModel: "remote" and homeOffice: true on it. Leave it on Any and those two fields come back null, because guessing from the description would be making it up. A job whose text says "Home Office" in the middle of a paragraph is not the same thing as a job Catho has flagged, and we are not going to pretend it is.
If you want a home-office feed, filter for it. That is the honest way to get one here.
---
What the salary field actually contains
Brazilian employers on Catho mostly publish a band, not a number. Measured across 120 jobs from a broad nursing search and 39 from filtered developer searches:
salaryBand, filled on 100% of rows. Catho's own wording:"A Combinar","A partir de R$ 2.000,00",
"Até R$ 2.000,00".
salaryMin, an actual figure on 26% of rows. When the employer published one, it is there.
Nothing is hidden behind a login. Catho shows the same salary to a signed-out visitor as to a signed-in one, and that is what you get. There just often isn't a number to show.
---
Coverage, measured
| Field | Broad search (120 jobs) | Filtered search (39 jobs) |
|---|---|---|
| title, city, state, description, postedAt, url, salaryBand | 100% | 100% |
| company named | 85% | 90% |
| contractType | 97% | 100% |
| category | 98% | 97% |
| benefits | 51% | 62% |
| salaryMin (a real figure) | 26% | 10% |
| seniority | 20% | 54% |
Where company is empty, confidentialCompany is true. That is Catho's "Empresa Confidencial", where the employer chose not to be named. The row is still complete in every other way.
---
What this does not do
- It does not invent a work model. See above.
nullwhere Catho says nothing. seniorityis read off the job title, because Catho has no seniority field.Júnior,Pleno,
Sênior, Estágio, Trainee, Coordenação, Gerência and so on, when the employer put one there. About a fifth of jobs on a broad search, half on developer searches. It is null otherwise, not defaulted to something.
- Catho's results count is not the number of jobs you can get. Its page says "8.782 resultados" for
desenvolvedor; paging through it end to end gives 763 distinct jobs. That is Catho's limit, not this actor's, and the actor stops when Catho stops rather than paying for a page of repeats. Depth varies by term: enfermeiro was still going past 880.
- No filters beyond the ones listed. Catho's contract, salary-band and posting-date filters have no
working URL form. We tried fourteen shapes and Catho ignored every one. Rather than ship a control that silently does nothing, they are not here. Filter contractType and postedAt on the rows instead.
- No résumés, no candidates, no employer contact details. Job listings only.
- No Catho account, so nothing that needs one.
---
Pricing
You pay per job delivered, flat, with no volume tiers. The price on this page is the price at every size.
Free, always:
- the
_samplerow an empty run returns; - a search that finds nothing;
- a job already delivered by an earlier search in the same run. Repeats are dropped, not billed;
- a job whose full record did not load when you asked for details;
- a search where Catho did not recognise the city you gave (you get a row saying so, free, instead of a
nationwide crawl you did not ask for).
If you set a maximum charge on the run, the actor reads it before its first request and stops at it.
---
Speed, from real runs
| Run | Jobs | Time |
|---|---|---|
| one search, one city, newest first | 12 | 3.0 s |
| three searches, one city, home office only | 39 | 5.7 s |
| one search, nationwide | 120 | 8.6 s |
---
Questions people actually ask
Can I scrape Catho without logging in? Yes. This actor never signs in and never handles a cookie. Everything it returns is what Catho shows a signed-out visitor.
Can I get the salary from Catho jobs? You get whatever Catho publishes: the band on every job, and a figure on about a quarter of them. Nothing is withheld from signed-out visitors that signing in would reveal.
How do I get only home-office jobs from Catho? Set workModel to remote. That is Catho's own Modalidade filter, and it is the only place Catho records a job's work model.
How many jobs can I pull for one search term? As many as Catho will page. Measured: 763 for desenvolvedor, over 880 for enfermeiro. The number Catho prints above the list is much larger than what it will actually serve.
Can I run this every morning for new postings? Yes. Set sortBy to recent and a modest maxResults. Each row carries postedAt and jobId, so de-duplicating against yesterday's pull is a one-line join.
What comes back if a term has no jobs? Nothing, and nothing is charged. The run still finishes green and the status message says which search came up empty.
Does it work for terms in English? Where Brazilian employers post in English, yes. software engineer returns real listings. Portuguese terms return far more.
---
The run report
Every run writes a RUN_REPORT record next to the data: per search, how many jobs Catho claimed, how many pages were read, how many came back, how many repeats were skipped, how many had no details, and why the search stopped. Worth a look when a number surprises you.