---
title: "Firm audit log (owner-only) · 0 credits"
method: GET
path: "/api/v1/firm/audit"
tags: ["Firm Management"]
---

# Firm audit log (owner-only) · 0 credits

`GET /api/v1/firm/audit`

## Request

- Base URL: `https://legal.nexusquantum.legal`
- URL: `https://legal.nexusquantum.legal/api/v1/firm/audit`
- Auth: HTTP bearer

Audit feed for your firm (member actions: invitations, role changes, removals…). Optional filters. Owner-only via the internal helper (`.eq(firm_owner_id, ownerId)`). No charge. Scope: mcp | *.

**Language.** This is a compliance record, so it is served in your firm's language, not in the language each route happened to be written in. Resolution order: `?locale=` > `Accept-Language` > the account holder's jurisdiction (SG → en, ES → es) > English. Never Spanish by default. The response declares `locale` and `locale_source` so you can see which signal decided it (`fallback` = there was no signal; it is not presented as a choice).

**Nothing is hidden.** Each line is translated from its stable `action` code, and the text stored when the event was logged is always kept in `summary_raw`. A line whose action has no label in the catalogue is served with its stored text VERBATIM and flagged `summary_localized:false` with `summary_unlocalized_reason` — it is neither translated nor dropped.

## Query parameters

- `actor` string, uuid
- `resource_type` string
- `before` string, date-time
- `limit` integer
- `locale` string

## Response `200`

{ locale, locale_source, events: [FirmAuditEvent] }

- object
  - `locale` string: Language the record was served in.
  - `locale_source` 'param' | 'cookie' | 'accept-language' | 'jurisdiction' | 'fallback': Which signal decided the language. `fallback` = none was available.
  - `events` FirmAuditEvent[]
    - `id` string, uuid
    - `created_at` string, date-time
    - `action` string: Action recorded (e.g. member.added, member.role_changed, invitation.revoked). Stable code — this is what the summary is translated from.
    - `actor_user_id` string, uuid, nullable: UUID of the member who performed the action.
    - `resource_type` string, nullable: Type of resource affected (member, invitation…).
    - `resource_id` string, nullable
    - `summary` string, nullable: Human-readable event summary, in the response `locale`. Falls back to the stored text when the action has no label (see summary_localized).
    - `summary_raw` string, nullable: The summary exactly as stored when the event was logged, in whatever language it was written. The canonical forensic trace — never rewritten.
    - `summary_localized` boolean: `true` = `summary` was translated from the `action` code. `false` = this line is NOT localized and carries the stored text verbatim; it is neither translated nor omitted.
    - `summary_source` 'action_label' | 'stored_text' | 'action_code': Where `summary` came from: the label catalogue, the stored free text, or the raw action code (no label and nothing stored).
    - `summary_unlocalized_reason` string, nullable: Present (non-null) only when `summary_localized` is false: why this line could not be localized, in the response `locale`.
    - `detail` string, nullable: Detail derived from the event METADATA (name, jurisdiction, via), not from prose in any language. `null` when there is nothing structured to show.

---

[API](https://skmtc.dev/nexusquantum/apis/nexus-legal-api.md) · [All operations](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nexusquantum/apis/nexus-legal-api/revisions/4084d8d4eb0b?raw)
