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.

40 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: 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.

InputSearch words, up to 10, with an optional city, state or work model
OutputOne row per job
Ceiling20,000 per run, though one search usually runs dry somewhere between 300 and 900 jobs
Account neededNone
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.

FieldWhen left outWhat it is
searchesnoneJob titles, roles or skills, one per line, up to 10. Accents are optional, and English works where employers use it.
citynoneA city with its two-letter state, such as São Paulo, SP.
stateANYA state such as SP or RJ, for the whole state, or alongside a city written without one.
workModelANYremote, hybrid or presential, through Catho's own Modalidade filter.
sortByrelevancerelevance, or recent for newest first.
maxResults1001 to 20,000 jobs across all your searches.
includeDescriptiontrueOpens each job's record for the full details. Off returns the card only: title, company, city, the salary line and a rough posting tag.
proxyConfigurationnot neededOptional. 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"
}
FieldWhat it is
jobId, urlCatho's job id and the listing. jobId is the key for joining today's pull onto yesterday's.
title, company, confidentialCompanyWhere company is empty, confidentialCompany is true: Catho's "Empresa Confidencial", an employer that chose not to be named.
city, state, stateName, country, otherLocationsWhere the job is.
seniorityRead 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, homeOfficeFilled only when you filter on a work model.
salaryText, salaryMin, salaryMax, salaryBand, salaryCurrencyThe salary line as shown, the figure when the employer published one, and Catho's band.
contractType, contractTypes, workSchedule, benefitsThe contract, such as CLT (Efetivo), the hours and the benefits. Hours and benefits are empty more often than not.
category, subCategory, roles, openingsWhere Catho files the job, and how many openings it has.
sponsored, hasScreeningQuestions, screeningQuestionCountA paid listing, and whether applying means answering questions.
description, postedAt, updatedAt, expiresAt, postedTextThe full text and the dates, from the job's own record. postedText is the card's own tag and is always there.
searchTerm, detailsLoaded, scrapedAtWhich of your searches found it, whether its full record loaded, and when it was read.

🧾 Reading the output

RowHow to spot itCharged
A jobno _sample and no _diagnostic fieldyes
The sample job_sample: true and charged: false, plus a note. Only when there were no search wordsno
A place Catho did not recognise_diagnostic: true, charged: false, the searchTerm, the place and a note saying what to fixno

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: sortBy set to recent, a modest maxResults, and jobId to skip what you had

yesterday.

  • A home-office job list, through workModel set to remote, which is the only honest way to get one from Catho.
  • Reading salary bands for a role across states, from salaryBand and salaryMin.
  • 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.

  • seniority is 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 wantUse
Catho jobs in Brazil, with the salary Catho showsThis one
Freelance projects from Brazilian clients on Workana's Portuguese boardWorkana Jobs Scraper
Public LinkedIn jobs by keyword and locationLinkedIn Jobs Scraper
Indeed jobs on its 11 country sitesIndeed Jobs Scraper
Listings from Google Jobs, with the site each job came fromGoogle 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.