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/meIdentité 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 — OK
  • 401 — Clé manquante, invalide, révoquée ou expirée
  • 429 — Quota de la clé dépassé

get/api/v1/brandProfil 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 — OK
  • 401 — Clé manquante, invalide, révoquée ou expirée
  • 403 — Scope insuffisant (catalog:read requis)
  • 404 — Clé non-brand ou marque introuvable
  • 429 — Quota de la clé dépassé

get/api/v1/productsCatalogue 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 — OK
  • 400 — Query invalide
  • 401 — Clé manquante, invalide, révoquée ou expirée
  • 403 — Scope insuffisant (catalog:read requis)
  • 404 — Clé non supportée
  • 429 — 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 invalide
  • 401 — Clé manquante, invalide, révoquée ou expirée
  • 403 — Scope insuffisant (catalog:write) ou clé non-brand
  • 404 — Produit introuvable pour cette marque
  • 429 — Quota de la clé dépassé

get/api/v1/campaignsCampagnes 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 — OK
  • 400 — Query invalide
  • 401 — Clé manquante, invalide, révoquée ou expirée
  • 403 — 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/client

Outils exposés (13)

  • aggregate_tablelecturetenant-config

    Agré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écriturecatalog

    Cré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_tracelectureconversations

    Renvoie une conversation (métadonnées) et ses messages dans l’ordre, pour investigation QA. Read-only.

  • get_pharmacy_configlecturetenant-config

    Configuration d’un PDV : identité, thème/domaine, plan, config d’accueil (marques mises en avant, suggestions). Read-only.

  • get_rag_sources_for_answerlectureconversations

    Renvoie les chunks RAG (rag_chunks_used) ayant servi à générer un message assistant. Read-only.

  • get_tenant_healthlectureconversations

    Santé d’un PDV : statut, volume de conversations (7j / 30j / total), présence d’une config d’accueil. Read-only.

  • get_turn_diagnosticslectureconversations

    Diagnostic « 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-config

    Liste paginée des PDV (tenants) avec filtres type / statut / recherche texte. Read-only.

  • search_conversationslectureconversations

    Recherche 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écriturecatalog

    Corrige 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écriturecatalog

    Met à 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-config

    Identité 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.

Lou Partner API · Lou