admin

List Audit

What platform staff have done, newest first.

Two filters, because they are the two questions that follow "what happened": what was done to this customer, and every time this kind of thing was done. Filtering by actor is available in the library and not published here — the screen has no picker for it, and an endpoint nothing calls is an endpoint nothing checks.

get/api/admin/audit

Request

  • Base URL: https://api.heymetra.com (the document declares no server; this is the origin it was published from)
  • URL: https://api.heymetra.com/api/admin/audit
  • Auth: none declared

Query parameters

action'skill.create' | 'skill.import' | 'skill.update' | 'skill.delete' | 'enterprise.grant' | 'enterprise.edit' | 'enterprise.checkout' | 'module.set' | 'module.reset'

What a superadmin did, as the audit trail names it (ZEISO-302).

A closed vocabulary rather than free text. An audit table whose action column is whatever the last caller typed cannot be filtered, cannot be counted, and cannot be read a year later by somebody who does not know which spellings were in use that month.

The rule for membership: an action belongs here when it changes what a customer gets or sees. That is why feedback triage is absent — moving a note from new to triaged changes nothing on the customer's side, and it is also the highest-volume thing staff do here, so logging it would bury the four actions that matter. tests/test_admin_audit.py enumerates the router and fails if a new writing endpoint is neither audited nor deliberately excluded.

The names are subject.verb so that filtering by prefix is filtering by subject, and they are persisted as strings: adding one is a code change, not a migration that rewrites a type.

tenant_idstring uuid nullable
limitinteger

Headers

authorizationstring nullable
x-workspace-idstring nullable

Response

Successful Response

idstring uuid required
created_atstring date-time required
actor_user_idstring required
actor_emailstring nullable required
action'skill.create' | 'skill.import' | 'skill.update' | 'skill.delete' | 'enterprise.grant' | 'enterprise.edit' | 'enterprise.checkout' | 'module.set' | 'module.reset' required

What a superadmin did, as the audit trail names it (ZEISO-302).

A closed vocabulary rather than free text. An audit table whose action column is whatever the last caller typed cannot be filtered, cannot be counted, and cannot be read a year later by somebody who does not know which spellings were in use that month.

The rule for membership: an action belongs here when it changes what a customer gets or sees. That is why feedback triage is absent — moving a note from new to triaged changes nothing on the customer's side, and it is also the highest-volume thing staff do here, so logging it would bury the four actions that matter. tests/test_admin_audit.py enumerates the router and fails if a new writing endpoint is neither audited nor deliberately excluded.

The names are subject.verb so that filtering by prefix is filtering by subject, and they are persisted as strings: adding one is a code change, not a migration that rewrites a type.

subject_type'workspace' | 'module' | 'skill' required

What an admin action was done to.

Three, because the id in subject_id is three different kinds of thing: a workspace uuid, a connector key, a skill uuid. Storing the kind beside it is what lets a reader (and a query) tell them apart without guessing from the shape of the string.

subject_idstring required
subject_labelstring nullable required
tenant_idstring uuid nullable required
beforeobject nullable required
afterobject nullable required

Changes

No recorded changes to this operation across all 3 revisions of this API.