API des Médicaments Français

API haute performance avec parsing concurrent en ~0.5s, 470K alg/380K real req/sec, et 30-50MB RAM stable. Accès aux 15K+ médicaments français avec mises à jour atomiques zero-downtime et cache intelligent.

15.8K Médicaments
391K Reqs/sec
~0.5s Mises à jour
30-50MB RAM stable
75.5% Test coverage
99.9% Uptime

Introduction

Cette API transforme les 5 fichiers TSV de la Base de Données Publique des Médicaments (BDPM) en une interface RESTful ultra-performante. Parsing concurrent des sources en **~0.5 secondes** avec validation croisée et structuration automatique via atomic operations pour garantir des mises à jour zero-downtime. Architecture optimisée pour **380K req/sec** avec seulement **30-50MB RAM** stable.


Architecture modulaire basée sur 6 interfaces principales (HTTPHandler, HealthChecker, DataValidator, Parser, Scheduler, DataManager) avec dependency injection. Les données sont indexées en O(1) via maps CIS-based pour des recherches instantanées, avec cache HTTP intelligent (ETag/Last-Modified) et compression gzip.


🚀 Démarrage Rapide

Base URL & Authentication
# Base URL
BASE_URL="https://medicaments-api.giygas.dev"

# Authentication: None required
# Rate limits: 1000 tokens/IP, 3 tokens/sec recharge
# Costs: /health (5), /medicament/* (100), /database (200), others (20)
Quick Test Commands
curl https://medicaments-api.giygas.dev/medicament/paracetamol
curl https://medicaments-api.giygas.dev/database/1
curl https://medicaments-api.giygas.dev/health

Documentation & Code Source

Vous voulez commencer ? Jetez un œil à la documentation pour intégrer l'API dans vos projets, ou parcourez le code source pour voir comment tout fonctionne.

Fonctionnalités Principales

🔍

Recherche ultra-rapide

Recherche par nom (regex supporté) ou CIS avec O(1) lookup. Validation stricte (3-50 chars alphanumériques) et échappement automatique. Temps de réponse : <100ms (nom) et <50ms (CIS).

GET /medicament/paracetamol
📄

Pagination & Base complète

Pagination optimisée (10 éléments/page) avec métadonnées complètes. Base complète accessible (23MB, ~2.1s). Cache HTTP 6h avec ETag/Last-Modified et compression gzip pour un transfert efficace.

GET /database/{pageNumber}
🔄

Mises à jour atomiques ultra-rapides

Parsing concurrent de 5 fichiers TSV BDPM en **~0.5 secondes** avec atomic.Value pour zero-downtime updates. Mises à jour automatiques 2x/jour (6h/18h) sans interruption de service. Architecture basée sur 6 interfaces avec dependency injection et 70%+ de couverture de tests.

Zero-downtime ~0.5s ⚡
📊

Données BDPM complètes

15K+ médicaments, 1.6K groupes génériques. Toutes les entités BDPM : compositions, présentations, génériques, conditions, voies d'administration. Mémoire optimisée : 30-50MB stable (150MB peak au démarrage).

23MB dataset, 30-50MB RAM
🚀

Performance exceptionnelle

Architecture optimisée pour **391K requêtes/seconde** sur les endpoints critiques. Lookup O(1) en ~2.6µs via maps mémoire, compression gzip 80%, et cache HTTP intelligent avec 90%+ hit ratio. Tests complets avec 70%+ couverture.

380K req/sec ⚡

Cache HTTP intelligent

Cache avancé avec ETag/Last-Modified et support 304 Not Modified. Compression gzip (80% réduction bande passante). Cache hit ratio 90%+. Invalidation automatique durant les mises à jour.

90%+ cache hit ratio

Points de terminaison

Endpoint Description Cache Coût
GET /database Base complète (15,803 médicaments) 6h 200
GET /database/{page} Pagination (10 éléments/page) 6h 20
GET /medicament/{nom} Recherche par nom (regex) 1h 100
GET /medicament/id/{cis} Recherche par identifiant CIS 12h 100
GET /generiques/{libelle} Génériques par libellé 1h 20
GET /generiques/group/{id} Groupe générique par ID 12h 20
GET /health État de santé avancé (data+system) - 5

Exemples d'utilisation

Découvrez comment utiliser l'API avec ces exemples pratiques dans différents langages.

📡 Recherche de médicaments

cURL
curl "https://medicaments-api.giygas.dev/medicament/paracetamol"
JavaScript
const response = await fetch('https://medicaments-api.giygas.dev/medicament/paracetamol');
const data = await response.json();
console.log(`Found ${data.length} medicaments`);
Python
import requests
response = requests.get('https://medicaments-api.giygas.dev/medicament/paracetamol')
data = response.json()
print(f"Found {len(data)} results")

⚠️ Réponses d'Erreur

Rate Limited (HTTP 429)
HTTP/1.1 429 Too Many Requests
Content-Type: application/json

{
  "code": 429,
  "error": "Too Many Requests", 
  "message": "Rate limit exceeded"
}
Not Found (HTTP 404)
HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "code": 404,
  "error": "Not Found",
  "message": "No medicaments found"
}
Invalid Input (HTTP 400)
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "code": 400,
  "error": "Bad Request",
  "message": "Invalid page number"
}
Validation Error (HTTP 400)
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "code": 400,
  "error": "Bad Request",
  "message": "input contains invalid characters"
}

✅ Règles de Validation

Exigences de saisie :
  • Longueur : 3-50 caractères
  • Caractères autorisés : Lettres, chiffres, espaces, tirets (-), apostrophes ('), points (.)
  • Interdits : Chaînes vides, caractères spéciaux (@, #, $, %, etc.)
  • Sensibilité à la casse : Recherche insensible à la casse
Exemples :
✅ "paracetamol" - Valide
✅ "Doliprane 500mg" - Valide
✅ "abc" - Valide (minimum 3 caractères)
❌ "paracetamol@xyz" - Invalide (contient @)
❌ "" - Invalide (vide)
❌ "ab" - Invalide (trop court)
❌ "a"*51 - Invalide (trop long)
Réponse d'erreur de validation :
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "code": 400,
  "error": "Bad Request",
  "message": "input contains invalid characters"
}

📋 Formats de Réponse

Medicament Search - Direct array response
GET /medicament/{name}
Response: [...]  // Direct array of medicament objects

GET /medicament/id/{cis}  
Response: {...}  // Single medicament object or error
Generiques Search - Direct array
GET /generiques/{libelle}
Response: [{"groupID": ..., "libelle": ..., "medicaments": [...]}]

GET /generiques/group/{id}
Response: {"groupID": ..., "libelle": ..., "medicaments": [...]}
Pagination - Object with metadata
GET /database/{page}
Response: {
  "data": [...],
  "page": 1,
  "pageSize": 10,
  "totalItems": 15803,
  "maxPage": 1581
}

💊 Exemple de réponse - Recherche par nom

Commande cURL :
curl "https://medicaments-api.giygas.dev/medicament/codoliprane"
Réponse JSON :
[
  {
    "cis": 60904643,
    "elementPharmaceutique": "CODOLIPRANE 500 mg/30 mg, comprimé",
    "formePharmaceutique": "comprimé",
    "voiesAdministration": ["orale"],
    "statusAutorisation": "Autorisation active",
    "typeProcedure": "Procédure nationale",
    "etatComercialisation": "Commercialisée",
    "dateAMM": "10/05/2013",
    "titulaire": "OPELLA HEALTHCARE FRANCE",
    "surveillanceRenforce": "Non",
    "composition": [
      {
        "cis": 60904643,
        "elementPharmaceutique": "comprimé",
        "codeSubstance": 2202,
        "denominationSubstance": "PARACÉTAMOL",
        "dosage": "500 mg",
        "referenceDosage": "un comprimé",
        "natureComposant": "SA"
      },
      {
        "cis": 60904643,
        "elementPharmaceutique": "comprimé",
        "codeSubstance": 1240,
        "denominationSubstance": "CAFÉINE",
        "dosage": "30 mg",
        "referenceDosage": "un comprimé",
        "natureComposant": "SA"
      }
    ],
    "generiques": [],
    "presentation": [
      {
        "cis": 60904643,
        "cip7": 3400936403114,
        "cip13": 3400936403114,
        "libelle": "CODOLIPRANE 500 mg/30 mg, comprimé (16)",
        "statusAdministratif": "Présentation active",
        "etatComercialisation": "Commercialisée",
        "dateDeclaration": "19/01/1965",
        "agreement": "non",
        "tauxRemboursement": "65%",
        "prix": 3.85
      }
    ],
    "conditions": []
  }
]

🔄 Exemple de réponse - Génériques

Commande cURL :
curl "https://medicaments-api.giygas.dev/generiques/paracetamol"
Réponse JSON :
[
  {
    "groupID": 1643,
    "libelle": "PARACETAMOL 500 mg + CODEINE (PHOSPHATE DE) HEMIHYDRATE 30 mg - DAFALGAN CODEINE, comprimé pelliculé",
    "medicaments": [
      {
        "cis": 66003374,
        "elementPharmaceutique": "DAFALGAN CODEINE, comprimé pelliculé",
        "formePharmaceutique": "comprimé pelliculé",
        "type": "Princeps",
        "composition": [
          {
            "elementPharmaceutique": "comprimé",
            "substance": "PARACÉTAMOL",
            "dosage": "500 mg"
          },
          {
            "elementPharmaceutique": "comprimé",
            "substance": "CODÉINE (PHOSPHATE DE) HÉMIHYDRATÉ",
            "dosage": "30 mg"
          }
        ]
      },
      {
        "cis": 69458587,
        "elementPharmaceutique": "PARACETAMOL/CODEINE BIOGARAN 500 mg/30 mg, comprimé",
        "formePharmaceutique": "comprimé",
        "type": "Générique",
        "composition": [
          {
            "elementPharmaceutique": "comprimé",
            "substance": "PARACÉTAMOL",
            "dosage": "500 mg"
          },
          {
            "elementPharmaceutique": "comprimé",
            "substance": "CODÉINE (PHOSPHATE DE) HÉMIHYDRATÉ",
            "dosage": "30 mg"
          }
        ]
      }
    ]
  }
]

🏥 Exemple de réponse - Health Check

{
  "status": "healthy",
  "last_update": "2025-10-05T22:04:32+02:00",
  "data_age_hours": 1.4483066186805555,
  "uptime_seconds": 86400.000000375,
  "data": {
    "api_version": "1.0",
    "generiques": 1618,
    "is_updating": false,
    "medicaments": 15803,
    "next_update": "2025-10-06T06:00:00+02:00"
  },
  "system": {
    "goroutines": 10,
    "memory": {
      "alloc_mb": 31,
      "num_gc": 60,
      "sys_mb": 187,
      "total_alloc_mb": 264
    }
  }
}

Technologies Utilisées

Go 1.21+
Chi Router v5
Interface-based Architecture
Dependency Injection
Atomic Operations
Token Bucket Rate Limiting
HTTP Cache (ETag/Last-Modified)
gzip Compression
Structured Logging (slog)
OpenAPI 3.1
Concurrent TSV Parsing
gocron Scheduler
75.5% Test Coverage
Benchmarks & Performance Tests