Fides 2.93.0 release notes
- 2.93.0: August 31, 2026
The Enterprise tag indicates that features are only available for Enterprise customers. To review pricing and upgrade your plan, please visit our site (opens in a new tab) or contact us to learn more.
Helios
Detect and classify global data risks with comprehensive visualization for data mapping and reporting for modern Enterprise.
- Dataset Promotion Provenance: Promoting a discovery resource now records which staged resource each dataset, collection, and field came from, in a dedicated provenance table. The dataset upsert, its provenance links, and the status finalization commit in a single transaction, so a failure can no longer strand a resource in a promoting state, and removing a field or collection cleans up its links in the same transaction. A background backfill reconstructs provenance for datasets promoted before this existed; once it completes, promoted-dataset resolution reads the recorded provenance instead of inferring it from a matching
fides_key. Includes database migrations. - Data Uses And Data Subjects On Datasets: Datasets, collections, and fields carry native
data_usesanddata_subjectsfields. Includes a database migration. - Microsoft Purview In Monitor Seeding: Microsoft Purview is included in the discovery monitor seed task.
- Bug Fixes:
- Website discovery monitors validate and normalize country-code locations, rejecting invalid entries such as "United States" that were previously accepted. Legacy monitors carrying invalid locations now fail with a clear 400 on execution instead of a 500.
- Long-running RDS monitor scans using IAM auth no longer expire mid-scan — credentials refresh through STS.
- The dataset YAML editor shows errors in a full-width alert below the editor.
- The ignored-systems label reads "Not Included" rather than "Not Touched" across the toolbar toggle, summary stat, lane header, and legend.
Lethe
Enterprise grade privacy request management and processing with a single orchestration layer for DSRs across vendors and systems
- Asynchronous Pre-Approval Webhooks: Pre-approval webhooks dispatch through Celery, one task per webhook, with per-webhook status tracking and automatic retry with backoff. Delivery failures are detected properly instead of being retried blindly, and a dispatch resolves to skipped when the privacy request is approved or denied before it completes. Callback tokens are bound to the privacy request that issued them. Includes database migrations.
- Respondent Access Link Recovery: External respondents whose access link expired or was lost can request a fresh one from the portal, and admins can resend a link from the manual-task configuration tab. Both paths rotate tokens so only the newest link authenticates, and the self-service flow reveals nothing about which addresses are registered.
- Misrouted Request Correction: An audited path for correcting privacy requests that were routed to the wrong place, alongside an organization offboarding scope query. Includes a database migration.
- Public Disclosure Metrics: A per-organization public privacy-request disclosure metrics endpoint (
GET /plus/privacy-request-metrics/{organization_fides_key}). - Named Policy Webhooks: Policy webhooks require a
name. - Access Package Memory Footprint: Large access packages no longer hold the plaintext, ciphertext, and base64 encoding as separate full copies — JSON packages serialize and encrypt incrementally. The upload path drops redundant copies of the result set, CSV assembly no longer mutates a shared row, and a memory kill during upload reports which step exhausted memory. Polling connectors store a pointer manifest and resolve one payload at a time rather than re-materializing every sub-request payload into a single list; manifest writes are gated behind
execution.polling_access_manifest_enabled(default off), with a guard that fails a request rather than delivering an unresolved manifest marker to a subject. - Bug Fixes:
- Long-running async DSRs are no longer falsely cancelled when their task-id cache key expires, and the interrupted-task watchdog skips a tick instead of cancelling when the cache is unavailable.
- Erasure requests no longer fail when a single application-database connection attempt fails transiently, and the erasure path no longer acquires a connection per record to read a global setting.
- Erasure and access polling behave correctly for hybrid connectors that use manual review tasks, and async correlation IDs are carried on headers with minute-granularity polling intervals.
- A
dataset_referencepointing at a field missing from the referenced collection filters that field out instead of failing the whole collection. - "Remove record" redactions in access packages remove identical records from every source, matching field-redaction fan-out, and redaction audit-log entries record the acting user.
- Access packages bundle and link remote attachments, and the HTML report links attachments to their bundled copy inside the ZIP rather than rendering them as plain text.
- The privacy request detail page no longer renders blank for a request that no longer exists.
- The Flagged tab shows readable velocity risk signals instead of raw reason codes.
- External-portal OTP requests no longer fail when the typed email doesn't match the access link, stale link tokens are cleared from browser storage, and an invalid or expired link is distinguished from a failed email dispatch.
- Authenticated attachment uploads are capped (configurable), with the limit shown on the form and a clear error instead of a timeout. Validation is extension-only so valid CCTV mp4s are accepted, and attachments download rather than rendering inline.
- The traversal preview never persists a cache entry whose key and body were read from different database states.
Janus
Consent management and enforcement across web, mobile, and server-side surfaces
- Consent Reporting Linkage: Privacy Center consent preferences no longer save without a served notice history ID, which had broken consent reporting linkage. Saves that arrive without one are instrumented so the gap is visible.
- Bug Fixes:
- Region conflict errors on Privacy Experiences and Properties name the region ("Belgium") instead of the internal region code ("be").
Astralis
AI-assisted privacy assessments, access policies, and purpose-based access control
- Assessments v2 Foundation (Alpha): The groundwork for outcome-based assessments, behind the
alphaAssessmentsV2flag — the shared assessment types and requirement lifecycle used across privacy frameworks, five new tables (framework, framework assessment type, source snapshot, mandated requirement, requirement rule detail), a framework-content repository with frozen entities and fail-closed vocabulary validation, and read-only access to managed framework content (GDPR, EU AI Act) seeded on startup. A read-only catalog is exposed atGET /api/v1/plus/frameworks, whose jurisdictions are expressed as locations and location groups — the same vocabulary as privacy-notice regions — so a catalog can be scoped against an organization's own location selections. A statement-based assessment detail page ships behind an alpha flag. Includes database migrations. - Assessment Engine (Alpha): A Temporal-backed assessment engine with a dedicated worker (
fides assessment-worker) polling its ownfides-assessmentstask queue. - Astralis Interface: The Astralis app renders its own design-system type scale, cards, tags, and alerts at their designed elevation, with a magnetic side navigation, a restructured dimension-led information architecture, and an agentic briefing on the home page. The Ethyca logo is consolidated into fidesui and adopted across admin-ui, privacy-center, and Astralis.
- Bug Fixes:
- The access control violation rate measures all evaluated queries rather than only recorded violations.
- Astralis renders the correct light/dark theme on the server from a cookie, removing the initial theme flash and the hydration warning; admin-ui remembers the selected theme across reloads.
Integrations
- ShipHero: Available as a SaaS connector supporting access requests.
- Bug Fixes:
- Integration forms mask only the connector params marked sensitive after create, instead of starring out every field.
Fides core
- Multi-Organization Scoping: The bulk of this release. Deployments running Advanced RBAC with the multi-org feature flag can place users in an organization hierarchy and have reads scoped to the organizations they can reach; deployments without both are unchanged. This slice covers:
- Attribution: privacy requests are tagged with an organization at intake through a single attribution funnel — the organization already on a resubmitted request, an explicit organization from a caller who can reach it, the property the request arrived through, the property behind a consent request, then the caller's active organization, falling back to the root organization. None of the caller-supplied inputs can widen an authenticated caller's access. Anonymous Privacy Center intake still takes its organization from the property. A request whose organization cannot be derived is still created and visible, with the fallback recorded as a warning on its execution logs. Requests also keep a durable record of the organization they were handled under, so reports over past periods don't change when a request is re-tagged.
- Read enforcement: systems, the privacy-request surface (list, search, CSV export, bulk selection, and the per-request detail, execution log, task, manual-webhook, access-result, and review/resume/delete routes), the generated privacy-request child routes (comments, attachments, manual-field submit/skip, task completion), privacy assessments, the consent layer (notices, experiences, TCF configurations and publisher restrictions, preference and served-notice reporting, the consent metrics dashboard), and every Plus dashboard aggregate. Out-of-scope records read as absent.
- Hierarchy and membership: an organization grant on a parent covers its descendants during permission evaluation, org-scoped role assignments are validated against real organizations, and the hierarchy is protected by cycle prevention on reparent, a delete guard for organizations with children, and sibling-name uniqueness.
- Operational plumbing: an organization switcher in the nav that sets the active organization and sends it as the
X-Fides-Organizationheader (the backend returns 403 when the header names an unreachable organization), organization context propagated into Celery workers, org-scoped DSR policy names with baseline policy inheritance from parent organizations and per-policy locking, organization as a selectable field in DSR policy conditions, properties carrying an organization key with an organization picker in the editor, and a historical DSR import that honors a per-recordorganization_fides_keyfor organizations the importing admin can already reach. - Includes database migrations. See the Notes below for the read-only caveat on consent isolation.
- Security:
cryptographybumped 48.0.1 → 50.0.0 (with a requiredpyOpenSSL26.2.0 → 26.4.0 co-bump), fixing a PKCS#7 Bleichenbacher oracle and two X.509 advisories (CVE-2026-69247, CVE-2026-69249, CVE-2026-69248).aiohttpbumped 3.14.1 → 3.14.3, fixing a DoS and two WebSocket advisories (CVE-2026-69244, CVE-2026-69243, CVE-2026-59881).pypdfbumped 6.14.2 → 6.16.1, fixing two DoS advisories in PDF text extraction (CVE-2026-71852, CVE-2026-71870).- Privacy-request fuzzy search skips the cross-org identity automaton when a restricted organization scope was resolved but not passed to the query builder.
- The manual-task custom privacy-request field-name catalogue and the row loads behind bulk actions are organization-scoped.
- Bug Fixes:
- Dashboard posture no longer reports a stale snapshot as a day-over-day change — the score diff compares only against a snapshot from the last week, so a deployment whose snapshot writes have paused reads as unchanged instead of showing weeks of accumulated drift as today's movement.
- Bulk DSR policy PATCH could silently update another organization's policy by key; it is now refused with the same 404 wording as the by-key routes.
- Requests from the same data subject in different organizations are no longer treated as duplicates of each other. Duplicate groups are re-keyed once on upgrade.
- The search icon is centered in the collapsed admin UI side navigation.
- Removed: the unused standalone purpose-evaluation API and its in-process evaluation service.
Database schema & data changes
- This release includes database migrations for organization attribution across the governance, taxonomy, and operational tables (privacy requests, connection configs, dataset configs, policies, properties, privacy assessments, the consent layer, and DSR policy names), the organization hierarchy integrity constraints, dataset promotion provenance and its backfill, native
data_usesanddata_subjectson datasets, the five assessments v2 framework tables, pre-approval webhook dispatch tracking, and the privacy-request duplicate-group re-key.
Notes
- Multi-org consent isolation is read-only for now. The consent slice enforces organization isolation on reads. Per-organization write authorization — blocking edits and deletes across organizations — is a fast-follow. Treat multi-org consent isolation as read-only until it lands.
- The v3 consent API returns
nullfornotice_history_id. Preferences with no notice history (those created by a propagation policy or the default mechanism) returnnullinstead of an empty string. The response schemasSourcePreferenceandPreferenceFidesMetaare renamed toSourcePreferenceResponseandPreferenceFidesMetaResponsein the OpenAPI spec. API consumers reading either should be updated. - Policy webhooks now require a name. Automation that creates policy webhooks without one will be rejected.
- Property names are unique per organization, not deployment-wide. Two organizations can each own a property called "Website", and a name collision no longer reveals that another organization already uses that name. Existing property names are unaffected.
- Website discovery monitors reject invalid locations. Locations must be valid country codes. Legacy monitors carrying invalid entries fail with a 400 on execution until they are corrected.
- Polling access-manifest writes are off by default. Enable
execution.polling_access_manifest_enabledto turn the pointer-manifest storage format on.