Audit log lookup (HIPAA pulls)
Outcome
You can answer the question "who looked at this member's record between dates A and B" — for HIPAA accounting-of-disclosures requests, breach investigations, or routine compliance audits — and export the result as PDF or CSV with a clean chain of custody.
Prerequisites
| Scope | What it lets you do |
|---|---|
security.audit.read | Read the audit log |
security.audit.export | Export PDF / CSV |
security.audit.read.phi | See the specific PHI field that was viewed (not just the fact of access) |
The audit log is append-only; rows are never edited or deleted, only added.
What is recorded
Every PHI-touching read and every member-record mutation is recorded:
| Event type | When it fires |
|---|---|
member.read | A user opens a member detail page. |
member.read.phi | A user views a redacted-by-default field (SSN, full DOB). |
member.update | Demographics, coverage, or documents change. |
claim.read | A user opens a claim detail page that includes member PHI. |
document.read | A user previews a clinical document. |
document.upload | A document is uploaded or replaced. |
eligibility.run | A 270 is sent for the member. |
auth.read / auth.update | Authorization access. |
report.export | A report or dashboard view is exported. |
Platform staff impersonating into your tenant always carry an extra attribute on the audit row identifying both the impersonating MedSuite user and the tenant user account they assumed.
Steps
Open
Configuration → Audit Logat/admin/audit-log. The default view shows the last 24 hours of activity, most-recent first.Apply filters:
Filter Use case Member Lookup by MRN or member name — narrows to a single subject. Actor Narrows to one staff member. Date range Required for HIPAA accounting; default is "last 24h". Event type member.read,claim.read, etc.Source IP Narrow by network origin (e.g., to confirm an event came from in-office). Review the rows. Each row shows when, who, what (event type), member subject, and the source IP. Click a row to see the before/after JSON for any mutation, or the exact PHI field viewed for a
*.read.phievent.Export with
Export PDForExport CSV. The export carries:- A header naming the tenant, the requestor, the filter window, and the query timestamp.
- A row count.
- Every visible row at the time of export.
The export is itself audited: a
report.exportrow goes into the audit log naming the user, the filter window, and a SHA-256 digest of the exported file.
HIPAA accounting-of-disclosures workflow
A member (or their representative) is entitled by HIPAA to a list of disclosures of their PHI for the prior 6 years. To produce one:
Filter by Member = the requesting member.
Set Date range =
today − 6 yearstotoday, or the window the member specified.Set Event type = check
member.read.phi,document.read,report.export, and any disclosure-class events your privacy officer defines.Export PDF. Hand to the privacy officer with the standard cover letter. Retain the SHA-256 digest with the case file.
Validation
| Check | Expected |
|---|---|
| Filtered list matches the case scope | Yes — every row references the member, falls in the date window. |
| Export includes the row count printed in the header | Yes. |
report.export row appears in the audit log immediately after | Yes — confirms the export is itself accounted for. |
| File digest matches the cover letter | Yes — recompute with shasum -a 256 export.pdf. |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Filter returns 0 rows | Date range too narrow, or actor filter too restrictive | Widen the range; remove unneeded filters. |
| Cannot see the specific PHI field that was viewed | Missing security.audit.read.phi scope | Have a teammate with the scope retrieve the detail; or request the scope. |
| Export PDF shows fewer rows than the UI | Export is paginated; default cap is 10,000 rows | Narrow the filter; or run multiple exports per case. |
| Impersonation row missing impersonator info | Pre-2026 audit row from before impersonation tracking shipped | These rows are flagged in the UI; consult your platform admin. |
Cross-references
- Member detail walkthrough — every read on a detail page produces an audit row.
- Status reference — for the meaning of
status fields shown on
member.updatebefore/after diffs.