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

4

Total users

2

Monthly active users

8 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. From $2.50 per 1,000 rows, proxy included — nothing else to pay. 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, about $3 per 1,000 on a Scale plan (see pricing below). 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?

One price, everything included. You pay a small start fee plus one charge per exported practitioner. The French (or German / Italian) residential connection that Doctolib requires and the compute are included — there is no proxy or platform bill on top.

You pay per exported practitioner row only. Profiles skipped (no phone, other city, page not available) are not billed.

Store comps (October 2026): other Doctolib Actors range from about $1.50 / 1k to $7–$40 / 1k.

FreeBronzeSilverGoldPlatinumDiamond
Actor start (per run)$0.02$0.02$0.02$0.02$0.02$0.02
Practitioner row$0.004$0.0035$0.003$0.0025$0.0025$0.0025
20 practitioners (Free plan max per run)~$0.10~$0.09~$0.08~$0.07~$0.07~$0.07
50 practitioners—~$0.20~$0.17~$0.15~$0.15~$0.15
1,000 practitioners—~$3.52~$3.02~$2.52~$2.52~$2.52
10,000 practitioners—~$35.02~$30.02~$25.02~$25.02~$25.02

Totals include the start fee. Tiers follow your Apify plan (Free, Starter = Bronze, Scale = Silver, Business = Gold).

Is scraping Doctolib free?

On the Apify Free plan each run returns up to 20 practitioners (about $0.10). Upgrade for bulk exports. 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
specialtySlugs—Extra 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.