API sans état pour intégration machine à machine. Anonymise un texte (règles + modèle), le soumet à Claude, restitue les valeurs — le tout côté serveur.
Cross-origin autorisé (Access-Control-Allow-Origin: *). Méthodes : GET, POST, OPTIONS.
PERSON · EMAIL · PHONE · ADDRESS · IBAN · ORG · DATE · URL ·
ID_NUMBER · IP_ADDRESS · MAC_ADDRESS · API_KEY · TAX_ID · CREDIT_CARD ·
DATE_OF_BIRTH · MEDICAL_CONDITION · JOB_TITLE
Les placeholders PERSON intègrent le genre : [PERSON_H_N] (homme), [PERSON_F_N] (femme), [PERSON_N] (indéterminé).
Détecte les entités, retourne le texte avec placeholders + mapping inverse.
{
"text": "Marie Dupont (marie@acme.ch) chez Acme SA.",
"entityTypes": ["PERSON", "EMAIL", "ORG"], // optionnel, défaut: TOUS les types
"persist": false // optionnel, sauve en DB si true
}
{
"anonymizedText": "[PERSON_F_1] ([EMAIL_1]) chez [ORG_1].",
"mapping": {
"[PERSON_F_1]": "Marie Dupont",
"[EMAIL_1]": "marie@acme.ch",
"[ORG_1]": "Acme SA"
},
"entities": [ /* détail des entités détectées */ ],
"sessionId": 42 // uniquement si persist=true
}
400 — text manquant ou vide502 — passe LLM en échec après retry (et un type LLM était demandé)curl -X POST http://localhost:3000/api/v1/anonymize \
-H "Content-Type: application/json" \
-H "Authorization: Bearer pllm_VOTRE_CLE" \
-d '{"text":"Marie Dupont","entityTypes":["PERSON"]}'
Restaure les valeurs réelles dans une réponse contenant des placeholders. Tolérant aux inversions de genre.
{
"cloudResponse": "Bonjour [PERSON_F_1], ...",
"mapping": {
"[PERSON_F_1]": "Marie Dupont"
}
}
{
"cloudResponse": "Bonjour [PERSON_F_1], ...",
"sessionId": 42
}
{
"deanonymized": "Bonjour Marie Dupont, ...",
"alerts": [
{
"severity": "warn",
"kind": "gender_flip",
"placeholder": "[PERSON_H_1]",
"suggestion": "[PERSON_F_1]",
"message": "..."
}
]
}
Les types d'alertes : orphan (placeholder absent du mapping), gender_flip (genre inversé), unknown_type (type inconnu), unresolved (placeholder resté en clair).
Valide structurellement une réponse cloud sans la désanonymiser ni rien persister. Utile pour CI/CD ou lint.
{
"cloudResponse": "Bonjour [PERSON_F_1], ...",
"mapping": { "[PERSON_F_1]": "Marie Dupont" }
}
{ "alerts": [ /* idem deanonymize */ ] }
Pipeline complet en un appel synchrone : anonymise → Claude (compte abonné) → restitue → contrôle.
{
"text": "Marie Dupont travaille chez Acme SA.",
"entityTypes": ["PERSON", "ORG"], // optionnel, défaut: TOUS les types
"claudeInstruction": "Reformule ce texte en langage juridique.", // optionnel, prepended
"guard": true, // optionnel, défaut true
"persist": false // optionnel
}
{
"anonymizedText": "[PERSON_F_1] travaille chez [ORG_1].",
"mapping": { "[PERSON_F_1]": "Marie Dupont", "[ORG_1]": "Acme SA" },
"cloudResponse": "[PERSON_F_1], salariée de [ORG_1], ...",
"deanonymized": "Marie Dupont, salariée de Acme SA, ...",
"alerts": [],
"timings": {
"anonymizeMs": 1800,
"claudeMs": 11500,
"deanonymizeMs": 2,
"totalMs": 13302
},
"sessionId": 43 // uniquement si persist=true
}
400 — text manquant413 — prompt total trop long502 — passe LLM Ollama en échec401 — clé absente ou invalide · 402 — abonnement requis · 413 — texte trop long500 — échec ou délai dépassé côté générationLe délai serveur côté génération est de 5 minutes par défaut. Côté client, prévoyez un délai d'au moins 60 s pour des demandes moyennes.