Pour les DSI
La même protection, appelée par vos programmes — une image sans état à exploiter.
Avant qu’un flux n’envoie un document à une IA, à un traducteur ou à un fournisseur, il peut demander à DoNotLeak d’y repérer et d’y remplacer les données personnelles — par une API qui exige une identité, servie par le moteur de la page.
Un composant de plus à héberger, sécuriser, mettre à jour et superviser ? Voici ce qu’il demande : une image signée, sans base ni volume à sauvegarder, configurée par l’environnement, appelée par des machines identifiées. Et, sur demande, son code source pour vos équipes.
Appelants identifiés uniquement · Rien n’est conservé · Images signées, amd64 et arm64

Essayer l’API
Envoyez une requête, lisez la réponse.
Le vrai moteur, ouvert ici en démonstration, sans clé : la réponse que vous lisez est celle que vos programmes recevront.
- 1 appel toutes les 15 s par adresse IP
- textes jusqu’à 4 Ko
- rien n’est conservé
- un même réseau partage le rythme
Les plafonds de la démonstration
Par adresse — un réseau IPv6 /64 compte pour une seule : 100 appels par jour, 300 par semaine, 600 par mois, 2 000 par an. Pour toute la démonstration : 600 appels par minute et un seul texte analysé à la fois ; au-delà, elle répond 503 et le reste du service n’est pas touché. Votre adresse n’est tenue qu’en mémoire, le temps de compter ses appels ; les journaux gardent le verbe, le statut, les tailles et la durée — jamais l’adresse, le texte ni la réponse.
RateLimit-Policy · RateLimit · Retry-After
- POSTscan
- POSTprotectBientôt
- POSTrestoreBientôt
- GETcapabilitiesBientôt
- POSTextractavec une clé
- POSTrenderavec une clé
Requête
POST/api/demo/scan
Repère les données personnelles — où elles sont (en octets UTF-8), leur type, leur gravité — et renvoie le texte protégé.
81 / 4096 octets
Voir le JSON envoyé
{
"text": "Damien Morel a validé le virement vers l'IBAN FR76 3000 6000 0112 3456 7890 189.",
"scope": [
"FR"
]
}Prêt — 1 appel disponible
Réponse
La réponse s’affichera ici.
Vos programmes, eux, appellent /api/v1/scan avec leur identité — un certificat client ou un jeton : c’est la section suivante.
L’API
Ce qu’elle fait aujourd’hui : repérer, puis remplacer.
Un seul appel : du JSON en entrée, les détections et le texte protégé en sortie. C’est le moteur de la page qui répond.
Repérer
Chaque donnée personnelle du texte, avec son type, sa position et un score de confiance. Les formats suivent les pays que vous indiquez.
findings · counts · scope
Remplacer
La même réponse porte le texte protégé : chaque valeur devient une étiquette typée et numérotée. Les valeurs que vous déclarez à garder restent telles quelles.
anonymized_text · replacements · kept
L’appel
curl -sS --cacert ca.pem --cert client.pem --key client.key \
-H 'Content-Type: application/json' \
-X POST --data '{"text":"Contact: jean.dupont@example.org"}' \
https://donotleak.example.org/api/v1/scanAvec un jeton plutôt qu’un certificat
-H "Authorization: Bearer $TOKEN"La réponse — enregistrée depuis le moteur, retours à la ligne ajoutés
{"version":1,
"findings":[{"id":0,"kind":"Pii","span":{"start":9,"end":32},
"primary":{"label":"EMAIL","severity":"Medium","confidence":85},
"alternatives":[],"entity_id":0,"kept":false,"applied":0}],
"counts":{"total":1,"low":0,"medium":1,"high":0,"critical":0},
"anonymized_text":"Contact: [[EMAIL-1]]",
"replacements":[{"span":{"start":9,"end":32},"placeholder":"[[EMAIL-1]]"}],
"entities":[{"id":0,"label":"EMAIL","value":"jean.dupont@example.org",
"placeholder":"[[EMAIL-1]]"}],
"skipped_overlaps":0}Les refus et la table des entités
Les refus ne citent jamais le contenu : 400 vide ou pas du JSON, 413 au-delà de 1 Mio, 422 contenu suspect, 401 sans identité, 403 non autorisé, 429 budget dépassé.
La table des entités renvoie chaque valeur d’origine à l’appelant qui l’a envoyée — c’est elle qui permettra de restaurer. Seul le texte protégé part vers l’IA.
Ce qu’elle ne fait pas encore
- Restaurer : remettre les originaux dans la réponse de l’IA Bientôt
- Les documents Word par l’API Bientôt
- Le contrat v1 publié : une description OpenAPI, des erreurs uniformes, des quotas par appelant Bientôt
Où l’insérer dans vos flux
Un contrôle avant l’appel externe.
Un flux — une GED, un CRM, un lot de fichiers — appelle DoNotLeak juste avant d’appeler une IA ou un partenaire. Seul le texte protégé continue sa route.
Vous choisissez où placer le contrôle et ce qui suit : envoyer tout de suite, ou laisser une personne relire les détections, puis renvoyer le texte en gardant les valeurs dont la tâche a besoin.

Identité des machines
Jamais anonyme : chaque appel nomme son appelant.
L’API n’a pas de porte ouverte. Le serveur refuse de démarrer tant qu’il ne sait pas identifier un appelant, et chaque appel est jugé selon votre politique.
Un certificat client
TLS mutuel, terminé par le serveur lui-même : le certificat doit remonter à l’autorité de certification que vous reconnaissez, et son identifiant SPIFFE — à défaut son nom DNS, jamais son nom commun — devient l’appelant.
TLS_CLIENT_CA · TLS_CLIENT_IDENTITY=san
Un jeton de votre fournisseur d’identité
L’émetteur OpenID Connect que vous désignez — votre annuaire, votre SSO : signature, émetteur, audience et expiration de chaque jeton sont vérifiés avec les clés qu’il publie, et ses rôles l’accompagnent.
OIDC_ISSUER_URL · OIDC_CLIENT_ID · éprouvé en CI face à Keycloak
- Refus par défaut : un appelant sans rôle dans votre fichier de politique est refusé (403), et analyser est un droit à part entière.
- Pas de clé d’API statique qui puisse fuiter : un appelant se prouve par un certificat ou un jeton signé.
Hébergement et souveraineté
Hébergé par Contee, ou dans votre propre système d’information.
La même image headless dans les deux cas.
Par Contee, dans l’UE
Contee exploite le serveur, vous l’appelez. La page publique fonctionne déjà ainsi, chez OVH SAS, hébergeur français (voir les mentions légales).
L’API hébergée, sous son propre contrat de service Bientôt
Dans votre système d’information
L’image tourne sur vos serveurs, derrière votre PKI et votre fournisseur d’identité : les textes ne quittent jamais votre périmètre. Sur demande, avec son code source : l’offre sur site, ci-dessous.

L’offre sur site
Le code source chez vous, et vos équipes pour le faire évoluer.
Pour une organisation qui veut DoNotLeak dans son propre système d’information, sans dépendre de Contee pour le faire vivre.
Le code source livré
Pour l’usage interne de votre organisation : vos équipes le lisent, le construisent et le déploient dans votre périmètre.
Vos équipes formées
À le maintenir, à l’améliorer et à l’étendre : les compétences se construisent chez vous, pas chez nous.
Le moins de dépendance possible
Le code et le savoir-faire restent dans la maison ; le serveur ne joint que ce que vous configurez, jamais un service de Contee.
En une fois, pas en abonnement SaaS
Disponible dès aujourd’hui, sur demande, pour votre périmètre.
L’image headless
Le cœur d’analyse seul — signé, pour deux architectures.
Pas de page, pas de cookie, pas de code navigateur : l’API et le moteur, rien d’autre.
Le moteur de la page
La page et l’API appellent la même fonction d’analyse : ce qu’une personne voit sur la page, un programme l’obtient.
un cœur · deux portes
Petite, et fermée par défaut
Une base distroless — ni shell, ni gestionnaire de paquets — et un utilisateur non root. Elle refuse de démarrer sans source d’identité, ou avec une configuration TLS à moitié faite.
port 3000 · TLS et mTLS dans l’application, ou derrière votre proxy
Construite et signée comme l’image web
La même chaîne la construit et l’analyse, puis la signe par empreinte avec la clé propre à DoNotLeak — l’image, sa nomenclature logicielle et sa provenance de build.
amd64 + arm64 · cosign · SBOM SPDX · provenance SLSA · Trivy, Grype, Dockle, Dive
Exploitation
Ce que l’image demande à votre exploitation.
Un conteneur parmi les autres.
Sans état
Ni base de données, ni volume à sauvegarder : chaque requête est traitée en mémoire, puis oubliée. Rien à restaurer.
aucune base · aucun volume de données
Configurée par l’environnement
Adresse d’écoute, certificats, autorité cliente, émetteur OIDC, fichier de politique, budgets : des variables, et des fichiers montés en lecture seule. Une configuration à moitié faite refuse de démarrer.
LEPTOS_SITE_ADDR · TLS_CERT · TLS_CLIENT_CA · CASBIN_POLICY_FILE · SCAN_*
Supervisée par vos outils
Les traces partent en OpenTelemetry vers votre collecteur, sinon sur la sortie standard ; les journaux ne contiennent jamais un texte analysé.
OTEL_EXPORTER_OTLP_ENDPOINT
Mise à jour par empreinte
Une version, c’est une image signée désignée par son empreinte : vérifier la signature, changer l’empreinte, redémarrer. Un certificat qui change : de nouveaux fichiers, puis un redémarrage.
cosign verify · amd64 + arm64
Où qu’elle tourne
Trois choses qui ne changent pas.
Rien n’est conservé
Chaque texte est analysé dans la mémoire de la requête qui le porte, sur le serveur, et disparaît avec elle : aucune copie, aucun journal de son contenu.
Chaque pipeline fait passer un texte témoin par le serveur headless, et échoue si son journal le montre un jour.
Personne d’autre n’est appelé
La détection repose sur des formats, des règles et des dictionnaires : aucun modèle de langage, aucun service tiers. Le serveur ne joint que ce que vous configurez — votre fournisseur d’identité, votre collecteur de télémétrie.
Chaque version vérifiable
Chaque image est signée par empreinte, avec sa nomenclature logicielle et sa provenance ; la chaîne vérifie la signature avant toute publication.

Essayez sur la page, puis écrivez à Contee.
La page répond avec le même moteur que l’API : collez-y un texte type de vos flux. La sécurité de l’image se vérifie contrôle par contrôle sur la page RSSI. Pour l’API hébergée ou l’offre sur site, écrivez à Contee.