{"id":15901602,"url":"https://github.com/axel-op/api-bdpm-graphql","last_synced_at":"2025-03-20T19:30:43.012Z","repository":{"id":41237845,"uuid":"302693814","full_name":"axel-op/api-bdpm-graphql","owner":"axel-op","description":"API en GraphQL pour la Base de Données Publique des Médicaments (BDPM)","archived":false,"fork":false,"pushed_at":"2022-12-16T23:54:04.000Z","size":2086,"stargazers_count":18,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-01T00:38:26.244Z","etag":null,"topics":["api","bdpm","data-gouv-fr","france","graphql","medicaments"],"latest_commit_sha":null,"homepage":"https://api-bdpm-graphql.axel-op.fr/graphql","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/axel-op.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-10-09T16:18:36.000Z","updated_at":"2025-01-06T07:20:58.000Z","dependencies_parsed_at":"2022-09-10T20:21:13.831Z","dependency_job_id":null,"html_url":"https://github.com/axel-op/api-bdpm-graphql","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axel-op%2Fapi-bdpm-graphql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axel-op%2Fapi-bdpm-graphql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axel-op%2Fapi-bdpm-graphql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axel-op%2Fapi-bdpm-graphql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axel-op","download_url":"https://codeload.github.com/axel-op/api-bdpm-graphql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244079616,"owners_count":20394764,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","bdpm","data-gouv-fr","france","graphql","medicaments"],"created_at":"2024-10-06T11:05:11.584Z","updated_at":"2025-03-20T19:30:42.599Z","avatar_url":"https://github.com/axel-op.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# API GraphQL pour la Base de Données Publique des Médicaments\n\n![Visualisation du graphe](./visualization.png)\n\nLa [Base de Données Publique des Médicaments](http://base-donnees-publique.medicaments.gouv.fr), mise à disposition par l'ANSM, la HAS et l'UNCAM, est [téléchargeable sous la forme de multiples fichiers](http://base-donnees-publique.medicaments.gouv.fr/telechargement.php) contenant des données tabulaires délimitées par des tabulations. Ces fichiers présentent deux inconvénients :\n\n- ils sont reliés entre eux de façon complexe, avec des clés qui ne sont pas toujours uniques au sein d'un même fichier ;\n- les données sont parfois mal formatées, difficilement *parsables* sans pré-traitement.\n\nCette API a pour objectif de résoudre ces problèmes en **typant** les données de la base et en permettant d'extraire toutes les données nécessaires, et seulement ces données, en un **minimum de requêtes**, grâce au langage de requête [GraphQL](https://graphql.org/learn).\n\n## Utilisation\n\n### Localement\n\nDémarrer le serveur :\n\n```bash\nnpm install\nnode src/server.js\n```\n\nUne fois le serveur démarré, les requêtes (HTTP POST) peuvent être envoyées à [`localhost:4000/graphql`](http://localhost:4000/graphql) (accéder à cette adresse depuis un navigateur affichera une interface graphique).\n\n```bash\ncurl http://localhost:4000/graphql -H \"Content-Type: application/graphql\" -d \"query { medicaments(CIS: [62204255]) { denomination } }\"\n\n# Si la requête GraphQL est contenue dans le fichier \"requete.graphql\" :\ncurl http://localhost:4000/graphql -H \"Content-Type: application/graphql\" -d @requete.graphql\n```\n\n### En ligne\n\nL'API est hébergée en ligne : \u003chttps://api-bdpm-graphql.axel-op.fr/graphql\u003e.\n\n## Guide\n\nLe schéma complet est disponible dans [`schema.graphql`](./schema.graphql).\n\n### Requête par code\n\nDemander un médicament à partir de son CIS (Code Identifiant de Spécialité), sa dénomination, les substances qu'il contient avec leur code et leur dénomination :\n\n```graphql\nquery {\n  medicaments(CIS: [\"68572075\"]) {\n    denomination\n    substances {\n      code_substance\n      denominations\n    }\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"medicaments\": [\n      {\n        \"denomination\": \"FAMOTIDINE MYLAN 20 mg, comprimé pelliculé\",\n        \"substances\": [\n          {\n            \"code_substance\": \"4034\",\n            \"denominations\": [\n              \"FAMOTIDINE\"\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nDemander une substance à partir de son code, sa dénomination, et tous les médicaments qui la contiennent avec leur dénomination :\n\n```graphql\nquery {\n  substances(codes_substances: [\"4034\"]) {\n    denominations\n    medicaments {\n      denomination\n    }\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"substances\": [\n      {\n        \"denominations\": [\n          \"FAMOTIDINE\"\n        ],\n        \"medicaments\": [\n          {\n            \"denomination\": \"FAMOTIDINE EG 20 mg, comprimé pelliculé\"\n          },\n          {\n            \"denomination\": \"FAMOTIDINE MYLAN 40 mg, comprimé pelliculé\"\n          },\n          {\n            \"denomination\": \"FAMOTIDINE EG 40 mg, comprimé pelliculé\"\n          },\n          {\n            \"denomination\": \"FAMOTIDINE MYLAN 20 mg, comprimé pelliculé\"\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nDemander un groupe générique à partir de son identifiant, et son ou ses médicament(s) princeps, avec pour chaque médicament leur dénomination et celle de leurs substances :\n\n```graphql\nquery {\n  groupes_generiques(ids: [\"101\"]) {\n    libelle\n    princeps {\n      denomination\n      substances {\n        denominations\n      }\n    }\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"groupes_generiques\": [\n      {\n        \"libelle\": \"CAPTOPRIL 50 mg + HYDROCHLOROTHIAZIDE 25 mg - ECAZIDE, comprimé sécable - CAPTEA, comprimé sécable.\",\n        \"princeps\": [\n          {\n            \"denomination\": \"ECAZIDE, comprimé sécable\",\n            \"substances\": [\n              {\n                \"denominations\": [\n                  \"HYDROCHLOROTHIAZIDE\"\n                ]\n              },\n              {\n                \"denominations\": [\n                  \"CAPTOPRIL\"\n                ]\n              }\n            ]\n          },\n          {\n            \"denomination\": \"CAPTEA, comprimé sécable\",\n            \"substances\": [\n              {\n                \"denominations\": [\n                  \"HYDROCHLOROTHIAZIDE\"\n                ]\n              },\n              {\n                \"denominations\": [\n                  \"CAPTOPRIL\"\n                ]\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n### Requête par produit\n\nDemander tous les médicaments avec leur dénomination, et toutes les substances avec leur dénomination (l'argument `limit` permet de limiter le nombre de résultats) :\n\n```graphql\nquery {\n  medicaments(limit: 3) {\n    denomination\n  }\n  \n  substances(limit: 3) {\n    denominations\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"medicaments\": [\n      {\n        \"denomination\": \"ANASTROZOLE ACCORD 1 mg, comprimé pelliculé\"\n      },\n      {\n        \"denomination\": \"RANITIDINE BIOGARAN 150 mg, comprimé effervescent\"\n      },\n      {\n        \"denomination\": \"ACTAEA RACEMOSA FERRIER, degré de dilution compris entre 2CH et 30CH ou entre 4DH et 60DH\"\n      }\n    ],\n    \"substances\": [\n      {\n        \"denominations\": [\n          \"CHLORHYDRATE DE LOPÉRAMIDE\",\n          \"LOPÉRAMIDE (CHLORHYDRATE DE)\"\n        ]\n      },\n      {\n        \"denominations\": [\n          \"SPLENINE POUR PRÉPARATIONS HOMÉOPATHIQUES\"\n        ]\n      },\n      {\n        \"denominations\": [\n          \"ACÉTAZOLAMIDE\"\n        ]\n      }\n    ]\n  }\n}\n```\n\n### Requête paginée\n\nPour une même requête, les éléments sont toujours renvoyés dans le même ordre.\n\nIl est possible d'effectuer une requête paginée avec les arguments `from` et `limit` :\n\n- `from` est l'index du premier élément à renvoyer (à partir de 0),\n- `limit` est le nombre maximum d'éléments à renvoyer.\n\nExemple :\n\n```graphql\nquery {\n  page_1:\n  presentations(limit: 3, from: 0) {\n    ...champs\n  }\n\n  page_2:\n  presentations(limit: 3, from: 3) {\n    ...champs\n  }\n\n  pages_1_et_2:\n  presentations(limit: 6) {\n    ...champs\n  }\n}\n\nfragment champs on Presentation {\n  CIP7\n  libelle\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"page_1\": [\n      {\n        \"CIP7\": \"2160191\",\n        \"libelle\": \"plaquette(s) thermoformée(s) aluminium de 28 comprimé(s)\"\n      },\n      {\n        \"CIP7\": \"2160363\",\n        \"libelle\": \"4 poche(s) bicompartimenté(e)(s) polymère multicouches BIOFINE de 1000 ml\"\n      },\n      {\n        \"CIP7\": \"2160417\",\n        \"libelle\": \"flacon(s) polyéthylène haute densité (PEHD) de 28 comprimé(s)\"\n      }\n    ],\n    \"page_2\": [\n      {\n        \"CIP7\": \"2160423\",\n        \"libelle\": \"flacon(s) polyéthylène haute densité (PEHD) de 14 comprimé(s)\"\n      },\n      {\n        \"CIP7\": \"2160469\",\n        \"libelle\": \"1 flacon(s) polyéthylène de 5 ml avec compte-gouttes\"\n      },\n      {\n        \"CIP7\": \"2160908\",\n        \"libelle\": \"4 seringue(s) préremplie(s) en verre de 0,5 ml dans stylo pré-rempli\"\n      }\n    ],\n    \"pages_1_et_2\": [\n      {\n        \"CIP7\": \"2160191\",\n        \"libelle\": \"plaquette(s) thermoformée(s) aluminium de 28 comprimé(s)\"\n      },\n      {\n        \"CIP7\": \"2160363\",\n        \"libelle\": \"4 poche(s) bicompartimenté(e)(s) polymère multicouches BIOFINE de 1000 ml\"\n      },\n      {\n        \"CIP7\": \"2160417\",\n        \"libelle\": \"flacon(s) polyéthylène haute densité (PEHD) de 28 comprimé(s)\"\n      },\n      {\n        \"CIP7\": \"2160423\",\n        \"libelle\": \"flacon(s) polyéthylène haute densité (PEHD) de 14 comprimé(s)\"\n      },\n      {\n        \"CIP7\": \"2160469\",\n        \"libelle\": \"1 flacon(s) polyéthylène de 5 ml avec compte-gouttes\"\n      },\n      {\n        \"CIP7\": \"2160908\",\n        \"libelle\": \"4 seringue(s) préremplie(s) en verre de 0,5 ml dans stylo pré-rempli\"\n      }\n    ]\n  }\n}\n```\n\n### Requête filtrée par date\n\nIl est possible de filtrer les médicaments par date d'autorisation de mise sur le marché (AMM).\n\nLe paramètre `date_AMM` est [de type `DateFilter`](./schema.graphql) et a deux propriétés :\n\n- `before` renverra les médicaments mis sur le marché avant ou à cette date,\n- `after` renverra les médicaments mis sur le marché à ou après cette date.\n\nSpécifier une même date pour les deux propriétés renverra les médicaments mis sur le marché à cette date exactement.\n\nUne date doit avoir un des formats suivants :\n\n- `DD/MM/YYYY`\n- `DD-MM-YYYY`\n- `YYYY-MM-DD`\n\nExemple :\n\n```graphql\nquery {\n  dateAvant: medicaments(\n    date_AMM: {before: \"22/12/1999\"},\n    limit: 2\n  ) {\n    ...champs\n  }\n  \n  dateApres: medicaments(\n    date_AMM: {after: \"22/12/1999\"},\n    limit: 2\n  ) {\n    ...champs\n  }\n  \n  dateExacte: medicaments(\n    date_AMM: {after: \"22/12/1999\", before: \"22/12/1999\"}\n  ) {\n    ...champs\n  }\n  \n  periode: medicaments(\n    date_AMM: {after: \"01/11/1999\", before: \"08/11/1999\"}\n  ) {\n    ...champs\n  }\n}\n\nfragment champs on Medicament {\n  denomination\n  date_AMM\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"dateAvant\": [\n      {\n        \"denomination\": \"RANITIDINE BIOGARAN 150 mg, comprimé effervescent\",\n        \"date_AMM\": \"04/07/1989\"\n      },\n      {\n        \"denomination\": \"FENOFIBRATE TEVA 100 mg, gélule\",\n        \"date_AMM\": \"06/12/1996\"\n      }\n    ],\n    \"dateApres\": [\n      {\n        \"denomination\": \"ANASTROZOLE ACCORD 1 mg, comprimé pelliculé\",\n        \"date_AMM\": \"28/10/2010\"\n      },\n      {\n        \"denomination\": \"ACTAEA RACEMOSA FERRIER, degré de dilution compris entre 2CH et 30CH ou entre 4DH et 60DH\",\n        \"date_AMM\": \"03/01/2008\"\n      }\n    ],\n    \"dateExacte\": [\n      {\n        \"denomination\": \"FAMOTIDINE EG 20 mg, comprimé pelliculé\",\n        \"date_AMM\": \"22/12/1999\"\n      },\n      {\n        \"denomination\": \"FAMOTIDINE EG 40 mg, comprimé pelliculé\",\n        \"date_AMM\": \"22/12/1999\"\n      }\n    ],\n    \"periode\": [\n      {\n        \"denomination\": \"KABIVEN, émulsion pour perfusion\",\n        \"date_AMM\": \"08/11/1999\"\n      },\n      {\n        \"denomination\": \"CISPLATINE MYLAN 25 mg/25 ml, solution à diluer pour perfusion\",\n        \"date_AMM\": \"02/11/1999\"\n      }\n    ]\n  }\n}\n```\n\n### Autres exemples\n\nDemander un médicament à partir de son CIS, et les présentations sous lesquelles il est vendu, associées à plusieurs caractéristiques :\n\n```graphql\nquery {\n  medicaments(CIS: [\"62204255\"]) {\n    denomination\n    presentations {\n      CIP7\n      libelle\n      taux_remboursement\n      prix_sans_honoraires\n      prix_avec_honoraires\n    }\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"medicaments\": [\n      {\n        \"denomination\": \"AMLODIPINE PFIZER 5 mg, gélule\",\n        \"presentations\": [\n          {\n            \"CIP7\": \"3334167\",\n            \"libelle\": \"plaquette(s) PVC PVDC aluminium de 30 gélule(s)\",\n            \"taux_remboursement\": 65,\n            \"prix_sans_honoraires\": 4.36,\n            \"prix_avec_honoraires\": 5.38\n          },\n          {\n            \"CIP7\": \"3823529\",\n            \"libelle\": \"plaquette(s) PVC PVDC aluminium de 90 gélule(s)\",\n            \"taux_remboursement\": 65,\n            \"prix_sans_honoraires\": 12.32,\n            \"prix_avec_honoraires\": 15.08\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nDemander les médicaments princeps et génériques, associés au prix de leurs présentations, du groupe générique \"AZANTAC 150 mg cp effervescent\" :\n\n```graphql\nquery {\n  groupes_generiques(\n    libelle: {contains_all: [\"azantac 150 mg\", \"effervescent\"]}\n  ) {\n    id\n    libelle\n    princeps {\n      ...champs\n    }\n    generiques {\n      ...champs\n    }\n  }\n}\n\nfragment champs on Medicament {\n  CIS\n  presentations {\n    prix_sans_honoraires\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"groupes_generiques\": [\n      {\n        \"id\": \"10\",\n        \"libelle\": \"RANITIDINE (CHLORHYDRATE DE) équivalant à RANITIDINE 150 mg - AZANTAC 150 mg, comprimé effervescent - RANIPLEX 150 mg, comprimé effervescent.\",\n        \"princeps\": [\n          {\n            \"CIS\": \"61541821\",\n            \"presentations\": [\n              {\n                \"prix_sans_honoraires\": 8.88\n              }\n            ]\n          }\n        ],\n        \"generiques\": [\n          {\n            \"CIS\": \"60002504\",\n            \"presentations\": [\n              {\n                \"prix_sans_honoraires\": 7.2\n              }\n            ]\n          },\n          {\n            \"CIS\": \"62349845\",\n            \"presentations\": [\n              {\n                \"prix_sans_honoraires\": 7.2\n              }\n            ]\n          },\n          {\n            \"CIS\": \"61765417\",\n            \"presentations\": [\n              {\n                \"prix_sans_honoraires\": 7.2\n              }\n            ]\n          },\n          {\n            \"CIS\": \"64940633\",\n            \"presentations\": [\n              {\n                \"prix_sans_honoraires\": 7.2\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nLes requêtes peuvent être très imbriquées. Par exemple, en partant d'une substance, il est possible de demander la liste des médicaments qui la contiennent, et pour chaque médicament, les présentations sous lesquelles ils sont vendus :\n\n```graphql\nquery {\n  substances(codes_substances: [\"1743\"]) {\n    denominations\n    medicaments {\n      denomination\n      presentations {\n        libelle\n        taux_remboursement\n      }\n    }\n  }\n}\n```\n\nRéponse :\n\n```json\n{\n  \"data\": {\n    \"substances\": [\n      {\n        \"denominations\": [\n          \"DIPYRIDAMOLE\"\n        ],\n        \"medicaments\": [\n          {\n            \"denomination\": \"PERSANTINE 75 mg, comprimé enrobé\",\n            \"presentations\": [\n              {\n                \"libelle\": \"plaquette(s) PVC PVDC aluminium de 30 comprimé(s)\",\n                \"taux_remboursement\": null\n              }\n            ]\n          },\n          {\n            \"denomination\": \"ASASANTINE L.P. 200 mg/25 mg, gélule à libération prolongée\",\n            \"presentations\": [\n              {\n                \"libelle\": \"flacon(s) polypropylène de 60 gélule(s)\",\n                \"taux_remboursement\": 65\n              }\n            ]\n          },\n          {\n            \"denomination\": \"CLERIDIUM 150 mg, comprimé pellicullé sécable\",\n            \"presentations\": [\n              {\n                \"libelle\": \"plaquette(s) thermoformée(s) PVC-aluminium de 60 comprimé(s)\",\n                \"taux_remboursement\": null\n              }\n            ]\n          },\n          {\n            \"denomination\": \"PERSANTINE 10 mg/2 mL, solution injectable, ampoule\",\n            \"presentations\": [\n              {\n                \"libelle\": \"10 ampoule(s) en verre de 2  ml\",\n                \"taux_remboursement\": null\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\nEtc.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxel-op%2Fapi-bdpm-graphql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxel-op%2Fapi-bdpm-graphql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxel-op%2Fapi-bdpm-graphql/lists"}