Doctolib · Practitioners by Specialty & City
Pricing
from $1.40 / 1,000 practitioner profiles
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
11 days ago
Last modified
Categories
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 goal | Suggested setup |
|---|---|---|
| Medical / dental supplier | City call list | Specialty Dentist + Paris · Max rows 50 first |
| Healthcare SDR / outbound | Phones for a territory | Same · export Outreach / CRM |
| Agency / CRM ops | Refresh links you already stored | Profile URLs mode |
| Market research | Size a specialty in a city | Keep Search · raise Max rows or set 0 |
| DE / IT expansion | Same job outside France | Country 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
- Keep Search mode.
- Choose Country, a specialty, and a city.
- Leave Max rows at 50 for a first look.
- 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)
| Example | Best for |
|---|---|
| Export dentists in Paris from Doctolib | France dental outreach |
| Find GPs in Lyon on Doctolib | City GP list |
| Export dentists in Berlin from Doctolib | Germany (doctolib.de) |
| Enrich Doctolib profile URLs you already have | CRM refresh |
These landing pages are on the Actor Examples tab after publication.
What it extracts
| Field | What it is |
|---|---|
fullName / title / firstName / lastName | Display name, Dr when listed, split identity |
specialityName | Specialty label |
phone / phoneE164 | Public landline (national) and E.164 (+33…) |
fullAddress | One line: street, postcode city, country |
address / zipcode / city / country | Split location. country is ISO2 (FR, DE, IT) |
rpps / adeli / lanr / siren | Legal IDs when published |
practiceName | Cabinet / clinic name when listed |
latitude / longitude / website | Rare on first HTML |
presentation / languagesSpoken / diplomas / experience | Profile sections when present in HTML |
feesSummary / regulationSector | Indicative fees and convention when listed |
sourceUrl / imageUrl | Canonical 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.
| Free | Bronze | Silver | Gold | Platinum | Diamond | |
|---|---|---|---|---|---|---|
| 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
| Field | Default | Notes |
|---|---|---|
mode | search | City list (search) or CRM links (practitionerUrls) |
specialty | dentiste | 40+ specialties in the list, or custom + customSpecialtySlug |
place | fr:paris | fr:paris, de:berlin, it:milano, fr:all, or custom + customCity |
maxItems | 0 in API · Console prefill 50 | 0 = no row ceiling |
requirePhone | true | Skip profiles with no public phone |
searchUrls | empty | Optional extra / custom search pages |
practitionerUrls | empty | Only for Profile URLs mode |
API-only (accepted in JSON, not shown on the Console form):
| Field | Default | Notes |
|---|---|---|
verboseLogs | false | Extra debug lines |
proxyConfiguration | Residential, country matched to the city | Override via API |
maxConcurrency | 8 | Parallel profile fetches |
datasetFormat | client | full 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
- You pick specialty + city (or paste a search / profile URL).
- The Actor matches public Doctolib directory profile URLs for that specialty and city.
- Each profile page is parsed from HTML (no Doctolib account, no private API).
- Rows are written as they complete.
Is it legal to scrape Doctolib?
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
- OneDoc.ch · Swiss Practitioners by Specialty & City — Swiss doctors and dentists, phone and email when published.
- local.ch scraper — Swiss business directory leads.
Local development
cd doctolib-practitioner-scrapernpm installapify 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.