Une API rapide et fiable pour accéder aux 15K+ médicaments françaises. Mises à jour automatiques deux fois par jour, cache intelligent, et protection contre les abus pour garantir une expérience stable.
See the codeAPI RESTful haute performance fournissant un accès programmatique aux données des médicaments français via une architecture basée sur 6 interfaces principales, parsing concurrent de 5 fichiers TSV BDPM, mises à jour atomiques zero-downtime, cache HTTP intelligent (ETag/Last-Modified), rate limiting par token bucket, et support Docker complet avec stack observabilité.
L'API délivre des performances exceptionnelles : lookups O(1) par code CIS ou CIP atteignent 80K+ requêtes/seconde en production avec latence moyenne < 5ms. Recherches regex atteignent 6,100 req/s grâce aux noms normalisés pré-calculés.
Nouveaux endpoints v1 (recommandés) :
| Endpoint | Description | Documentation |
|---|---|---|
/v1/medicaments | Recherche & browse médicaments | Full API |
/v1/medicaments/{cis}/rcp | RCP ANSM (JSON sectionné) | Docs RCP |
/v1/medicaments/{cis}/notice | Notice ANSM (JSON sectionné) | Docs RCP |
/v1/generiques | Groupes génériques | Full API |
/v1/presentations | Présentations par CIP | Full API |
/v1/diagnostics | Métriques système détaillées | Full API |
/health | Santé système simplifiée | Full API |
/ | Documentation SPA | Full API |
/docs | Swagger UI interactive | Full API |
Endpoints legacy (supprimés le 31 juillet 2026) :
Ces endpoints ont été supprimés le 31 juillet 2026. Ils répondent désormais 410 Gone, accompagnés d'un header Link; rel="successor-version" pointant vers l'endpoint v1 de remplacement.
| Endpoint | Description | Migration |
|---|---|---|
GET /database | Base complète | → /v1/medicaments/export |
GET /database/{page} | Pagination | → /v1/medicaments?page={n} |
GET /medicament/{nom} | Recherche nom | → /v1/medicaments?search={nom} |
GET /medicament/id/{cis} | Recherche CIS | → /v1/medicaments/{cis} |
GET /medicament/cip/{cip} | Recherche CIP | → /v1/medicaments?cip={cip} |
GET /generiques/{libelle} | Génériques libellé | → /v1/generiques?libelle={libelle} |
GET /generiques/group/{id} | Groupe générique | → /v1/generiques/{id} |
Voir le Guide de Migration pour les détails complets.
# Production (HTTPS)
# Recherche par nom
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol"
# Recherche par CIS (Code Identifiant de Spécialité)
curl "https://medicaments-api.giygas.dev/v1/medicaments/61504672"
# Pagination (10 médicaments par page, défaut)
curl "https://medicaments-api.giygas.dev/v1/medicaments?page=1"
# Pagination avec pageSize personnalisé (50 médicaments par page)
curl "https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50"
# Recherche par CIP via présentation
curl "https://medicaments-api.giygas.dev/v1/medicaments?cip=3400936403114"
# Export complet (~20MB)
curl "https://medicaments-api.giygas.dev/v1/medicaments/export"
# Local (Go native : port 8000, Docker : port 8030)
curl "http://localhost:8030/v1/medicaments?search=paracetamol"
curl "http://localhost:8030/health"
# Génériques par libellé
curl "https://medicaments-api.giygas.dev/v1/generiques?libelle=paracetamol"
# Groupe générique par ID
curl "https://medicaments-api.giygas.dev/v1/generiques/1234"
# Présentations par CIP
curl "https://medicaments-api.giygas.dev/v1/presentations/3400936403114"
Le RCP (Résumé des Caractéristiques du Produit) et la notice patient de chaque médicament, servis en JSON sectionné (rubriques avec identifiants stables). Le document est téléchargé paresseusement depuis l'ANSM au premier accès, puis caché définitivement sur disque (fetch-once, serve-forever) :
# RCP par code CIS
curl "https://medicaments-api.giygas.dev/v1/medicaments/60016308/rcp"
# Notice patient
curl "https://medicaments-api.giygas.dev/v1/medicaments/60016308/notice"
Documentation complète — format JSON sectionné, cache disque & tombstones, en-têtes de cache, attribution Etalab 2.0 et notes de déploiement : voir Documents ANSM (RCP & Notices).
L'API supporte désormais la recherche multi-mots avec logique ET (tous les mots doivent être présents) :
# 2 mots - recherche précise
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol+500"
# 6 mots - recherche très précise
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol+500+mg+comprime+boite+20"
Note : Maximum de 6 mots par requête (protection DoS). Les mots peuvent être séparés par + ou espace.
// Recherche par nom
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol",
);
const data = await response.json();
// Recherche par CIS
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments/61504672",
);
const data = await response.json();
// Pagination
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?page=1",
);
const data = await response.json();
console.log(`Page ${data.page} of ${data.maxPage}`);
// Pagination avec pageSize personnalisé
const response2 = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50",
);
const data2 = await response2.json();
console.log(`Page ${data2.page} of ${data2.maxPage}, pageSize: ${data2.pageSize}`);
import requests
# Recherche par nom
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol')
data = response.json()
# Recherche par CIS
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments/61504672')
data = response.json()
# Pagination
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?page=1')
data = response.json()
print(f"Page {data['page']} of {data['maxPage']}")
# Pagination avec pageSize personnalisé
response2 = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50')
data2 = response2.json()
print(f"Page {data2['page']} of {data2['maxPage']}, pageSize: {data2['pageSize']}")
') et slash (/) sont acceptées. Les points consécutifs (..) sont bloqués.regexp.QuoteMeta pour échappementX-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Rate, Retry-After/v1/medicaments/exportatomic.Value et atomic.Bool pour basculementslog avec rotation de fichiers automatiquesync.RWMutex et opérations atomiques# Initial setup (première fois)
make setup-secrets
make obs-init
# Build Docker image
make build
# Démarrer tous les services (API + observabilité)
make up
# Accès : http://localhost:8030
Pour la documentation complète Docker, voir DOCKER.md
Pour le guide de développement complet, voir Guide de développement.
# Cloner et configurer
git clone https://github.com/giygas/medicaments-api.git
cd medicaments-api
# Installer les dépendances et configurer l'environnement
go mod tidy
cp .env.example .env
# Lancer le serveur de développement
go run .
# Build
go build -o medicaments-api .
# Tests
go test -v ./...
# Formatage et analyse
gofmt -w .
go vet ./...
Pour plus de détails sur le développement, les tests et les benchmarks, voir Guide de développement.
http://localhost:8000 (Go native) ou http://localhost:8030 (Docker)http://localhost:6060 (quand ENV=dev)http://localhost:8000/docs ou http://localhost:8030/docs (Docker)http://localhost:8000/health ou http://localhost:8030/health (Docker)http://localhost:3000, Prometheus http://localhost:9090
observability/ (voir DOCKER.md)Ce service est gratuit et fonctionne avec des ressources limitées :
Ce projet est distribué sous GNU AGPL-3.0.
Les données médicales restent soumises à la licence de la Base de Données Publique des Médicaments (BDPM).
Si vous utilisez cette API dans vos projets, merci de citer :
Données issues de la Base de Données Publique des Médicaments (BDPM)
API : https://medicaments-api.giygas.dev/
Source : https://base-donnees-publique.medicaments.gouv.fr
Pour l'historique complet des versions et des changements détaillés, consultez le CHANGELOG.md.
Ce projet est développé avec passion pour les professionnels de santé, chercheurs, et développeurs qui ont besoin d'accéder aux données sur les médicaments disponibles en France.
Merci à tous les contributeurs des projets open source qui rendent cette API possible :
⭐ Si ce projet vous est utile, n'hésitez pas à laisser une étoile sur GitHub !
Une API rapide et fiable pour accéder aux 15K+ médicaments françaises. Mises à jour automatiques deux fois par jour, cache intelligent, et protection contre les abus pour garantir une expérience stable.
See the codeAPI RESTful haute performance fournissant un accès programmatique aux données des médicaments français via une architecture basée sur 6 interfaces principales, parsing concurrent de 5 fichiers TSV BDPM, mises à jour atomiques zero-downtime, cache HTTP intelligent (ETag/Last-Modified), rate limiting par token bucket, et support Docker complet avec stack observabilité.
L'API délivre des performances exceptionnelles : lookups O(1) par code CIS ou CIP atteignent 80K+ requêtes/seconde en production avec latence moyenne < 5ms. Recherches regex atteignent 6,100 req/s grâce aux noms normalisés pré-calculés.
Nouveaux endpoints v1 (recommandés) :
| Endpoint | Description | Documentation |
|---|---|---|
/v1/medicaments | Recherche & browse médicaments | Full API |
/v1/medicaments/{cis}/rcp | RCP ANSM (JSON sectionné) | Docs RCP |
/v1/medicaments/{cis}/notice | Notice ANSM (JSON sectionné) | Docs RCP |
/v1/generiques | Groupes génériques | Full API |
/v1/presentations | Présentations par CIP | Full API |
/v1/diagnostics | Métriques système détaillées | Full API |
/health | Santé système simplifiée | Full API |
/ | Documentation SPA | Full API |
/docs | Swagger UI interactive | Full API |
Endpoints legacy (supprimés le 31 juillet 2026) :
Ces endpoints ont été supprimés le 31 juillet 2026. Ils répondent désormais 410 Gone, accompagnés d'un header Link; rel="successor-version" pointant vers l'endpoint v1 de remplacement.
| Endpoint | Description | Migration |
|---|---|---|
GET /database | Base complète | → /v1/medicaments/export |
GET /database/{page} | Pagination | → /v1/medicaments?page={n} |
GET /medicament/{nom} | Recherche nom | → /v1/medicaments?search={nom} |
GET /medicament/id/{cis} | Recherche CIS | → /v1/medicaments/{cis} |
GET /medicament/cip/{cip} | Recherche CIP | → /v1/medicaments?cip={cip} |
GET /generiques/{libelle} | Génériques libellé | → /v1/generiques?libelle={libelle} |
GET /generiques/group/{id} | Groupe générique | → /v1/generiques/{id} |
Voir le Guide de Migration pour les détails complets.
# Production (HTTPS)
# Recherche par nom
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol"
# Recherche par CIS (Code Identifiant de Spécialité)
curl "https://medicaments-api.giygas.dev/v1/medicaments/61504672"
# Pagination (10 médicaments par page, défaut)
curl "https://medicaments-api.giygas.dev/v1/medicaments?page=1"
# Pagination avec pageSize personnalisé (50 médicaments par page)
curl "https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50"
# Recherche par CIP via présentation
curl "https://medicaments-api.giygas.dev/v1/medicaments?cip=3400936403114"
# Export complet (~20MB)
curl "https://medicaments-api.giygas.dev/v1/medicaments/export"
# Local (Go native : port 8000, Docker : port 8030)
curl "http://localhost:8030/v1/medicaments?search=paracetamol"
curl "http://localhost:8030/health"
# Génériques par libellé
curl "https://medicaments-api.giygas.dev/v1/generiques?libelle=paracetamol"
# Groupe générique par ID
curl "https://medicaments-api.giygas.dev/v1/generiques/1234"
# Présentations par CIP
curl "https://medicaments-api.giygas.dev/v1/presentations/3400936403114"
Le RCP (Résumé des Caractéristiques du Produit) et la notice patient de chaque médicament, servis en JSON sectionné (rubriques avec identifiants stables). Le document est téléchargé paresseusement depuis l'ANSM au premier accès, puis caché définitivement sur disque (fetch-once, serve-forever) :
# RCP par code CIS
curl "https://medicaments-api.giygas.dev/v1/medicaments/60016308/rcp"
# Notice patient
curl "https://medicaments-api.giygas.dev/v1/medicaments/60016308/notice"
Documentation complète — format JSON sectionné, cache disque & tombstones, en-têtes de cache, attribution Etalab 2.0 et notes de déploiement : voir Documents ANSM (RCP & Notices).
L'API supporte désormais la recherche multi-mots avec logique ET (tous les mots doivent être présents) :
# 2 mots - recherche précise
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol+500"
# 6 mots - recherche très précise
curl "https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol+500+mg+comprime+boite+20"
Note : Maximum de 6 mots par requête (protection DoS). Les mots peuvent être séparés par + ou espace.
// Recherche par nom
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol",
);
const data = await response.json();
// Recherche par CIS
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments/61504672",
);
const data = await response.json();
// Pagination
const response = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?page=1",
);
const data = await response.json();
console.log(`Page ${data.page} of ${data.maxPage}`);
// Pagination avec pageSize personnalisé
const response2 = await fetch(
"https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50",
);
const data2 = await response2.json();
console.log(`Page ${data2.page} of ${data2.maxPage}, pageSize: ${data2.pageSize}`);
import requests
# Recherche par nom
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?search=paracetamol')
data = response.json()
# Recherche par CIS
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments/61504672')
data = response.json()
# Pagination
response = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?page=1')
data = response.json()
print(f"Page {data['page']} of {data['maxPage']}")
# Pagination avec pageSize personnalisé
response2 = requests.get('https://medicaments-api.giygas.dev/v1/medicaments?page=1&pageSize=50')
data2 = response2.json()
print(f"Page {data2['page']} of {data2['maxPage']}, pageSize: {data2['pageSize']}")
') et slash (/) sont acceptées. Les points consécutifs (..) sont bloqués.regexp.QuoteMeta pour échappementX-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Rate, Retry-After/v1/medicaments/exportatomic.Value et atomic.Bool pour basculementslog avec rotation de fichiers automatiquesync.RWMutex et opérations atomiques# Initial setup (première fois)
make setup-secrets
make obs-init
# Build Docker image
make build
# Démarrer tous les services (API + observabilité)
make up
# Accès : http://localhost:8030
Pour la documentation complète Docker, voir DOCKER.md
Pour le guide de développement complet, voir Guide de développement.
# Cloner et configurer
git clone https://github.com/giygas/medicaments-api.git
cd medicaments-api
# Installer les dépendances et configurer l'environnement
go mod tidy
cp .env.example .env
# Lancer le serveur de développement
go run .
# Build
go build -o medicaments-api .
# Tests
go test -v ./...
# Formatage et analyse
gofmt -w .
go vet ./...
Pour plus de détails sur le développement, les tests et les benchmarks, voir Guide de développement.
http://localhost:8000 (Go native) ou http://localhost:8030 (Docker)http://localhost:6060 (quand ENV=dev)http://localhost:8000/docs ou http://localhost:8030/docs (Docker)http://localhost:8000/health ou http://localhost:8030/health (Docker)http://localhost:3000, Prometheus http://localhost:9090
observability/ (voir DOCKER.md)Ce service est gratuit et fonctionne avec des ressources limitées :
Ce projet est distribué sous GNU AGPL-3.0.
Les données médicales restent soumises à la licence de la Base de Données Publique des Médicaments (BDPM).
Si vous utilisez cette API dans vos projets, merci de citer :
Données issues de la Base de Données Publique des Médicaments (BDPM)
API : https://medicaments-api.giygas.dev/
Source : https://base-donnees-publique.medicaments.gouv.fr
Pour l'historique complet des versions et des changements détaillés, consultez le CHANGELOG.md.
Ce projet est développé avec passion pour les professionnels de santé, chercheurs, et développeurs qui ont besoin d'accéder aux données sur les médicaments disponibles en France.
Merci à tous les contributeurs des projets open source qui rendent cette API possible :
⭐ Si ce projet vous est utile, n'hésitez pas à laisser une étoile sur GitHub !