"> Aller au contenu principal
PHP PHP PHP v1.0.0 PolyForm NC 1.0

RPPS API PHP SDK

qrcommunication/rppsapi

PHP 8.1+, guzzlehttp/guzzle ^7.0

Installation

bash
composer require qrcommunication/rppsapi
Prérequis : PHP 8.2+, ext-json. La dépendance guzzlehttp/guzzle est incluse automatiquement.

Quick Start

Deux patterns principaux : récupérer un profil complet par numéro RPPS, ou rechercher des praticiens par nom, prénom et/ou code postal.

php
<?php

use QrCommunication\RppsApi\RppsClient;
use QrCommunication\RppsApi\RppsClientOptions;
use QrCommunication\RppsApi\Dto\RppsSearchCriteria;
use QrCommunication\RppsApi\Exception\RppsException;

$client = new RppsClient(new RppsClientOptions(
    fhirApiKey: $_ENV['FHIR_API_KEY'] ?? null,
));

// ── Profil complet par numéro RPPS ─────────────────────────────

try {
    $profil = $client->getByRpps('10005173140');

    echo $profil->identite->civiliteExercice->libelle . ' ';
    echo $profil->identite->prenomExercice . ' ' . $profil->identite->nomExercice . "\n";
    echo 'Profession : ' . $profil->profession->libelle . "\n";

    foreach ($profil->activites as $activite) {
        echo '  Structure : ' . $activite->structure->raisonSociale . "\n";
        echo '  Adresse   : ' . $activite->structure->adresse->libelleCommune . "\n";
    }

    foreach ($profil->diplomesEtAutorisations as $da) {
        if ($da->diplome) {
            echo '  Diplôme : ' . $da->diplome->libelle . "\n";
        }
    }

    foreach ($profil->savoirFaire as $sf) {
        echo '  Savoir-faire : ' . $sf->savoirFaire->libelle . "\n";
    }

    foreach ($profil->messageriesMssante as $mss) {
        echo '  MSSanté : ' . $mss->adresseBal . "\n";
    }

    // Statut des sources interrogées
    foreach ($profil->sources as $source) {
        $status = $source->success ? 'OK' : 'ERREUR';
        echo "  [{$status}] {$source->source->value} — {$source->durationMs}ms\n";
    }

} catch (RppsException $e) {
    echo 'Erreur RPPS : ' . $e->getMessage() . "\n";
}

// ── Recherche par critères ──────────────────────────────────────

$results = $client->search(new RppsSearchCriteria(
    nom: 'DUPONT',
    codePostal: '75',
));

echo "Total trouvé : {$results->total}\n";
echo "Durée : {$results->durationMs}ms\n";

foreach ($results->results as $r) {
    echo "  {$r->civilite} {$r->prenomExercice} {$r->nomExercice}";
    echo " — {$r->profession->libelle}";
    echo " — {$r->libelleCommune}\n";
}

// ── Pagination ──────────────────────────────────────────────────

$page2 = $client->search(new RppsSearchCriteria(nom: 'MARTIN'), page: 2, pageSize: 50);

Configuration

RppsClientOptions est un objet readonly passé au constructeur de RppsClient. Tous les paramètres ont des valeurs par défaut fonctionnelles.

php
use QrCommunication\RppsApi\RppsClientOptions;

$options = new RppsClientOptions(
    fhirBaseUrl:      'https://gateway.api.esante.gouv.fr/fhir/v2',  // URL de base FHIR ANS
    fhirApiKey:       'votre-cle-esante-api-key',                    // Clé API Gravitee (optionnel)
    tabularBaseUrl:   'https://tabular-api.data.gouv.fr/api/resources', // URL Tabular data.gouv.fr
    timeout:          30.0,                                           // Timeout Guzzle en secondes
    tabularPageSize:  100,                                            // Taille de page pour les requêtes Tabular
    disabledSources:  ['fhir', 'mssante'],                           // Sources à désactiver
);
Paramètre Type Défaut Description
fhirBaseUrl string 'https://gateway.api.esante.gouv.fr/fhir/v2' URL de base de l'API FHIR ANS
fhirApiKey string|null null Clé API Gravitee (ESANTE-API-KEY). Sans cette clé, la source FHIR est ignorée.
tabularBaseUrl string 'https://tabular-api.data.gouv.fr/api/resources' URL de base de l'API Tabular data.gouv.fr
timeout float 30.0 Timeout en secondes pour les requêtes HTTP Guzzle
tabularPageSize int 100 Nombre de lignes par page pour les requêtes Tabular (utilisé par search)
disabledSources string[] [] Liste des sources à désactiver. Valeurs acceptées : 'fhir', 'personne-activite', 'diplomes', 'savoir-faire', 'carte-cps', 'mssante'

Méthodes

getByRpps

PUBLIC
getByRpps(string $rpps): RppsFullProfile

Récupère le profil complet d'un praticien à partir de son numéro RPPS (11 chiffres). Interroge toutes les sources activées (identité, activités, diplômes, savoir-faire, cartes CPS, messageries MSSanté, FHIR) et retourne un objet agrégé.

ParamètreTypeDescription
$rpps string Numéro RPPS à 11 chiffres. Les espaces en début/fin sont ignorés.
Lance RppsException si le numéro RPPS ne contient pas exactement 11 chiffres.
php
$profil = $client->getByRpps('10005173140');
// Retourne RppsFullProfile

validateRpps

STATIC
static validateRpps(string $rpps): string

Valide un numéro RPPS. Retourne le numéro nettoyé (sans espaces) si valide. Lance RppsException si le format est incorrect (doit contenir exactement 11 chiffres).

php
// Validation statique (pas besoin d'instancier RppsClient)
$clean = RppsClient::validateRpps('10005173140'); // '10005173140'
$clean = RppsClient::validateRpps(' 10005173140 '); // '10005173140' (trim)

// Lance RppsException :
RppsClient::validateRpps('123');          // Trop court
RppsClient::validateRpps('1234567890A'); // Contient une lettre

DTOs

Tous les DTOs sont des classes final readonly. Les valeurs manquantes sont des chaînes vides '' ou des instances par défaut (jamais null), sauf indication contraire.

RppsFullProfile

Profil agrégé retourné par getByRpps().

PropriétéTypeDescription
rppsstringNuméro RPPS à 11 chiffres
identificationNationalestringIdentifiant national PP
identiteIdentiteCivilité, nom et prénom d'exercice
professionProfessionCode et libellé profession, catégorie professionnelle
activitesActivite[]Activités et structures rattachées (une entrée par structure avec identifiant technique)
diplomesEtAutorisationsDiplomeEtAutorisation[]Diplômes obtenus et autorisations d'exercice
savoirFaireSavoirFaire[]Spécialités et compétences déclarées
cartesCpsCarteCps[]Cartes CPS (Carte de Professionnel de Santé)
messageriesMssanteMessagerieMssante[]Adresses de messagerie sécurisée MSSanté
fhirFhirDataDonnées FHIR (Practitioner + PractitionerRoles). Vide si pas de clé API.
sourcesSourceStatus[]Statut de chaque source interrogée (succès, durée, erreur éventuelle)
queriedAtstringHorodatage ISO 8601 de la requête
totalDurationMsfloatDurée totale d'exécution en millisecondes

Identite

Identité civile d'exercice du praticien.

PropriétéTypeDescription
civiliteCodeLabelCivilité administrative (ex : M / M.)
civiliteExerciceCodeLabelCivilité d'exercice (ex : DR / Docteur)
nomExercicestringNom d'exercice
prenomExercicestringPrénom d'exercice

Profession

Profession déclarée dans le RPPS.

PropriétéTypeDescription
codestringCode profession (ex : 10)
libellestringLibellé profession (ex : Médecin)
categorieCodeLabelCatégorie professionnelle (code + libellé)

Activite

Activité professionnelle rattachée à une structure.

PropriétéTypeDescription
modeExerciceCodeLabelMode d'exercice (ex : libéral, salarié)
savoirFaireCodeLabelSavoir-faire associé à l'activité
typeSavoirFaireCodeLabelType de savoir-faire
secteurActiviteCodeLabelSecteur d'activité
sectionTableauPharmaciensCodeLabelSection du tableau des pharmaciens
roleCodeLabelRôle dans la structure
genreActiviteCodeLabelGenre d'activité
autoriteEnregistrementstringAutorité d'enregistrement
structureStructureStructure d'exercice rattachée

Structure

Établissement ou cabinet d'exercice.

PropriétéTypeDescription
identifiantTechniquestringIdentifiant technique de la structure
raisonSocialestringRaison sociale du site
enseigneCommercialestringEnseigne commerciale du site
numeroSiretstringNuméro SIRET
numeroSirenstringNuméro SIREN
numeroFinessSitestringNuméro FINESS du site
numeroFinessEtablissementJuridiquestringNuméro FINESS de l'établissement juridique
telephonestringTéléphone principal
telephone2stringTéléphone secondaire
telecopiestringNuméro de télécopie
emailstringAdresse e-mail de la structure
codeDepartementstringCode département
libelleDepartementstringLibellé département
ancienIdentifiantstringAncien identifiant de la structure
adresseAdresseStructureAdresse postale complète

AdresseStructure

Adresse postale normalisée d'une structure.

PropriétéTypeDescription
complementDestinatairestringComplément destinataire
complementPointGeographiquestringComplément point géographique
numeroVoiestringNuméro de voie
indiceRepetitionVoiestringIndice de répétition de voie (bis, ter…)
codeTypeVoiestringCode type de voie
libelleTypeVoiestringLibellé type de voie (Rue, Avenue…)
libelleVoiestringNom de la voie
mentionDistributionstringMention de distribution
bureauCedexstringBureau cedex
codePostalstringCode postal
codeCommunestringCode INSEE commune
libelleCommunestringLibellé commune
codePaysstringCode pays
libellePaysstringLibellé pays

DiplomeEtAutorisation

Diplôme obtenu ou autorisation d'exercice. Chaque entrée représente soit un diplôme, soit une autorisation (jamais les deux à la fois). Les propriétés sont null si la valeur est absente.

PropriétéTypeDescription
typeDiplomeCodeLabel|nullType de diplôme obtenu (non nul si diplôme)
diplomeCodeLabel|nullDiplôme obtenu (code + libellé)
typeAutorisationCodeLabel|nullType d'autorisation (non nul si autorisation)
disciplineAutorisationCodeLabel|nullDiscipline de l'autorisation

SavoirFaire

Spécialité ou compétence déclarée dans le RPPS.

PropriétéTypeDescription
professionCodeLabelProfession associée au savoir-faire
categorieProfessionnelleCodeLabelCatégorie professionnelle
typeSavoirFaireCodeLabelType de savoir-faire (spécialité, capacité…)
savoirFaireCodeLabelSavoir-faire (code + libellé)

CarteCps

Carte de Professionnel de Santé (CPS) associée au praticien.

PropriétéTypeDescription
typeCarteCodeLabelType de carte CPS
numeroCartestringNuméro de carte
identifiantNationalCartestringIdentifiant national contenu dans la carte
dateDebutValiditestringDate de début de validité
dateFinValiditestringDate de fin de validité
dateOppositionstringDate d'opposition (si carte opposée)
dateMiseAJourstringDate de mise à jour

MessagerieMssante

Boîte aux lettres de messagerie sécurisée MSSanté.

PropriétéTypeDescription
typeBalstringType de BAL MSSanté
adresseBalstringAdresse MSSanté (ex : jean.dupont@medecin.mssante.fr)
dematerialisationbooltrue si la dématérialisation est activée
savoirFaireCodeLabelSavoir-faire associé à cette boîte
structureIdentifiantstringIdentifiant de la structure rattachée
structureTypeIdentifiantstringType d'identifiant de la structure
serviceRattachementstringService de rattachement
raisonSocialestringRaison sociale de la structure BAL
codePostalstringCode postal de la structure BAL
departementstringDépartement de la structure BAL

FhirData

Données FHIR brutes retournées par l'API ANS. Disponibles uniquement si fhirApiKey est configurée et que la source n'est pas désactivée.

PropriétéTypeDescription
practitionerarray|nullRessource FHIR Practitioner brute (décodée depuis JSON)
practitionerRolesarray[]Tableau de ressources FHIR PractitionerRole (jusqu'à 50)

CodeLabel

Paire code/libellé réutilisée dans tous les DTOs pour les données de référentiel (civilité, profession, mode d'exercice, etc.).

PropriétéTypeDescription
codestringCode de la valeur (ex : '10', 'DR')
libellestringLibellé humain (ex : 'Médecin', 'Docteur')
php
$profil->profession->libelle;           // 'Médecin'
$profil->profession->code;              // '10'
$profil->identite->civiliteExercice->libelle; // 'Docteur'

$arr = $profil->profession->categorie->toArray();
// ['code' => 'C', 'libelle' => 'Civil']

SourceStatus

Statut d'exécution d'une source de données.

PropriétéTypeDescription
sourceSourceNameIdentifiant de la source (enum)
successbooltrue si la requête a réussi
rowCountintNombre de lignes retournées
durationMsfloatDurée d'exécution en millisecondes
errorstring|nullMessage d'erreur si success === false, ou raison de désactivation

RppsSearchCriteria

Critères passés à search(). Au moins un critère non nul et non vide est requis.

PropriétéTypeDescription
nomstring|nullNom d'exercice (recherche partielle contains)
prenomstring|nullPrénom d'exercice (recherche partielle contains)
codePostalstring|nullCode postal — filtre exact si 5 caractères, sinon contains

RppsSearchResponse

Réponse paginée retournée par search().

PropriétéTypeDescription
resultsRppsSearchResult[]Résultats de la page courante (dédupliqués par RPPS)
totalintNombre total de résultats (toutes pages)
pageintNuméro de page courant
pageSizeintNombre de résultats par page
durationMsfloatDurée d'exécution en millisecondes
criteriaRppsSearchCriteriaCritères utilisés pour cette requête

RppsSearchResult

Résultat allégé d'une recherche (moins de champs que RppsFullProfile). Pour un profil complet, appeler getByRpps($result->rpps).

PropriétéTypeDescription
rppsstringNuméro RPPS
identificationNationalestringIdentifiant national PP
civilitestringLibellé civilité d'exercice
nomExercicestringNom d'exercice
prenomExercicestringPrénom d'exercice
professionCodeLabelProfession (code + libellé)
categorieProfessionnelleCodeLabelCatégorie professionnelle
modeExerciceCodeLabelMode d'exercice
savoirFaireCodeLabelSavoir-faire principal
raisonSocialestringRaison sociale de la structure
codePostalstringCode postal de la structure
libelleCommunestringCommune de la structure
departementstringDépartement de la structure

Sources de données

Le SDK agrège 6 sources interrogées lors de chaque appel à getByRpps(). Chaque source correspond à une ressource sur data.gouv.fr ou à l'API FHIR ANS.

Source Enum SourceName Resource ID Données fournies
personne-activite PersonneActivite fffda7e9-0ea2-4c35-bba0-4496f3af935d Identité, profession, activités, structures
diplomes Diplomes 41ae70ac-90c8-4c4e-8644-4ef1b100f045 Diplômes obtenus et autorisations d'exercice
savoir-faire SavoirFaire fb55f15f-bd61-4402-b551-51ef387f2fab Spécialités et compétences déclarées
carte-cps CarteCps 210eb05e-564b-42be-994a-d1800b63e9b7 Cartes CPS (type, numéro, validité)
mssante Mssante afe01105-d9a1-41fe-921f-e40ea48b2ba6 Messageries sécurisées MSSanté
fhir Fhir — API FHIR ANS Practitioner + PractitionerRoles FHIR (clé API requise)
Les 5 sources Tabular interrogent tabular-api.data.gouv.fr/api/resources/{resource-id}/data/ avec un filtre exact sur Identifiant PP (colonne RPPS). La source FHIR utilise gateway.api.esante.gouv.fr/fhir/v2/Practitioner.

Enum SourceName

Backed enum PHP utilisé dans SourceStatus::$source et RppsClientOptions::$disabledSources.

php
use QrCommunication\RppsApi\Enum\SourceName;

SourceName::Fhir->value;             // 'fhir'
SourceName::PersonneActivite->value; // 'personne-activite'
SourceName::Diplomes->value;         // 'diplomes'
SourceName::SavoirFaire->value;      // 'savoir-faire'
SourceName::CarteCps->value;         // 'carte-cps'
SourceName::Mssante->value;          // 'mssante'
CaseValeur
SourceName::Fhir'fhir'
SourceName::PersonneActivite'personne-activite'
SourceName::Diplomes'diplomes'
SourceName::SavoirFaire'savoir-faire'
SourceName::CarteCps'carte-cps'
SourceName::Mssante'mssante'

Gestion des erreurs

Le SDK lance RppsException (étend \RuntimeException) dans deux cas : numéro RPPS invalide ou absence de critères de recherche. Les erreurs réseau ou d'API sont capturées silencieusement et consignées dans RppsFullProfile::$sources avec success === false.

php
use QrCommunication\RppsApi\Exception\RppsException;

// ── Cas 1 : RPPS invalide ───────────────────────────────────────
try {
    $profil = $client->getByRpps('123');
} catch (RppsException $e) {
    // "Numéro RPPS invalide : "123". Le RPPS doit contenir exactement 11 chiffres."
    echo $e->getMessage();
}

// ── Cas 2 : aucun critère de recherche ─────────────────────────
try {
    $results = $client->search(new RppsSearchCriteria());
} catch (RppsException $e) {
    // "Au moins un critère de recherche est obligatoire (nom, prenom ou codePostal)."
    echo $e->getMessage();
}

// ── Cas 3 : erreur source (silencieuse, consultable après coup) ─
$profil = $client->getByRpps('10005173140');

foreach ($profil->sources as $source) {
    if (!$source->success) {
        // La source a échoué, mais le reste du profil est disponible
        echo "[{$source->source->value}] ERREUR : {$source->error}\n";
    }
}

Exemples

Profil complet par RPPS

php
$client = new RppsClient(new RppsClientOptions(
    fhirApiKey: getenv('ESANTE_API_KEY'),
));

$profil = $client->getByRpps('10005173140');

// Identité
echo $profil->identite->civiliteExercice->libelle;  // 'Docteur'
echo $profil->identite->prenomExercice;              // 'JEAN'
echo $profil->identite->nomExercice;                 // 'DUPONT'

// Profession
echo $profil->profession->libelle;                   // 'Médecin'
echo $profil->profession->code;                      // '10'

// Structures d'exercice
foreach ($profil->activites as $activite) {
    echo $activite->structure->raisonSociale . "\n";
    echo $activite->structure->adresse->libelleCommune . ' ';
    echo $activite->structure->adresse->codePostal . "\n";
    echo $activite->modeExercice->libelle . "\n";
}

// Diplômes
foreach ($profil->diplomesEtAutorisations as $da) {
    if ($da->diplome !== null) {
        echo '[Diplôme] ' . $da->diplome->libelle . "\n";
    }
    if ($da->typeAutorisation !== null) {
        echo '[Autorisation] ' . $da->typeAutorisation->libelle . "\n";
    }
}

// Messageries MSSanté
foreach ($profil->messageriesMssante as $mss) {
    echo $mss->adresseBal . ' (' . $mss->typeBal . ")\n";
}

// FHIR (si clé configurée)
if ($profil->fhir->practitioner !== null) {
    echo 'ID FHIR : ' . $profil->fhir->practitioner['id'] . "\n";
    echo count($profil->fhir->practitionerRoles) . " rôle(s) FHIR\n";
}

Désactiver des sources

Utile pour accélérer les requêtes quand certaines données ne sont pas nécessaires.

php
// Identité + profession uniquement (sans CPS, MSSanté, FHIR)
$clientLeger = new RppsClient(new RppsClientOptions(
    disabledSources: ['carte-cps', 'mssante', 'fhir'],
));

// Identité seulement (désactiver tout sauf personne-activite)
$clientMinimal = new RppsClient(new RppsClientOptions(
    disabledSources: ['carte-cps', 'mssante', 'fhir', 'diplomes', 'savoir-faire'],
));

// Vérifier quelles sources ont été désactivées dans la réponse
$profil = $clientLeger->getByRpps('10005173140');
foreach ($profil->sources as $src) {
    if (!$src->success && $src->error === 'disabled') {
        echo "[DESACTIVE] {$src->source->value}\n";
    }
}

Configuration FHIR

L'API FHIR ANS est gratuite mais nécessite une clé d'API Gravitee. Sans clé, la source FHIR est ignorée (pas d'erreur, le profil reste complet sur les autres sources).

  1. Créer un compte sur portal.api.esante.gouv.fr
  2. Créer une application
  3. S'abonner à l'offre API Annuaire Santé en libre accès
  4. Récupérer la clé ESANTE-API-KEY
php
$client = new RppsClient(new RppsClientOptions(
    fhirApiKey: $_ENV['ESANTE_API_KEY'], // ou getenv('ESANTE_API_KEY')
));
La clé est envoyée dans le header HTTP ESANTE-API-KEY à chaque requête vers gateway.api.esante.gouv.fr/fhir/v2. Elle n'est jamais transmise aux APIs Tabular.

Skill AI

Le SDK inclut un skill AI qui installe une documentation complète directement dans votre agent de code (Claude Code, Cursor, Codex, Windsurf, Cline, Aider, Gemini CLI).

bash
bash vendor/qrcommunication/rppsapi/skill/install.sh

Installation manuelle : cp -r vendor/qrcommunication/rppsapi/skill ~/.claude/skills/sdk-rpps