GDPR API

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

View as Markdown

Base URL https://api.brixsignage.com. Send Authorization: Bearer $BRIX_API_KEY unless an operation says No auth. The permission chip names what the key must hold. See Authentication and scopes, Errors and rate limits and Pagination.

POST/v1/gdpr/erase

Bearer token user.edit

Permanently anonymizes a user's profile and deletes their associated personal data, including linked identities, passkeys, sessions, and pending email verifications, to satisfy a right-to-be-forgotten request. You cannot erase your own account or the last remaining account owner. Only an account owner can do this to an owner, and you cannot do it to a person who holds a permission you do not hold. An API key is never an owner. **Notes.** - Irreversible. Unlike POST /v1/users/:id/erase, the person does not have to be deactivated first.

Request body application/json

FieldTypeRequiredDescription
userIdstringyes
curl -X POST "https://api.brixsignage.com/v1/gdpr/erase" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataobject
data.userIdstring
data.erasedtrue

Response 401 Missing, expired or revoked bearer token.

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.

Response 403 You do not hold the permission for the whole workspace (a grant at one location, or in a franchise workspace, is not enough). Also `owner_required` or `outranked`: the person is an owner, or holds a permission you do not hold.

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.

Response 404 No such person in this workspace.

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.

Response 409 `cant_erase_self` or `last_owner`.

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.

Response 422 `userId` is missing.

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.

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

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/gdpr/export

Bearer token billing.edit

Assembles a data subject access request export for the whole workspace: every person, screen and piece of content, and the last 365 days of the activity log, as one JSON file with secret values withheld. The key or person must have billing.edit for the whole workspace. Each table is capped; complete is false when one was cut. **Notes.** - Exports the whole workspace, not one person: every person, screen and piece of content, and the last 365 days of the activity log. - No { data } envelope: the body is the export file (Content-Disposition: attachment). - Credentials are never exported: their columns are kept with null or a [secret; not exported] / [encrypted; not exported] marker.

curl "https://api.brixsignage.com/v1/gdpr/export" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
schemaVersion1
generatedAtstringISO-8601 timestamp (UTC).
subjectobject
subject.spaceIdstringThe workspace exported.
subject.requestedByUserIdstring | nullNull for an API key.
limitsobject
limits.perTableintegerAt most this many rows per table.
limits.auditEventsintegerAt most this many activity log events.
limits.auditWindowDaysintegerActivity log events from this many days back.
truncatedobjectThe tables cut at the limit; empty when none.
completebooleanFalse when a table was cut at the limit.
tablesobject
tables.workspaceobject | nullThe workspace record, every column (the Screen Lock PIN hash replaced by `kioskHasGlobalPin` inside `prefs`).
tables.usersarray of object
tables.users[].idstring
tables.users[].namestring
tables.users[].emailstring
tables.users[].titlestring | null
tables.users[].phonestring | null
tables.users[].statusstring
tables.users[].lastLoginAtstring | null
tables.users[].emailVerifiedAtstring | null
tables.users[].createdAtstringISO-8601 timestamp (UTC).
tables.users[].updatedAtstringISO-8601 timestamp (UTC).
tables.users[].deletedAtstring | null
tables.screensarray of objectEvery column; credentials withheld, and `kioskHasCustomPin` / `kioskHasRecovery` added.
tables.mediaarray of object
tables.playlistsarray of object
tables.schedulesarray of object
tables.layoutsarray of object
tables.creativesarray of object
tables.appInstancesarray of object
tables.dataSourcesarray of object`config` is `[encrypted; not exported]` (or null).
tables.bannersarray of object
tables.auditEventsarray of objectNewest first.

Response 401 Missing, expired or revoked bearer token.

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.

Response 403 You do not hold the permission for the whole workspace (a grant at one location, or in a franchise workspace, is not enough).

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.

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

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.

POST/v1/gdpr/export

Bearer token billing.edit

Same as the GET version of this operation: assembles a data subject access request export for the whole workspace as one JSON file, with secret values withheld. The key or person must have billing.edit for the whole workspace. Takes no request body. **Notes.** - Exports the whole workspace, not one person: every person, screen and piece of content, and the last 365 days of the activity log. - No { data } envelope: the body is the export file (Content-Disposition: attachment). - Credentials are never exported: their columns are kept with null or a [secret; not exported] / [encrypted; not exported] marker. - Takes no body; the same export as the GET.

curl -X POST "https://api.brixsignage.com/v1/gdpr/export" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
schemaVersion1
generatedAtstringISO-8601 timestamp (UTC).
subjectobject
subject.spaceIdstringThe workspace exported.
subject.requestedByUserIdstring | nullNull for an API key.
limitsobject
limits.perTableintegerAt most this many rows per table.
limits.auditEventsintegerAt most this many activity log events.
limits.auditWindowDaysintegerActivity log events from this many days back.
truncatedobjectThe tables cut at the limit; empty when none.
completebooleanFalse when a table was cut at the limit.
tablesobject
tables.workspaceobject | nullThe workspace record, every column (the Screen Lock PIN hash replaced by `kioskHasGlobalPin` inside `prefs`).
tables.usersarray of object
tables.users[].idstring
tables.users[].namestring
tables.users[].emailstring
tables.users[].titlestring | null
tables.users[].phonestring | null
tables.users[].statusstring
tables.users[].lastLoginAtstring | null
tables.users[].emailVerifiedAtstring | null
tables.users[].createdAtstringISO-8601 timestamp (UTC).
tables.users[].updatedAtstringISO-8601 timestamp (UTC).
tables.users[].deletedAtstring | null
tables.screensarray of objectEvery column; credentials withheld, and `kioskHasCustomPin` / `kioskHasRecovery` added.
tables.mediaarray of object
tables.playlistsarray of object
tables.schedulesarray of object
tables.layoutsarray of object
tables.creativesarray of object
tables.appInstancesarray of object
tables.dataSourcesarray of object`config` is `[encrypted; not exported]` (or null).
tables.bannersarray of object
tables.auditEventsarray of objectNewest first.

Response 401 Missing, expired or revoked bearer token.

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.

Response 403 You do not hold the permission for the whole workspace (a grant at one location, or in a franchise workspace, is not enough).

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.

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

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.