Audit API

Audit endpoints in the Brix REST API for digital signage: 5 operations (GET, POST). Each lists its path, auth, required permission and a curl example.

View as Markdown · For AI agents: the full docs index is at /llms.txt

Base URL https://api.brixsignage.com. Send Authorization: Bearer $BRIX_API_KEY unless an operation says Auth: none or Auth: no API key. The Permission line names what the key must hold. See Authentication and scopes, Errors and rate limits and Pagination.

Every 4xx and 5xx response below returns this body:

FieldTypeDescription
errorstringMachine-readable code: unauthorized, forbidden, not_found, validation_error, conflict, rate_limited, internal_error, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET /v1/audit

Auth: Bearer token. Permission: audit-log.view.

Returns the workspace's append-only activity log, newest first, with each event's actor shown by name rather than raw id, whether the actor was a person, an API key, or the system. Page with limit and cursor; nextCursor sits beside data. There are no filters: use the export for a time window. A caller limited to some locations sees only the events at those locations. Notes. - Newest first. There are no filters: page with cursor. - A caller limited to some locations sees only events at those locations, so a page can hold fewer than limit events while nextCursor is still set.

ParameterInTypeRequiredDescription
limitqueryintegernoPage size (default 200, max 500).
cursorquerystringnonextCursor of the previous page.
curl "https://api.brixsignage.com/v1/audit" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataarray of AuditEvent
data[].idstring
data[].atstringISO-8601 timestamp (UTC).
data[].workspaceIdstring
data[].actorstringuser:<id>, apikey:<id>, system, staff (our support team), or another internal actor.
data[].actorKind"user" | "api-key" | "system" | "brix-support" | "support"Our support team made the change: support in a workspace a white-label partner owns, brix-support otherwise.
data[].actorNamestringThe person's or key's name; System for the system; the support team's name for support / brix-support.
data[].actorEmailstringThe person's email; n/a for a key; system@brix for the system (system in a white-label partner's workspace); empty for support / brix-support.
data[].actionstringWhat happened, e.g. screen.renamed.
data[].targetstring | nullThe id of the thing acted on.
data[].detailstring | null
data[].nodeIdstring | nullThe location the event belongs to; null for the workspace.
data[].nodeNamestring | null
data[].ipAddressstring | null
data[].userAgentstring | null
data[].via"mcp" | "api" | nullHow it arrived: mcp (an MCP tool such as Claude or ChatGPT), api (an API key on REST), null (in the Brix app).
data[].viaAppstring | nullThe connector or API key behind an mcp/api event; null for the app.
nextCursorstring | nullPass as cursor for the next (older) page; null on the last page.

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 5XX: Server error. The body carries a requestId to quote to support.

POST /v1/audit

Auth: Bearer token. Permission: audit-log.view.

Appends one client event to the workspace's activity log, for example that a help panel was opened. The action must be in the cms. namespace, so only events of that kind can be added this way. The actor is always the caller, never taken from the request body. The activity log is append-only: events can be added but never updated or deleted. Limited to 120 events a minute. Notes. - Needs only audit-log.view. The actor is always the caller; ipAddress and userAgent come from the request.

Request body: application/json

FieldTypeRequiredDescription
actionstringyesMust be in the cms. namespace: cms. then lower-case letters, digits, ., _ or - (up to 122 more characters).
targetstringno
detailstringno
nodeIdstring | nullnoA location you can see.
curl -X POST "https://api.brixsignage.com/v1/audit" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201: Success.

FieldTypeDescription
dataAuditEventOne activity log event, with the actor resolved to a name.
data.idstring
data.atstringISO-8601 timestamp (UTC).
data.workspaceIdstring
data.actorstringuser:<id>, apikey:<id>, system, staff (our support team), or another internal actor.
data.actorKind"user" | "api-key" | "system" | "brix-support" | "support"Our support team made the change: support in a workspace a white-label partner owns, brix-support otherwise.
data.actorNamestringThe person's or key's name; System for the system; the support team's name for support / brix-support.
data.actorEmailstringThe person's email; n/a for a key; system@brix for the system (system in a white-label partner's workspace); empty for support / brix-support.
data.actionstringWhat happened, e.g. screen.renamed.
data.targetstring | nullThe id of the thing acted on.
data.detailstring | null
data.nodeIdstring | nullThe location the event belongs to; null for the workspace.
data.nodeNamestring | null
data.ipAddressstring | null
data.userAgentstring | null
data.via"mcp" | "api" | nullHow it arrived: mcp (an MCP tool such as Claude or ChatGPT), api (an API key on REST), null (in the Brix app).
data.viaAppstring | nullThe connector or API key behind an mcp/api event; null for the app.

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 422: action is missing or outside the cms. namespace, or nodeId is not a location you can see.

Response 429: More than 120 events a minute.

Response 5XX: Server error. The body carries a requestId to quote to support.

GET /v1/audit/export

Auth: Bearer token. Permission: audit-log.view.

Returns the activity log as a feed suitable for a log collector or SIEM tool. Unlike the regular activity log listing, results are returned oldest first, so a collector can page forward from a saved position without missing or re-reading events. Returns newline-delimited JSON by default; pass ?format=json for a human-readable array. Use the from and to parameters for a half-open time window, and the x-brix-next-cursor and x-brix-has-more response headers to page through results. Notes. - Oldest first. The default body is NDJSON: one AuditEvent object per line. The next-page cursor is in the X-Brix-Next-Cursor header (empty on the last page) and X-Brix-Has-More is 1 or 0. - With format=json the body is JSON: { data: AuditEvent[], nextCursor: string | null }.

ParameterInTypeRequiredDescription
limitqueryintegernoPage size (default 500, max 1000).
cursorquerystringnoThe X-Brix-Next-Cursor header (or nextCursor) of the previous page.
fromquerystringnoISO-8601; events at or after this time.
toquerystringnoISO-8601; events before this time.
formatquery"json"nojson answers { data: AuditEvent[], nextCursor } instead of NDJSON.
curl "https://api.brixsignage.com/v1/audit/export" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 422: from or to is not an ISO-8601 timestamp.

Response 5XX: Server error. The body carries a requestId to quote to support.

GET /v1/audit/integrity

Auth: Bearer token. Permission: audit-log.view.

Returns the tamper-evidence chain for the workspace's activity log: a digest to record for later comparison, and the daily checkpoints behind it. Each complete UTC day of events is combined into one checkpoint linked to the day before. The current, still-open day is deliberately not yet included, since a checkpoint over data still being written would have to be recalculated.

ParameterInTypeRequiredDescription
limitqueryintegernoCheckpoints to return, newest first (default 90, max 400).
curl "https://api.brixsignage.com/v1/audit/integrity" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.latestDigeststring | nullThe value to record. Null before the first day is covered.
data.coveredThroughstring | nullThe end of the last covered day.
data.canonicalVersionstringThe newest row encoding the hashes use (3). Each checkpoint names its own in leafVersion.
data.notestring
data.checkpointsarray of object
data.checkpoints[].seqinteger
data.checkpoints[].periodStartstringISO-8601 timestamp (UTC).
data.checkpoints[].periodEndstringISO-8601 timestamp (UTC).
data.checkpoints[].rowCountinteger
data.checkpoints[].firstEventIdstring | null
data.checkpoints[].lastEventIdstring | null
data.checkpoints[].merkleRootstring
data.checkpoints[].leafVersionstring | nullThe row encoding this checkpoint's root was taken over. 3: every field escaped (backslash as \\, U+001F as \u) and joined on U+001F, via last. Null: a checkpoint written before version 3, whose rows are joined unescaped, each starting with its own version (1 with no via, 2 with via last).
data.checkpoints[].prevDigeststringThe previous checkpoint's digest, or genesis.
data.checkpoints[].digeststring

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 5XX: Server error. The body carries a requestId to quote to support.

POST /v1/audit/integrity/verify

Auth: Bearer token. Permission: audit-log.view.

Re-reads every event behind the integrity chain and recomputes it, to prove the activity log has not been altered since a digest was recorded. Returns HTTP 200 with ok: false when verification fails, rather than an error status, so a monitoring script can distinguish "the log was altered" from "the check itself failed". This is rate-limited because it re-reads the full log. Notes. - Answers 200 with ok: false when verification fails.

Request body: application/json

FieldTypeRequiredDescription
limitintegernoCheckpoints to check, newest first (default 90).
curl -X POST "https://api.brixsignage.com/v1/audit/integrity/verify" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.checkpointsarray of object
data.checkpoints[].idstring
data.checkpoints[].seqinteger
data.checkpoints[].periodStartstringISO-8601 timestamp (UTC).
data.checkpoints[].periodEndstringISO-8601 timestamp (UTC).
data.checkpoints[].storedRowCountinteger
data.checkpoints[].actualRowCountinteger
data.checkpoints[].recomputedRootstring | null
data.checkpoints[].rootMatchesboolean
data.checkpoints[].digestMatchesboolean
data.checkpoints[].chainIntactboolean
data.checkpoints[].okboolean
data.okbooleanFalse when any checkpoint failed: the log was changed.
data.latestDigeststring | null

Response 401: Missing, expired or revoked bearer token.

Response 403: The token lacks the permission this operation needs (see x-brix-permission).

Response 429: More than 10 checks in 5 minutes.

Response 5XX: Server error. The body carries a requestId to quote to support.