Our insurance claims payloads mix sensitive policyholder PII, such as home addresses, policy numbers, and bank routing details for Actual Cash Value payouts, right alongside commercial property fields like item descriptions, pre-tax replacement prices, and depreciation rates. Putting Privado AI's static code scanner into our GitHub Actions pipeline gave us a reliable way to trace how personal data elements move through our Python and FastAPI microservices before code ever merges. The strongest part of their architecture is how the privado scan CLI uses AST data-flow analysis to map data sources to four distinct sink categories: console logs, databases, internal APIs, and third-party endpoints. Because the scanner runs locally inside our CI runner and only pushes the generated .privado/privado.json metadata graph to the Privado dashboard, our raw proprietary source code never leaves our infrastructure. Whenever a developer modifies a Pydantic model and accidentally passes a claimant identifier into an unmasked logger.info() call or an external LLM pricing payload, Privado flags the exact file and line number right on the pull request. Review collected by and hosted on G2.com.
Out of the box, Privado's default discovery rules easily caught standard identifiers like email addresses, phone numbers, and SSNs, but missed several insurance-specific attributes in our Pydantic schemas such as loss_location_address and payee_routing_number. At the same time, generic variable names on our commercial inventory sheets, like vendor_name or manufacturer_contact for retail suppliers, initially triggered false-positive personal data alerts. I had to spend time writing custom YAML classification rules under rules/sources so the scanner could distinguish commercial retailer metadata from actual policyholder PII. Additionally, because static AST scanning evaluates one repository at a time, it maps data lineage cleanly inside our main FastAPI api-server, but when a claim dictionary is written to our cache layer and picked up asynchronously by separate background worker repositories for categorization or depreciation, the scanner cannot stitch that cross-repo hop automatically without manual linking in the UI. Full repository scans also added a few minutes to our pull request checks until we configured incremental scanning. Review collected by and hosted on G2.com.