# Resalib · Emails, Phones & SIRET by Specialty (`corent1robert/resalib-practitioners-scraper`) Actor

Pick a Resalib specialty. We open each public profile — phone, address, website, socials, SIRET — then scan their site for a published email. No login.

- **URL**: https://apify.com/corent1robert/resalib-practitioners-scraper.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 practitioner with emails

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Resalib · Emails, Phones & SIRET by Specialty

Export **French wellness practitioners** from the public [Resalib](https://www.resalib.fr) directory. We **open each public profile** (not only the listing card): phone, address, website, socials, SIRET when published. **Find email on their website** (on by default) looks for a **published** mailbox on the practitioner site.

**No login. No API key. No Resalib account.**

Built for: supplement / training outbound · wellness SaaS · local partner lists

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| Supplement / lab brand | Naturopath call list | Specialty **Naturopath** · Max 24 first |
| Training school | Practitioners in one modality | Sophrology / hypnosis · Max 50 |
| Wellness SaaS | CRM with sites, phones, emails | Keep **Find email on their website** on · export **Outreach / CRM** |
| Agency / SDR | City slice | Set **City** (e.g. Paris) |

**What you get by default:** we visit the public Resalib **profile page**. Listing cards already have phone ~90%; the fiche adds **website**, **Facebook / Instagram**, **SIRET** (when valid) and GPS. Then we HTTP-scan the personal site for a mailbox.

**We never invent emails.** Only addresses published on the site (prefer `contact@`).

**Typical fill rates** (naturopath sample, 2026-08-24):

| Field | Rate |
|-------|------|
| Name / city / postal / URL | 24/24 |
| Phone | 23/24 (**96%**) |
| Website (personal site) | **15/24 (~63%)** |
| Instagram / Facebook | **20/24 (~83%)** / **17/24 (~71%)** |
| SIRET (checksum-valid) | **23/24 (~96%)** |
| Email on the Resalib fiche | **0/24** |
| Email from the practitioner website | **2/4 sites** in an 8-row check (~25% of all rows; only published addresses) |

Listing cards already have name, city and often the phone. **Website, socials and SIRET are on the fiche** — that is what this Actor opens.

***

### Quick start

1. Open this Actor on Apify.
2. Keep specialty **Naturopath** (or pick another).
3. Keep **Find email on the practitioner website** on. Set Max **24**. Click **Start**.
4. Export **Outreach / CRM**.

Paste profile URLs if you already have Resalib links — we skip the directory and enrich those pages.

### Saved tasks

Four Console presets (24 profiles, website email on). Open one and click **Start**.

| Task | Specialty | View |
|------|-----------|------|
| [Find French naturopath emails](https://console.apify.com/actors/tasks/HAZ3ujwrMwBrHgfZR) | Naturopath · France | Outreach / CRM |
| [Export Paris naturopaths](https://console.apify.com/actors/tasks/Wndo48WGvkOtyzkBp) | Naturopath · Paris | Overview |
| [List French sophrologists](https://console.apify.com/actors/tasks/2YyIdg8d79AeKnbeL) | Sophrologist · France | Overview |
| [Osteopath phones, emails and SIRET](https://console.apify.com/actors/tasks/8O4rJUZ0ghwJ8ZEfo) | Osteopath · France | Outreach / CRM |

Store Examples pages go live when the Actor is public.

### What it extracts

| Category | Fields |
|----------|--------|
| Identity | `name`, `description`, `specialty`, `practitionerId` |
| Location | `street`, `city`, `postalCode`, `region`, `country`, `latitude`, `longitude` |
| Contacts | `phone`, `phoneE164`, `email`, `emailSource`, `website` |
| Social | `facebookUrl`, `instagramUrl`, `linkedinUrl`, `youtubeUrl`, `tiktokUrl` |
| Company | `siret`, `siren` (valid checksum only) |
| Profile | `url`, `imageUrl`, `priceRange`, `scrapedAt` |

Missing values are omitted (not invented).

### Input

```json
{
  "specialty": "naturopathe",
  "maxItems": 24,
  "enrichFromWebsite": true
}
```

| Field | Console | Default | Notes |
|-------|---------|---------|--------|
| `specialty` | Specialty | Naturopath | Or **Other** + slug |
| `city` | City | — | Optional. Keep that city only |
| `maxItems` | Max profiles | 24 | **0** = all matching. **Free plan: 20 / run** |
| `profileUrls` | Profile URLs | — | Enrich links you already have |
| `enrichFromWebsite` | Find email on the practitioner website | **On** | Homepage + contact / mentions légales. Turn off for a faster export |

### Output example

```json
{
  "name": "Cabinet Example",
  "city": "Lyon",
  "postalCode": "69001",
  "phone": "+33600000000",
  "email": "contact@example-naturo.fr",
  "emailSource": "practitioner-website",
  "website": "https://example-naturo.fr",
  "instagramUrl": "https://www.instagram.com/example",
  "siret": "12345678900012",
  "url": "https://www.resalib.fr/praticien/121178-example",
  "scrapedAt": "2026-08-24T20:00:00.000Z"
}
```

### How much does it cost?

HTTP only (no browser). Actor start is **$0.00005** per GB.

| Event | FREE | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Practitioner with email | **$5.00 / 1k** | $4.50 | $4.00 | $3.50 |
| Practitioner with phone (no email) | **$2.00 / 1k** | $1.80 | $1.60 | $1.40 |
| Practitioner without phone | **$1.00 / 1k** | $0.90 | $0.80 | $0.70 |

24 phone-only rows ≈ **$0.05**. 24 rows with email ≈ **$0.12**.

A mailbox from the practitioner website is billed as **with email**. Resalib lists on the order of **~79k** public profiles (sitemap). A full specialty dump (e.g. ~4k naturopaths) is billed per exported row.

### Also available

- [Doctolib · Practitioners by Specialty & City](https://apify.com/corent1robert/doctolib-practitioner-scraper) — licensed health directory (Doctolib has no naturopaths)
- [Ameli Health Directory Scraper](https://apify.com/corent1robert/ameli-practitioners-scraper) — conventioned practitioners
- [PagesJaunes · French Local Leads](https://apify.com/corent1robert/pagesjaunes-local-leads)

### FAQ

**Why not listing-only?** The card has name, city and often the phone. Website, socials and SIRET live on the **profile**. That is the default job.

**Why was email empty before?** Resalib does not publish mailboxes on the fiche. Turn **Find email on the practitioner website** on (default) — we only keep an address the site already shows.

**Can I take one specialty for all of France?** Yes. Leave City empty. Set Max **0** if you want every matching profile (6-hour run cap).

### Local development

```bash
npm install
npm test
apify run -p --input-file INPUT.json
```

**Having issues?** Contact corentin@outreacher.fr

# Actor input Schema

## `specialty` (type: `string`):

Resalib directory. **Naturopath** is the default. Anything missing → Other and paste the URL slug.

## `customSpecialtySlug` (type: `string`):

Only if Specialty is **Other**. Copy the word from the Resalib URL, e.g. `naturopathe`.

## `city` (type: `string`):

Keep profiles in this city only (e.g. Paris). Leave empty for all France.

## `maxItems` (type: `integer`):

Stop after this many unique profiles. **0 = all matching results**. **Free plan: 20 / run.**

## `profileUrls` (type: `array`):

One practitioner page per line, e.g. `https://www.resalib.fr/praticien/121178-revitalis-emoi-naturopathe-kruth`.

## `enrichFromWebsite` (type: `boolean`):

When the profile has a website, fetch it over HTTP(S) and keep a published mailbox (prefer contact@). On by default. Rows with a mailbox are billed as **Practitioner with email**. Turn off for a faster directory-only export.

## Actor input object example

```json
{
  "specialty": "naturopathe",
  "maxItems": 24,
  "profileUrls": [],
  "enrichFromWebsite": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per profile — identity, phone, email, website, socials, SIRET, profile URL.

## `overview` (type: `string`):

Name, city, phone, website, profile URL.

## `outreachCrm` (type: `string`):

Phone, email, website, socials, SIRET and address for CRM import.

## `runLog` (type: `string`):

Plain-text log of the run phases and progress.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "specialty": "naturopathe",
    "maxItems": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/resalib-practitioners-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "specialty": "naturopathe",
    "maxItems": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/resalib-practitioners-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "specialty": "naturopathe",
  "maxItems": 24
}' |
apify call corent1robert/resalib-practitioners-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/resalib-practitioners-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kaG71WUxcpwMrjZb7/builds/EhjQj0XY1hHGAv2cP/openapi.json
