# French Health Facilities (FINESS): pharmacies, hospitals, EHPAD (`futurelife/french-health-facilities`) Actor

Every pharmacy, hospital, clinic, care home (EHPAD), laboratory, health centre and social care facility in France from the official FINESS register, updated daily. Filter by type, department, city, postal code or radius; one clean row per facility with address, phone, GPS and readable labels.

- **URL**: https://apify.com/futurelife/french-health-facilities.md
- **Developed by:** [Future Life](https://apify.com/futurelife) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 facilities

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## French Health Facilities

Every pharmacy, hospital, clinic, care home, laboratory, health centre and social care facility in France, from the official national register (FINESS), refreshed every day, one clean row per establishment.

- **Complete and official**: the FINESS register is the reference list every French health authority uses. 104,796 open establishments on 2026-09-21, among them 20,068 pharmacies, 10,016 care homes for the elderly (EHPAD), 4,613 medical laboratories, 4,040 hospitals, 3,747 health centres.
- **Ready to use**: name, FINESS number, SIRET, type in plain English and official category, address, postal code, city, department, GPS coordinates, phone, legal entity with its legal status and sector (public, private non-profit, private for-profit), opening date.
- **Filtered the way you need**: by facility type, department, city, postal code, or a radius around any address (nearest first); open or closed; public or private; name search.
- **Fresh**: read from the new daily FINESS feed of the ANS (the historical extraction that other tools rely on stopped on 2026-05-04, when the register moved to its new platform; see the notice on its data.gouv.fr page).

No account on any French site, no API key. **$1 per 1,000 establishments.**

### What you get

Sample row (run with `facilityTypes: ["pharmacies"]`, `center: "Place du Capitole, Toulouse"`, `radiusKm: 3`):

```json
{
  "finess_id": "310012695",
  "name": "PHARMACIE DU CAPITOLE",
  "category_code": "620",
  "category": "Pharmacie d'Officine",
  "category_group": "Pharmacies",
  "status": "open",
  "opened_on": "1942-05-18",
  "siret": "48383117800015",
  "address": "18 Place du Capitole",
  "postal_code": "31000",
  "city": "Toulouse",
  "insee_code": "31555",
  "department_code": "31",
  "department": "Haute-Garonne",
  "latitude": 43.604866,
  "longitude": 1.442736,
  "geocoding_score": 0.976,
  "distance_km": 0.06,
  "phone": "0561216018",
  "phone_e164": "+33561216018",
  "legal_entity_name": "PHARMACIE DORBES-CHABERT",
  "legal_status": "Personne Physique",
  "sector": "private for-profit",
  "siren": "483831178",
  "last_updated_on": "2026-08-20",
  "source_file_date": "2026-09-21",
  "map_url": "https://www.openstreetmap.org/?mlat=43.604866&mlon=1.442736#map=17/43.604866/1.442736",
  "source_url": "https://www.data.gouv.fr/datasets/finess-structures-1"
}
```

Every row has the same 40 columns (a few are left out above: short name, closing date, first authorisation date, main or secondary site, address complement, locality, fax, email, legal entity FINESS number, legal status code, APE code, snapshot time), so the CSV or Excel export opens flat.

### Who it is for

- **Pharma, medical device and healthcare sales teams**: every pharmacy, laboratory or clinic of a territory with a phone number, ready for a CRM.
- **Care home and senior services**: all EHPAD and residences of a region, with the owning group and its legal status.
- **Health apps, directories and maps**: geocoded establishments around a point, with the official identifier to link other public data (SIRET, FINESS).
- **Analysts, journalists, public bodies**: counts and lists by type, department and sector from the same source the authorities use.

### How to use it

1. Pick one or more **Facility types** (pharmacies, hospitals, care homes...), or add exact **FINESS category codes** (620 pharmacy, 355 hospital, 500 EHPAD, 611 laboratory...). Leave both empty for every type.
2. Choose an area: **Departments**, **Cities**, **Postal codes**, or a place in **Around this place** with a **Radius**. Leave everything empty for the whole country.
3. Optionally keep only **Open** or **Closed** establishments, one **Sector**, a **Name contains** text, or **With GPS coordinates only**.
4. Set **Maximum number of rows**, run, and download the dataset as CSV, Excel or JSON, or plug it into Google Sheets, Zapier, Make or your own code through the Apify API.

### Input summary

| Field | Example | What it does |
|---|---|---|
| `facilityTypes` | `["pharmacies", "laboratories"]` | Types of establishment; `all` or empty for every type. |
| `categoryCodes` | `["620", "641"]` | Exact FINESS category codes, added to the types. |
| `status` | `"open"` | `open` (default), `closed` or `all`. |
| `departments` | `["31", "82"]` | Department codes. |
| `cities` | `["Toulouse", "Saint-Denis (93)"]` | City names or INSEE codes; big cities include all districts. |
| `postalCodes` | `["75012", "75013"]` | 5-digit postal codes. |
| `center` | `"Gare de Lyon, Paris"` or `"48.844, 2.374"` | Place to search around, nearest first. |
| `radiusKm` | `10` | Radius around the place, 1 to 300 km. |
| `sector` | `"public"` | `all`, `public`, `private_non_profit`, `private_for_profit`. |
| `nameContains` | `"Korian"` | Text the name must contain. |
| `geolocatedOnly` | `true` | Rows with coordinates only. |
| `maxResults` | `500` | Stop after this many rows. |

### Facility types

| Type | FINESS categories | Open on 2026-09-21 |
|---|---|---|
| Pharmacies | 620 pharmacie d'officine, 627, 628, 629, 641 | 20,068 |
| Hospitals (public and specialised) | 101 CHR/CHU, 355 CH, 292 psychiatric, 131 cancer centres, 106, 362, 114, 115 | 4,040 |
| Private clinics | 122, 128, 129, 365 | 641 |
| Rehabilitation and follow-up care (SSR) | 109 and former codes | 732 |
| Care homes for the elderly | 500 EHPAD, 501, 502, 202 résidences autonomie and former codes | 10,016 |
| Medical laboratories | 610, 611, 612 | 4,613 |
| Health centres | 124 centre de santé and former codes, 636, 639 | 3,747 |
| Medical homes and walk-in care | 603 maison de santé, 617, 618 | 3,619 |
| Mental health centres | 156 CMP, 425 CATTP, 161, 366, 412, 415, 430, 444 | 3,344 |
| Dialysis and hospital-at-home | 141, 146, 127 HAD, 422 | 861 |
| Home care and support services | 354 SSIAD, 460 SAA, 209 SAAS, 640 and former codes | 13,065 |
| Facilities for people with disabilities | 183 IME, 246 ESAT, 255 MAS, 182 SESSAD, 41 codes in all | 14,537 |
| Prevention, screening and sexual health | 223 PMI, 645 vaccination, 638 CeGIDD, 23 codes in all | 3,390 |
| Addiction and precarity care | 197 CSAPA, 178 CAARUD, 180 LHSS, 165, 213, 608 | 1,389 |
| Child protection | 177 MECS, 175, 236, 295 AEMO, 21 codes in all | 4,934 |
| Social reception and housing | 214 CHRS, 443 CADA, 259, 258, 257, 20 codes in all | 6,520 |
| Childcare | 167, 170, 174 and other codes retired in 2014, historical rows only | 0 |
| Health and social work schools | 300, 330, 374, 436 and former codes | 1,433 |

Establishments of the 322 categories of the register that fit none of these types (blood transfusion, ambulances, occupational health services, cooperation groups, MDPH...) are reachable with **Every type** or their **FINESS category code**; their `category_group` column then carries the heading of the official table (for example "Other health facilities"). The official category table: https://smt.esante.gouv.fr/fhir/CodeSystem/tre-r397-categorie-entite-geographique-exercice

### Pricing

**$1 per 1,000 establishments** (one paid event per row written to the dataset) plus the standard Actor start event ($0.05 per 1,000 runs). A 50-row search costs $0.05; all the pharmacies of France, about $20; the whole register, about $105.

### Speed and limits

- The register is published as one daily file of about 50 MB (750 MB once unzipped). The first run after a new daily file reads it whole and builds a shared cache, which takes about 4 minutes (measured on 2026-09-21); every later run of the day reads only the departments it needs and finishes in a few seconds (8 seconds for the sample above).
- Coverage on 2026-09-21: 174,762 establishments, 104,796 open and 69,966 closed. 75% of the open establishments carry GPS coordinates (from the national address base, with the geocoder's confidence in `geocoding_score`), 84% a phone number, 87% a SIRET. Email addresses are rare (fewer than 600).
- `postal_code` is the postal routing code of the site, sometimes a CEDEX code for large institutions; `insee_code` is the reliable commune key.
- The register does not contain opening hours, on-call duty, staff, beds or activities. Category labels and legal statuses are the official French wordings; `category_group` and `sector` are the English summaries.
- Addresses are resolved with the national address base and city names with the official communes register, both public French services. If a place is not found, write coordinates "lat, lon" instead.

### Data source and legal notice

All data comes from "FINESS - Structures", the daily open data export of the French national register of health and social care establishments, published by the Agence du Numérique en Santé (ANS) on data.gouv.fr (https://www.data.gouv.fr/datasets/finess-structures-1) under the French open licence "Licence Ouverte 2.0" (Etalab). This feed replaced the older "FINESS Extraction du Fichier des établissements" dataset, whose files are frozen at their 2026-05-04 state (https://www.data.gouv.fr/datasets/finess-extraction-du-fichier-des-etablissements). It can be reused, including commercially, provided the source is mentioned ("Source: ANS, répertoire FINESS, data.gouv.fr"). Category and legal status labels come from the official code tables of the ANS terminology server. The Actor reads the register as-is and adds no data of its own; the only transformations are readable labels, one address line, E.164 phone numbers and the detection of the WGS84 coordinate pair (the source file swaps its two coordinate pairs in part of the records).

### Support

Something wrong with an establishment? Open its `map_url`, and look it up by FINESS number on the official site https://finess.esante.gouv.fr for the raw record. For anything else, use the **Issues** tab of this Actor.

# Changelog

This Actor's version history is a separate document: https://apify.com/futurelife/french-health-facilities/changelog.md

# Actor input Schema

## `facilityTypes` (type: `array`):

One or more types. Leave empty for every type of establishment in the register (hospitals, social care, childcare, schools...).

## `categoryCodes` (type: `array`):

Exact 3-digit FINESS categories to add to the types above, e.g. 620 (pharmacy), 355 (hospital), 500 (EHPAD), 611 (laboratory), 124 (health centre). The full table is linked in the README.

## `status` (type: `string`):

Open establishments only (default), closed ones only, or both.

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

French department codes: 75, 69, 13, 31, 2A, 974... Leave empty to ignore.

## `cities` (type: `array`):

City names (Toulouse, Lyon, "Saint-Denis (93)") or INSEE commune codes. Paris, Lyon and Marseille cover all their districts.

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

5-digit French postal codes, e.g. 75008, 31000.

## `center` (type: `string`):

An address, a place or a city (e.g. "Place du Capitole, Toulouse"), or coordinates written "lat, lon". Establishments within the radius below are returned, nearest first.

## `radiusKm` (type: `integer`):

Distance around the place above, in kilometres (1 to 300).

## `sector` (type: `string`):

Public bodies, private non-profit (associations, foundations, mutuals) or private for-profit (companies, sole traders), from the legal status of the owning entity.

## `nameContains` (type: `string`):

Keep only establishments whose name contains this text (accents and case ignored), e.g. "CHU", "Korian", "Pharmacie du Centre".

## `geolocatedOnly` (type: `boolean`):

Skip establishments the register has not geocoded (on 2026-09-21: 75% of the open establishments have coordinates, 60% of the closed ones).

## `maxResults` (type: `integer`):

The run stops once this many establishments have been exported. The whole register has about 105,000 open establishments, 20,000 of them pharmacies.

## `forceRefresh` (type: `boolean`):

Read the daily file again even if the cache already comes from it (adds a few minutes). Never needed in normal use.

## Actor input object example

```json
{
  "facilityTypes": [
    "pharmacies"
  ],
  "status": "open",
  "departments": [
    "31"
  ],
  "radiusKm": 10,
  "sector": "all",
  "geolocatedOnly": false,
  "maxResults": 500,
  "forceRefresh": false
}
```

# Actor output Schema

## `facilities` (type: `string`):

One row per establishment: FINESS id, name, type and category, status, address, postal code, city, GPS, phone, legal entity, dates. Download as JSON, CSV or Excel.

## `run` (type: `string`):

Log, statistics and the same dataset in a table view.

# 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 = {
    "facilityTypes": [
        "pharmacies"
    ],
    "departments": [
        "31"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurelife/french-health-facilities").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 = {
    "facilityTypes": ["pharmacies"],
    "departments": ["31"],
}

# Run the Actor and wait for it to finish
run = client.actor("futurelife/french-health-facilities").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 '{
  "facilityTypes": [
    "pharmacies"
  ],
  "departments": [
    "31"
  ]
}' |
apify call futurelife/french-health-facilities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,futurelife/french-health-facilities"
        }
    }
}
```

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/e4ebqS0f3fh6KDFtR/builds/ZkfRo0Kp30yZ39dur/openapi.json
