Documentatie

Gegevensbescherming

Detectiemodi, de bibliotheek met 60 detectoren, entiteitsdetectie met keuzemodellen, securityscanning, de modelnotitie en retentie.

Gegevensbescherming draait op elk verzoek vóór verzending. De standaardmodus is tokenize: elke gedetecteerde waarde wordt vervangen door een stabiele getypeerde token zoals «EMAIL_1». Alleen tokens bereiken de provider, en op de terugweg naar jou wordt het antwoord hersteld naar de echte waarden, gestreamd of niet. De tokenmap leeft in het geheugen zolang het verzoek duurt en wordt nooit opgeslagen.

# tokenize mode (the default): what you send
curl https://api.sluis.ai/v1/chat/completions \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "model": "sluis/auto", "messages": [{ "role": "user",
        "content": "Mail j.devries@acme.nl that IBAN NL91ABNA0417164300 is active." }] }'

Andere modi: mask herschrijft gedetecteerde waarden onomkeerbaar, block weigert het verzoek met 422, en allow_log laat het door en markeert tegelijk de auditregel.

60 ingebouwde detectoren zijn er meteen: 28 voor persoonsgegevens, van het Amerikaanse Social Security-nummer tot een pakket nationale ID's met checksumvalidatie voor 12 EU-landen, en 32 voor secrets en credentials. Elke detector is per organisatie in/uit te schakelen, en eigen termen (gewoon of regex) dekken alles wat specifiek is voor jouw bedrijf:

Persoonsgegevens · 28EmailPhone numberIBANCredit cardIPv4 addressIPv6 addressMAC addressUS Social Security numberDutch BSNPortuguese NIFGerman Steuer-IDPolish PESELBelgian rijksregisternummerFrench NIR (INSEE)Spanish DNI/NIEItalian codice fiscaleSwedish personnummerDanish CPR numberFinnish henkilötunnusUK National Insurance numberEU VAT numberBIC/SWIFT codeDutch license plateDutch addressPassport numberDate of birthGPS coordinatesVehicle identification number
Secrets & credentials · 32API key (generic)AWS access keyAWS secret access keyPrivate key (PEM)GitHub tokenGitLab tokenSlack tokenSlack webhook URLDiscord webhook URLGoogle API keyGoogle OAuth refresh tokenStripe keyMollie API keyAnthropic API keyOpenAI API keySluis keyHugging Face tokennpm tokenSendGrid keyTwilio keyShopify tokenVault tokenDatabricks tokenDocker Hub tokenTelegram bot tokenJSON Web TokenCredentials in URL.env file dumpAzure storage key / SASPassword assignmentConfidentiality markerHigh-entropy token (generic)

Entiteitsdetectie

Personen, organisaties en locaties zijn alleen met patronen moeilijk te vangen. Sluis voegt vijf optionele lagen toe: contextheuristieken (aanheffen, begroetingen, ondertekeningen; alleen personen), e-mailcorrelatie (leidt namen af uit adressen in dezelfde tekst), een naamdirectory per tenant, een meegeleverd namenwoordenboek, en NER: een herkenningsmodel dat Sluis als netwerkinterne sidecar draait, zodat tekst nooit de perimeter van de deployment verlaat om gescand te worden. NER vindt personen, organisaties en locaties in gewone lopende tekst.

Het namenwoordenboek is de deterministische tegenhanger van NER: voornamen en achternamen, samengesteld uit open overheidsdata tot een woordenboek dat in de gateway meegeleverd wordt. Het vangt volledige namen en namen na een aanspreektitel, zonder extra vertraging en zonder dat er iets je perimeter verlaat. Namen die ook gewone woorden zijn worden alleen gevangen met naamvormige context; zeldzame namen blijven het werk van de naamdirectory of NER.

NER-modelopties

Twee niveaus wegen latency af tegen vangstpercentage: swift (spaCy xx_ent_wiki_sm) antwoordt in enkele milliseconden met basale meertalige dekking; deep (GLiNER2-PII op mDeBERTa-v3-basis, Apache-2.0) vangt aanzienlijk meer, tegen een hogere latency per gescand segment. Kies per organisatie in Beleid → Gegevensbescherming; een key kan via zijn option overrides een ander model kiezen, maar kan de laag nooit inschakelen als de organisatie hem uit laat staan.

ModelDekkingGemeten nauwkeurigheidLatency
swift · spaCy xx_ent_wiki_smmultilingual, basicall-entity F1 0.58 · person F1 0.72 · recall ~0.53~7-14 ms
deep · GLiNER2-PII (mDeBERTa-v3, Apache-2.0)7 trained languages (EN, FR, ES, DE, IT, PT, NL) + multilingual backbone transferall-entity F1 0.61 · person F1 0.76 · recall ~0.70~150-250 ms per scanned segment

Gemeten op 2026-08-12 in een interne benchmark: WikiANN-testzinnen in zes talen (NL, EN, DE, FR, ES, IT; 150 per taal), gescoord als micro-F1 over (label, tekst)-paren op tekstniveau met het productiefilter tegen valse positieven toegepast, op een Apple Silicon-ontwikkelmachine in FP32. WikiANN is automatisch geannoteerd Wikipedia-materiaal en het thuisterrein van spaCy: lees de cijfers als relatieve richtlijn tussen de niveaus, niet als absolute nauwkeurigheid in het veld.

Securityscanning

Optionele detectie van prompt injection en jailbreaks bij de sluis, gescand vóór verzending. Drie modi: off | log | block. log legt treffers vast in het auditlogboek zonder het verkeer te raken; block weigert het verzoek met een verzegelde 403 permission_error ("request refused: prompt-injection scan flagged this request"). De drempel is per organisatie instelbaar, en de scan faalt open: een storing van de scanner legt het verkeer nooit plat.

De scan voegt ongeveer 20 ms toe bij een korte prompt en ongeveer 620 ms bij een lange (1500 tekens), gemeten op een interne benchmark; het slechtste geval is begrensd, omdat de scanner het aantal beoordeelde vensters van 512 tokens per verzoek aftopt. Hij draait gelijktijdig met de NER-scan, dus de gecombineerde extra latency ligt dicht bij de grootste van de twee, niet bij de som. Detectie is een classifier, geen bewijs: onschuldige, instructie-achtige tekst kan als injection scoren, een bekende realiteit in het hele vakgebied, en daarom is log de aanbevolen startmodus.

Elke treffer wordt in het auditlogboek vermeld als sec:injection:<score>, dus voor review is geen extra tooling nodig. Afwijkingen per key lopen via dezelfde option overrides als gegevensbescherming.

Built with Llama. The scan model is Llama Prompt Guard 2 86M (multilingual), used under the Llama 4 Community License.

Los daarvan draait optionele anomaliedetectie op key-gedrag als achtergrondtaak, zonder enige latency op verzoeken: baselines per key uit robuuste statistiek met uur-van-de-week-seizoenspatronen, plus een multivariate isolation-forest-laag. Alerts zijn uitlegbaar, nooit een kale score, en verschijnen in het Security-tabblad van de console, optioneel per e-mail.

Modelnotitie

Als tokenisatie een verzoek heeft herschreven, injecteert Sluis vooraan een systeembericht dat het model vertelt dat de «…»-tokens ondoorzichtige placeholders zijn die het intact moet laten; dat is wat het herstel betrouwbaar houdt. Standaard aan; pas het aan of schakel het uit per organisatie.

Retentie & auditgetrouwheid

Contentretentie (request- en response-bodies voor het auditlog) staat standaard aan en is versleuteld in rust; auditgetrouwheid bepaalt of bewaarde content de tokens of de originele waarden opslaat. Zet retentie uit voor een grootboek met alleen metadata; dat schakelt ook de response-caches uit.

Documentanonimisering

Stuur een docx-, pdf-, afbeeldings- of tekstbestand naar POST /v1/documents/anonymize en hetzelfde document komt terug met PII en secrets vervangen door merge tags zoals «PERSON_NAME_1» in tekst, en vervaagd in afbeeldingen en PDF-pagina's. De verwerking blijft lokaal in de gateway, OCR inbegrepen; de operatie wordt verzegeld in de auditketen en gefactureerd per pagina/afbeelding. De tokentabel wordt alleen teruggegeven als je erom vraagt en nooit opgeslagen. Geredigeerde PDF's behouden een onzichtbare doorzoekbare tekstlaag opgebouwd uit de geanonimiseerde tekst. Voor grote documenten zet je een asynchrone job in de wachtrij en haal je het resultaat later op via een tijdgebonden ondertekende URL.

Dezelfde bescherming werkt onderweg: met het dlp_documents-beleid aan worden bestanden die via /v1/files binnenkomen en inline OCR-documenten geanonimiseerd voordat ze naar een provider vertrekken, geweigerd onder block en gescand onder allow_log.

# enqueue a large document (202 + job id; Idempotency-Key honoured)
curl https://api.sluis.ai/v1/documents/anonymize/jobs \
  -H "Authorization: Bearer $SLUIS_KEY" \
  -F file=@archive.pdf

# poll until succeeded; the signed download_url then needs no API key
curl https://api.sluis.ai/v1/documents/anonymize/jobs/9c31… \
  -H "Authorization: Bearer $SLUIS_KEY"

Embeddings

Gepseudonimiseerde tokens zijn stabiel binnen een verzoek, niet tussen verzoeken; embeddings van getokeniseerde tekst kunnen dus per aanroep verschillen. De instelling dlp_embeddings bepaalt of de scan /v1/embeddings dekt: standaard aan, op off gaat embedding-invoer ongescand naar de provider. Elke uitgezonderde aanroep wordt vastgelegd in het auditlogboek.

Option overrides per key

Overrides via requestheaders bestaan niet meer: afwijkingen zijn vaste, bestuurde keyconfiguratie. Een owner of admin zet spaarzame option_overrides op een key, in de API keys-weergave van de Console of via POST/PUT /admin/keys: de gegevensbeschermingsmodus (inclusief off), het NER-model en de injectiescanmodus. Alles wat niet is ingesteld erft het organisatiebeleid, en een key kan nooit een laag inschakelen die de organisatie uit laat staan.

# per-key option overrides are standing key config, set by an owner or admin
curl -X PUT https://api.sluis.ai/admin/keys/{key_id} \
  -H "Authorization: Bearer $SLUIS_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "option_overrides": {
        "dlp": { "mode": "off" },
        "ner_model": "deep",
        "security": { "prompt_injection": { "mode": "block" } } } }'
# sparse: absent fields inherit org policy; every deviation is sealed in the audit trail

De requestheader x-sluis-dlp is verwijderd. Een verzoek dat hem nog draagt, met welke waarde ook, wordt geweigerd met 400 en een verwijzing naar de option overrides van de key. Elke geldende afwijking wordt vermeld op de verzegelde auditregel, zodat het logboek altijd toont welke configuratie werkelijk gold.