Doctolib · Practitioners by Specialty & City avatar

Doctolib · Practitioners by Specialty & City

Pricing

from $1.40 / 1,000 practitioner profiles

Go to Apify Store
Doctolib · Practitioners by Specialty & City

Doctolib · Practitioners by Specialty & City

Export public Doctolib practitioners in France, Germany and Italy. Pick a specialty and city — name, phone, address, RPPS. About $2 per 1,000 rows. No login. No API key.

Pricing

from $1.40 / 1,000 practitioner profiles

Rating

0.0

(0)

Developer

Corentin Robert

Corentin Robert

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

Pick a specialty and a city. Get one row per public Doctolib practitioner: name, phone when listed, address, specialty, RPPS / ADELI when shown, profile URL.

No login. No API key. No Doctolib account. About $2 per 1,000 rows on Free. France, Germany, and Italy.

Who is this for?

You are…Typical goalSuggested setup
Medical / dental supplierCity call listSpecialty Dentist + Paris · Max rows 50 first
Healthcare SDR / outboundPhones for a territorySame · export Outreach / CRM
Agency / CRM opsRefresh links you already storedProfile URLs mode
Market researchSize a specialty in a cityKeep Search · raise Max rows or set 0
DE / IT expansionSame job outside FranceCountry Germany or Italy · matching city

What you get by default: name (split first/last when listed), landline, street, city, specialty, RPPS on French directory pages, profile URL and photo. Email is almost never public — this Actor does not guess mailboxes. Languages, diplomas, fees, GPS and cabinet name stay null unless Doctolib already put them in the first HTML (most profiles hydrate those in the browser).

Fill rate (cloud, 14 Paris dentists, phone required, August 2026): 14/14 name · phone · address · city · photo · 13/14 RPPS and first/last name · 13/14 specialty · 1/14 presentation · 0/14 languages, diplomas, fees, GPS, website. One profile was skipped (no public phone).

When to paste profile URLs: you already have Doctolib links in a spreadsheet and only need a refresh.

Quick start

  1. Keep Search mode.
  2. Choose Country, a specialty, and a city.
  3. Leave Max rows at 50 for a first look.
  4. Click Start. Open the Outreach / CRM dataset view.

Set Max rows to 0 when you want the full city list (every public profile for that specialty in that city). Optional: paste a Doctolib search URL if the city is not in the list.

Example — all gynaecologists in Paris

Specialty Gynaecologist, city Paris, France, Max rows = 0. The Actor walks the public directory until it runs out of matching profiles (not a 50-row sample). Related French slugs are included (gynecologue, obstetrics, medical / surgical gynae). Expect hundreds of rows and about $2 per 1,000 on Free. Turn only rows with a phone off if you also want profiles without a landline.

Ready-made examples (published tasks)

ExampleBest for
Export dentists in Paris from DoctolibFrance dental outreach
Find GPs in Lyon on DoctolibCity GP list
Export dentists in Berlin from DoctolibGermany (doctolib.de)
Enrich Doctolib profile URLs you already haveCRM refresh

These landing pages are on the Actor Examples tab after publication.

What it extracts

FieldWhat it is
fullName / title / firstName / lastNameDisplay name, Dr when listed, split identity
specialityNameSpecialty label
phone / phoneE164Public landline (national) and E.164 (+33…)
fullAddressOne line: street, postcode city, country
address / zipcode / city / countrySplit location. country is ISO2 (FR, DE, IT)
rpps / adeli / lanr / sirenLegal IDs when published
practiceNameCabinet / clinic name when listed
latitude / longitude / websiteRare on first HTML
presentation / languagesSpoken / diplomas / experienceProfile sections when present in HTML
feesSummary / regulationSectorIndicative fees and convention when listed
sourceUrl / imageUrlCanonical profile and photo

Empty values are null, never "-".

How much does it cost to scrape Doctolib?

Cloud runs use a French (or DE/IT) residential proxy by default. A cheap datacenter proxy is blocked by Doctolib’s directory. Proxy traffic is billed by Apify on top of PPE.

HTTP-only — default 1024 MB, no browser. You pay per exported practitioner row. Skipped pages are not billed.

Store comps (August 2026): other Doctolib Actors range from about $1.50 / 1k to $7–$40 / 1k. This Actor is $2 / 1k on Free — same band as OneDoc.ch and local.ch in this toolkit.

FreeBronzeSilverGoldPlatinumDiamond
Actor start$0.00005$0.00005$0.00005$0.00005$0.00005$0.00005
Practitioner profile$0.002$0.0018$0.0016$0.0014$0.0012$0.0012
50 profiles~$0.10~$0.09~$0.08~$0.07~$0.06~$0.06
1,000 practitioners$2$1.80$1.60$1.40$1.20$1.20

Is scraping Doctolib free?

A 50-row test is about $0.10 on Free. National (All cities) exports can be tens of thousands of rows — keep Max rows low on the first run.

Input

FieldDefaultNotes
modesearchCity list (search) or CRM links (practitionerUrls)
specialtydentiste40+ specialties in the list, or custom + customSpecialtySlug
placefr:parisfr:paris, de:berlin, it:milano, fr:all, or custom + customCity
maxItems0 in API · Console prefill 500 = no row ceiling
requirePhonetrueSkip profiles with no public phone
searchUrlsemptyOptional extra / custom search pages
practitionerUrlsemptyOnly for Profile URLs mode

API-only (accepted in JSON, not shown on the Console form):

FieldDefaultNotes
verboseLogsfalseExtra debug lines
proxyConfigurationResidential, country matched to the cityOverride via API
maxConcurrency8Parallel profile fetches
datasetFormatclientfull adds internal IDs
specialtySlugsExtra directory slugs (legacy)

Example — Paris dentists

{
"mode": "search",
"specialty": "dentiste",
"place": "fr:paris",
"maxItems": 50,
"requirePhone": true
}

Example — Berlin dentists

{
"mode": "search",
"specialty": "dentiste",
"place": "de:berlin",
"maxItems": 50,
"requirePhone": true
}

Example — profile URLs

{
"mode": "practitionerUrls",
"practitionerUrls": [
{ "url": "https://www.doctolib.fr/dentiste/paris/leslie-sultan" }
]
}

Output example

{
"fullName": "Dr Leslie Sultan",
"title": "Dr",
"firstName": "Leslie",
"lastName": "Sultan",
"specialityName": "Chirurgien-dentiste",
"rpps": "10003489860",
"phone": "01 42 60 43 11",
"phoneE164": "+33142604311",
"fullAddress": "12 Rue d'Alger, 75001 Paris, France",
"address": "12 Rue d'Alger",
"zipcode": "75001",
"city": "Paris",
"country": "FR",
"sourceUrl": "https://www.doctolib.fr/dentiste/paris/leslie-sultan"
}

Phone and legal IDs are only present when Doctolib shows them on the public page.

How it works

  1. You pick specialty + city (or paste a search / profile URL).
  2. The Actor matches public Doctolib directory profile URLs for that specialty and city.
  3. Each profile page is parsed from HTML (no Doctolib account, no private API).
  4. Rows are written as they complete.

This Actor only reads public practitioner directory pages. Health-related personal data is sensitive: you must have a lawful basis (GDPR and local rules) for your use case. Respect Doctolib’s terms and keep concurrency reasonable. This is not legal advice.

Also available

Local development

cd doctolib-practitioner-scraper
npm install
apify run

storage/key_value_stores/default/INPUT.json (or .actor/INPUT.json) must satisfy the input schema. Local datasets stay in storage/ and are also written to output.csv. They are not uploaded to Apify Console.

Support

Contact corentin@outreacher.fr if you need a custom scraper or a tailored export.