Proof API

Proof endpoints in the Brix REST API: 10 operations (GET, POST, DELETE). 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/proof

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

Get proof-of-play totals for a date range, broken down by content item and by screen, including digital-out-of-home verification fields. Use the from and to query parameters to set the date range. Counts what played, where and for how long, over a time window. Only screens the caller can see are counted.

ParameterInTypeRequiredDescription
fromquerystringnoWindow start (ISO-8601). Default: the start of the retention window.
toquerystringnoWindow end (ISO-8601). Default: now.
screenIdquerystringnoOnly this screen.
screenIdsquerystringnoOnly these screens: ids separated by commas.
contentIdsquerystringnoOnly this content: ids separated by commas. Totals count only this content.
detailquery"screens"noscreens adds byScreen: one row per content and screen.
curl "https://api.brixsignage.com/v1/proof" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataProofOfPlayReport
data.totalsobject
data.totals.playsintegerSuccessful plays (neither skipped nor failed).
data.totals.skippedinteger
data.totals.failedinteger
data.totals.eventsintegerEvery playback-end event: plays + skipped + failed.
data.totals.uniqueContentinteger
data.totals.screensReportinginteger
data.byContentarray of objectPer content, most successful plays first.
data.byContent[].contentIdstringunknown when the player did not report one.
data.byContent[].contentNamestringFalls back to the id when no name was reported.
data.byContent[].contentKindstringmedia, app, creative, …; media for days read from the daily rollup.
data.byContent[].screenNamestring | nullSet only when exactly one screen played it.
data.byContent[].playedinteger
data.byContent[].skippedinteger
data.byContent[].failedinteger
data.byContent[].screenCountinteger
data.byContent[].totalDurationSecinteger
data.byContent[].firstAtstringISO-8601 timestamp (UTC).
data.byContent[].lastAtstringISO-8601 timestamp (UTC).
data.screensarray of objectScreens that reported in the window, by name.
data.screens[].idstring
data.screens[].namestring
data.fromstringISO-8601 timestamp (UTC).
data.tostringISO-8601 timestamp (UTC).
data.retentionDaysintegerHow far back raw play events exist; older days come from the daily rollup.
data.truncatedbooleanAlways false: the whole window is counted.
data.fromRollupbooleanPart of the window was read from the daily rollup.
data.byScreenarray of objectWith detail=screens: one row per content and screen, by content name then screen name.
data.byScreen[].contentIdstring
data.byScreen[].contentNamestring
data.byScreen[].screenIdstring
data.byScreen[].screenNamestringThe screen id when the screen no longer exists.
data.byScreen[].playedinteger
data.byScreen[].skippedinteger
data.byScreen[].failedinteger
data.byScreen[].totalDurationSecinteger
data.byScreen[].playedDurationSecintegerThe part of totalDurationSec from finished plays (not skipped or failed). A day whose daily total has no split counts its total.
data.byScreen[].firstAtstringISO-8601 timestamp (UTC).
data.byScreen[].lastAtstringISO-8601 timestamp (UTC).

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.

GET /v1/proof/advertisers

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

Get proof-of-play totals for a date range, one row per advertiser and venue. An advertiser is a tag on files and designs. A venue is the location that a screen is in; a screen with no location counts at the workspace. Content with two advertiser tags counts for each tag. Use advertisers or advertiser to filter, and format=csv to download a file. Only finished plays count in the played time. An advertiser is a tag on files and designs. A venue is the location (org-tree node) a screen sits in; a screen with no location counts at the workspace. Content with two advertiser tags counts for each. With no advertisers filter, content with no tag is reported under an empty name. Only screens the caller can see are counted. format=csv returns a file with one row per advertiser and venue. Its finished_min and finished_sec columns and playedDurationSec count finished plays only; a skipped or failed play is not in them. For dates whose daily totals predate this change, they may include plays that did not finish.

ParameterInTypeRequiredDescription
fromquerystringnoWindow start (ISO-8601). Default: the start of the retention window.
toquerystringnoWindow end (ISO-8601). Default: now.
advertisersquerystringnoOnly these advertisers: tags separated by commas. Case does not matter.
advertiserquerystringnoOnly this one advertiser (a tag). Use it to get one advertiser's CSV.
screenIdsquerystringnoOnly these screens: ids separated by commas.
contentIdsquerystringnoOnly this content: ids separated by commas.
formatquery"json" | "csv"no
curl "https://api.brixsignage.com/v1/proof/advertisers" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataProofOfPlayByAdvertiser
data.fromstringISO-8601 timestamp (UTC).
data.tostringISO-8601 timestamp (UTC).
data.retentionDaysinteger
data.fromRollupbooleanPart of the window was read from the daily rollup.
data.advertisersarray of objectBy advertiser name; content with no tag comes last.
data.advertisers[].advertiserstringThe tag, as most of its files spell it. Empty for content with no tag.
data.advertisers[].playedinteger
data.advertisers[].skippedinteger
data.advertisers[].failedinteger
data.advertisers[].totalDurationSecintegerAll plays, with skipped and failed plays.
data.advertisers[].playedDurationSecintegerFinished plays only: the report's minutes. A day whose daily total has no split counts its total.
data.advertisers[].screensintegerDistinct screens, each counted once.
data.advertisers[].venuesinteger
data.advertisers[].adsintegerDistinct files and designs.
data.advertisers[].firstAtstringISO-8601 timestamp (UTC).
data.advertisers[].lastAtstringISO-8601 timestamp (UTC).
data.advertisers[].byVenuearray of object
data.advertisers[].byVenue[].venueIdstringThe location's id. Empty when the screen no longer exists.
data.advertisers[].byVenue[].venueNamestring
data.advertisers[].byVenue[].screensinteger
data.advertisers[].byVenue[].playedinteger
data.advertisers[].byVenue[].skippedinteger
data.advertisers[].byVenue[].failedinteger
data.advertisers[].byVenue[].totalDurationSecinteger
data.advertisers[].byVenue[].playedDurationSecinteger
data.advertisers[].byVenue[].firstAtstringISO-8601 timestamp (UTC).
data.advertisers[].byVenue[].lastAtstringISO-8601 timestamp (UTC).
data.advertisers[].byVenue[].adsarray of object

Response 401: Missing, expired or revoked bearer token.

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

Response 422: A bad format, or an advertiser name longer than 120 characters.

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

GET /v1/proof/events

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

List individual playback events, one per play, for a date range. The number of events returned is capped. For totals rolled up by content item and screen, use GET /v1/proof instead. Notes. - rollup sits beside data, outside the usual envelope.

ParameterInTypeRequiredDescription
fromquerystringnoISO-8601 start (default: the start of the report window).
toquerystringnoISO-8601 end (default: now).
screenIdquerystringno
curl "https://api.brixsignage.com/v1/proof/events" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataarray of objectOne row per play, newest first (at most 2000), from screens the caller can see.
data[].idstring
data[].screenIdstring
data[].screenNamestringThe screen id when the screen no longer exists.
data[].contentKindstringmedia when not reported.
data[].contentIdstringunknown when not reported.
data[].contentNamestringUnknown content when not reported.
data[].startedAtstringISO-8601 timestamp (UTC).
data[].durationSecinteger
data[].result"played" | "skipped" | "failed"
data[].reasonstring | null
rolluparray of objectDaily totals for the part of the range older than the raw-event window; empty when from is inside it.
rollup[].daystringYYYY-MM-DD.
rollup[].screenIdstring
rollup[].contentIdstring
rollup[].playsinteger
rollup[].totalDurationMsinteger
rollup[].playedinteger
rollup[].skippedinteger
rollup[].failedinteger

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.

GET /v1/proof/export

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

Downloads the plays in a date range with the signature and chain status of each play, a summary of counts, a SHA-256 hash of the bundle and a detached server signature. Use from, to and screenId to filter and format=json or format=csv. The newest 5,000 plays are included. Available only to workspaces with digital-out-of-home enabled; other workspaces get 404.

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

Response 4XX: Client error. 404 rather than 403 for another tenant's resource, so account existence is not leaked.

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

GET /v1/proof/keys

Auth: Bearer token.

Lists the proof-of-play signing keys that one screen has registered. screenId is required. Each key shows its key id, when it was first seen, the key it replaced and when it was revoked. Key material is never returned. Available only to workspaces with digital-out-of-home enabled.

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

Response 4XX: Client error. 404 rather than 403 for another tenant's resource, so account existence is not leaked.

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

POST /v1/proof/keys/{keyId}/revoke

Auth: Bearer token.

Marks one of a screen's signing keys as bad. Send the screenId in the body. From that time, plays signed with the key show as revoked, and the next new key from the screen registers as a replacement. Calling it again has no further effect. The change is recorded in the activity log.

ParameterInTypeRequiredDescription
keyIdpathstringyesIdentifier for keyId.
curl -X POST "https://api.brixsignage.com/v1/proof/keys/{keyId}/revoke" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 4XX: Client error. 404 rather than 403 for another tenant's resource, so account existence is not leaked.

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

GET /v1/proof/schedules

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

List the proof-of-play reports that you scheduled. Each one is sent by email every week or every month. You see only your own schedules.

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

Response 200: Success.

FieldTypeDescription
dataarray of ProofReportSchedule
data[].idstring
data[].namestring
data[].cadence"weekly" | "monthly"
data[].filtersobject
data[].filters.screenIdsarray of string
data[].filters.groupIdsarray of stringGroups on the org tree; each covers the groups below it.
data[].filters.contentIdsarray of string
data[].filters.tagsarray of stringFiles and designs with any of these tags, on the day the report runs.
data[].recipientUserIdsarray of string
data[].nextRunAtstringISO-8601 timestamp (UTC).
data[].lastRunAtstring | null
data[].lastStatusstring | null

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/proof/schedules

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

Send a proof-of-play report by email every week or every month. Send a name, a cadence (weekly or monthly), optional filters and optional recipientUserIds (active people in this workspace; the default is you). The report shows only the screens that you can see. Only a signed-in person can schedule a report. The report runs with your access at send time and goes only to active people in this workspace. The first one goes within the hour. A signed-in person only; an API key is refused.

Request body: application/json

FieldTypeRequiredDescription
namestringyesAt most 80 characters.
cadence"weekly" | "monthly"yes
filtersobjectno
filters.screenIdsarray of stringno
filters.groupIdsarray of stringnoGroups on the org tree; each covers the groups below it.
filters.contentIdsarray of stringno
filters.tagsarray of stringnoFiles and designs with any of these tags, on the day the report runs.
recipientUserIdsarray of stringno1 to 10 people in this workspace. Default: you.
curl -X POST "https://api.brixsignage.com/v1/proof/schedules" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201: Success.

FieldTypeDescription
dataProofReportSchedule
data.idstring
data.namestring
data.cadence"weekly" | "monthly"
data.filtersobject
data.filters.screenIdsarray of string
data.filters.groupIdsarray of stringGroups on the org tree; each covers the groups below it.
data.filters.contentIdsarray of string
data.filters.tagsarray of stringFiles and designs with any of these tags, on the day the report runs.
data.recipientUserIdsarray of string
data.nextRunAtstringISO-8601 timestamp (UTC).
data.lastRunAtstring | null
data.lastStatusstring | null

Response 401: Missing, expired or revoked bearer token.

Response 403: An API key cannot own a report.

Response 422: A bad name, cadence or filter, or a recipient who is not an active person in this workspace.

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

DELETE /v1/proof/schedules/{id}

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

Stop a proof-of-play report that you scheduled. You can stop only your own schedules.

ParameterInTypeRequiredDescription
idpathstringyesSchedule id.
curl -X DELETE "https://api.brixsignage.com/v1/proof/schedules/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.okboolean

Response 401: Missing, expired or revoked bearer token.

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

Response 404: You have no such schedule. Only its owner can stop it.

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

POST /v1/proof/verify-bundle

Auth: none.

Checks a downloaded proof-of-play export against the published signing keys: the bundle hash, the server signature, and the device signature and chain of each play. No credential is needed. Requests are rate limited, and a bundle can be at most 8 MB and 5,000 plays.

curl -X POST "https://api.brixsignage.com/v1/proof/verify-bundle"

Response 4XX: Client error. 404 rather than 403 for another tenant's resource, so account existence is not leaked.

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