Lou Partner API
v0.1.0 · spec OpenAPI (JSON)
API partenaire self-service. Authentification par clé secrète `sk_live_…` (Authorization: Bearer). Chaque clé est scopée à son owner (pdv/brand/network) et à ses scopes `<domaine>:<action>`.
Authentification
Clé secrète partenaire `sk_live_…` en en-tête `Authorization: Bearer`.
curl -s "https://lou.care/api/v1/me" \
-H "Authorization: Bearer $LOU_API_KEY"get/api/v1/me— Identité de la clé
Renvoie l'owner résolu et les scopes de la clé présentée. Sentinelle : n'expose aucune donnée métier.
curl -s "https://lou.care/api/v1/me" \
-H "Authorization: Bearer $LOU_API_KEY"Réponses
200— OK401— Clé manquante, invalide, révoquée ou expirée429— Quota de la clé dépassé
get/api/v1/brand— Profil de la marque
Profil de la marque de la clé (clés de type brand). Requiert le scope `catalog:read`. Champs limités aux colonnes de classe `public`/`owner` (field-level).
curl -s "https://lou.care/api/v1/brand" \
-H "Authorization: Bearer $LOU_API_KEY"Réponses
200— OK401— Clé manquante, invalide, révoquée ou expirée403— Scope insuffisant (catalog:read requis)404— Clé non-brand ou marque introuvable429— Quota de la clé dépassé
get/api/v1/products— Catalogue de l’owner
Produits de l’owner de la clé — d’une marque (ses produits), d’un PDV (produits activés) ou d’un réseau (produits activés par ses PDV membres, distincts), non archivés, paginés. Requiert `catalog:read`. Champs limités aux colonnes `public`/`owner`.
curl -s "https://lou.care/api/v1/products?limit=50&offset=0" \
-H "Authorization: Bearer $LOU_API_KEY"Paramètres
limit(query, integer, optionnel)offset(query, integer, optionnel)
Réponses
200— OK400— Query invalide401— Clé manquante, invalide, révoquée ou expirée403— Scope insuffisant (catalog:read requis)404— Clé non supportée429— Quota de la clé dépassé
patch/api/v1/products/{ean}— Mettre à jour la description produit
Met à jour la `long_description` d’un produit de la MARQUE de la clé (clés `brand` uniquement). Requiert `catalog:write`. VOLONTAIREMENT ÉTROIT : ni statut, ni validation, ni activation. La description passe par la review self-service (Charte) : servie → écrite (`written:true`) ; sinon le verdict est renvoyé (`attestation_required` / `blocked_medical` / `locked`) SANS écriture. Parité stricte avec l’outil MCP client `update_product_description`.
curl -s -X PATCH "https://lou.care/api/v1/products/<ean>" \
-H "Authorization: Bearer $LOU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"longDescription":"…"}'Paramètres
ean(path, string, requis)
Réponses
200— Servi (écrit) OU verdict de review (non écrit)400— EAN ou corps invalide401— Clé manquante, invalide, révoquée ou expirée403— Scope insuffisant (catalog:write) ou clé non-brand404— Produit introuvable pour cette marque429— Quota de la clé dépassé
get/api/v1/campaigns— Campagnes de l’owner
Campagnes de l’owner de la clé (brand/pdv/network), non archivées, paginées. Requiert `campaigns:read`. Champs limités aux colonnes de classe `public`/`owner` (field-level).
curl -s "https://lou.care/api/v1/campaigns?limit=50&offset=0" \
-H "Authorization: Bearer $LOU_API_KEY"Paramètres
limit(query, integer, optionnel)offset(query, integer, optionnel)
Réponses
200— OK400— Query invalide401— Clé manquante, invalide, révoquée ou expirée403— Scope insuffisant (campaigns:read requis)429— Quota de la clé dépassé
MCP — connecteur client
Surface MCP tenant-safe, publiable en connecteur (ChatGPT / Claude). Authentification OAuth 2.1 (consentement) — distincte de la clé API REST ci-dessus. Écritures gouvernées (brouillon + review Charte), jamais de publication directe. Mêmes règles d’accès (rôle × domaine) que le portail.
Point de terminaison
https://lou.care/api/mcp/clientOutils exposés (13)
aggregate_tablelecturetenant-configAgrégat read-only d’une table : fonctions dans un enum FERMÉ (count/count_distinct/sum/avg/min/max), `groupBy` optionnel, `filters` structurés, `where` par agrégat (FILTER) + `alias` → taux de remplissage en UNE requête. Rend le TOTAL réel (fin du « ≥1000 »). PAGINATION des GROUPES (avec `groupBy`) : la réponse porte `total` (nombre réel de groupes), `hasMore` et `nextOffset` → rappeler avec `offset: nextOffset` jusqu’à `hasMore:false` ; groupes triés par clé (ordre stable). ADMIN = cross-tenant (full read). TENANT = préciser pdvId/brandId possédé → agrège SES lignes (WHERE owner injecté), tables non-agrégeables refusées. Aucun SQL brut ; identifiants validés catalogue ; transaction READ ONLY.
create_product_claim_draftécriturecatalogCrée un claim produit en BROUILLON (validation_status=draft, proof_ref=NULL) via le chemin gouvernance. JAMAIS published/ai_validated/reviewed_by. Claim MÉDICAL accepté EN DRAFT (capture pour revue) : inerte tant que non publié ; double-gate humain à la PUBLICATION (published + reviewed_by, LOU-221). WRITE — gated.
get_conversation_tracelectureconversationsRenvoie une conversation (métadonnées) et ses messages dans l’ordre, pour investigation QA. Read-only.
get_pharmacy_configlecturetenant-configConfiguration d’un PDV : identité, thème/domaine, plan, config d’accueil (marques mises en avant, suggestions). Read-only.
get_rag_sources_for_answerlectureconversationsRenvoie les chunks RAG (rag_chunks_used) ayant servi à générer un message assistant. Read-only.
get_tenant_healthlectureconversationsSanté d’un PDV : statut, volume de conversations (7j / 30j / total), présence d’une config d’accueil. Read-only.
get_turn_diagnosticslectureconversationsDiagnostic « replay-from-inputs » d’un tour (LOU-846) : modèle, version prompt + deploy, mode, campagnes éligibles / cardées / pill, sortie LLM brute pré-strip, bloc RAG (min_score, top_k, chunks retenus/écartés), et appels d’OUTILS (scope=tool, LOU-1134 : nom + outcome ok/empty/temporarily_unavailable/other_error + inputs masqués PHI-safe + flag threw→Sentry). Par conversationId (tout le fil) ou messageId (un tour). Read-only.
list_tenantslecturetenant-configListe paginée des PDV (tenants) avec filtres type / statut / recherche texte. Read-only.
search_conversationslectureconversationsRecherche paginée de conversations par PDV / marque / mode / issue / fenêtre temporelle. Read-only.
update_product_claimécriturecatalogÉdite un claim produit (claimType, claimText, riskTier, population) à TOUT statut. Éditer un claim PUBLISHED le repasse en DRAFT (re-review IA/admin), SAUF principal admin = confiance (comme aujourd’hui au BO). proof/review jamais ; médical reste sous double-gate (LOU-221/908). WRITE — gated.
update_product_classificationécriturecatalogCorrige la classification d’un produit : `productType` (∈ les 9 types, hors-enum rejeté, ne crée jamais de type). Écrit product_type + category_data ; ne touche JAMAIS validation_status. WRITE — gated.
update_product_descriptionécriturecatalogMet à jour la `long_description` d’un produit (factuelle, claims strippés). N’écrit JAMAIS short_description ni validation_status. Gate Charte serveur : description bloquée si non conforme. WRITE — gated.
whoamilecturetenant-configIdentité de l’appelant : type de principal, capacités (read/write) et — pour un tenant — la liste de ses accès (rôle × owner). Équivalent MCP du GET /me de l’API. Read-only, aucune donnée métier.