Skip to main content

HIPAA Compliance

Compliance posture is yours to configure — Devotel Orbit defaults open. HIPAA mode is an opt-in, per-organization toggle for organizations that handle Protected Health Information (PHI): a workspace owner turns it on, and it stays off unless you ask for it. Devotel never mandates HIPAA mode or decides that your traffic is “compliant” — enabling the toggle activates Orbit’s BAA-gated safeguards, and the gates it opens are tenant controls you operate. This document describes the technical and administrative controls that apply when HIPAA mode is enabled.

Overview

HIPAA mode is an opt-in, per-organization toggle — not a platform-mandated posture. Only a workspace owner can switch it, the toggle is off until you act, and it is BAA-gated: it activates (or relaxes) a set of enhanced controls, and no send or access carries PHI-specific rules unless you have opted in:
  1. Encryption at Rest — PHI encrypted at rest with Google-managed AES-256 (Cloud SQL default)
  2. Access Controls — PHI access restricted to designated roles
  3. Audit Logging — All PHI access logged with reason codes
  4. Data Retention — Automatic deletion after configured retention period
  5. BAA Tracking — Business Associate Agreement status management
The HIPAA_BAA_REQUIRED and HIPAA_BAA_INVALID envelopes you can receive desk-side are document-level tenant controls you opt into and own — the same verdict and fail-closed behavior described under BAA — the HIPAA send gate. They are not platform mandates.

Who can do what

HIPAA controls are assigned to roles, so you can map each surface to the people in your workspace. (These columns match the prose in the sections below.)

Prerequisites

Before enabling HIPAA mode, organizations must:
  1. Sign a Business Associate Agreement (BAA) with Devotel
  2. Designate a HIPAA compliance officer within their team

Technical Controls

1. Encryption at Rest

All PHI — including message body, media_url, and metadata — is encrypted at rest using Google-managed AES-256 keys (Cloud SQL default encryption):
  • Algorithm: AES-256 (Google Cloud default at-rest encryption)
  • Key Management: Encryption keys are managed and rotated by Google Cloud
  • Scope: All database-stored content, including message body, media_url, and metadata
  • In transit: TLS 1.3 protects all data in transit (see Infrastructure Safeguards)
Note: Devotel does not currently perform per-organization application-layer encryption of message bodies. PHI confidentiality at rest relies on Google Cloud’s transparent AES-256 encryption rather than an application-layer cipher. The GET /settings/hipaa response includes an encryption_algorithm field for reporting purposes only — it does not indicate that message bodies are individually encrypted at the application layer.

2. Access Controls

Message-content reads are governed by workspace membership and, for API keys, by the messages:read / messages:write scope. Every read is recorded in the PHI audit log. The table below reflects who can read message content today: The billing role is limited to financial surfaces — billing, pricing, and usage insights — and cannot read message content. Every other role, including viewer, can read message content, and each access is written to the PHI access log. Reason codes are stored on every PHI access-log entry. Reads through GET /messages and GET /messages/{id} are recorded with an automatic read reason. The categories below describe the access reasons used elsewhere in the platform when an operator supplies one explicitly:
  • treatment — Access required for patient treatment coordination
  • payment — Access required for payment processing
  • operations — Access required for healthcare operations
  • legal — Access required for legal compliance
  • support — Access required for customer support resolution
Known limitation: Orbit does not currently restrict message-content reads to a narrower set of roles beyond the billing confinement above, and it does not require an operator-supplied reason code on the message read endpoints (GET /messages, GET /messages/{id}). To meet the HIPAA minimum necessary standard, provision workspace membership and API-key scopes so that only staff who need PHI can reach these endpoints. If your program requires per-role read restriction on message content, contact compliance@devotel.io before relying on it.

3. PHI audit log

Every access to PHI-containing data generates an audit log entry. This log is one row in the processing-records catalog your organization maintains — the Data Processing Agreement page is the upstream catalog of those records and of the attestations that bind them:
The PHI access log:
  • Is append-only and cannot be modified or deleted
  • Retains up to 10,000 entries per organization (oldest entries are automatically rotated)
  • Is accessible to owner and admin roles via the dashboard or API
  • Can be exported for external compliance audits
API Endpoint: GET /api/v1/settings/hipaa/phi-access-log

4. Data Retention

When HIPAA mode is active, data retention is enforced:
  • Default retention period: 365 days (configurable: 30–3,650 days)
  • Scope: Message content, call recordings, media attachments
  • Mechanism: Automated background job scans for expired records and securely deletes them
  • Exceptions: Audit logs and PHI access logs are retained independently of the data retention policy
Configuration: Via dashboard at Settings → Compliance → HIPAA → Data Retention or via API:
Enabling HIPAA mode is a single call — it tightens the workspace’s security posture, so no re-authentication challenge is required (a signed BAA is still mandatory; see below). Disabling HIPAA mode is destructive and requires the two-step re-auth flow described in Disabling HIPAA Mode.

5. BAA status lifecycle

Devotel tracks BAA status per organization on a canonical baa_status lifecycle:
  • not_required — the organization has attested that no PHI is in scope (the default)
  • pending — PHI is in scope and the BAA is awaiting execution
  • executed — the BAA has been signed and is within its term
  • expired — an executed BAA has passed its one-year term and must be re-executed
Each executed BAA records its template version, signer name and email, execution timestamp, and term expiry. Requirement: HIPAA mode cannot be enabled until baa_status is executed. Attempting to enable HIPAA mode before then returns a 403 Forbidden error, and any PHI send is rejected with 422 HIPAA_BAA_REQUIRED. The send-time gate’s verdict and its fail-closed behaviour are documented under BAA — the HIPAA send gate.

Executing the BAA

Execute the BAA through the /api/v1/compliance/baa endpoints. This is the flow the dashboard’s Compliance → BAA pane uses, and the only flow that satisfies the HIPAA-enable and PHI-send gates.
  1. Check the current stateGET /api/v1/compliance/baa/ returns baa_status, the signer details, and days_until_expiry (owner/admin).
  2. Attest that PHI is in scopePOST /api/v1/compliance/baa/require sets hipaa_required and moves a not_required organization to pending so the execute step opens (owner only). This starts the flow; it does not enable HIPAA mode.
  1. Execute the BAAPOST /api/v1/compliance/baa/execute records the agreement with a type-the-name click-wrap e-signature (owner only). The typed_attestation must exactly match signer_name. On success the organization is stamped executed with the signer, version, and date, which unblocks PHI sends and lets you enable HIPAA mode.
To review the agreement before signing, call GET /api/v1/compliance/baa/template.
Legacy endpoint: PUT /api/v1/settings/hipaa/baa (body { signed, signed_at, document_url }) writes an older JSONB status mirror and is a fallback for pre-migration tenants only. Once an organization has a baa_status value, the HIPAA-enable and PHI-send gates read that canonical column and ignore this mirror — so a signed: true write here does not unblock sends or HIPAA mode. Use POST /api/v1/compliance/baa/execute instead.

PHI-Adjacent Audience Registry

The PHI-adjacent audience registry is an organization-level register of contact-list and segment ids whose members carry PHI — for example, patients opted into treatment outreach. Designation belongs on the audience itself, not on any individual campaign: an audience is PHI-adjacent because of its source data, so the designation follows it regardless of which campaign picks it up. When HIPAA is in scope for your organization (hipaa_required set via the BAA flow) and a campaign’s audience resolves to a designated list or segment id, the campaign launch precheck refuses the launch until your BAA is executed and in-term. API: GET /api/v1/compliance/hipaa/phi-audiences returns the current registry scoped to your organization. PUT /api/v1/compliance/hipaa/phi-audiences replaces the registry in a single write. Both endpoints require the owner or admin role — the same gate used for the BAA endpoints. Reading the registry:
Replacing the registry:
The PUT is a full replacement of the designated ids — there is no DELETE endpoint. To lift a designation, PUT the registry without that id; to re-designate, PUT it with the id added back. Each element is an audience id string (1–128 characters), up to 500 ids per organization. A PUT with an empty audience_ids array clears the registry. Every replacement is written atomically (a concurrent GET never sees a partial update) and recorded in the audit log.
Note: The registry is your organization’s attestation of which audiences contain PHI. It is tenant-owned: Devotel never designates audiences on your behalf, and the designation only takes effect once HIPAA is in scope for your organization.

Campaign Launch Precheck

Campaigns have two HIPAA gates at different points in the flow:
  1. Launch precheck (campaign-level, hard gate). Before a campaign leaves the draft/scheduled state, the launch precheck resolves its audience against the registry. If the audience is a designated list or segment and your organization’s BAA is not executed and in-term, the launch is refused with 422 HIPAA_BAA_REQUIRED. This keeps a PHI cohort out of campaign enrollment instead of burning wallet credit on thousands of per-recipient refusals. If the compliance state cannot be read, the precheck fails closed (500 HIPAA_BAA_GATE_DB_FAIL) rather than silently admitting a PHI audience.
  2. Send gate (per-recipient, existing behavior). The per-recipient send gate documented under BAA — the HIPAA send gate still applies at message time and is unchanged.
The precheck evaluates the same BAA rules as the per-recipient gate, so the two never disagree about what “BAA in-term” means. Dashboard surface: in the campaign wizard’s audience step, choosing a designated list or segment shows an advisory warning — “This audience is designated as PHI-adjacent. Launch requires an executed Business Associate Agreement (BAA) — check its status under Settings → Compliance → BAA.” The warning is advisory: it does not block the Next button, because the designation may be lifted (or the BAA executed) before you actually launch. The hard gate is at launch. The refusal response:
Operator sequence — a launch refused by the precheck:
  1. Compose the registryPUT /api/v1/compliance/hipaa/phi-audiences with the list/segment ids that contain PHI.
  2. Verify the block — attempt the launch against a designated audience; expect 422 HIPAA_BAA_REQUIRED while the BAA is not executed/in-term.
  3. Resolve the BAA — execute (or re-execute an expired) BAA via POST /api/v1/compliance/baa/execute as described in Executing the BAA.
  4. Relaunch — once the BAA is executed and in-term, the precheck passes and the campaign launches normally.
Limits:
  • The registry governs campaign launches only. Legacy one-off per-recipient sends are still governed by the per-recipient send gate, which does not consult the registry.
  • Only list- and segment-type audiences resolve against the registry at launch. Audiences assembled per contact (all contacts, CSV, manual entry) are evaluated recipient-by-recipient at send time instead.
  • The wizard’s PHI-adjacent warning is advisory on the audience picker; enforcement lives at launch.

6. Disabling HIPAA Mode

Disabling HIPAA mode is a destructive, audit-sensitive transition: it clears the covered-entity flag, the BAA link, and the strict retention floor on a workspace that may hold PHI. To prevent this from happening on a stolen browser session, disabling requires a fresh re-authentication challenge. (Enabling HIPAA mode does not — it only tightens posture.) Disabling is therefore a two-step flow: Step 1 — Mint a single-use re-auth challenge token:
The response returns a short-lived (5-minute), single-use token:
Step 2 — Send the disable request with the X-Reauth-Challenge header set to that token:
The token must be redeemed within 5 minutes and can be consumed only once. If the X-Reauth-Challenge header is missing, malformed, or expired, the disable request is rejected with 401 REAUTH_REQUIRED:
Note: The re-auth challenge gates only the enable → disable transition. Enabling HIPAA mode, and retention-only updates submitted while HIPAA mode is already disabled, do not require the header.

API Reference


Dashboard Configuration

HIPAA settings are available in the dashboard under Settings → Compliance:
  1. HIPAA Mode Toggle — Enable/disable HIPAA mode (requires BAA)
  2. BAA Section — Execute the BAA (type-the-name e-signature) and track its status, signer, and term expiry
  3. Data Retention — Configure automatic data deletion period
  4. PHI Access Log — View and export PHI access audit trail
  5. PHI-Adjacent Audiences — Designate which contact lists and segments carry PHI; the campaign wizard warns on designated audiences and the launch precheck enforces the BAA gate

Infrastructure Safeguards

Beyond application-level controls, Devotel’s infrastructure provides:
  • Cloud SQL Encryption: All database storage encrypted with AES-256 by Google Cloud
  • TLS 1.3: All data in transit encrypted with TLS 1.3
  • VPC Isolation: Database accessible only via private IP within the VPC
  • No Privileged Containers: GKE Autopilot prevents privileged container execution
  • Secret Manager: All encryption keys and credentials stored in GCP Secret Manager
  • Audit Trails: Google Cloud Audit Logs for infrastructure-level access tracking

Voice & Video Transcript PII/PHI Redaction

Live captions, call transcripts, and post-call transcripts are generated by Devotel’s speech-to-text subprocessor with PII/PHI redaction enabled by default. Sensitive numerics — credit-card numbers, social-security numbers, and similar — are masked at the source, before any transcript text is stored or written to logs. For HIPAA organizations, this means PHI spoken on a call is redacted before it is persisted.

Redaction is on by default

Transcript redaction is enabled by default and cannot be turned off from your dashboard or API. Turning it off is a deployment-wide change Devotel makes only for archival-compliance verticals (for example, legal or healthcare) that are contractually required to retain raw, unredacted transcripts under their own safeguards and BAA.
Warning: Because this control applies to a whole deployment rather than a single organization, it cannot be scoped to one workspace. If your deployment handles PHI, redaction should stay enabled — confirm its status in writing with your Devotel contact as part of your BAA before you store any PHI.
If raw-transcript retention was ever enabled for your deployment, transcripts captured during that window were stored unredacted and are not masked retroactively. Review and purge them per your retention policy if they contain PHI, and ask Devotel to confirm redaction is re-enabled for all transcripts going forward.

Shared Responsibility

HIPAA compliance is a shared responsibility between Devotel and the customer:

Incident Response

In the event of a suspected PHI breach:
  1. Devotel’s security team is notified within 1 hour via automated alerting
  2. Affected organizations are notified within 24 hours per HIPAA Breach Notification Rule
  3. PHI access logs are immediately preserved and exported for forensic analysis
  4. Remediation steps are documented and shared with affected parties

  • DLP scanner — the send-time control that flags regulated data crossing an outbound message
  • Pre-send policy scanner — the verdict and enforcement mode this control feeds

Last updated: September 2026 For questions about HIPAA compliance, contact: compliance@devotel.io