Les tables, avec tout ce qu’il faut pour les relire

Chercheur, journaliste, partenaire : voici ce que nous construisons à partir des bases publiques, table par table. Chaque table porte son millésime, sa licence, le fichier ou l’API dont elle sort, la commande qui la reconstruit, et un dictionnaire où chaque colonne dit sa source, son unité et sa dérivation. Vous n’avez pas à nous croire sur parole : vous pouvez refaire le calcul.

Export produit le 17 septembre 2026. 9 tables, 146 colonnes documentées. Produit par Santeflex — src/intelligence/exports.py (sprint I12).

Les tables

Le nombre de lignes est celui du fichier écrit, pas une estimation. Une table que la chaîne n’a pas pu construire est nommée ici avec sa raison : elle n’est jamais présentée comme vide.

TableLignesColonnesMillésimeLicence
Événements réglementairesregulatory_events7622construit le : 17 septembre 2026 · version des paramètres : 17 septembre 2026 · lignes déclarées par le magasin : 76Santeflex — Licence Ouverte 2.0 (structure et résumés)
OpenMedic — série nationale annuelleopenmedic_national_yearly710millésimes : 2019 · 2020 · 2021 · 2022 · 2023 · 2024 · 2025 · magasin construit le : 16 septembre 2026 · présentations de référence : 12 486Licence Ouverte 1.0
OpenMedic — série annuelle par classe ATC niveau 1openmedic_atc1_yearly9811millésimes : 2019 · 2020 · 2021 · 2022 · 2023 · 2024 · 2025 · magasin construit le : 16 septembre 2026Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)
Pénétration des génériques par moléculegeneric_penetration3878premier millésime : 2019 · dernier millésime : 2025 · magasin construit le : 16 septembre 2026Licence Ouverte 1.0
Fiches médicament par présentationdrug_records12 48638millésime Open MEDIC : 2025 · millésime précédent : 2024 · magasin construit le : 16 septembre 2026 · lignes déclarées par le magasin : 12 486 · sources du magasin : BDPM CIS/CIP/GENER/HAS_SMR/HAS_ASMR/Dispo_Spec (ANSM), OpenMedic (Assurance Maladie), regulatory_events.jsonLicence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)
DREES — dépenses de santé et restes à charge (tranche publiée)drees_rac_published172 45610jeu de données : depenses-de-sante-et-restes-a-charge · dernière modification à la source : 13 avril 2026 · millésimes : 2017 · 2021 · 2023 · magasin construit le : 16 septembre 2026 · lignes du cube complet : 1 234 682Licence Ouverte 2.0
Open DAMIR — table par spécialité de l'exécutantdamir_specialties2717premier mois : janvier 2024 · dernier mois : décembre 2025 · mois couverts : 24 · lexique des codes : github.comLicence Ouverte 1.0
Accès aux soins — comptages de praticiens par département et spécialitéaccess_annuaire2 13423instantanés : 16 septembre 2026 · magasin source construit le : 12 septembre 2026 · version de correspondance : cnam_liste_ps_v1Licence Ouverte 2.0
FINESS — établissements recensés par département et groupe de catégoriesfiness_establishments1 0277instantanés : 16 septembre 2026 · magasin source construit le : 10 septembre 2026Licence Ouverte 1.0

Les 9 tables demandées à la chaîne d’export ont toutes été écrites à ce millésime.

Chaque table, en détail

Ouvrez une fiche pour lire son millésime, sa provenance, sa méthode, ses limites, la commande qui la reconstruit et son dictionnaire de colonnes.

Événements réglementaires

regulatory_events

Un événement par changement réglementaire suivi : ce qui change, à partir de quand, avec quel statut, pour qui, quels paramètres et quels textes il porte, et où il a été lu.

76 lignes · 22 colonnes documentées · Santeflex — Licence Ouverte 2.0 (structure et résumés)

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
76 lignes
Colonnes
22
construit le
17 septembre 2026
version des paramètres
17 septembre 2026
lignes déclarées par le magasin
76
origine
fichier
chemin dans le dépôt
src/config/regulatory_events.json
construit par
scripts/build_regulatory_events.py
path_relative_to
repo
Licence
Santeflex — Licence Ouverte 2.0 (structure et résumés)La structuration, le regroupement et les résumés sont notre travail et sont diffusés sous Licence Ouverte 2.0, avec attribution à Santeflex. Les textes cités restent sous leur propre régime (Légifrance / JORF, ameli.fr, service-public.fr, communiqués ministériels) : chaque ligne porte ses URL, à citer avec elle. Aucune source n'endosse Santeflex.
Fichiers écrits
  • regulatory_events.csv66,4 ko (66 448 octets)sha256 03919f6e88d1ba31862447a9f312c6d07b400bc1c8bc6dfbaacc1e4eff85113b
  • regulatory_events.json107,4 ko (107 422 octets)sha256 d9f89ea1ce9b1249c8438a914e6f6d954e4dd4259a7bc0093a707300bb1787b0

Méthode

Le magasin est construit par scripts/build_regulatory_events.py à partir de trois entrées : les textes légaux de l'ingestion (un événement par texte, daté par sa date d'effet), chaque entrée d'historique datée du fichier de paramètres qu'aucun texte ne couvre (regroupée par source et par date d'effet), et l'overlay curé à la main (événements proposés, débattus, calendaires, et surcharges de thème, de périmètre, de parties prenantes). Règles : un statut « en vigueur » suppose une référence légale officielle ; un texte publié mais non applicable est « adopté » ; un événement sans source est une erreur de validation ; rien n'est déduit du silence. Le fichier est versionné et relu en diff comme les paramètres.

Ce que la table dit, et ce qu’elle ne dit pas

  • 8 avertissement(s) de validation à la construction du magasin (statut « en vigueur » appuyé sur une source de presse) ; ils sont listés dans src/config/regulatory_events.json, champ _meta.warnings.

Sources amont

Reconstruire la table depuis la source

python scripts/build_regulatory_events.py
python scripts/build_exports.py --out <dir> --tables regulatory_events

Citer cette table

Santeflex, « Événements réglementaires » (regulatory_events), export du 17 septembre 2026, 76 lignes. Licence : Santeflex — Licence Ouverte 2.0 (structure et résumés). D’après Légifrance / JORF et sources officielles citées ligne par ligne ; src/config/regulatory_params.json (paramètres datés) et LEGAL_TEXTS. https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
idIdentifiant de l'événementstringregulatory_events.json : events[].iddate d'effet + abrégé de la source, construit par le script de build
title_frTitrestringregulatory_events.json : events[].title_frcomposé du libellé du paramètre ou du texte et de sa date d'effet en français
themeThèmestringregulatory_events.json : events[].themedix thèmes fermés ; déduit du préfixe de l'identifiant de paramètre, sauf surcharge curée
kindNaturestringregulatory_events.json : events[].kindparameter_change, new_rule, rule_removed, deadline ou calendar
statusStatutstringregulatory_events.json : events[].statuscolonne brute, aucune dérivation
status_frStatut (français)stringintelligence.events.STATUS_FRtraduction du statut ; aucun autre calcul
engine_applicableApplicable par le moteur de calculbooleanintelligence.events.ENGINE_STATUSESvrai si le statut est in_force, adopted ou decree_pending ; les statuts proposed et debated n'alimentent jamais un calcul
announced_onDate d'annoncedateregulatory_events.json : events[].announced_oncolonne brute, aucune dérivation
effective_fromDate d'entrée en vigueurdateregulatory_events.json : events[].effective_fromcolonne brute, aucune dérivation
effective_toDate de fin d'effetdateregulatory_events.json : events[].effective_tocolonne brute, aucune dérivation
scope_populationPopulation viséestringregulatory_events.json : events[].scope.populationvaleurs jointes par « ; »
scope_otherAutres clés de périmètrestringregulatory_events.json : events[].scopeles clés de périmètre autres que population, en JSON
stakeholdersParties prenantesstringregulatory_events.json : events[].stakeholdersdéduit des préfixes des paramètres portés, sauf surcharge curée ; joint par « ; »
paramsParamètres portésstringregulatory_events.json : events[].paramsidentifiants de src/config/regulatory_params.json, joints par « ; »
replacesParamètres repris d'un événement antérieurstringregulatory_events.json : events[].replacespaires « identifiant de paramètre = identifiant de l'événement remplacé », jointes par « ; » : pour chaque paramètre porté, l'événement dont il reprend la valeur ; vide quand l'événement ne remplace rien
confidenceNiveau de confiance de la sourcestringregulatory_events.json : events[].confidenceofficial, press ou analysis
derived_fromOrigine de la constructionstringregulatory_events.json : events[].derived_fromdit laquelle des trois entrées a produit l'événement (texte légal, paramètre daté, overlay curé)
legal_refs_titlesTitres des références légalesstringregulatory_events.json : events[].legal_refs[].titlejoints par « ; »
legal_refs_urlsURL des références légalesstringregulatory_events.json : events[].legal_refs[].urljointes par « ; »
sources_urlsURL des sources consultéesstringregulatory_events.json : events[].sources[].urljointes par « ; »
sources_retrieved_onDates de consultation des sourcesstringregulatory_events.json : events[].sources[].retrieved_onjointes par « ; »
summary_frRésuméstringregulatory_events.json : events[].summary_frvaleurs des paramètres portés, mises en français, suivies des notes de l'entrée d'historique

OpenMedic — série nationale annuelle

openmedic_national_yearly

Un point par millésime OpenMedic : boîtes, remboursé, base de remboursement, lignes de consommants, taux réalisé et part générique nationale.

7 lignes · 10 colonnes documentées · Licence Ouverte 1.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
7 lignes
Colonnes
10
millésimes
2019 · 2020 · 2021 · 2022 · 2023 · 2024 · 2025
magasin construit le
16 septembre 2026
présentations de référence
12 486
origine
fichier
chemin dans le dépôt
open_medic_trends.db
table lue
cip13_year + cip13_ref
construit par
scripts/build_open_medic_trends.py
path_relative_to
data_dir
Fichiers écrits
  • openmedic_national_yearly.csv701 octetssha256 777a0e44c93d9766b42e4f03f85450ba88c1ed17a81c56d88d81c7796e6107de
  • openmedic_national_yearly.json5,5 ko (5 499 octets)sha256 2b73d07fd3d04f8de68b99ac53773635a96193a602d6d464ea2fa6c17b949ce2

Méthode

Assurance Maladie — Open MEDIC, marginal national par CIP13 (Licence Ouverte 1.0) ; sommes par présentation et par année ; ATC et statut générique lus sur le millésime courant ; variation = (N − N−k) / N−k ; part générique = boîtes des présentations marquées génériques / boîtes des présentations dont le statut est connu.

Ce que la table dit, et ce qu’elle ne dit pas

  • La première année de la série n'a pas d'évolution annuelle : les colonnes boxes_yoy_pct et reimbursement_yoy_pct y sont « non renseignées », jamais zéro.

Reconstruire la table depuis la source

python scripts/build_open_medic_trends.py --years 2019-2025 --out data/open_medic_trends.db
python scripts/build_exports.py --out <dir> --tables openmedic_national_yearly

Citer cette table

Santeflex, « OpenMedic — série nationale annuelle » (openmedic_national_yearly), export du 17 septembre 2026, 7 lignes. Licence : Licence Ouverte 1.0. D’après Assurance Maladie — Open MEDIC (base complète des dépenses de médicaments). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
yearMillésimeyearannéeopen_medic_trends.db : cip13_year.yearannée du fichier OpenMedic (NB_<année>_cip13.CSV.gz)
boxesBoîtes rembourséesintegerboîtesopen_medic_trends.db : cip13_year.boxessomme sur toutes les présentations du millésime
reimbursement_eurMontant remboursénumbereurosopen_medic_trends.db : cip13_year.reimbursementsomme sur toutes les présentations
base_eurBase de remboursementnumbereurosopen_medic_trends.db : cip13_year.basesomme sur toutes les présentations
people_linesLignes de consommantsintegerlignesopen_medic_trends.db : cip13_year.beneficiariessomme des consommants par présentation : une personne consommant deux présentations compte deux fois, ce n'est pas un effectif de personnes
realised_rate_pctTaux de remboursement réalisénumber%open_medic_trends.db : cip13_yearremboursé / base × 100
generic_share_pctPart des génériques dans les boîtesnumber%open_medic_trends.db : cip13_year JOIN cip13_ref.is_genericboîtes des présentations marquées génériques / boîtes des présentations dont le statut générique est connu × 100
generic_status_coverage_pctCouverture du statut génériquenumber%open_medic_trends.db : cip13_year JOIN cip13_refboîtes dont le statut générique est connu / boîtes totales × 100 ; dit sur quelle part du millésime la part générique est calculée
boxes_yoy_pctÉvolution des boîtes sur un annumber%open_medic_trends.db : cip13_year.boxes(boîtes N − boîtes N−1) / boîtes N−1 × 100 ; non renseigné pour la première année de la série
reimbursement_yoy_pctÉvolution du remboursé sur un annumber%open_medic_trends.db : cip13_year.reimbursement(remboursé N − remboursé N−1) / remboursé N−1 × 100 ; non renseigné pour la première année

OpenMedic — série annuelle par classe ATC niveau 1

openmedic_atc1_yearly

Un point par classe thérapeutique (ATC niveau 1) et par millésime OpenMedic.

98 lignes · 11 colonnes documentées · Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
98 lignes
Colonnes
11
millésimes
2019 · 2020 · 2021 · 2022 · 2023 · 2024 · 2025
magasin construit le
16 septembre 2026
origine
fichier
chemin dans le dépôt
open_medic_trends.db
table lue
cip13_year JOIN cip13_ref
construit par
scripts/build_open_medic_trends.py
path_relative_to
data_dir
Licence
Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)Les volumes et les montants viennent d'OpenMedic (Licence Ouverte 1.0). La colonne atc_level_1_label porte les libellés de la classification ATC de niveau 1 tels que l'OMS et la BDPM les écrivent : ils relèvent du régime des données publiques ANSM/HAS et doivent être cités comme tels. Rien n'est rediffusé sous une licence plus permissive que son entrée : republier la colonne de libellés sans mentionner ce régime ne serait pas conforme.
Fichiers écrits
  • openmedic_atc1_yearly.csv10,0 ko (10 023 octets)sha256 0a44179fee2c36c0abda9b6221ca59ed5816b2f44ba787c5376443c2e2c84726
  • openmedic_atc1_yearly.json36,7 ko (36 718 octets)sha256 45168f83b16b1b0cbf5ff5be9a09f46283c444c91c10bec2d301e8ca5da00f22

Méthode

Assurance Maladie — Open MEDIC, marginal national par CIP13 (Licence Ouverte 1.0) ; sommes par présentation et par année ; ATC et statut générique lus sur le millésime courant ; variation = (N − N−k) / N−k ; part générique = boîtes des présentations marquées génériques / boîtes des présentations dont le statut est connu. Périmètre : présentations du millésime courant portant ce code ATC.

Ce que la table dit, et ce qu’elle ne dit pas

  • Périmètre de chaque classe : les présentations du millésime courant qui portent ce code ATC niveau 1 ; une présentation sans code ATC dans la référence n'est comptée dans aucune classe, donc la somme des classes est inférieure au total national.
  • Les libellés de niveau 1 sont ceux de la classification ATC (OMS/BDPM) et non la chaîne du fichier OpenMedic, dont l'octet accentué est corrompu à ce niveau.

Sources amont

Reconstruire la table depuis la source

python scripts/build_open_medic_trends.py --years 2019-2025 --out data/open_medic_trends.db
python scripts/build_exports.py --out <dir> --tables openmedic_atc1_yearly

Citer cette table

Santeflex, « OpenMedic — série annuelle par classe ATC niveau 1 » (openmedic_atc1_yearly), export du 17 septembre 2026, 98 lignes. Licence : Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments). D’après Assurance Maladie — Open MEDIC (base complète des dépenses de médicaments) ; Classification ATC (libellés de niveau 1, OMS / BDPM). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
atc_level_1Code ATC niveau 1stringopen_medic_trends.db : cip13_ref.atc_level_1colonne brute, aucune dérivation
atc_level_1_labelClasse thérapeutiquestringintelligence.trends.ATC1_LABELS (libellés OMS/BDPM)le libellé du fichier OpenMedic porte un octet accentué corrompu à ce niveau ; la liste fermée des quatorze classes ATC1 est utilisée à la place, aucun libellé n'est inventé
yearMillésimeyearannéeopen_medic_trends.db : cip13_year.yearcolonne brute, aucune dérivation
presentationsPrésentationsintegerprésentationsopen_medic_trends.db : cip13_yearnombre de CIP13 de la classe ayant une ligne cette année
boxesBoîtes rembourséesintegerboîtesopen_medic_trends.db : cip13_year.boxessomme sur les présentations de la classe
reimbursement_eurMontant remboursénumbereurosopen_medic_trends.db : cip13_year.reimbursementsomme sur les présentations de la classe
base_eurBase de remboursementnumbereurosopen_medic_trends.db : cip13_year.basesomme sur les présentations de la classe
people_linesLignes de consommantsintegerlignesopen_medic_trends.db : cip13_year.beneficiariessomme des consommants par présentation, pas un effectif de personnes
generic_share_pctPart des génériques dans les boîtesnumber%open_medic_trends.db : cip13_ref.is_genericboîtes des présentations génériques de la classe / boîtes de la classe × 100
boxes_yoy_pctÉvolution des boîtes sur un annumber%open_medic_trends.db : cip13_year.boxes(N − N−1) / N−1 × 100 ; non renseigné pour la première année de la classe
reimbursement_yoy_pctÉvolution du remboursé sur un annumber%open_medic_trends.db : cip13_year.reimbursement(N − N−1) / N−1 × 100 ; non renseigné pour la première année de la classe

Pénétration des génériques par molécule

generic_penetration

Part des génériques dans les boîtes, au premier et au dernier millésime, pour chaque molécule (ATC niveau 5) dont la référence contient à la fois un princeps et un générique. Table complète, sans seuil ni troncature.

387 lignes · 8 colonnes documentées · Licence Ouverte 1.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
387 lignes
Colonnes
8
premier millésime
2019
dernier millésime
2025
magasin construit le
16 septembre 2026
origine
fichier
chemin dans le dépôt
open_medic_trends.db
table lue
cip13_year JOIN cip13_ref
construit par
scripts/build_open_medic_trends.py
path_relative_to
data_dir
Fichiers écrits
  • generic_penetration.csv21,1 ko (21 066 octets)sha256 6b6fc057490812dace67da4e562089cb427d8deb529ebbe534ecaf3c46c65125
  • generic_penetration.json93,6 ko (93 557 octets)sha256 0673751f8995f40611472f687b6134b352b1ad619174df79376009d4aeea14c3

Méthode

Assurance Maladie — Open MEDIC, marginal national par CIP13 (Licence Ouverte 1.0) ; sommes par présentation et par année ; ATC et statut générique lus sur le millésime courant ; variation = (N − N−k) / N−k ; part générique = boîtes des présentations marquées génériques / boîtes des présentations dont le statut est connu.

Ce que la table dit, et ce qu’elle ne dit pas

  • Table complète : toutes les molécules (ATC5) dont la référence du millésime 2025 contient à la fois au moins un princeps et au moins un générique, sans seuil de volume et sans troncature. Les pages publiques n'en montrent que les 20 plus fortes hausses et baisses au-dessus de 500 000 boîtes : ces classements sont un extrait de cette table, jamais un total.
  • Le statut générique est lu sur le millésime courant et appliqué aux deux années : une présentation devenue générique entre les deux millésimes est comptée comme générique dans les deux.

Reconstruire la table depuis la source

python scripts/build_open_medic_trends.py --years 2019-2025 --out data/open_medic_trends.db
python scripts/build_exports.py --out <dir> --tables generic_penetration

Citer cette table

Santeflex, « Pénétration des génériques par molécule » (generic_penetration), export du 17 septembre 2026, 387 lignes. Licence : Licence Ouverte 1.0. D’après Assurance Maladie — Open MEDIC (base complète des dépenses de médicaments). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
atc_level_5Code ATC niveau 5 (molécule)stringopen_medic_trends.db : cip13_ref.atc_level_5colonne brute, aucune dérivation
atc_level_5_labelMoléculestringopen_medic_trends.db : cip13_ref.atc_level_5_labellibellé du fichier OpenMedic, non réécrit
year_fromPremier millésime comparéyearannéeopen_medic_trends.db : cip13_year.yearpremière année présente dans la base
generic_share_from_pctPart générique au premier millésimenumber%open_medic_trends.db : cip13_year JOIN cip13_ref.is_genericboîtes génériques / boîtes de la molécule cette année-là × 100
year_toDernier millésime comparéyearannéeopen_medic_trends.db : cip13_year.yeardernière année présente dans la base
generic_share_to_pctPart générique au dernier millésimenumber%open_medic_trends.db : cip13_year JOIN cip13_ref.is_genericboîtes génériques / boîtes de la molécule cette année-là × 100
delta_ptsÉvolution de la part génériquenumberpoints de %open_medic_trends.dbpart au dernier millésime − part au premier ; non renseigné si l'une des deux parts manque
boxes_lastBoîtes au dernier millésimeintegerboîtesopen_medic_trends.db : cip13_year.boxessomme des boîtes de la molécule au dernier millésime, pour pondérer la lecture

Fiches médicament par présentation

drug_records

Une ligne par présentation (CIP13) du millésime OpenMedic courant : produit, prix et taux (BDPM), groupe générique et princeps, SMR propre ou hérité, dépense, consommants, rangs, évolution annuelle, bulletin ANSM et événements réglementaires. Données agrégées publiques, aucune donnée personnelle.

12 486 lignes · 38 colonnes documentées · Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
12 486 lignes
Colonnes
38
millésime Open MEDIC
2025
millésime précédent
2024
magasin construit le
16 septembre 2026
lignes déclarées par le magasin
12 486
sources du magasin
BDPM CIS/CIP/GENER/HAS_SMR/HAS_ASMR/Dispo_Spec (ANSM), OpenMedic (Assurance Maladie), regulatory_events.json
origine
fichier
chemin dans le dépôt
drug_intel.db
table lue
drug_intel
construit par
scripts/build_drug_intel.py
path_relative_to
data_dir
Licence
Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments)Table dérivée : les jointures BDPM × OpenMedic, l'héritage du SMR depuis le princeps et les rangs sont notre travail. Les colonnes restent sous la licence de leur source, colonne par colonne (voir le dictionnaire). Rien n'est rediffusé sous une licence plus permissive que son entrée.
Fichiers écrits
  • drug_records.csv5,1 Mo (5 070 341 octets)sha256 af0a37daf16757a426a904b21cb637a1ce73fcf91edabda146eac418b254f4d6
  • drug_records.json14,3 Mo (14 349 202 octets)sha256 548763425d21d1033a8220059658e8cc1286627b4a51b7245638a1cfb6dbb439

Méthode

BDPM (ANSM) : dénomination, présentation, prix et taux publics, groupes génériques, avis HAS (SMR/ASMR), bulletins de disponibilité ; OpenMedic (Assurance Maladie) : boîtes, remboursé, base, consommants du dernier millésime et du précédent ; SMR hérité du princeps du groupe générique quand la présentation n'a pas d'avis propre ; rang = position par remboursé (ou boîtes) parmi les présentations du millésime.

Ce que la table dit, et ce qu’elle ne dit pas

  • Table agrégée par présentation (CIP13) : aucune donnée personnelle. « people » est un nombre de lignes de consommants du fichier OpenMedic national, pas un effectif de personnes identifiables.
  • Le SMR peut être hérité du princeps du groupe générique : smr_source vaut alors « princeps » et smr_from_cis donne le CIS qui porte l'avis.

Sources amont

Reconstruire la table depuis la source

python scripts/build_open_medic_trends.py --years 2019-2025 --out data/open_medic_trends.db
python scripts/build_drug_intel.py --out data/drug_intel.db
python scripts/build_exports.py --out <dir> --tables drug_records

Citer cette table

Santeflex, « Fiches médicament par présentation » (drug_records), export du 17 septembre 2026, 12 486 lignes. Licence : Licence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments). D’après Assurance Maladie — Open MEDIC (base complète des dépenses de médicaments) ; ANSM — base de données publique des médicaments (CIS, CIS_CIP, CIS_GENER, CIS_HAS_SMR, CIS_HAS_ASMR, CIS_CIP_Dispo_Spec) ; Santeflex — événements réglementaires (table regulatory_events). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
cip13Code CIP13 de la présentationstringopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.cip13colonne brute, aucune dérivation
cisCode CIS de la spécialitéstringBDPM (ANSM) : CIS_CIP_bdpm.txtrattaché au CIP13 par le fichier CIS_CIP
nameDénominationstringBDPM (ANSM) : CIS_bdpm.txtdénomination du CIS ; à défaut, le libellé du fichier OpenMedic
presentationLibellé de présentationstringBDPM (ANSM) : CIS_CIP_bdpm.txtcolonne brute, aucune dérivation
atc_level_1Code ATC niveau 1stringopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_ref.atc_level_1colonne brute, aucune dérivation
atc_level_5Code ATC niveau 5stringopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_ref.atc_level_5colonne brute, aucune dérivation
atc_level_5_labelMoléculestringopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_ref.atc_level_5_labelcolonne brute, aucune dérivation
is_genericPrésentation génériquebooleanopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_ref.is_genericstatut générique du millésime OpenMedic courant
group_idIdentifiant du groupe génériquestringBDPM (ANSM) : CIS_GENER_bdpm.txtcolonne brute, aucune dérivation
group_labelLibellé du groupe génériquestringBDPM (ANSM) : CIS_GENER_bdpm.txtcolonne brute, aucune dérivation
princeps_namePrinceps du groupestringBDPM (ANSM) : CIS_GENER_bdpm.txtextrait du libellé du groupe (partie après « - », avant la première virgule)
smrService médical rendustringBDPM (ANSM) : CIS_HAS_SMR_bdpm.txtavis le plus récent du CIS, ou de son princeps (voir smr_source)
smr_levelNiveau de SMR normaliséstringsrc/intelligence — table SMR_LEVELimportant / modere / faible / insuffisant, à partir du libellé HAS ; vide si le libellé n'est pas l'un des quatre
smr_dateDate de l'avis SMRdateBDPM (ANSM) : CIS_HAS_SMR_bdpm.txtcolonne brute, aucune dérivation
smr_sourceOrigine du SMRstringconstruit« own » quand la spécialité porte l'avis, « princeps » quand il est hérité du princeps du groupe générique
smr_from_cisCIS ayant fourni le SMR héritéstringBDPM (ANSM) : CIS_GENER_bdpm.txtrenseigné seulement quand smr_source = princeps
asmrAmélioration du service médical rendustringBDPM (ANSM) : CIS_HAS_ASMR_bdpm.txtavis le plus récent du CIS
rate_pctTaux de remboursement affichénumber%BDPM (ANSM) : CIS_CIP_bdpm.txttaux public de la présentation, hors exonération
price_eurPrixnumbereurosBDPM (ANSM) : CIS_CIP_bdpm.txtcolonne brute, aucune dérivation
price_ttc_eurPrix TTCnumbereurosBDPM (ANSM) : CIS_CIP_bdpm.txtcolonne brute, aucune dérivation
honoraire_eurHonoraire de dispensationnumbereurosBDPM (ANSM) : CIS_CIP_bdpm.txtcolonne brute, aucune dérivation
boxesBoîtes rembourséesintegerboîtesopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.boxesmillésime courant (colonne year)
reimbursement_eurMontant remboursénumbereurosopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.reimbursementmillésime courant
base_eurBase de remboursementnumbereurosopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.basemillésime courant
peopleLignes de consommantsintegerlignesopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.beneficiariesconsommants de cette présentation au millésime courant ; pas un effectif de personnes
yearMillésime OpenMedicyearannéeopen_medic_trends.db (OpenMedic, Assurance Maladie) : meta.yearcolonne brute, aucune dérivation
boxes_prevBoîtes au millésime précédentintegerboîtesopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.boxesmillésime précédent ; vide si la présentation n'y figure pas
boxes_yoy_pctÉvolution des boîtes sur un annumber%open_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.boxes(N − N−1) / N−1 × 100
reimbursement_yoy_pctÉvolution du remboursé sur un annumber%open_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.reimbursement(N − N−1) / N−1 × 100
spend_rankRang par montant rembourséintegerrangopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.reimbursementposition parmi toutes les présentations du millésime, 1 = la plus remboursée
boxes_rankRang par boîtesintegerrangopen_medic_trends.db (OpenMedic, Assurance Maladie) : cip13_year.boxesposition parmi toutes les présentations du millésime, 1 = la plus vendue
dispo_codeCode du bulletin de disponibilitéstringBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtbulletin le plus récent du CIS
dispo_labelStatut de disponibilitéstringBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtcolonne brute, aucune dérivation
dispo_sinceDébut du bulletindateBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtcolonne brute, aucune dérivation
dispo_updatedMise à jour du bulletindateBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtcolonne brute, aucune dérivation
dispo_urlLien du bulletin ANSMstringBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtcolonne brute, aucune dérivation
dispo_activeBulletin actifbooleanBDPM (ANSM) : CIS_CIP_Dispo_Spec.txtvide quand la présentation ne porte aucun bulletin : « non renseigné », jamais « disponible »
eventsÉvénements réglementaires touchant la présentationstringsrc/config/regulatory_events.jsonidentifiants d'événements attachés par niveau de SMR au moment du build, joints par « ; »

DREES — dépenses de santé et restes à charge (tranche publiée)

drees_rac_published

Le cube DREES des montants moyens par consommant et des taux de recours, restreint aux combinaisons que les lecteurs du produit renvoient : sexe « _Ensemble » et C2S « _Ensemble », toutes années, variables, postes, classes d'âge, ALD et échantillons.

172 456 lignes · 10 colonnes documentées · Licence Ouverte 2.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
172 456 lignes
Colonnes
10
jeu de données
depenses-de-sante-et-restes-a-charge
dernière modification à la source
13 avril 2026
millésimes
2017 · 2021 · 2023
magasin construit le
16 septembre 2026
lignes du cube complet
1 234 682
origine
fichier
chemin dans le dépôt
drees_rac.db
table lue
rac (vue)
construit par
scripts/build_drees_rac_db.py
path_relative_to
data_dir
Fichiers écrits
  • drees_rac_published.csv23,3 Mo (23 321 819 octets)sha256 16f97bec63d4fd91ad0e31cf87293f59597abc1efd6178c760f8797622531a61
  • drees_rac_published.json54,5 Mo (54 483 124 octets)sha256 826378f9eef65c5aa2b828f1cf49381219f21410d54d70384dcff400582891dd

Méthode

Source : DREES, données ouvertes (data.drees.solidarites-sante.gouv.fr, Licence Ouverte 2.0). Les jeux retenus sont copiés tels quels à chaque changement de leur date de mise à jour (champ « modified » du portail) ; les libellés sont ceux du portail, aucun n'est réécrit. Le cube « Dépenses de santé et restes à charge » est chargé dans une base locale et interrogé par croisement exact des dimensions (année, variable, poste, classe d'âge, sexe, ALD, C2S, échantillon) ; une combinaison absente est « non renseignée », jamais zéro. Chaque chiffre cite le jeu, son millésime et sa date de mise à jour.

Ce que la table dit, et ce qu’elle ne dit pas

  • Tranche publiée : sexe = « _Ensemble » et C2S = « _Ensemble », soit toutes les combinaisons (année × variable × poste × classe d'âge × ALD × échantillon) que les lecteurs du produit renvoient pour la population générale — 172456 lignes sur les 1234682 du cube. Les ventilations par sexe et par statut C2S existent dans le cube et ne sont pas dans cet export ; elles se reconstruisent avec la même commande et s'interrogent par GET /api/intel/drees/rac/lookup.
  • Les libellés (variable, poste, classe d'âge, ALD, C2S, échantillon) sont les chaînes du portail DREES, y compris leurs accents manquants, et ne sont jamais réécrits.
  • Une combinaison absente du cube n'a pas de ligne : elle est « non renseignée », jamais zéro. La variable « RAC après AMO » n'existe qu'au millésime 2017.

Sources amont

Reconstruire la table depuis la source

python scripts/build_drees_rac_db.py --out data/drees_rac.db
python scripts/build_exports.py --out <dir> --tables drees_rac_published

Citer cette table

Santeflex, « DREES — dépenses de santé et restes à charge (tranche publiée) » (drees_rac_published), export du 17 septembre 2026, 172 456 lignes. Licence : Licence Ouverte 2.0. D’après DREES — Dépenses de santé et restes à charge. https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
anneeMillésimeyearannéedrees_rac.db : rac.annee (colonne annee de l'export)colonne brute, aucune dérivation
variableVariablestringdrees_rac.db : rac.variablechaîne du portail DREES, non réécrite (neuf variables)
postePoste de soinsstringdrees_rac.db : rac.postechaîne du portail DREES, non réécrite (29 postes, dont « _Total »)
classe_d_ageClasse d'âgestringdrees_rac.db : rac.classe_d_agechaîne du portail ; « _Ensemble » = toutes classes
sexeSexestringdrees_rac.db : rac.sexeconstante « _Ensemble » dans cet export ; les ventilations par sexe ne sont pas exportées
aldAffection de longue duréestringdrees_rac.db : rac.aldchaîne du portail : Oui, Non ou « _Ensemble »
c2sComplémentaire santé solidairestringdrees_rac.db : rac.c2sconstante « _Ensemble » dans cet export ; les ventilations C2S ne sont pas exportées
echantillonÉchantillon de dépensestringdrees_rac.db : rac.echantillondéciles de dépense, top 5 %, top 1 % ou « _Total » ; chaînes du portail
valeurValeurnumbereuros par consommant (montants moyens) ; % pour « Taux de recours »drees_rac.db : rac.valeurvaleur publiée par la DREES pour la combinaison ; une combinaison absente n'a pas de ligne et n'est pas zéro
nombre_de_consommantsNombre de consommantsintegerconsommantsdrees_rac.db : rac.nombre_de_consommantseffectif publié derrière la moyenne

Open DAMIR — table par spécialité de l'exécutant

damir_specialties

Actes, base, remboursé, payé et dépassement par spécialité de l'exécutant sur les mois de flux chargés, avec le taux de dépassement et les parts exonérée, ALD et C2S du montant payé.

27 lignes · 17 colonnes documentées · Licence Ouverte 1.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
27 lignes
Colonnes
17
premier mois
janvier 2024
dernier mois
décembre 2025
mois couverts
24
origine
api
lu le
17 septembre 2026
construit par
scripts/build_open_damir_db.py (sur le serveur qui sert l'API)
Licence
Licence Ouverte 1.0Les libellés de codes viennent des nomenclatures officielles republiées par Etalab/SGMAP (lexique open-DAMIR) et sont cités tels quels ; un code sans libellé chargé est exporté avec label vide et label_loaded = false.
Fichiers écrits
  • damir_specialties.csv3,8 ko (3 792 octets)sha256 a473d043863e3f2a02683de3ed206de6514efd4f80d80f732fadd26b4e5d8b65
  • damir_specialties.json17,7 ko (17 684 octets)sha256 6c7b59fe6fbbd4d8c0a27e5a4b777bbad52979185b90fa585b0a24c5f41b8dd3

Méthode

Source : Assurance Maladie, Open DAMIR (open-data-assurance-maladie.ameli.fr, Licence Ouverte 1.0), fichiers mensuels de flux de remboursement tous régimes. Chaque fichier est lu une fois et sommé sur six clés (spécialité de l'exécutant PSE_SPE_SNDS, secteur public/privé PRS_PPU_SEC, région de résidence BEN_RES_REG, nature de prestation PRS_NAT, motif d'exonération EXO_MTF, top C2S BEN_CMU_TOP) : nombre d'actes, quantités, base de remboursement, montant remboursé, montant payé et montant du dépassement (PRS_DEP_MNT) ; les lignes correctives négatives sont conservées. Taux de dépassement = dépassement / base × 100 (absent si la base est nulle). Parts exonérée, ALD et C2S = part du montant payé dont le motif d'exonération (classes du lexique) ou le top C2S le porte. Les libellés des codes viennent des nomenclatures officielles citées dans le lexique ; un code sans libellé est affiché tel quel. La spécialité de l'exécutant ne s'applique qu'aux médecins : le code 0 (non renseigné) porte les pharmacies, laboratoires, auxiliaires médicaux, transports et établissements. Le mois est le mois de traitement (FLX_ANN_MOI), pas le mois de soins. Périmètre : hors la majeure partie des prestations hospitalières du secteur public ; ni secteur conventionnel, ni département, ni délai.

Ce que la table dit, et ce qu’elle ne dit pas

  • Le magasin local open_damir.db est absent de cet environnement : la table a été lue sur l'API publique Santeflex, qui la calcule sur les mois construits sur son volume. Les chiffres sont ceux du serveur, pas d'un calcul local ; la commande de reproduction reconstruit les mois à partir des fichiers de l'Assurance Maladie.
  • La spécialité de l'exécutant ne s'applique qu'aux médecins : le code « 0 » (non renseigné) porte les pharmacies, laboratoires, auxiliaires médicaux, transports et établissements. Ce n'est pas une spécialité et son taux de dépassement ne se lit pas comme tel.
  • Le mois est le mois de traitement (FLX_ANN_MOI), pas le mois de soins ; les lignes correctives négatives sont conservées.

Reconstruire la table depuis la source

python scripts/build_open_damir_db.py --backfill-missing --max 24 --from-month 202401
python scripts/build_exports.py --out <dir> --tables damir_specialties

Citer cette table

Santeflex, « Open DAMIR — table par spécialité de l'exécutant » (damir_specialties), export du 17 septembre 2026, 27 lignes. Licence : Licence Ouverte 1.0. D’après Assurance Maladie — Open DAMIR (dépenses d'assurance maladie interrégimes) ; Lexique open-DAMIR (nomenclatures CNAMTS diffusées avec le jeu Open DAMIR, republiées par Etalab / SGMAP-AGD). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
month_fromPremier mois de traitementmonthAAAAMMopen_damir.db : months.month (ou champ months de l'API)plus ancien mois additionné
month_toDernier mois de traitementmonthAAAAMMopen_damir.db : months.month (ou champ months de l'API)plus récent mois additionné
months_countNombre de mois additionnésintegermoisopen_damir.db : months (ou champ months de l'API)dit sur combien de mois la ligne est sommée ; la série n'est pas continue par construction
regionRégion de résidence (code)stringopen_damir.db : damir.BEN_RES_REGvide = France entière (aucun filtre de région)
region_labelRégion de résidencestringlexique open-DAMIR : BEN_RES_REGvide quand aucune région n'est demandée ou quand le lexique ne porte pas le code
pse_spe_sndsCode spécialité de l'exécutantstringopen_damir.db : damir.PSE_SPE_SNDSclé d'agrégation du fichier mensuel
labelSpécialité de l'exécutantstringlexique open-DAMIR : PSE_SPE_SNDSlibellé officiel du code ; vide quand le lexique ne le porte pas — aucun libellé n'est inventé
label_loadedLibellé chargébooleanlexique open-DAMIRfaux quand le code est affiché sans libellé
actsNombre d'actesnumberactesopen_damir.db : SUM(PRS_ACT_NBR)somme sur les mois retenus ; les lignes correctives négatives sont conservées
base_eurBase de remboursementnumbereurosopen_damir.db : SUM(PRS_REM_BSE)somme sur les mois retenus
reimbursed_eurMontant remboursénumbereurosopen_damir.db : SUM(PRS_REM_MNT)somme sur les mois retenus
paid_eurMontant payénumbereurosopen_damir.db : SUM(PRS_PAI_MNT)somme sur les mois retenus
overrun_eurMontant de dépassementnumbereurosopen_damir.db : SUM(PRS_DEP_MNT)somme sur les mois retenus
overrun_rate_pctTaux de dépassementnumber%open_damir.dbdépassement / base × 100 ; non renseigné si la base est nulle
exonerated_share_pctPart exonérée du montant payénumber%open_damir.db : EXO_MTF (classes du lexique)montant payé dont le motif d'exonération appartient aux classes exonérantes / montant payé × 100
ald_share_pctPart ALD du montant payénumber%open_damir.db : EXO_MTF (classe ald_related du lexique)montant payé dont le motif d'exonération est lié à une ALD / montant payé × 100
c2s_share_pctPart C2S du montant payénumber%open_damir.db : BEN_CMU_TOPmontant payé porté par un bénéficiaire au top C2S / montant payé × 100

Accès aux soins — comptages de praticiens par département et spécialité

access_annuaire

Comptages issus des instantanés datés de l'annuaire santé de la CNAM : praticiens recensés, répartition par secteur conventionnel, option tarifaire OPTAM, carte Vitale et densité pour 100 000 habitants. COMPTAGES UNIQUEMENT.

2 134 lignes · 23 colonnes documentées · Licence Ouverte 2.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
2 134 lignes
Colonnes
23
instantanés
16 septembre 2026
magasin source construit le
12 septembre 2026
version de correspondance
cnam_liste_ps_v1
origine
instantanés
chemin dans le dépôt
snapshots/annuaire
construit par
intelligence.snapshots.snapshot_annuaire (job hebdomadaire)
path_relative_to
data_dir
Licence
Licence Ouverte 2.0Licence lue sur la page du jeu, pas déduite d'un autre de nos fichiers : https://www.data.gouv.fr/datasets/annuaire-sante-ameli (jeu 68e51e04c4258097a201a3cc, organisation « Caisse nationale de l'Assurance Maladie »), champ « license » de l'API data.gouv.fr = « lov2 », c'est-à-dire la Licence Ouverte 2.0 — attribution, sans partage à l'identique (relevé le 2026-09-17). Une version antérieure de cet export déclarait l'ODbL et son partage à l'identique : c'était une obligation que la source n'impose pas, et elle est retirée. Les comptages dérivés sont donc diffusés sous Licence Ouverte 2.0, avec attribution à la CNAM. Vérifier la page du jeu avant toute rediffusion.
Fichiers écrits
  • access_annuaire.csv304,0 ko (303 982 octets)sha256 0684cd977d552d3c2808b746ad10790555f0bdab4478cd7d1cb695cd2e446247
  • access_annuaire.json1,4 Mo (1 403 919 octets)sha256 2bf6ea296d430261e916c2e30fdda6caabf51a3a088421f04b1c9ff553b2db17

Méthode

Comptage des praticiens recensés dans l'annuaire santé Ameli (CNAM, export hebdomadaire « liste des PS », Licence Ouverte 2.0), agrégé à chaque build en instantané daté par département × libellé de spécialité × code secteur × option tarifaire × carte Vitale (version de correspondance cnam_liste_ps_v1). Le département est formé des deux premiers caractères du code postal : la Corse apparaît en « 20 » (2A et 2B réunis), tous les codes postaux 97xxx en « 97 » (départements d'outre-mer 971, 972, 973, 974, 976, mais aussi Saint-Pierre-et-Miquelon 975, Saint-Barthélemy 977 et Saint-Martin 978), rapportés pour la densité à la population des cinq seuls départements d'outre-mer : la densité « 97 » est donc une borne haute, légèrement surestimée. « 98 » (Monaco et collectivités du Pacifique) est ignoré pour la densité, les codes postaux absents ou invalides ('', 00, 99) sont écartés. Le code secteur est lu tel que l'export l'écrit : '1' = secteur 1, '3' = secteur 2 (l'export code le secteur 2 en 3, étude S7), '' et '0' = non conventionné ou non applicable, tout autre code ('2', 137 lignes au niveau national) est compté à part sous « autre » sans être attribué. Une spécialité du dictionnaire Santeflex couvre un ou plusieurs libellés CNAM résolus avec la même règle que la recherche de praticiens (correspondance sur mots entiers) ; les libellés couverts sont cités avec chaque série. « Conventionnés » = secteur 1 + secteur 2 ; les parts secteur 1, secteur 2 et OPTAM (option tarifaire commençant par OPTAM) sont rapportées aux conventionnés, la part carte Vitale à l'ensemble des praticiens recensés. La densité = praticiens recensés / population du département × 100 000, calculée seulement quand la population est chargée (INSEE, populations légales servies par geo.api.gouv.fr, millésime indiqué dans la source) et jamais estimée. Une évolution compare le premier et le dernier instantané disponibles, cite les deux dates et les deux valeurs, et n'est jamais extrapolée ; avec un seul point, aucune évolution n'est affirmée. Les établissements viennent des instantanés FINESS (une ligne par département × catégorie) ; la démographie nationale annuelle vient des jeux DREES cités avec leur date de mise à jour. Ces chiffres décrivent l'offre recensée, ni un délai ni une disponibilité.

Ce que la table dit, et ce qu’elle ne dit pas

  • COMPTAGES UNIQUEMENT. Le fichier « liste des professionnels de santé » de la CNAM nomme des personnes ; aucune ligne nominative ne sort de l'application. Cet export reprend exactement le GRAIN des pages publiques de l'observatoire — département × spécialité du dictionnaire × date d'instantané — mais pas leur COUVERTURE : les pages publient les départements les plus peuplés, cet export couvre les 97 départements que l'instantané porte, dont les plus ruraux.
  • Petits effectifs supprimés. Une cellule n'est publiée que si son total atteint 3 praticiens et qu'aucun de ses comptages ne vaut 1 ou 2 : un tel comptage décrirait une personne identifiable, et n'en retirer que le comptage en cause le rendrait par soustraction des autres — c'est donc toute la cellule qui est supprimée, total compris. Un comptage nul, lui, est publié : zéro dit « aucun de ceux-là » et ne décrit personne. Sur ce grain — département × spécialité × date d'instantané — un comptage de 1 ou 2 praticiens dirait le secteur, l'option tarifaire et la carte Vitale d'une personne identifiable. Ces cellules sont exportées avec supprime_petit_effectif = true, renseigne = true (l'instantané porte bien des lignes) et des comptages « non renseigné » — jamais zéro. 682 ligne(s) sur 2134 sont dans ce cas. Le total du département n'est donc pas la somme des lignes publiées.
  • Une combinaison sans ligne dans l'instantané est exportée avec renseigne = false et des comptages nuls : « non renseigné », jamais zéro.
  • Le département vient des deux premiers caractères du code postal : « 20 » réunit 2A et 2B, « 97 » réunit les codes postaux 97xxx (dont 975, 977 et 978, qui ne sont pas au dénominateur de population), « 98 » n'a pas de densité.
  • Le code secteur est celui de l'export : « 1 » = secteur 1, « 3 » = secteur 2 (l'export code le secteur 2 en 3), « » et « 0 » = non conventionné ou non applicable ; tout autre code est compté à part sous « autre » et n'est pas attribué.

Reconstruire la table depuis la source

python -c "import sys; sys.path.insert(0,'src'); from intelligence import snapshots; print(snapshots.run_weekly_snapshots())"
python scripts/build_exports.py --out <dir> --tables access_annuaire

Citer cette table

Santeflex, « Accès aux soins — comptages de praticiens par département et spécialité » (access_annuaire), export du 17 septembre 2026, 2 134 lignes. Licence : Licence Ouverte 2.0. D’après CNAM — annuaire santé, liste des professionnels de santé ; INSEE — populations légales, servies par geo.api.gouv.fr (découpage administratif). https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
dateDate de l'instantanédateDATA_DIR/snapshots/annuaire/<date>.csv.gzjour où l'agrégat daté a été écrit
depDépartement (code)stringannuaire CNAM : deux premiers caractères du code postal« 20 » réunit la Corse (2A et 2B), « 97 » tous les codes postaux 97xxx, « 98 » Monaco et le Pacifique ; codes postaux absents ou invalides écartés
departementDépartementstringsrc/config/population_departements.json : nomnom servi par geo.api.gouv.fr ; vide quand le département n'y figure pas
specialty_keyClé de spécialité Santeflexstringsrc/config/specialty_dictionary.jsonclé de notre dictionnaire, pas une nomenclature
specialty_labelSpécialitéstringsrc/config/specialty_dictionary.jsonnom d'affichage de notre dictionnaire
specialites_normLibellés CNAM couvertsstringannuaire CNAM : colonne specialite_normlibellés de l'export effectivement additionnés, résolus par correspondance sur mots entiers, joints par « ; » ; dit exactement ce que le comptage recouvre
mapping_versionVersion de correspondancestringintelligence.snapshots.ANNUAIRE_MAPPING_VERSIONversion de la lecture des codes de l'export CNAM
renseigneCombinaison renseignéebooleaninstantané annuairefaux quand l'instantané ne porte aucune ligne pour ce département et ces libellés : les comptages sont alors vides, « non renseigné », jamais zéro
supprime_petit_effectifComptage supprimé (petit effectif)booleanintelligence.exports.SMALL_CELL_THRESHOLDvrai quand le total de la cellule est sous 3 praticiens OU quand l'un de ses comptages vaut 1 ou 2 — un sous-comptage de 1 ou 2 décrit une personne même sous un total élevé, et le retirer seul le rendrait par soustraction : toute la cellule est donc vidée, total compris. Les comptages et les parts sont alors vides alors même que renseigne reste vrai ; une cellule vide n'est jamais zéro, et un comptage nul, lui, est publié
totalPraticiens recensésintegerpraticiensinstantané annuaire : somme de countsomme des lignes du département pour ces libellés
conventionnesPraticiens conventionnésintegerpraticiensinstantané annuaire : secteur_codesecteur 1 + secteur 2
secteur_1Secteur 1integerpraticiensinstantané annuaire : secteur_code = '1'colonne brute, aucune dérivation
secteur_2Secteur 2integerpraticiensinstantané annuaire : secteur_code = '3'l'export CNAM code le secteur 2 en « 3 » (étude S7)
non_conventionneNon conventionnés ou non applicableintegerpraticiensinstantané annuaire : secteur_code vide ou '0'colonne brute, aucune dérivation
autreAutre code secteurintegerpraticiensinstantané annuaire : tout autre secteur_codecodes non attribués (notamment « 2 ») comptés à part, jamais reversés dans le secteur 2
optamPraticiens en option tarifaire OPTAMintegerpraticiensinstantané annuaire : option_tarifairelignes dont l'option tarifaire commence par OPTAM
carte_vitalePraticiens acceptant la carte Vitaleintegerpraticiensinstantané annuaire : carte_vitale = '1'colonne brute, aucune dérivation
share_secteur_1_pctPart du secteur 1number%instantané annuairesecteur 1 / conventionnés × 100
share_secteur_2_pctPart du secteur 2number%instantané annuairesecteur 2 / conventionnés × 100
share_optam_pctPart OPTAMnumber%instantané annuaireOPTAM / conventionnés × 100
share_carte_vitale_pctPart acceptant la carte Vitalenumber%instantané annuairecarte Vitale / praticiens recensés × 100
populationPopulation du départementintegerhabitantssrc/config/population_departements.json : valuesomme des populations légales des communes servies par geo.api.gouv.fr ; vide quand absente
density_per_100kDensiténumberpraticiens pour 100 000 habitantsinstantané annuaire et population_departements.jsonpraticiens recensés / population × 100 000 ; jamais estimée, vide quand la population manque ; la densité « 97 » est une borne haute (le dénominateur ne couvre que les cinq DOM)

FINESS — établissements recensés par département et groupe de catégories

finess_establishments

Comptages d'établissements sanitaires et médico-sociaux issus des instantanés datés du cache FINESS, par département et groupe de catégories.

1 027 lignes · 7 colonnes documentées · Licence Ouverte 1.0

Millésime, provenance, méthode, dictionnaire des colonnes →
Lignes
1 027 lignes
Colonnes
7
instantanés
16 septembre 2026
magasin source construit le
10 septembre 2026
origine
instantanés
chemin dans le dépôt
snapshots/finess
construit par
intelligence.snapshots.snapshot_finess (job hebdomadaire)
path_relative_to
data_dir
Fichiers écrits
  • finess_establishments.csv86,6 ko (86 636 octets)sha256 535153f7ec4ec479c7097c83c9b36b98a083b2887a438fee7da41dbb69069254
  • finess_establishments.json244,5 ko (244 458 octets)sha256 7d184cab222d641ad899e9f2fdf6590badbe80135f4d15d84f826699ae800ebd

Méthode

Comptage d'établissements recensés dans FINESS (fichier national des établissements sanitaires et sociaux, extraction data.gouv.fr, Licence Ouverte 1.0), agrégé à chaque build en instantané daté par département × regroupement de catégories × catégorie (colonnes dept_code, categorie_group, categorie de l'extraction), puis additionné ici par département × regroupement. Ce sont des établissements, jamais des personnes. Les codes départementaux de FINESS diffèrent de ceux de l'annuaire : la Corse y est en 2A et 2B (réunies ici sous « 20 ») et l'outre-mer porte une lettre (9A, 9B, …), réuni sous « 97 » ; les codes FINESS effectivement additionnés sont cités avec chaque comptage, de sorte que le périmètre est lisible. Le regroupement de catégories est la chaîne écrite par FINESS, jamais réécrite : c'est la clé d'agrégation. Le nom d'affichage à côté est le nôtre (data_hub.finess.GROUP_LABELS) ; sans correspondance il reprend la chaîne FINESS telle quelle et le drapeau de libellé chargé est faux — aucun libellé n'est inventé pour un code. Un regroupement absent d'un instantané est « non renseigné », jamais zéro. Une évolution exige deux instantanés datés, cite les deux dates et les deux valeurs, et n'est jamais extrapolée. Ces comptages décrivent l'offre recensée dans le répertoire, ni une capacité, ni une activité, ni une disponibilité.

Ce que la table dit, et ce qu’elle ne dit pas

  • Comptage d'établissements, jamais de personnes.
  • Les codes départementaux de FINESS diffèrent de ceux de l'annuaire : la Corse est en 2A et 2B (réunis ici sous « 20 »), l'outre-mer porte une lettre (9A, 9B, …) et est réuni sous « 97 » ; la colonne finess_dept_codes donne les codes FINESS effectivement additionnés.
  • Une catégorie absente d'un instantané est « non renseignée » (count vide), jamais zéro.
  • Un groupe de catégories dont le libellé n'est pas chargé est exporté tel quel avec label_loaded = false : aucun libellé n'est inventé pour un code.

Reconstruire la table depuis la source

python -c "import sys; sys.path.insert(0,'src'); from intelligence import snapshots; print(snapshots.run_weekly_snapshots())"
python scripts/build_exports.py --out <dir> --tables finess_establishments

Citer cette table

Santeflex, « FINESS — établissements recensés par département et groupe de catégories » (finess_establishments), export du 17 septembre 2026, 1 027 lignes. Licence : Licence Ouverte 1.0. D’après FINESS — fichier national des établissements sanitaires et sociaux. https://www.santeflex.com/observatoire/donnees/

Dictionnaire des colonnes

ColonneLibelléTypeUnitéSourceDérivation
dateDate de l'instantanédateDATA_DIR/snapshots/finess/<date>.csv.gzjour où l'agrégat daté a été écrit
depDépartement (code Santeflex)stringinstantané FINESS : dept_codecode à deux caractères aligné sur l'annuaire : « 20 » pour la Corse, « 97 » pour l'outre-mer
finess_dept_codesCodes départementaux FINESS additionnésstringinstantané FINESS : dept_codecodes réellement sommés (2A, 2B, 9A…), joints par « ; » ; dit exactement ce que le comptage recouvre
categorie_groupRegroupement de catégories FINESSstringinstantané FINESS : categorie_group, colonne 21 de l'extraction FINESS (libellé du regroupement de catégories d'établissements)chaîne écrite par FINESS, non réécrite ; c'est la clé de regroupement
categorie_group_labelNom d'affichage Santeflex du regroupementstringsrc/data_hub/finess.py : GROUP_LABELSnom d'affichage que nous donnons au regroupement (« Hôpital public (CH/CHU) » pour « Centres Hospitaliers ») : c'est notre libellé, pas celui de FINESS, qui est dans categorie_group ; sans correspondance la colonne reprend categorie_group tel quel
label_loadedNom d'affichage disponiblebooleansrc/data_hub/finess.py : GROUP_LABELSfaux quand le regroupement n'a pas de nom d'affichage et est repris tel quel : aucun libellé n'est inventé
countÉtablissements recensésintegerétablissementsinstantané FINESS : countsomme des lignes du groupe pour les codes départementaux retenus ; vide quand l'instantané ne porte pas ce groupe pour ce département — « non renseigné », jamais zéro

Les formats

Un format que nous ne servons pas est écrit ici, avec la raison : vous ne perdrez pas une journée à le chercher.

CSVservi

RFC 4180, UTF-8 sans BOM, séparateur virgule, fin de ligne LF. Un champ vide signifie « non renseigné » et ne doit pas être lu comme zéro.

JSONservi

les mêmes lignes sous « rows », précédées de la table, de sa licence, de son millésime, de sa provenance et de son dictionnaire de colonnes ; une valeur absente y est écrite null, jamais une chaîne vide, et ne doit pas être lue comme zéro.

PARQUETnon servi

pyarrow n'est pas installé dans cet environnement et ne figure pas dans requirements.txt : le format Parquet n'est pas proposé. Pour obtenir du Parquet : `pip install pyarrow` puis `python scripts/build_exports.py --format parquet`.

Ce qui n’est pas publié, et pourquoi

Une page qui ne dit pas ce qu’elle retient ne vaut pas grand-chose.

Aucune donnée personnelle ne sort de l’application, jamais. L’annuaire de l’Assurance Maladie nomme des professionnels de santé : nous n’en exportons que des comptages, au niveau d’agrégation que les pages publiques de l’observatoire publient déjà — un département, une spécialité, une date d’instantané. Les lignes nominatives restent dans le fichier source, que la CNAM publie elle-même et que vous pouvez aller chercher chez elle. Du côté des remboursements, nous ne rediffusons aucune ligne de soin : Open DAMIR nous sert à calculer des agrégats mensuels par spécialité, et c’est cet agrégat qui est publié. Rien de ce que nos utilisateurs nous confient — documents, ordonnances, conversations, carnet — n’entre dans une table d’export : ces tables sont construites à partir de sources publiques, et seulement de sources publiques. La raison est simple : sur une grille assez fine, des comptages redeviennent des personnes, et une licence ouverte sur une base ne nous autorise jamais à publier ce qui n’y était pas.

Chaque table dit aussi, dans ses propres notes, ce qu’elle laisse de côté : la tranche du cube DREES effectivement publiée et les ventilations qui n’y sont pas, le niveau d’agrégation de l’annuaire, les lignes d’une liste que les pages publiques montrent en extrait et qui ne sont pas un total. Ces notes sont sur la fiche de chaque table, pas ici en résumé.

La règle, telle que la chaîne d’export l’applique

Aucune donnée personnelle. Les tables issues de l'annuaire de la CNAM, qui nomme des professionnels, ne contiennent que des comptages agrégés, au grain des pages publiques (département × spécialité × date d'instantané) ; la couverture, elle, est plus large que celle des pages. Une cellule n'est publiée que si son total atteint 3 praticiens et qu'aucun de ses comptages ne vaut 1 ou 2 : un tel comptage décrirait une personne identifiable, et n'en retirer que le comptage en cause le rendrait par soustraction des autres — c'est donc toute la cellule qui est supprimée, total compris. Un comptage nul, lui, est publié : zéro dit « aucun de ceux-là » et ne décrit personne. La ligne supprimée le dit avec supprime_petit_effectif.

Comment citer

Une ligne prête à copier est attachée à chaque table, sur sa fiche.

Citez la table par son titre et son nom technique, avec la date de l’export que vous avez utilisé et son nombre de lignes : deux exports du même nom à deux dates ne portent pas les mêmes chiffres. Citez aussi la source amont sous sa propre licence — nos jointures et notre curation sont à nous, les données publiques restent à leurs producteurs, et aucun d’eux n’endosse Santeflex.

Exemple, pour la table « Événements réglementaires »

Santeflex, « Événements réglementaires » (regulatory_events), export du 17 septembre 2026, 76 lignes. Licence : Santeflex — Licence Ouverte 2.0 (structure et résumés). D’après Légifrance / JORF et sources officielles citées ligne par ligne ; src/config/regulatory_params.json (paramètres datés) et LEGAL_TEXTS. https://www.santeflex.com/observatoire/donnees/

Une table redistribuée garde la licence de son entrée : jamais une plus permissive, jamais une plus restrictive que ce que la source accorde. Vérifiez la page du jeu de données amont avant toute rediffusion.

Les tables dont la licence demande une explication

  • regulatory_eventsSanteflex — Licence Ouverte 2.0 (structure et résumés) : La structuration, le regroupement et les résumés sont notre travail et sont diffusés sous Licence Ouverte 2.0, avec attribution à Santeflex. Les textes cités restent sous leur propre régime (Légifrance / JORF, ameli.fr, service-public.fr, communiqués ministériels) : chaque ligne porte ses URL, à citer avec elle. Aucune source n'endosse Santeflex.
  • openmedic_atc1_yearlyLicence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments) : Les volumes et les montants viennent d'OpenMedic (Licence Ouverte 1.0). La colonne atc_level_1_label porte les libellés de la classification ATC de niveau 1 tels que l'OMS et la BDPM les écrivent : ils relèvent du régime des données publiques ANSM/HAS et doivent être cités comme tels. Rien n'est rediffusé sous une licence plus permissive que son entrée : republier la colonne de libellés sans mentionner ce régime ne serait pas conforme.
  • drug_recordsLicence Ouverte 1.0 (OpenMedic) et Données publiques ANSM/HAS (base de données publique des médicaments) : Table dérivée : les jointures BDPM × OpenMedic, l'héritage du SMR depuis le princeps et les rangs sont notre travail. Les colonnes restent sous la licence de leur source, colonne par colonne (voir le dictionnaire). Rien n'est rediffusé sous une licence plus permissive que son entrée.
  • damir_specialtiesLicence Ouverte 1.0 : Les libellés de codes viennent des nomenclatures officielles republiées par Etalab/SGMAP (lexique open-DAMIR) et sont cités tels quels ; un code sans libellé chargé est exporté avec label vide et label_loaded = false.
  • access_annuaireLicence Ouverte 2.0 : Licence lue sur la page du jeu, pas déduite d'un autre de nos fichiers : https://www.data.gouv.fr/datasets/annuaire-sante-ameli (jeu 68e51e04c4258097a201a3cc, organisation « Caisse nationale de l'Assurance Maladie »), champ « license » de l'API data.gouv.fr = « lov2 », c'est-à-dire la Licence Ouverte 2.0 — attribution, sans partage à l'identique (relevé le 2026-09-17). Une version antérieure de cet export déclarait l'ODbL et son partage à l'identique : c'était une obligation que la source n'impose pas, et elle est retirée. Les comptages dérivés sont donc diffusés sous Licence Ouverte 2.0, avec attribution à la CNAM. Vérifier la page du jeu avant toute rediffusion.

Demander l’accès

Les fichiers ne sont pas encore servis en téléchargement libre : ils sont produits par la chaîne d’export, et envoyés sur demande.

Écrivez-nous

Dites-nous qui vous êtes, quelle table vous voulez, pour quel travail, et sous quel format parmi ceux servis. C’est tout ce dont nous avons besoin : nous ne demandons ni pièce justificative, ni engagement sur ce que vous publierez. Une petite équipe répond, généralement sous 24 h ouvrées.

contact@santeflex.com

C’est l’adresse « presse et partenaires » de la page contact, où figurent aussi les autres points d’entrée. Le site n’héberge aucun formulaire : rien n’est collecté ici, et votre demande arrive par courriel, chez nous.

Ce que vous recevrez

  • Les fichiers de la ou des tables demandées (CSV, JSON), tels que la chaîne les écrit.
  • Le manifeste : millésime, provenance, licence, méthode, dictionnaire de colonnes et empreinte sha256 de chaque fichier — de quoi vérifier que vous lisez bien ce que nous avons écrit.
  • Les commandes de reconstruction, pour refaire la table depuis la source publique sans passer par nous.

La chaîne est publique dans le dépôt : python scripts/build_exports.py --out data/exports --site-manifest site/data/observatoire/exports.json. Les tables sont reconstruites à chaque mise à jour des données : demandez le millésime dont vous avez besoin.

Les sources amont, telles que les tables les déclarent

Méthode

Chaque colonne porte sa source, son millésime et sa licence ; une valeur absente est « non renseignée », jamais zéro ; un code sans libellé chargé est exporté tel quel avec label_loaded = false ; aucune donnée personnelle ne sort de l'application — l'annuaire de la CNAM nomme des personnes, seuls des comptages sont exportés, au grain des pages publiques (département × spécialité × date). Une cellule n'est publiée que si son total atteint 3 praticiens et qu'aucun de ses comptages ne vaut 1 ou 2 : un tel comptage décrirait une personne identifiable, et n'en retirer que le comptage en cause le rendrait par soustraction des autres — c'est donc toute la cellule qui est supprimée, total compris. Un comptage nul, lui, est publié : zéro dit « aucun de ceux-là » et ne décrit personne.

L'observatoire ne publie que des comptages agrégés : aucun praticien n'y est nommé, aucune donnée personnelle n'y entre. Chaque chiffre porte sa source et son millésime ; une table absente est signalée comme non disponible avec la raison, jamais comme un zéro ; aucune évolution n'est affirmée sans deux points datés.

Santeflex décrit les portes du système, les règles et les montants ; jamais l’opportunité d’un soin ni la conduite d’un traitement — c’est votre médecin, ou le 15, qui en juge.

Prêt à savoir ce que vous paierez vraiment ?

Bêta gratuite. Chaque montant cite sa source publique — et vos retours décident de la suite.

  • Gratuit, sans attente
  • Chaque taux cite sa source
  • Conforme RGPD
  • Sans engagement