API & clé composite

Deux champs, zéro réécriture. CLOISON expose un endpoint OpenAI-compatible : vous renseignez la base URL et la clé composite, puis chaque requête part pseudonymisée — champs PII convertis en jetons ⟦…⟧ — et la réponse revient restaurée, sans toucher à votre code.

Base URLhttps://api.wonkom.ai
Clé compositeCLOISON_v1_acme_e8f2…9ab1
AuthentificationEn-tête Authorization: Bearer — aucun secret dans l'URL

01Endpoints

Tout passe par un unique endpoint OpenAI-compatible. Il n'existe pas de SDK propriétaire à apprendre : vous conservez votre client, vos modèles et vos prompts. La seule chose qui change est l'adresse à laquelle votre interface envoie ses requêtes.

Le protocole est celui que votre client connaît déjà. Les champs model, messages, temperature et max_tokens transitent sans être réécrits — CLOISON n'intercepte que les champs déclarés par votre politique de pseudonymisation.

config — pointer votre client
# Deux valeurs, et rien d'autre à toucher.
OPENAI_BASE_URL = "https://api.wonkom.ai"
OPENAI_API_KEY = "CLOISON_v1_acme_e8f2…9ab1"

# Le protocole OpenAI est conservé tel quel :
# model, messages, temperature … transitent sans être réécrits.
OpérationCheminMéthode
Complétion/v1/chat/completionsPOST
Liste des modèles/v1/modelsGET
Comptes (usage)/v1/usageGET
Note

Cloison n'expose pas de route dédiée par tenant : le même endpoint dessert tous les espaces, isolés par la clé composite.

02Clé composite

Une seule valeur transporte tout : l'identifiant du tenant et la clé secrète, réunis dans le seul champ clé. Aucun secret ne transite dans l'URL — l'authentification passe par l'en-tête Authorization, révocable à tout moment.

La clé composite isole chaque tenant. Deux espaces ne partagent ni clés, ni politique de pseudonymisation, ni journal : la séparation reste étanche, même sur un endpoint partagé.

cloison onboarding — provisionner un tenant
# Génère la clé, provisionne l'espace et écrit ./.cloison
$ cloison onboarding --tenant acme --out ./.cloison

# Sortie :
tenant  acme
base    https://api.wonkom.ai
key     CLOISON_v1_acme_e8f2…9ab1   # stockée, jamais réaffichée
requête — le secret dans l'en-tête, jamais dans l'URL
Authorization: Bearer CLOISON_v1_acme_e8f2…9ab1
# ❌ jamais   https://api.wonkom.ai?token=CLOISON_v1_…
Attention

Ne placez jamais la clé dans une URL ou une chaîne de requête : elle serait consignée dans les journaux des proxys et des serveurs. La clé est révocable — en cas de fuite, cloison rotate --tenant acme en émet une nouvelle sans interruption de service.

03Exemples

L'envoi se fait en curl ou via le SDK OpenAI. Avant le modèle, les champs PII sont remplacés par des jetons ⟦…⟧ ; à la réponse, les vraies valeurs sont réintégrées.

curl — requête envoyée
curl https://api.wonkom.ai/v1/chat/completions \
  -H "Authorization: Bearer $CLOISON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "messages": [{
      "role": "user",
      "content": "Résume le dossier de ⟦PII-PATIENT⟧."
    }]
  }'
python — SDK OpenAI inaltéré
from openai import OpenAI

client = OpenAI(
    base_url="https://api.wonkom.ai",
    api_key="CLOISON_v1_acme_e8f2…9ab1",
)

r = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user",
               "content": "Résume le dossier de ⟦PII-PATIENT⟧."}],
)
réponse — restaurée avant de vous revenir
{
  "id": "chatcmpl-7fN9…",
  "object": "chat.completion",
  "model": "gpt-4o",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "Le dossier de Marie Dupont (n° 7fN9…) compte 3 analyses."
    },
    "finish_reason": "stop"
  }]
}
Attention

Seuls les champs déclarés par la politique sont convertis. Un champ non reconnu passe tel quel : en mode observe-only, rien n'est transformé, tout est journalisé (voir section audit).

04Journal & logs

Chaque appel produit un événement horodaté dans un journal append-only. Trois états rendent la vie du jeton lisible d'un coup d'œil — et vérifiable.

Pseudonymiséle clair est remplacé par un jeton avant d'atteindre le modèle
Restauréla vraie valeur est réintégrée à la réponse, coréférence conservée
Verrouillérestauration impossible — valeur absente ou rotation en cours
HorodatageAppelChamps touchésÉtat
09:12:03Zc-7fN9patient.nom · patient.datePseudonymisé
09:12:03Zc-7fN9—Restauré
09:12:04Zc-7fN7⟦PII-PATIENT⟧Verrouillé
événement — append-only, signé
{
  "ts": "2025-06-04T09:12:03Z",
  "tenant": "acme",
  "call": "c-7fN9",
  "state": "pseudonymise",
  "fields": ["patient.nom", "patient.date"],
  "sig": "ed25519:4F2A…C9D1"
}

05Section audit

Le rapport d'audit est conçu pour être remis à votre autorité de protection des données. En Afrique de l'Ouest, le cadre de référence est celui de la loi n° 2008-12 du 25 janvier 2008 relative à la protection des données à caractère personnel (Sénégal), complété par l'Acte additionnel CEDEAO A/SA.1/01/10 — applicable aussi dans l'espace UEMOA — et par la Convention de Malabo (2014) sur la cybersécurité et la protection des données.

Le régime sénégalais est à deux étages devant la Commission de protection des Données personnelles (CDP) : déclaration pour les traitements courants, autorisation préalable pour ceux qui présentent des risques particuliers. Le rapport documente aussi la distinction entre responsable de traitement et sous-traitant — elle détermine qui doit déclarer et qui doit solliciter l'autorisation. Le RGPD n'intervient qu'en complément (fast-follow Europe), jamais comme cadre principal du rapport.

Cadre de référence

Le rapport s'appuie d'abord sur le cadre ouest-africain, et ne mentionne le RGPD qu'en complément :

  • Loi n° 2008-12 (Sénégal) — traitement des données à caractère personnel
  • Acte additionnel CEDEAO A/SA.1/01/10 — applicable aussi dans l'espace UEMOA
  • Convention de Malabo (2014) — cybersécurité et protection des données
  • Régime deux étages de la CDP — déclaration / autorisation préalable
  • Responsable de traitement ≠ sous-traitant — répartition des obligations

Le mode observe-only produit un rapport par tenant, signé : compteurs k-anonymes par type de PII, restaurations incomplètes, cellules dont le compte est inférieur à k, le tout signé Ed25519 et vérifiable avec cloison-verify.

rapport — extrait signé, à remettre à votre CDP / DPO
{
  "tenant": "acme",
  "mode": "observe-only",
  "cadre": "loi-2008-12 · CEDEAO-A/SA.1/01/10 · Malabo-2014",
  "k_anonymity": 12,
  "compteurs": {
    "patient.nom": 1842,
    "patient.date": 917,
    "adresse": 403
  },
  "restaurations_incompletes": 3,
  "cellules_redactees": 17,   // < k
  "responsabilite": "responsable-de-traitement",
  "signature_ed25519": "4F2A…C9D1"
}