Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Catho Jobs Scraper icon

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.

11 runs on Apify $0.0014 per job ($1.4 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searches, city, state (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export 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 forWhenPrice
Job returnedOne 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

FieldWhat it doesType
searchesJob 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
cityOnly 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
stateOnly 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
workModelCatho'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
sortByCatho's own two orders. Most recent first is what you want for a daily feed; Catho's relevance order mixes older jobs in.string
maxResultsThe 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
includeDescriptionOpens 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:

titlecompanycitystatesalaryTextcontractTypesenioritypostedAturlsalaryMinsalaryMaxsalaryBandcontractTypesworkSchedulebenefitscategorysubCategoryopeningsworkModeldescription

Export 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 iconDeveloper & Research Tools

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.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

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.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

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.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

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.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

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.

2 use cases

See all 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
}
FieldWhat it does
searchesUp 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.
stateUsed on its own for a whole state, or alongside a city written without one.
workModelremote, hybrid, presential, or any. This is Catho's own Modalidade filter. There is a note below on why it matters.
sortByrecent for newest first, or Catho's relevance order.
maxResultsAcross all your searches. Each job returned is charged once.
includeDescriptionOn 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

FieldBroad search (120 jobs)Filtered search (39 jobs)
title, city, state, description, postedAt, url, salaryBand100%100%
company named85%90%
contractType97%100%
category98%97%
benefits51%62%
salaryMin (a real figure)26%10%
seniority20%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. null where Catho says nothing.
  • seniority is 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 _sample row 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

RunJobsTime
one search, one city, newest first123.0 s
three searches, one city, home office only395.7 s
one search, nationwide1208.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.