psql, for an ORM, for a dashboard and for an agent.
Free tier: one Data Masking rule and one Guardrail per Sidecar are free, forever. Running more than one rule per feature, or managing rules centrally across Sidecars, requires Enterprise.
Configuration
Two blocks, and both are required.pii turns detection on; mask says what to do with what was detected.
config.yaml
Rule fields
Strategies
hash is the one worth knowing about: equal inputs give equal outputs, so a masked column still works as a join key. An analyst can group by customer without ever seeing a customer.
Entity rules and column rules
Two ways to name what gets masked, and they fail in opposite directions. Entity rules mask by detection. They work anywhere a value appears, including inside an opaque HTTP body where the protocol names nothing — and they miss whatever the detector does not recognize. Column rules mask by position. They cannot miss, because they never guess — and they only work where the protocol names its values, which means result sets, not payloads.Inheritance: a listener’s mask block replaces the defaults
This is the single most common way a working config quietly stops masking:config.yaml
mask block replaces the top-level list rather than extending it. Adding one column rule drops every inherited entity rule, so list those again alongside it. This is deliberate: a rule owns an entity type, and two concatenated lists would leave two rules competing for one entity.
policy.rules behaves the opposite way — it concatenates.
Verify what actually resolved
The admin API reports the resolved state per listener, which is the only place the merge above is visible:Looking for masking on the Hoop Gateway instead? That is a different implementation, configured in the web app with DLP providers and per-resource roles. See Live Data Masking.
Next
Guardrails
Control what reaches the resource, not just what comes back.
Config File Reference
Every field, the full entity list, and what startup refuses.