Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Doctoralia Scraper icon

Doctoralia Scraper

Scrape Doctoralia doctors and clinics by speciality and city in 12 countries. Name, speciality, clinic, address, rating and published price. No contact data.

26 runs on Apify $0.0019 per listing ($1.9 / 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 speciality, city, country (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.0019 per listing = $1.9 per 1,000

You are charged forWhenPrice
Listing returnedOne practitioner or clinic listing returned in the dataset. Diagnostic rows and the labelled sample row are not charged.$0.0019

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
specialityThe speciality as Doctoralia spells it on that country's site, one per line. Spanish sites use "dentista", "psicologo", "pediatra"; Poland uses "stomatolog"; Turkey uses "dis-hekimi". If the exact slug does not exist the Actor falls back to the site's own search, so a close spelling still works.array
cityCity to search in, for example "madrid", "sao-paulo", "milano". Leave empty to search the whole country.string
countryWhich Doctoralia country site to read. Each one is a separate directory with its own practitioners and its own speciality names.string
maxItemsHard cap on rows across every search in this run. You are charged per row returned.integer
startUrlsOptional. Paste Doctoralia listing pages instead of filling the fields above, for example https://www.doctoralia.es/dentista/madrid or https://www.miodottore.it/dentista/milano. Single profile pages are not supported.array
insuranceOptional. Return only practitioners Doctoralia lists under one insurer, using that insurer's slug from the site, for example "adeslas" or "sanitas" in Spain. Leave empty for everyone.string
includeClinicsDoctoralia mixes clinics into most speciality listings. Leave this on to get both; turn it off for individual practitioners only.boolean

What you get

A structured dataset — each result includes fields like:

nameentityTypespecialityclinicNamestreetcityregioncountryratingreviewCountconsultationServiceconsultationPriceonlineBookingonlineConsultationOnlylatitudelongitudeprofileUrl

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 →

Doctoralia Scraper

Reads Doctoralia's speciality-and-city listing pages and gives you one row per practitioner or clinic: the name, what they practise, where they practise, the rating and review count Doctoralia shows, and the consultation price when the professional has published one.

It covers twelve country sites, including the ones that do not live where you would guess: Argentina is doctoraliar.com and Peru is doctoralia.pe.

Read this before you buy it

There are no phone numbers and no email addresses in the output. That is on purpose.

These rows describe named healthcare professionals. The listing pages this Actor reads carry no tel: link, no mailto: and no telephone or email microdata at all (317 listing cards across all twelve country sites, zero of each), and the Actor does not go looking for contact details anywhere else. Every row also passes a filter that strips anything shaped like an email address, a phone number or a national identity number before it is written, so a field that changes shape on Doctoralia's side cannot quietly turn into a contact export.

If what you need is a call list, this is the wrong purchase. It will not become one by running it longer.

There is no review text either. Doctoralia publishes patient reviews with the patient's first name attached; those are somebody else's words about their own medical care and they are not in these rows. You get the star rating and how many reviews there are. Nothing else from the review section.

Countries

CountrySiteSpeciality slug looks like
Spaindoctoralia.esdentista, psicologo, pediatra
Brazildoctoralia.com.brdentista, ginecologista
Mexicodoctoralia.com.mxpsicologo, dentista
Colombiadoctoralia.coodontologo, psicologo
Chiledoctoralia.cldentista, psicologo
Argentinadoctoraliar.compsicologo, odontologo
Perudoctoralia.pedentista, psicologo
Portugaldoctoralia.com.ptdentista, psicologo
Italymiodottore.itdentista, ginecologo
Polandznanylekarz.plstomatolog, psycholog
Czechiaznamylekar.czzubar, psycholog
Turkeydoktortakvimi.comdis-hekimi, psikolog

Speciality names are in the local language. dentysta returns nothing in Poland; the word Doctoralia uses there is stomatolog. If your spelling does not match a real listing page, the Actor falls back to the site's own search box rather than failing, so a near miss usually still works, but the exact slug is faster and goes deeper.

Input

{
  "speciality": ["dentista"],
  "city": "madrid",
  "country": "es",
  "maxItems": 50
}

Or paste listing pages and skip the fields entirely:

{
  "startUrls": [
    "https://www.doctoralia.com.br/dentista/sao-paulo",
    "https://www.miodottore.it/dentista/milano",
    "https://www.znanylekarz.pl/stomatolog/warszawa"
  ],
  "maxItems": 90
}
FieldWhat it does
specialityOne or more speciality terms, one per line
cityCity to search in. Leave empty for the whole country
countryWhich country site to read
maxItemsHard cap on rows for the whole run
startUrlsListing pages, if you would rather paste URLs
insuranceReturn only professionals listed under one insurer, by that insurer's slug, for example adeslas or sanitas
includeClinicsDoctoralia mixes clinics into most speciality listings. Off gives you individuals only

maxItems is shared across your searches, not spent in order. Paste six cities with a cap of 90 and you get fifteen from each, not ninety from the first one and nothing from the rest. A search that runs out early hands its share to the others.

Output

One real row, from a run against doctoralia.com.br:

{
  "entityType": "practitioner",
  "id": "382464",
  "locationId": "567727",
  "name": "Dra. Carmen Lucia Calixto",
  "speciality": "Dentista",
  "subSpecialities": ["Ortodontia", "Dentística", "Ortodontia e ortopedia facial", "Harmonização facial"],
  "specialityIds": ["64"],
  "clinicName": "Dra. Carmen Calixto Odontologia",
  "street": "rua Madre de Deus, 1603",
  "city": "São Paulo",
  "region": "São Paulo SP",
  "country": "Brazil",
  "latitude": -23.5671577,
  "longitude": -46.5889091,
  "rating": 5,
  "reviewCount": 5,
  "consultationService": "Consulta Odontológica",
  "consultationPrice": "R$ 180",
  "consultationPriceAmount": 180,
  "consultationPriceCurrency": "R$",
  "consultationPriceIsFrom": false,
  "consultationPriceIsFree": false,
  "insuranceFilter": null,
  "onlineConsultationOnly": false,
  "onlineBooking": true,
  "slotsAvailable": true,
  "hasPhoto": true,
  "profileUrl": "https://www.doctoralia.com.br/carmen-lucia-calixto/dentista/sao-paulo",
  "countryCode": "br",
  "searchSpeciality": null,
  "searchCity": null,
  "sourceUrl": "https://www.doctoralia.com.br/dentista/sao-paulo",
  "listingHeading": "Dentistas em São Paulo",
  "page": 1,
  "position": 1,
  "scrapedAt": "2026-09-20T01:41:42.243Z"
}

searchSpeciality and searchCity echo back what you typed, so you can tell which of your searches a row came from. They are null above because that run pasted URLs instead.

entityType is practitioner or clinic. Clinics are the same shape, with the clinic's own name in name and clinicName left empty.

consultationPrice keeps whatever Doctoralia printed, because the phrasing carries meaning: da 90 € and 90 € are not the same offer. consultationPriceAmount is the number pulled out of it, consultationPriceIsFrom tells you it was a starting price, and consultationPriceIsFree is set when the listing says the first visit costs nothing.

listingHeading is the H1 Doctoralia rendered for the page the row came from, for example "Dentistas em São Paulo" above. Useful when you asked for one city and want to check what the site actually answered.

What you actually get, measured

From one run across six country sites (Brazil, Italy, Poland, Turkey, Peru and Argentina), fifteen rows from each:

FieldFilled
name, speciality, city, coordinates90 of 90
street address89 of 90
online-booking flag88 of 90
rating and review count86 of 90; the gaps are professionals with no reviews yet
region or province78 of 90
consultation service75 of 90
clinic name74 of 90
consultation price70 of 90
sub-specialities58 of 90

Limitations, plainly

Turkey publishes no consultation prices on its listing pages. Zero of fifteen rows from doktortakvimi.com carried a price or a service name, where Italy and Poland carried fifteen of fifteen. The other fields are all there. This is how that site is built, not something a retry fixes.

Sub-specialities depend on the country template. Spain, Brazil, Italy, Poland, Peru, Argentina and Czechia list them in brackets after the main speciality and the Actor splits them out. Turkey runs them together into one comma-separated string, which lands whole in speciality and leaves subSpecialities mostly empty there. That is what the page shows.

One address per row. A professional practising at three clinics appears once, with the first address Doctoralia shows. The others are on their profile page, which this Actor does not open.

"Price not specified" is common and it is real data. Plenty of professionals list a service without a fee. Those rows come back with consultationPrice set to the site's own wording and consultationPriceAmount null, rather than being silently dropped.

Ratings are Doctoralia's, not a judgement. A five with two reviews and a five with three hundred are both a five. reviewCount is in the row for exactly that reason.

This reads listing pages, not profiles. Paste a profile URL and you get a diagnostic row telling you so, uncharged. Paste the listing it appears on instead.

Deep pages repeat. A big city listing runs about a hundred pages: dentists in Madrid advertises ninety-eight. Ask for more and Doctoralia keeps answering with HTTP 200 rather than a 404: pages 105, 115 and 125 all came back with three cards and not one professional that had not already appeared. The Actor stops at the first page that adds nobody new, so you are not billed for laps.

Billing

You are charged per row returned. Sample rows and diagnostic rows are free: an empty input, a speciality the site does not recognise, a URL it cannot read, a page that failed to load: all of those write an explanatory row that costs you nothing and the run still ends as succeeded rather than failing on you. The current per-row figure is on the Pricing tab.

A run that finds nothing costs you the run fee and no more.

FAQ

Does this return doctors' phone numbers or emails? No. Not on any country site, not with any input. See the top of this page. It is a deliberate design choice, and every row is filtered before it is written.

Does it return the patient reviews? No. You get the star rating and the number of reviews. The review text and the reviewer names stay where they are.

Do I need a Doctoralia account or an API key? No. It reads the same signed-out pages anyone can open in a browser.

Which speciality name do I type? The one that country's site uses. dentista in Spain, Brazil, Italy and Portugal; stomatolog in Poland; dis-hekimi in Turkey; odontologo in Colombia. Open the site, do the search once, and copy the two words out of the address bar: doctoralia.es/dentista/madrid means speciality dentista, city madrid. If you get it slightly wrong the Actor falls back to the site's search.

Can I get every dentist in a country rather than one city? Leave city empty and the search runs nationally. Expect a lot of rows, so set maxItems to something you actually want to pay for.

Can I filter by insurer? Yes, where the country site supports it. Put the insurer's slug in insurance, for example adeslas, sanitas, dkv-seguros in Spain. It narrows the listing to professionals Doctoralia lists for that insurer, and the slug you used is echoed back in insuranceFilter on every row.

Are clinics included? By default yes, because Doctoralia mixes them into speciality listings and leaving them out would quietly lose you results you can see on the page. Set includeClinics to false for individuals only.

How many rows per page? Between eighteen and thirty-four depending on the country and how deep you are. Portugal and Czechia came back with eighteen, Mexico with thirty-four. The Actor pages until it hits your cap or the listing stops producing anyone new.

Why did I get fewer rows than maxItems? Either the search ran out of professionals, or the listing started repeating. Both are logged. The cap is a ceiling, not a target, and you are only charged for rows you actually received.

Does it need a proxy? No. It runs straight from its container. If you want it to exit from your own network, put your proxy servers in proxyConfiguration and it will use them.

What happens if Doctoralia is down or slow? Each request has a time limit and a small number of retries on a second browser profile. If a page still will not load you get an uncharged diagnostic row naming the URL and the status, and the run ends as succeeded so the rest of your searches still deliver.