Apps API

Apps endpoints in the Brix REST API for digital signage: 12 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/apps/{key}/render

Auth: none.

Get the rendered HTML for one app from the app catalog. This is the same output used by the player and by the content management system preview. Notes. - HTML for an iframe, with a strict content security policy; who may frame it is limited to Brix players and the console.

ParameterInTypeRequiredDescription
keypathstringyesThe app's catalog key.
configquerystringnoThe app's settings as a JSON string (at most 8 KB; invalid JSON renders the defaults).
langquerystringnoBCP 47 language tag for the app's text (default en-US).
brandquerystringnoA brand kit as a JSON string, for apps that follow the brand.
dtquerystringnoAn app data token, for an app bound to a data source (dataSourceId in config).
curl "https://api.brixsignage.com/v1/apps/{key}/render"

Response 401: Missing, expired or revoked bearer token.

Response 404: Unknown app key. The body is still an HTML card saying so.

Response 413: config is over 8 KB.

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

GET /v1/apps/catalog

Auth: Bearer token. Permission: app-instance.view.

List the apps available to your workspace, including which ones are currently visible for your account to add.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.appsarray of object
data.apps[].keystringThe appKey to create an instance with.
data.apps[].status"alpha" | "beta" | "ga" | "deprecated"
data.apps[].visiblebooleanTrue when this workspace can add it: enabled and GA, or alpha/beta with early access.

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/apps/counter/{token}

Auth: none.

Get the current value of a live counter app, such as Now Serving or Goal Tracker. Access is controlled by the token in the URL rather than by an API key; anyone with the token can read the value. Notes. - An unknown token answers 200 with value: null, not 404.

ParameterInTypeRequiredDescription
tokenpathstringyesThe counter's control code (8–64 letters, digits, _ or -), from the app's settings.
curl "https://api.brixsignage.com/v1/apps/counter/{token}"

Response 200: Success.

FieldTypeDescription
dataobject
data.valueinteger | nullNull until the counter is first set. The queue position: what the next call adds 1 to.
data.labelstring | null
data.seqintegerGoes up by 1 on every staff action. A screen chimes when it changes, unless quiet is true.
data.ninteger | nullThe number of the latest call (or call again, or correction); null before the first write and after a restart, until a call.
data.counterstring | nullThe counter that made the latest call, or null.
data.historyarray of objectThe last 20 changes, oldest first.
data.history[].ninteger
data.history[].cstring | nullThe counter name, or null.
data.history[].atstringISO 8601 time of the change.
data.history[].kind"call" | "recall" | "set" | "reset"call: the next number; recall: a number called again; set: a correction (the number that counter serves now); reset: the numbers were started again.
data.issuedinteger | nullThe last ticket number handed out (join the queue); null when no ticket was taken.
data.waitingintegerHow many tickets are not called yet (0 without tickets; cancelled tickets do not count).
data.nextintegerThe number the next call is.
data.epochintegerThe run of numbers: goes up when staff restart the numbers and when a day's tickets expire.
data.quietbooleantrue: the latest action is not a call (a restart, an undo, a number given by hand). The screen does not chime for it.

Response 400: bad_token: the token is not 8–64 letters, digits, _ or -.

Response 401: Missing, expired or revoked bearer token.

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

POST /v1/apps/counter/{token}

Auth: none.

Set or adjust the value of a live counter app. Provide an absolute value or a relative change (the resulting value is clamped between 0 and 999999), or one staff action of Now Serving: call again, move the number one up or down, start the numbers again, give a number, or undo the latest action. Access is controlled by the token in the URL rather than by an API key.

ParameterInTypeRequiredDescription
tokenpathstringyesThe counter's control code (8–64 letters, digits, _ or -), from the app's settings.

Request body: application/json

FieldTypeRequiredDescription
valuenumbernoSet to this value.
deltanumbernoAdd this (may be negative). Used when value is absent.
labelstringnoA new label (first 80 characters kept).
counterstringnoThe counter (desk) that makes this call, 1–40 characters. Listed with the number in history.
recallbooleannotrue: call this counter's last number again. The value does not change; seq goes up so the screen chimes.
takebooleannotrue: give the next ticket to a customer with no phone (join the queue). The answer adds ticket.
queuebooleannotrue with delta: 1: call only a number a customer took. Answers 409 nobody_waiting when nobody waits.
moveintegerno1 or -1: move this counter's number one up or one down (a correction, not a call). 409 at_minimum / at_maximum when it cannot move.
restartintegernoStart the numbers again: the next call and the next ticket are this number (1–999999). Every ticket that waits is void.
undointegernoThe seq an earlier action answered: put back what that action changed. Only the latest action, for 2 minutes. 409 cannot_undo otherwise.
curl -X POST "https://api.brixsignage.com/v1/apps/counter/{token}" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.valueintegerThe stored value, 0–999999.
data.labelstring | nullThe label SENT in this request; null when none was sent, even if one is stored.
data.seqintegerGoes up by 1 on every staff action. A screen chimes when it changes, unless quiet is true.
data.ninteger | nullThe number of the latest call (or call again, or correction); null before the first write and after a restart, until a call.
data.counterstring | nullThe counter that made the latest call, or null.
data.historyarray of objectThe last 20 changes, oldest first.
data.history[].ninteger
data.history[].cstring | nullThe counter name, or null.
data.history[].atstringISO 8601 time of the change.
data.history[].kind"call" | "recall" | "set" | "reset"call: the next number; recall: a number called again; set: a correction (the number that counter serves now); reset: the numbers were started again.
data.issuedinteger | nullThe last ticket number handed out (join the queue); null when no ticket was taken.
data.waitingintegerHow many tickets are not called yet (0 without tickets; cancelled tickets do not count).
data.nextintegerThe number the next call is.
data.epochintegerThe run of numbers: goes up when staff restart the numbers and when a day's tickets expire.
data.quietbooleantrue: the latest action is not a call (a restart, an undo, a number given by hand). The screen does not chime for it.
data.ticketintegerWith take: the number to give the customer.
data.undonebooleanWith undo: true when the earlier action was put back.

Response 400: bad_token; bad_counter: counter is not 1–40 plain characters; bad_move, bad_number, bad_undo: that field is not valid; or value_or_delta_required: no action was sent.

Response 401: Missing, expired or revoked bearer token.

Response 404: unknown_token: no saved app uses this control code.

Response 409: nothing_to_recall: this counter has not called a number yet; nobody_waiting: queue is set and nobody waits; queue_full: take and 300 customers already wait; at_minimum / at_maximum: move would leave 0–999999; cannot_undo: another action came after, or the time is over.

Response 429: More than 120 updates a minute.

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

GET /v1/apps/counter/{token}/card

Auth: none.

Public printable staff card (HTML) for a counter app: Now Serving's A6 card or Goal Tracker's QR page. Its QR is the control page on the workspace's console host; 404 once no saved app owns the code. Notes. - Now Serving: the A6 staff card. Goal Tracker: a page with the QR code. The QR code opens the control page on the workspace's own console host, with the counters and the phone queue of the saved app.

ParameterInTypeRequiredDescription
tokenpathstringyesThe counter's control code (8–64 letters, digits, _ or -), from the app's settings.
langquerystringnoBCP 47 language tag for the card's text (default en-US).
curl "https://api.brixsignage.com/v1/apps/counter/{token}/card"

Response 400: The token is not 8–64 letters, digits, _ or - (plain text body).

Response 401: Missing, expired or revoked bearer token.

Response 404: No saved app owns this control code (plain text body).

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

GET /v1/apps/counter/{token}/control

Auth: none.

Get an HTML page with simple controls for adjusting a live counter from a phone. The page submits its changes back to the counter endpoint. Access is controlled by the token in the URL.

ParameterInTypeRequiredDescription
tokenpathstringyesThe counter's control code (8–64 letters, digits, _ or -), from the app's settings.
startquerynumbernoThe value shown before the first read.
labelquerystringnoThe page's heading (default Now Serving).
cquerystringnoA counter name; repeat it once per counter. With counters the page asks which counter the phone is and shows Next and Call again.
langquerystringnoBCP 47 language tag for the page's text (default en-US).
qquerystringno1: customers take numbers on their phones. The page shows how many wait and Give a number, and Next calls only a number a customer took.
curl "https://api.brixsignage.com/v1/apps/counter/{token}/control"

Response 400: The token is not 8–64 letters, digits, _ or - (plain text body).

Response 401: Missing, expired or revoked bearer token.

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

GET /v1/apps/queue/{joinId}

Auth: none.

Get the HTML page a customer opens from the Now Serving screen's QR code to take a queue number on their phone. The join id in the URL is the control code sealed with a server key, so the page never holds the control code. Notes. - The screen's customer QR opens this page. The join id is the control code sealed with a server key; the page never holds the control code.

ParameterInTypeRequiredDescription
joinIdpathstringyesThe join id from the screen's customer QR: the control code sealed with a server key (base64url).
labelquerystringnoThe page's heading (default Now Serving).
langquerystringnoBCP 47 language tag for the page's text (default en-US).
curl "https://api.brixsignage.com/v1/apps/queue/{joinId}"

Response 401: Missing, expired or revoked bearer token.

Response 404: The join id does not open (HTML page that says so).

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

POST /v1/apps/queue/{joinId}/cancel

Auth: none.

Give a queue number back. The place is free at once: the screen and the staff page count one fewer customer, and the next call passes over the number. Send the ticket number, its epoch and the key the take answer gave. Only the holder of the key can cancel the ticket.

ParameterInTypeRequiredDescription
joinIdpathstringyesThe join id from the screen's customer QR: the control code sealed with a server key (base64url).

Request body: application/json

FieldTypeRequiredDescription
ticketintegeryesThe ticket number.
epochintegeryesThe epoch the ticket was taken in.
keystringyesThe key the take answer gave for this ticket.
curl -X POST "https://api.brixsignage.com/v1/apps/queue/{joinId}/cancel" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.cancelledboolean
data.waitingintegerHow many tickets are not called yet, after the cancel.

Response 400: bad_ticket: ticket or epoch is not a whole number.

Response 401: Missing, expired or revoked bearer token.

Response 403: bad_ticket: the key is not the key of this ticket.

Response 404: not_found: the join id does not open.

Response 409: not_waiting: the ticket was called, has passed or has expired. state says which.

Response 429: More than 10 cancels a minute from one address.

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

GET /v1/apps/queue/{joinId}/state

Auth: none.

Get the number now called, the counter that called it and how many customers wait. Access is controlled by the join id in the URL. The answer never contains the control code or the call history.

ParameterInTypeRequiredDescription
joinIdpathstringyesThe join id from the screen's customer QR: the control code sealed with a server key (base64url).
tqueryintegernoA ticket number, to learn where it stands.
equeryintegernoThe epoch that ticket was taken in.
curl "https://api.brixsignage.com/v1/apps/queue/{joinId}/state"

Response 200: Success.

FieldTypeDescription
dataobject
data.valueinteger | nullThe last number called; null before the first write.
data.ninteger | nullThe number of the latest call (or recall, or set).
data.counterstring | nullThe counter that made the latest call, or null.
data.seqintegerGoes up by 1 on every call, recall and set.
data.issuedinteger | nullThe last ticket number handed out; null when no ticket was taken.
data.waitingintegerHow many tickets are not called yet (cancelled tickets do not count).
data.epochintegerThe run of numbers: goes up when staff restart the numbers and when a day's tickets expire.
data.ticketobjectWith t and e: where that ticket stands.
data.ticket.state"waiting" | "called" | "passed" | "cancelled" | "expired"
data.ticket.beforeintegerwaiting: how many customers are in front.
data.ticket.counterstring | nullcalled: the counter to go to, or null.
data.ticket.callstringcalled: changes on every call of this number (a call again is a new call).

Response 401: Missing, expired or revoked bearer token.

Response 404: not_found: the join id does not open.

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

POST /v1/apps/queue/{joinId}/take

Auth: none.

Give the customer the next queue number. Each call hands out one number, with the key that lets its holder cancel it. At most 300 customers can wait, and one address can take 10 numbers a minute. Access is controlled by the join id in the URL.

ParameterInTypeRequiredDescription
joinIdpathstringyesThe join id from the screen's customer QR: the control code sealed with a server key (base64url).
curl -X POST "https://api.brixsignage.com/v1/apps/queue/{joinId}/take"

Response 200: Success.

FieldTypeDescription
dataobject
data.ticketintegerThe customer's number.
data.valueintegerThe last number called.
data.nintegerThe number of the latest call.
data.counterstring | null
data.waitingintegerHow many tickets are not called yet, this one included.
data.beforeintegerHow many customers are in front of this ticket.
data.epochintegerThe run of numbers this ticket belongs to.
data.keystringThe key of this ticket. Only its holder can cancel the ticket.

Response 401: Missing, expired or revoked bearer token.

Response 404: not_found: the join id does not open, or no saved app uses its control code.

Response 409: queue_full: 300 customers already wait.

Response 429: More than 10 tickets a minute from one address.

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