# French Diagnosticians · Emails & Phones (`corent1robert/diagnostiqueurs-france-annuaire`) Actor

Export unique certified French diagnosticians (DPE, amiante, gaz, électricité…) with public email and phone from the official DIN / data.gouv annuaire. One person per row, certificates nested. HTTP only, no login.

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

## Pricing

from $1.75 / 1,000 diagnostician scrapeds

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

### What does French Certified Diagnosticians do?

This Actor turns the official [DIN diagnosticians directory](https://diagnostiqueurs.din.developpement-durable.gouv.fr/) into a **CRM file of unique certified people** — with the **public email and phone** already published in the [data.gouv dump](https://www.data.gouv.fr/datasets/annuaire-des-diagnostiqueurs-immobiliers).

**One row = one person.** If Olivier holds DPE individuel, gaz and amiante, you get **one lead** and a nested `certificates[]` list. The raw CSV is one row per certificate (~75,000 lines). We collapse that to ~**14,000 unique people** nationwide.

It is a public **diagnosticians directory API alternative**: HTTP only, no login, no browser, **Licence Ouverte**. We never invent a mailbox.

This is **not** [French DPE F/G · SIREN Property Owners](https://apify.com/corent1robert/dpe-fg-proprietaires-siren). That Actor is the **SCI on a passoire**. This one is the **person who writes the DPE**. Mixing them in outreach is a wasted sequence.

### Why scrape the official diagnosticians directory?

You sell **to diagnosticians**, not to dwelling owners. PagesJaunes and LinkedIn give you a company switchboard. The DIN dump gives you the **named certified person**, the **certificate types that are still valid**, and a **mailbox they published for the public directory**.

| You are… | Typical goal | Suggested first run |
|---|---|---|
| SaaS DPE / logiciel métier | Territory of operators who actually hold **DPE individuel**, with a mailbox | Dept `75` · cert DPE individuel · Max 20 |
| RC pro / insurance | Named certified people (not a SARL dump), validity dates, certifier | One dept · valid only · Max 50 |
| Training / COFRAC organism | People whose cert is valid, or who only hold amiante / gaz | Cert type = Amiante or Gaz · Max 100 |
| Equipment / marketplace | Local DPE or amiante operators to pitch cameras, GED, software | Dept + postal · Max 200 |
| Lead agency (rénovation énergie) | Operators you can brief on passoires — **not** the SCI owner file | DPE individuel · your depts |

**What you get:** first name, last name, company, address, department, **email**, **phone**, nested certificates (type, number, certifier, validity), flags `hasDpeIndividuel` / `hasDpeImmeuble` / `hasAudit`.

**What you do not get:** LinkedIn, SIREN, guessed `info@` on a marketing site, or the owner of the dwelling. Empty email is rare in this dump — if it is empty, the administration did not publish it.

**Why not download the CSV yourself?** You can. The dump is public. This Actor is the CRM step: unique people, Title Case, phone `06 12 34 56 78`, “keep if they have DPE but still nest gaz/amiante”, department filter, Excel / API / schedule. You pay for that file, not for inventing contacts.

On Apify you can **schedule** a monthly refresh (the dump updates weekly), download **JSON / CSV / Excel**, and call the Actor from the **API** (Sheets, Make, n8n).

### What data can this diagnosticians scraper extract?

| Field | Description |
|---|---|
| `firstName`, `lastName`, `companyName` | Person + company as published, Title Case |
| `address`, `postalCode`, `city`, `department` | Work address from the dump |
| `email`, `phone`, `phone2` | Public directory contacts. We copy them; we do not guess. |
| `certificateTypes`, `certificateTypesText` | Labels for filters / CSV (`DPE individuel; Gaz`) |
| `hasDpeIndividuel`, `hasDpeImmeuble`, `hasAudit` | Fast flags for SaaS and insurance ICPs |
| `certificates[]` | `typeId`, `typeLabel`, `number`, `certifier`, `validFrom`, `validUntil`, `isValid` |
| `source`, `sourceUrl`, `scrapedAt` | DIN / data.gouv + the CSV URL used for this run |

Certificate types in the dump: DPE individuel, DPE immeuble / tertiaire, audit énergétique, amiante, amiante bâtiments complexes, électricité, gaz, plomb, DRIPP/CAT, termites (métropole and outre-mer).

### How to extract French certified diagnosticians

1. Open this Actor in Apify Console.
2. Keep **Department = 75 (Paris)** and **Certificate = DPE individuel**, **Max diagnosticians = 20**.
3. Click **Start**. Open the **Outreach / CRM** view. Export CSV or Excel into your sequencer.

That first run is the product: named people in one territory, mailbox + phone, DPE flag on.

Then:

- Empty **Department** for France entière (~14k unique people).
- Add postal codes (`75008`) after department if you only want a slice of Paris.
- Tick extra certificate types only if the person **must** hold at least one of them. Other certs still appear nested (a DPE operator who also has gaz stays one row).
- Leave **Valid certificates only** on unless you are hunting expiry / recertification.

**Max items = 0** → all matches (Free plan still stops at **50** people / run).

### How much does it cost to scrape diagnosticians?

**Pay-per-event** on **unique people**, not on the 75k certificate lines. Actor start is **$0.00005**. Default **512 MB**, HTTP only, no proxy.

Priced as a **named contact file** ($2.50 / 1,000 on Free): above open-data DPE F/G owners at $2 / 1k (no emails), in the same band as other unique-person public-email lists. You are not paying $5 / 1k marketplace-crawl prices — the mailbox is already in the dump.

| Apify plan | Per person | Per 1,000 |
|---|---|---|
| Free | **$0.0025** | **$2.50** |
| Bronze | $0.00225 | $2.25 |
| Silver | $0.002 | $2.00 |
| Gold | $0.00175 | $1.75 |
| Platinum | $0.0015 | $1.50 |
| Diamond | $0.00125 | $1.25 |

| Run | Unique people | Approx. cost (Free) |
|---|---|---|
| Default Console test | 20 | **$0.05** |
| Paris · DPE individuel (valid) | ~380 | **~$0.95** |
| France entière | ~14,000 | **~$35** |

Free plan: **50 rows / run**. Set a **max total charge** on paid plans. Compute is seconds, not hours — you pay for the people, not for residential proxy.

### Input

See the **Input** tab for the full form.

| Field | Default | Why it exists |
|---|---|---|
| `departments` | `75` | INSEE codes. Empty = France. |
| `postalCodes` | — | Extra filter after department |
| `certificateTypes` | DPE individuel | Keep people who hold **at least one**. Other certs stay nested. |
| `onlyValid` | true | Drop expired certificates; skip people with none left |
| `requireEmail` | No | Guard only. The dump already publishes email on essentially every row. |
| `maxItems` | 20 | Unique-person cap. `0` = all matches. |

### Output

You can download the dataset as JSON, HTML, CSV, or Excel. Use **Outreach / CRM** for sequencer columns (`firstName`, `email`, `phone`, `city`, `certificateTypesText`).

```json
{
  "firstName": "Olivier",
  "lastName": "Martin",
  "companyName": "SARL Example Diagnostics",
  "address": "12 Rue Exemple",
  "postalCode": "75008",
  "city": "Paris",
  "department": "75",
  "email": "contact@example-diagnostics.fr",
  "phone": "01 23 45 67 89",
  "phone2": "06 12 34 56 78",
  "certificateCount": 2,
  "certificateTypesText": "DPE individuel; Gaz",
  "hasDpeIndividuel": true,
  "hasDpeImmeuble": false,
  "hasAudit": false,
  "certificates": [
    {
      "typeId": "dpe-individuel",
      "typeLabel": "DPE individuel",
      "number": "C0001",
      "certifier": "AFNOR CERTIFICATION",
      "validUntil": "2029-09-30",
      "isValid": true
    }
  ]
}
```

### Tips

- Start with **one department** and DPE individuel. Raise `maxItems` only when the 20-row sample looks like your ICP.
- Filter **Amiante** (or Gaz / Électricité) when you sell a métier tool, not a DPE SaaS. Do not select every type “to be safe” — you will keep almost everyone.
- `certificateTypesText` is the CSV-friendly field for HubSpot / Lemlist. Nested `certificates[]` is for ops (expiry, certifier, number).
- Schedule a monthly run: the data.gouv resource titled **« dernière mise à jour »** changes about weekly. Same filters, fresh validity.
- Need **SCI on passoires** instead? Use [DPE F/G · SIREN Property Owners](https://apify.com/corent1robert/dpe-fg-proprietaires-siren) — emails there are always null.

### Is it legal to reuse the DIN / data.gouv dump?

This Actor downloads the official CSV listed on [Annuaire des diagnostiqueurs immobiliers](https://www.data.gouv.fr/datasets/annuaire-des-diagnostiqueurs-immobiliers) (same source as the [public DIN directory](https://diagnostiqueurs.din.developpement-durable.gouv.fr/)). It is published under **Licence Ouverte / Open Licence 2.0**.

Our Actors only keep **what the administration has chosen to share publicly** (name, work address, professional email, phone, certificates). We do not scrape private inboxes or guess addresses.

You should still treat those fields as **personal data**. GDPR applies. Outreach needs a **legitimate interest** (B2B, opt-out, suppression). If you are unsure, consult your lawyers.

### FAQ

#### Is this the same as ADEME DPE F/G property owners?

No. ADEME DPE is the **dwelling** (class F/G → SCI at the address, no email). This dump is the **certified person** who can issue DPE, amiante, gaz, électricité… reports.

#### Do you scrape the DIN website?

No. We resolve the latest CSV on data.gouv.fr and parse it. No login, no browser, no proxy.

#### Why ~14,000 people and not 75,000 rows?

The administration publishes **one line per certificate**. The same person appears many times. The Actor is a **people file**.

#### Are emails always filled?

Almost always — they are in the official dump. We do not invent them. If a row has `email: null`, the dump had no valid address.

#### Does it work outside Paris?

Yes. Empty the department list for France. Defaults are Paris so a first Console run stays cheap.

#### Can I keep only people whose DPE cert expires soon?

v1 keeps **valid** certs (or all, if you turn the toggle off). Expiry dates are on each nested certificate (`validUntil`). Filter in your CRM, or ask for a recertification view.

### Support

Use the **Issues** tab for bugs and department edge cases. Use the **API** tab for programmatic runs. Custom territories or a sister Actor (SIREN on the company name, recertification window): corentin@outreacher.fr

# Actor input Schema

## `departments` (type: `array`):

INSEE department codes. Default **75 (Paris)**. Leave empty for nationwide (~14k unique people).

## `postalCodes` (type: `array`):

Extra filter, e.g. `75002`. Applied after department.

## `certificateTypes` (type: `array`):

Keep people who hold **at least one** of these. Other certificates stay nested on the row. Default **DPE individuel**.

## `onlyValid` (type: `boolean`):

Drop expired certificates. People with no remaining valid cert are skipped.

## `requireEmail` (type: `string`):

The official dump publishes emails for essentially every row. Keep **No** unless you want an extra guard.

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

**Global** cap of unique people. Default **20**. `0` = all matches (Free plan still capped at 50 / run).

## Actor input object example

```json
{
  "departments": [
    "75"
  ],
  "certificateTypes": [
    "dpe-individuel"
  ],
  "onlyValid": true,
  "requireEmail": "no",
  "maxItems": 20
}
```

# Actor output Schema

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

Name, company, email

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

Contacts for CRM import

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

All rows

## `output` (type: `string`):

No description

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

No description

# 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 = {
    "departments": [
        "75"
    ],
    "certificateTypes": [
        "dpe-individuel"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/diagnostiqueurs-france-annuaire").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 = {
    "departments": ["75"],
    "certificateTypes": ["dpe-individuel"],
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/diagnostiqueurs-france-annuaire").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 '{
  "departments": [
    "75"
  ],
  "certificateTypes": [
    "dpe-individuel"
  ]
}' |
apify call corent1robert/diagnostiqueurs-france-annuaire --silent --output-dataset

```

## MCP server setup

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

```

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/cC5Rx75dRlUcyGYJO/builds/vnkIPPXGiidU10QOd/openapi.json
