{"openapi":"3.1.0","info":{"title":"API Artemis","version":"1.2.0","description":"Les chiffres de votre officine, en lecture seule : ventes, stock, marges, laboratoires, familles. Une clé ouvre les données d'une seule officine, la sienne. Appelez l'API depuis un serveur, jamais depuis une page web : une clé mise dans un navigateur se lit par n'importe quel visiteur. Chaque clé a un niveau, choisi à sa création et jamais modifié : catalogue (produits, prix de vente et stock), ventes (produits, prix de vente, stock et ventes, sans prix d'achat ni marge) ou complet (tout, prix d'achat et marges compris). Chaque route dit son niveau minimum (x-niveau), et un champ réservé à un niveau plus haut n'est jamais rendu. L'API ne conseille aucun prix, ne compare l'officine à aucune autre et ne modifie rien dans son logiciel : pour cela, PriceCraft."},"externalDocs":{"description":"La référence pour les développeurs : niveaux d'accès, routes, erreurs, Lovable.","url":"https://sydera.ai/artemis/documentation/api"},"servers":[{"url":"https://artemis.sydera.ai/api/v1"}],"security":[{"cle":[]}],"components":{"securitySchemes":{"cle":{"type":"http","scheme":"bearer","description":"Clé créée dans Artemis → API (sk_art_…), dans l'en-tête Authorization : Bearer sk_art_…, ou X-Api-Key."}}},"paths":{"/officine":{"get":{"summary":"L'officine : identité, stock, dates de relevé et qualité des données ; avec une clé ventes, les douze derniers mois pleins ; avec une clé complet, la valeur du stock au PAMP et la marge.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"officine","parameters":[],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"nom":{"type":["string","null"]},"raison_sociale":{"type":["string","null"]},"adresse":{"type":["string","null"]},"code_postal":{"type":["string","null"]},"commune":{"type":["string","null"]},"departement":{"type":["string","null"]},"telephone":{"type":["string","null"]},"cip":{"type":["string","null"]},"finess":{"type":["string","null"]},"siret":{"type":["string","null"]},"identifiant_ordre":{"type":["string","null"]},"logiciel":{"type":["string","null"]},"logiciel_depuis":{"type":["string","null"]},"logiciel_precedent":{"type":["string","null"]},"source_identite":{"type":["string","null"]},"dates_de_releve":{"type":"object","additionalProperties":false,"properties":{"produits":{"type":["string","null"],"format":"date-time"},"stock":{"type":["string","null"],"format":"date-time"},"ventes":{"type":["string","null"],"format":"date-time"}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"chiffres_cles":{"type":"object","additionalProperties":false,"properties":{"stock":{"type":"object","additionalProperties":false,"properties":{"references_en_stock":{"type":["number","null"]},"unites":{"type":["number","null"]},"valeur_pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"date_releve":{"type":["string","null"],"format":"date-time"},"source":{"type":["string","null"]}}},"douze_mois_pleins":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"references_vendues":{"type":["number","null"]},"source":{"type":["string","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."}}},"qualite_des_donnees":{"type":"object","additionalProperties":false,"properties":{"produits":{"type":["number","null"]},"sans_famille":{"type":["number","null"]},"familles_estimees":{"type":["number","null"]},"actes_et_prestations":{"type":["number","null"]},"laboratoire_non_identifie":{"type":["number","null"]},"sans_prix_achat":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"manques":{"type":"array","items":{"type":["string","null"]}}}},"erreur":{"type":["string","null"]},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/recherche":{"get":{"summary":"Chercher un produit par son nom (mots dans n'importe quel ordre, abréviations comprises) ou son code CIP.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"recherche","parameters":[{"name":"q","in":"query","required":true,"description":"Mots du nom, ou code CIP (7 ou 13 chiffres).","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":10,"minimum":1,"maximum":50}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"prix_catalogue_ttc":{"type":["number","null"]},"stock":{"type":["number","null"]},"dernier_mois_vendu":{"type":["string","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"acte_ou_prestation":{"type":["boolean","null"]},"proximite":{"type":["number","null"]}}}},"nombre":{"type":["number","null"]},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/fiche":{"get":{"summary":"Tout sur un ou plusieurs produits : prix, stock ; avec une clé ventes, les ventes mois par mois ; avec une clé complet, le PAMP et les marges.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"fiche","parameters":[{"name":"cip","in":"query","required":true,"description":"Un ou plusieurs CIP séparés par des virgules (20 au plus), obtenus par /recherche.","schema":{"type":"string"}},{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":12,"minimum":1,"maximum":24}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"mois_demandes":{"type":["number","null"]},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"acte_ou_prestation":{"type":["boolean","null"]},"prix_catalogue_ttc":{"type":["number","null"]},"prix_catalogue_ht":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct_catalogue":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"taux_tva":{"type":["number","null"]},"stock":{"type":["number","null"]},"dernier_mois_vendu":{"type":["string","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"emplacement":{"type":["string","null"]},"prix_achat_inconnu":{"type":["boolean","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"ventes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"mois":{"type":["string","null"]},"quantite":{"type":["number","null"]},"prix_moyen_encaisse_ttc":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"mois_en_cours":{"type":["boolean","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."}}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"unites_mois_pleins":{"type":["number","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"moyenne_par_mois_plein":{"type":["number","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"marge_eur_mois_pleins":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct_mois_pleins":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"couverture_jours":{"type":["number","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"rang_dans_la_famille":{"type":"object","additionalProperties":false,"properties":{"famille":{"type":["string","null"]},"references_vendues_famille":{"type":["number","null"]},"rang_3_mois_pleins":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."}}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/liste":{"get":{"summary":"Les laboratoires ou les familles de la pharmacie, avec le nombre de références.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"liste","parameters":[{"name":"quoi","in":"query","required":true,"description":"Lister les laboratoires ou les familles.","schema":{"type":"string","enum":["laboratoires","familles"]}},{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":50,"minimum":1,"maximum":150}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"quoi":{"type":["string","null"]},"liste":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"nom":{"type":["string","null"]},"references":{"type":["number","null"]},"references_vendues_3_mois":{"type":["number","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"references_en_stock":{"type":["number","null"]},"dont_famille_estimee":{"type":["number","null"]}}}},"nombre":{"type":["number","null"]},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/produits":{"get":{"summary":"Export du catalogue, page par page : prix de vente, TVA, stock ; dernier mois vendu avec une clé ventes, prix d'achat avec une clé complet.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"produits","parameters":[{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"cip","in":"query","required":false,"description":"Un CIP.","schema":{"type":"string"}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":200,"minimum":1,"maximum":1000}},{"name":"curseur","in":"query","required":false,"description":"Valeur « suivant » de la réponse précédente.","schema":{"type":"string"}}],"responses":{"200":{"description":"Une page de l'export. « suivant » vaut null à la dernière page.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"acte_ou_prestation":{"type":["boolean","null"]},"prix_vente_ttc":{"type":["number","null"]},"prix_vente_ht":{"type":["number","null"]},"prix_achat_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"taux_tva":{"type":["number","null"]},"stock":{"type":["number","null"]},"stock_au_releve":{"type":["number","null"]},"dernier_mois_vendu":{"type":["string","null"],"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"}}}},"nombre":{"type":["number","null"]},"suivant":{"type":["string","null"]},"date_releve":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/stock":{"get":{"summary":"Export de l'inventaire, page par page : quantité, emplacement ; PAMP et valeur avec une clé complet.","description":"Niveau minimum de la clé : catalogue.","x-niveau":"catalogue","operationId":"stock","parameters":[{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"cip","in":"query","required":false,"description":"Un CIP.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":200,"minimum":1,"maximum":1000}},{"name":"curseur","in":"query","required":false,"description":"Valeur « suivant » de la réponse précédente.","schema":{"type":"string"}}],"responses":{"200":{"description":"Une page de l'export. « suivant » vaut null à la dernière page.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"quantite":{"type":["number","null"]},"prix_achat_moyen_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"emplacement":{"type":["string","null"]},"date_releve":{"type":["string","null"],"format":"date-time"}}}},"nombre":{"type":["number","null"]},"suivant":{"type":["string","null"]},"date_releve":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/top-ventes":{"get":{"summary":"Les produits les plus vendus sur N mois pleins ; leur marge avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"topVentes","parameters":[{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":3,"minimum":1,"maximum":24}},{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":20,"minimum":1,"maximum":100}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"mois_pleins":{"type":["number","null"]},"periode":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]}}},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"prix_catalogue_ttc":{"type":["number","null"]},"prix_moyen_encaisse_ttc":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"stock":{"type":["number","null"]}}}},"nombre":{"type":["number","null"]},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/palmares":{"get":{"summary":"Le classement des laboratoires ou des familles par chiffre d'affaires ; la marge avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"palmares","parameters":[{"name":"par","in":"query","required":true,"description":"Classer les laboratoires ou les familles.","schema":{"type":"string","enum":["laboratoire","famille"]}},{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":3,"minimum":1,"maximum":24}},{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Pour par=laboratoire : restreindre à une famille.","schema":{"type":"string"}},{"name":"laboratoire","in":"query","required":false,"description":"Pour par=famille : restreindre à un laboratoire.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":20,"minimum":1,"maximum":50}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"par":{"type":["string","null"]},"mois_pleins":{"type":["number","null"]},"periode":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]}}},"classement":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"nom":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"references_vendues":{"type":["number","null"]},"dont_famille_estimee":{"type":"object","additionalProperties":false,"properties":{"references_vendues":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]}}}}}},"nombre":{"type":["number","null"]},"total":{"type":"object","additionalProperties":false,"properties":{"nombre":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]}}},"part_du_ca_pct":{"type":["number","null"]},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/laboratoires":{"get":{"summary":"Le palmarès des laboratoires (raccourci de /palmares?par=laboratoire).","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"laboratoires","parameters":[{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":3,"minimum":1,"maximum":24}},{"name":"q","in":"query","required":false,"description":"Mot du nom.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Restreindre à une famille.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":20,"minimum":1,"maximum":50}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"par":{"type":["string","null"]},"mois_pleins":{"type":["number","null"]},"periode":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]}}},"classement":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"nom":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"references_vendues":{"type":["number","null"]},"dont_famille_estimee":{"type":"object","additionalProperties":false,"properties":{"references_vendues":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]}}}}}},"nombre":{"type":["number","null"]},"total":{"type":"object","additionalProperties":false,"properties":{"nombre":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]}}},"part_du_ca_pct":{"type":["number","null"]},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/gamme":{"get":{"summary":"Toute la gamme d'un laboratoire, produit par produit, références sans vente comprises ; la marge avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"gamme","parameters":[{"name":"laboratoire","in":"query","required":true,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":3,"minimum":1,"maximum":24}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":100,"minimum":1,"maximum":200}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"laboratoire":{"type":["string","null"]},"mois_pleins":{"type":["number","null"]},"periode":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"total":{"type":"object","additionalProperties":false,"properties":{"references":{"type":["number","null"]},"references_vendues":{"type":["number","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"references_sans_prix_achat":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."}}},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"prix_catalogue_ttc":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"stock":{"type":["number","null"]},"dernier_mois_vendu":{"type":["string","null"]}}}},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/ventes-du-mois":{"get":{"summary":"Toutes les ventes d'un mois, référence par référence, par pages de 200 ; la marge avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"ventesDuMois","parameters":[{"name":"mois","in":"query","required":true,"description":"Le mois, AAAA-MM (par exemple 2026-09).","schema":{"type":"string"}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Page (200 lignes chacune).","schema":{"type":"integer","default":1,"minimum":1}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"mois":{"type":["string","null"]},"page":{"type":["number","null"]},"mois_en_cours":{"type":["boolean","null"]},"ventes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"acte_ou_prestation":{"type":["boolean","null"]},"quantite":{"type":["number","null"]},"prix_moyen_encaisse_ttc":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"ca_ttc":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"quantite_mois_precedent":{"type":["number","null"]},"ca_ttc_mois_precedent":{"type":["number","null"]}}}},"par_famille":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"famille":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"unites_mois_precedent":{"type":["number","null"]},"ca_ttc_mois_precedent":{"type":["number","null"]}}}},"nombre":{"type":["number","null"]},"page_suivante":{"type":["number","null"]},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/stock-dormant":{"get":{"summary":"Les produits en stock sans vente depuis N mois ; les produits dont la saison commence sont mis à part ; la valeur immobilisée au PAMP avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"stockDormant","parameters":[{"name":"mois_sans_vente","in":"query","required":false,"description":"Mois sans vente.","schema":{"type":"integer","default":6,"minimum":1,"maximum":36}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":50,"minimum":1,"maximum":200}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"mois_sans_vente":{"type":["number","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"total":{"type":"object","additionalProperties":false,"properties":{"references":{"type":["number","null"]},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."}}},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"stock":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"dernier_mois_vendu":{"type":["string","null"]},"emplacement":{"type":["string","null"]}}}},"nombre":{"type":["number","null"]},"par_laboratoire":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"laboratoire":{"type":["string","null"]},"references":{"type":["number","null"]},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."}}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"saisonniers":{"type":"object","additionalProperties":false,"properties":{"references":{"type":["number","null"]},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"stock":{"type":["number","null"]},"pamp_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"valeur_stock_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"dernier_mois_vendu":{"type":["string","null"]},"emplacement":{"type":["string","null"]},"vendus_meme_periode_an_dernier":{"type":["number","null"]},"part_des_ventes_de_l_annee_pct":{"type":["number","null"]}}}}}},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/couverture":{"get":{"summary":"Les produits dont le stock couvre au plus N jours de ventes (0 = rupture) ; fins de saison et ventes ponctuelles mises à part.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"couverture","parameters":[{"name":"jours_max","in":"query","required":false,"description":"Couverture maximale en jours.","schema":{"type":"integer","default":15,"minimum":0,"maximum":365}},{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":3,"minimum":1,"maximum":24}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":50,"minimum":1,"maximum":200}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"jours_max":{"type":["number","null"]},"mois_pleins":{"type":["number","null"]},"periode":{"type":"object","additionalProperties":false,"properties":{"du":{"type":["string","null"]},"au":{"type":["string","null"]}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"produits":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"stock":{"type":["number","null"]},"unites":{"type":["number","null"]},"unites_par_mois":{"type":["number","null"]},"couverture_jours":{"type":["number","null"]},"en_rupture":{"type":["boolean","null"]},"dernier_mois_vendu":{"type":["string","null"]}}}},"nombre":{"type":["number","null"]},"ruptures":{"type":["number","null"]},"a_part":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"nom":{"type":["string","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"famille_estimee":{"type":["string","null"]},"stock":{"type":["number","null"]},"unites":{"type":["number","null"]},"unites_par_mois":{"type":["number","null"]},"couverture_jours":{"type":["number","null"]},"en_rupture":{"type":["boolean","null"]},"dernier_mois_vendu":{"type":["string","null"]},"raison":{"type":["string","null"]}}}},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/ventes":{"get":{"summary":"Export des ventes mensuelles par produit, page par page ; le prix d'achat du mois avec une clé complet.","description":"Niveau minimum de la clé : ventes.","x-niveau":"ventes","operationId":"ventes","parameters":[{"name":"cip","in":"query","required":false,"description":"Un CIP.","schema":{"type":"string"}},{"name":"depuis","in":"query","required":false,"description":"Premier mois, AAAA-MM.","schema":{"type":"string"}},{"name":"jusqu_a","in":"query","required":false,"description":"Dernier mois, AAAA-MM.","schema":{"type":"string"}},{"name":"limite","in":"query","required":false,"description":"Nombre de lignes.","schema":{"type":"integer","default":200,"minimum":1,"maximum":1000}},{"name":"curseur","in":"query","required":false,"description":"Valeur « suivant » de la réponse précédente.","schema":{"type":"string"}}],"responses":{"200":{"description":"Une page de l'export. « suivant » vaut null à la dernière page.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"cip":{"type":["string","null"]},"mois":{"type":["string","null"]},"quantite":{"type":["number","null"]},"prix_vente_ttc":{"type":["number","null"]},"prix_achat_ht":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"mois_en_cours":{"type":["boolean","null"]},"date_releve":{"type":["string","null"],"format":"date-time"}}}},"nombre":{"type":["number","null"]},"suivant":{"type":["string","null"]},"date_releve":{"type":["string","null"],"format":"date-time"}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}},"/bilan":{"get":{"summary":"L'officine mois par mois : unités, chiffre d'affaires TTC et HT, marge en euros et en pourcentage.","description":"Niveau minimum de la clé : complet.","x-niveau":"complet","operationId":"bilan","parameters":[{"name":"mois","in":"query","required":false,"description":"Nombre de mois pleins.","schema":{"type":"integer","default":12,"minimum":1,"maximum":24}},{"name":"laboratoire","in":"query","required":false,"description":"Nom exact du laboratoire (sans souci des accents ni des majuscules), tel que /liste?quoi=laboratoires le rend.","schema":{"type":"string"}},{"name":"famille","in":"query","required":false,"description":"Famille (rayon) de la pharmacie ; compte aussi les produits que Sydera range dans cette famille quand le logiciel ne leur en donne pas.","schema":{"type":"string"}}],"responses":{"200":{"description":"La lecture, datée de son relevé.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"donnees":{"type":"object","additionalProperties":false,"properties":{"mois_demandes":{"type":["number","null"]},"laboratoire":{"type":["string","null"]},"famille":{"type":["string","null"]},"total_mois_pleins":{"type":"object","additionalProperties":false,"properties":{"mois_pleins":{"type":["number","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."}}},"bilan":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"mois":{"type":["string","null"]},"unites":{"type":["number","null"]},"ca_ttc":{"type":["number","null"]},"ca_ht":{"type":["number","null"]},"marge_eur":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"marge_pct":{"type":["number","null"],"x-niveau":"complet","description":"Clé de niveau complet seulement."},"references_vendues":{"type":["number","null"]},"mois_en_cours":{"type":["boolean","null"]}}}},"historique":{"type":"object","additionalProperties":false,"properties":{"etat":{"type":["string","null"]},"depuis":{"type":["string","null"]},"mois_couverts":{"type":["number","null"]},"mois_demandes":{"type":["number","null"]}},"x-niveau":"ventes","description":"Clé de niveau ventes ou complet."},"date_releve":{"type":["string","null"],"format":"date-time"},"note":{"type":["string","null"]}}},"date_releve":{"type":["string","null"],"format":"date-time"},"etat":{"type":["string","null"]},"message":{"type":["string","null"]}}}}}},"400":{"description":"Paramètre manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"401":{"description":"Clé absente, inconnue ou coupée.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"403":{"description":"Accès en pause (aucun abonnement en cours), ou clé d'un niveau insuffisant pour cette route (niveau_insuffisant : le message nomme le niveau requis).","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"409":{"description":"Pharmacie enregistrée, données pas encore remontées.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"429":{"description":"Trop d'appels : en-tête Retry-After, en secondes.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"500":{"description":"Lecture impossible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}},"503":{"description":"API momentanément fermée ou indisponible.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"string"},"message":{"type":"string"}},"required":["erreur","message"]}}}}}}}}}