Vous envoyez le document
PDF, DOCX, TXT, Markdown, HTML — peu importe. L'API accepte un upload multipart ou une URL signée. Le fichier est tenu en mémoire, jamais sur disque.
lexform reçoit votre PDF, extrait le texte en Markdown propre, remplace chaque entreprise, personne et email par des jetons neutres — puis vous rend une table de correspondance pour retrouver les vraies données après coup.
POST /v1/anonymizeCONTRAT DE PRESTATION Entre Acme Corporation, représentée par Jane Dubois (jane@acme.com), et Globex SA, il est convenu ce qui suit. Acme Corporation s'engage à fournir à Globex SA un ensemble de prestations pour un montant forfaitaire. Initech Ltd interviendra en tant que sous-traitant de Acme Corporation sur la partie infrastructure.
PDF, DOCX, TXT, Markdown, HTML — peu importe. L'API accepte un upload multipart ou une URL signée. Le fichier est tenu en mémoire, jamais sur disque.
Extraction du texte en Markdown, détection des entités (entreprises, personnes, emails, IBAN, numéros). Chacune reçoit un jeton neutre : COMPANY_1, PERSON_2…
Un Markdown propre et anonymisé, plus une table JSON qui associe chaque jeton à sa valeur d'origine. La table reste chez vous — on la renvoie, on ne la garde pas.
Envoyez le Markdown anonymisé à OpenAI, Anthropic, un modèle local — aucun risque de fuite. Au retour, faites un remap local avec la table et retrouvez les vrais noms.
Connexion Campus requise — 20 pages offertes chaque mois sans carte bancaire, puis tarification au token (1 mot = 1 token). SDK Node et Python, source ouverte.
curl -X POST https://lexform.zevra.tech/api/anonymize \ -F "file=@contrat.pdf" \ -F "kinds=COMPANY,PERSON,EMAIL,IBAN"
{
"markdown": "# CONTRAT DE PRESTATION\n\nEntre COMPANY_1, représentée par PERSON_1 (EMAIL_1), et COMPANY_2…",
"mapping": {
"COMPANY_1": "Acme Corporation",
"COMPANY_2": "Globex SA",
"COMPANY_3": "Initech Ltd",
"PERSON_1": "Jane Dubois",
"EMAIL_1": "jane@acme.com"
},
"stats": { "pages": 3, "entities": 5, "ms": 812 }
}100 % local. Le fichier est traité en RAM puis effacé. Aucun LLM, aucun envoi externe.
L'application desktop fait tourner toute l'anonymisation en local — extraction, détection, modèle NER, OCR. Vos documents ne quittent jamais votre poste. Seule une connexion légère à l'API gère l'authentification et le décompte (mêmes 20 pages offertes, mêmes crédits qu'en ligne).
La version en ligne reste disponible — testez sans rien installer.
20 pages offertes chaque mois, sans carte bancaire. Au-delà, vous rechargez des crédits prépayés — au mot près, sans abonnement ni minimum. Connexion via le Campus Zevra requise.
Pour anonymiser vos documents courants. Aucune carte bancaire demandée, le quota se réinitialise le 1er de chaque mois.
Un token = un mot du document. Un contrat de 10 pages ≈ 4 000 tokens ≈ 0,04 €. Rechargez un pack, les crédits ne périment pas.
Le compteur (pages, tokens, solde de crédits) est renvoyé dans chaque réponse API — aucune surprise en fin de mois.
Copie ce prompt et colle-le dans Claude Code, Cursor ou n'importe quel agent IA codeur. Il génèrera le wrapper, modifiera tes appels LLM existants, et ajoutera la couche de désanonymisation au retour.
Intègre lexform dans ce projet pour anonymiser tout document
ou texte avant envoi à un LLM (OpenAI, Anthropic, Mistral, etc.).
API
POST https://lexform.zevra.tech/api/anonymize
Content-Type: multipart/form-data
Body: file=<binary> (PDF, DOCX, TXT, MD, max 30 Mo)
kinds=COMPANY,PERSON… (optionnel)
Auth : session lexform requise (cookie) — connexion via campus.zevra.tech.
Quota : 20 pages gratuites/mois (1 token = 1 mot), puis 402 quota_exceeded.
Réponse 200 OK :
{
"markdown": "<contenu anonymisé>",
"mapping": { "COMPANY_1": "Acme SAS", "PERSON_1": "Jean Dupont", ... },
"quota": { "pagesUsed": N, "pagesLimit": 20, "pagesRemaining": N, "tokensUsed": N },
"stats": { "entities": N, "uniqueEntities": N, "tokens": N, "ms": N, "nerActive": true }
}
Tâches
1. Crée un module `lib/lexform.ts` (ou équivalent dans le langage du
projet) exposant deux fonctions :
anonymize(input: File | Buffer | string) → { markdown, mapping }
deanonymize(text: string, mapping: Record<string,string>) → string
2. Identifie chaque appel sortant vers un LLM dans la codebase.
Avant l'appel : remplace le payload utilisateur par sa version
anonymisée. Après la réponse : applique deanonymize() au texte
retourné par le LLM en utilisant la mapping table.
3. Ne persiste JAMAIS la mapping table en base ou dans les logs.
Garde-la en mémoire le temps de la requête, jette-la ensuite.
4. Adapte le style de code à celui du projet (TS strict / async /
gestion d'erreurs cohérente avec le reste).
Tests
- Smoke test sur un document avec entités connues, vérifier que la
réponse du LLM ré-injecte correctement les vraies valeurs après
deanonymize.
- Vérifier qu'aucune valeur originale n'apparaît dans les logs ni
dans les payloads sortants vers le LLM.Deux circuits étanches. Le Campus Zevra (cloud) vérifie uniquement que vous êtes membre — il ne voit ni vos fichiers, ni le résultat. Le traitement tourne sur un serveur dédié hébergé en France, avec les modèles d'analyse embarqués (NER, OCR) : aucun appel sortant, vers aucun service tiers.
Le document part, le Markdown anonymisé et la table de correspondance reviennent. La table reste chez vous — elle n'est jamais conservée.
Extraction → détection (regex + modèle NER local) → masquage. Tout en mémoire vive, hébergé en France.
Vérifie que vous êtes membre et renvoie un jeton de session à votre navigateur. C'est la seule chose qui transite par le cloud.
jeton de session ↔ votre posteAucun document n'est écrit sur disque. Aucune table de correspondance n'est loggée. Aucun apprentissage n'est fait sur votre contenu. Quand la réponse part, toute trace disparaît — c'est aussi simple que ça.
Vos documents sont traités sur des serveurs français. Ils ne quittent jamais l’Union européenne.
Rien n’est conservé, donc rien à effacer. Pas de compte, pas de cookies, pas de tracking.
Tout se passe en mémoire vive, jamais sur disque. Le document disparaît dès la réponse envoyée.
La table de correspondance vous est rendue, à vous seul. Sans elle, le document anonymisé ne révèle rien.