Account API (part 4 of 4)

Account endpoints in the Brix REST API, part 4 of 4: 19 operations from /v1/account/payment-card/setup, each with auth, permission and curl.

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.

Account is split into 4 pages: part 1 (/v1/account to /v1/account/brix-plan/screens/estimate), part 2 (/v1/account/brix-plan/screens/request to /v1/account/location-payment), part 3 (/v1/account/location-payment to /v1/account/payment-card/complete), part 4 (/v1/account/payment-card/setup to /v1/account/upgrade-annual/estimate).

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.

POST /v1/account/payment-card/setup

Auth: Bearer token. Permission: billing.edit.

Starts adding or replacing the saved card for a workspace billed directly by Brix. Returns a hosted checkout URL where the card is entered, unless useLastPaid: true is passed and the payment provider already holds a card that was last used to pay this workspace, in which case that card is saved directly. Returns 409 if the workspace is not billed directly by Brix, and 404 for white-label workspaces.

Request body: application/json

FieldTypeRequiredDescription
useLastPaidbooleannoSave the card the last invoice was paid with, when that is possible, instead of opening a page.
role"primary" | "backup"nobackup saves a backup card, charged once when the card is declined. Default primary.
curl -X POST "https://api.brixsignage.com/v1/account/payment-card/setup" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject | object

Response 401: Missing, expired or revoked bearer token.

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

Response 404: A workspace billed by a partner.

Response 409: not_brix_billed, or card_unavailable.

Response 502: The card page could not be opened.

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

POST /v1/account/payment-card/swap

Auth: Bearer token. Permission: billing.edit.

Makes the saved backup card the card that invoices are charged to, and the previous card the backup. Returns 409 backup_required when no backup card is saved.

curl -X POST "https://api.brixsignage.com/v1/account/payment-card/swap" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.swappedtrue
data.paymentAccountPaymentPayment settings of an account that Brix invoices directly.
data.payment.option"card" | "invoice"How issued invoices are paid: charged to the saved card, or paid from the invoice email.
data.payment.cardobject | null
data.payment.backupCardobject | nullCharged once when the card is declined.
data.payment.lastPaidobject | nullThe card the last invoice was paid with.
data.payment.cardAvailablebooleanCard payment can be set up for this workspace.
data.payment.invoiceEmailstring | nullOne more address that gets every invoice. The owners always get them.

Response 401: Missing, expired or revoked bearer token.

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

Response 404: A workspace billed by a partner.

Response 409: not_brix_billed, or backup_required (no backup card saved).

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

GET /v1/account/payment-methods

Auth: Bearer token. Permission: billing.view.

Returns the workspace's saved payment methods, including cards and ACH bank accounts. When there are two or more methods and none is the backup, one method that is not the primary is made the backup. Notes. - A read that can write: with two or more methods and no backup, the handler makes one non-primary method the backup and records it in the audit log.

curl "https://api.brixsignage.com/v1/account/payment-methods" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.configuredbooleanFalse when billing is not set up (or could not be read, see reason).
data.sourcesarray of object
data.sources[].idstring
data.sources[].typestringcard, bank_account, or a wallet type (apple_pay, paypal_express_checkout, …).
data.sources[].brandstring | null
data.sources[].last4string | null
data.sources[].walletTypestring | null
data.sources[].gatewaystring | null
data.sources[].expiryMonthinteger | null
data.sources[].expiryYearinteger | null
data.sources[].statusstring
data.sources[].primaryboolean
data.sources[].backupbooleanCharged when the primary fails.
data.reasonstring

Response 401: Missing, expired or revoked bearer token.

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

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

POST /v1/account/payment-methods/{id}/role

Auth: Bearer token. Permission: billing.edit.

Sets a saved payment method as the primary or backup method for the workspace.

ParameterInTypeRequiredDescription
idpathstringyesPayment method id from the list.

Request body: application/json

FieldTypeRequiredDescription
role"primary" | "backup"yes
curl -X POST "https://api.brixsignage.com/v1/account/payment-methods/{id}/role" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.oktrue
data.idstring
data.role"primary" | "backup"

Response 401: Missing, expired or revoked bearer token.

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

Response 404: Not one of this workspace's payment methods.

Response 409: billing_not_configured.

Response 422: Bad role.

Response 502: The billing provider did not answer; nothing changed.

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

POST /v1/account/payment-methods/manage-url

Auth: Bearer token. Permission: billing.edit.

Returns a hosted page URL where the workspace can add, replace, or remove a saved card or bank account.

curl -X POST "https://api.brixsignage.com/v1/account/payment-methods/manage-url" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.urlstringA hosted page to add, replace or remove a card or bank account. Open it in a browser.

Response 401: Missing, expired or revoked bearer token.

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

Response 409: billing_not_configured.

Response 502: The billing provider did not answer; nothing changed.

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

PATCH /v1/account/payment-option

Auth: Bearer token. Permission: billing.edit.

Sets how a workspace billed directly by Brix pays: card or invoice. Choosing card requires a saved card and returns 409 if none exists; every invoice Brix issues is then charged to that card automatically. Returns 409 if the workspace is billed through the billing provider instead, and 404 for white-label workspaces.

Request body: application/json

FieldTypeRequiredDescription
option"card" | "invoice"yes
curl -X PATCH "https://api.brixsignage.com/v1/account/payment-option" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.changedboolean
data.paymentAccountPaymentPayment settings of an account that Brix invoices directly.
data.payment.option"card" | "invoice"How issued invoices are paid: charged to the saved card, or paid from the invoice email.
data.payment.cardobject | null
data.payment.backupCardobject | nullCharged once when the card is declined.
data.payment.lastPaidobject | nullThe card the last invoice was paid with.
data.payment.cardAvailablebooleanCard payment can be set up for this workspace.
data.payment.invoiceEmailstring | nullOne more address that gets every invoice. The owners always get them.

Response 401: Missing, expired or revoked bearer token.

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

Response 404: A workspace billed by a partner.

Response 409: not_brix_billed, or card_required (save a card first).

Response 422: Bad option.

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

PATCH /v1/account/prefs

Auth: Bearer token. Permission: billing.edit.

Updates workspace-level preferences such as locale, time zone, date and number formats, brand kit, and plan tier. Any field you include is overwritten; fields you omit keep their current value.

Request body: application/json

FieldTypeRequiredDescription
kioskPinstring | nullnoSet (4–8 digits) or clear (null) the workspace Screen Lock PIN. Stored as a hash.
requireSsobooleannoNeeds a working single sign-on connection with verified domains; until someone signs in through it, the request is held (requireSsoPending).
requireTwoFactorbooleannoTurning it on needs the calling user to have two-factor sign-in set up, so an API key cannot turn it on.
curl -X PATCH "https://api.brixsignage.com/v1/account/prefs" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeFormat":"24h","timeZone":"America/Chicago"}'

Response 200: Success.

FieldTypeDescription
dataWorkspacePrefsWorkspace preferences. Every key is present (defaults filled in).
data.timeFormat"12h" | "24h"
data.weekStart"mon" | "sun"
data.dateFormat"mdy" | "dmy" | "ymd"
data.tempUnits"f" | "c"
data.timeZonestringIANA time zone. Screens without their own zone use it, and so do schedules timed by the workspace.
data.languagestringBCP 47 language tag.
data.multinationalbooleanShows the per-location and per-screen language settings.
data.newLocationsPayFirstbooleanNew locations pay for themselves before going live: each adds its own card, and its screens show a hold card (not billed to the account) until then. Default false. Turning it on needs Brix billing with a running plan (409 otherwise).
data.navExtrasarray of stringConsole pages switched on that the workspace size hides by default.
data.appBrandingobjectThe look of the on-screen apps.
data.appBranding.accentstring
data.appBranding.accent2string
data.appBranding.theme"dark" | "light"
data.appBranding.backdrop"brand" | "wash" | "plain" | "aurora" | "dots" | "grid" | "solid"
data.appBranding.intensitynumber
data.brandKitsarray of objectSaved looks. An app follows one with config.brandKitId. A write replaces the whole list (at most 50).
data.brandKits[].idstring
data.brandKits[].namestring
data.brandKits[].accentstring
data.brandKits[].accent2string
data.brandKits[].theme"dark" | "light"
data.brandKits[].backdrop"brand" | "wash" | "plain" | "aurora" | "dots" | "grid" | "solid"
data.brandKits[].intensitynumber
data.audioobjectDefault screen volume and a master mute.
data.audio.volumenumber0–100.
data.audio.mutedboolean
data.brandobject
data.brand.companyNamestring
data.brand.logoUrlstring
data.requireAltTextboolean
data.showScreenLogoboolean
data.keepTvOnInputbooleanDefault for "Keep the TV on this input" on screens that have not set their own.
data.standbyContentKindstring | nullWhat a screen with nothing to play shows; null = the default card.
data.standbyContentIdstring | null
data.tier"simple" | "team" | "enterprise"Workspace size. It sets console defaults, not access.
data.industrystring | null
data.onboardingCompletedAtstring | null
data.setupStepstring | nullWalkthrough position (s1…s5, l1…l6, done).
data.welcomeDeclinedAtstring | nullWhen the owner declined the setup questions. Null if never declined, or answered later.
data.aboutYouDuebooleanThe workspace is asked the first-sign-in questions (workspaces created from 2026-10-14).
data.aboutYouAtstring | nullWhen the first-sign-in questions were answered.
data.expectedScreensinteger | nullHow many screens the owner said they expect.
data.orgNameSetboolean
data.tiersarray of integerLocation tree levels in use.
data.tierLabelsobjectCustom names for the location tree levels.
data.requireTwoFactorboolean
data.requireSsoboolean
data.requireSsoPendingbooleanSingle sign-on was required, and turns on after the first sign-in through the connection.
data.requireSsoPendingSincestring | null
data.aiobject
data.ai.enabledboolean
data.ai.featuresobjectPer feature (tags, alt-text, moderation, transcription, translation, focal-region, embedding); an absent feature follows enabled.
data.ai.dailyCallLimitinteger | null
data.ai.redactPersonalDataboolean
data.retentionobjectDays kept per stream, only for the streams the workspace has set. An absent stream uses the platform window.
data.retention.offlinenumber
data.retention.screenshotsnumber
data.retention.playbacknumber
data.retention.deviceLogsnumber
data.retention.vitalsnumber
data.retention.replaysnumber
data.retention.aiEventsnumber
data.warehouseobjectData warehouse feed. Set by Brix; not writable here.
data.warehouse.enabledboolean
data.warehouse.bucketBindingstringSet by Brix when the data warehouse feed is provisioned.
data.warehouse.tablesarray of string
data.warehouse.lookbackDaysinteger
data.supportAccessSupportAccessPolicy
data.supportAccess.mode"open" | "notify" | "approve"open: Brix support may open the workspace. notify: it may, and the owners are emailed. approve: a person here must approve each request.
data.supportAccess.grantMinutesintegerHow long an approval lasts.
data.supportAccess.requestTtlMinutesintegerHow long a request waits for an answer before it expires.
data.kioskHasGlobalPinbooleanA workspace Screen Lock PIN is set. The PIN and its hash are never returned.

Response 401: Missing, expired or revoked bearer token.

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

Response 422: sso_not_configured, two_factor_not_enrolled, or a PIN that is not 4–8 digits.

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

GET /v1/account/provider

Auth: Bearer token. Permission: user.view.

Returns the partner that provides this workspace, with its product name and the email addresses of its team, or null when no partner provides it. The partner always has access to the workspace, and this access cannot be turned off.

curl "https://api.brixsignage.com/v1/account/provider" \
  -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/account/reactivate

Auth: Bearer token. Permission: billing.edit.

Reverses a scheduled cancellation, or resumes an account that was paused for seasonal closure.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.status"active"

Response 401: Missing, expired or revoked bearer token.

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

Response 409: already_active, pending_deletion, payment_required, payment_method_required, not_reactivatable, or under_contract.

Response 502: The billing provider did not answer; nothing changed.

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

GET /v1/account/retention

Auth: Bearer token. Permission: settings.view.

Returns the workspace's data retention schedule: every data stream that can be governed, the retention window currently in effect for it, and the allowed range for that window.

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

Response 200: Success.

FieldTypeDescription
dataRetentionSchedule
data.policyobjectDays kept per stream, only for the streams the workspace has set. An absent stream uses the platform window.
data.policy.offlinenumber
data.policy.screenshotsnumber
data.policy.playbacknumber
data.policy.deviceLogsnumber
data.policy.vitalsnumber
data.policy.replaysnumber
data.policy.aiEventsnumber
data.effectiveobjectDays kept per stream now.
data.effective.offlineinteger
data.effective.screenshotsinteger
data.effective.playbackinteger
data.effective.deviceLogsinteger
data.effective.vitalsinteger
data.effective.replaysinteger
data.effective.aiEventsinteger
data.boundsobject
data.bounds.offlineobject
data.bounds.offline.mininteger
data.bounds.offline.maxinteger
data.bounds.offline.platformDefaultinteger
data.bounds.offline.labelstring
data.bounds.offline.whatstring
data.bounds.screenshotsobject
data.bounds.screenshots.mininteger
data.bounds.screenshots.maxinteger
data.bounds.screenshots.platformDefaultinteger
data.bounds.screenshots.labelstring
data.bounds.screenshots.whatstring
data.bounds.playbackobject
data.bounds.playback.mininteger
data.bounds.playback.maxinteger
data.bounds.playback.platformDefaultinteger
data.bounds.playback.labelstring
data.bounds.playback.whatstring
data.bounds.deviceLogsobject
data.bounds.deviceLogs.mininteger
data.bounds.deviceLogs.maxinteger
data.bounds.deviceLogs.platformDefaultinteger
data.bounds.deviceLogs.labelstring
data.bounds.deviceLogs.whatstring
data.bounds.vitalsobject
data.bounds.vitals.mininteger
data.bounds.vitals.maxinteger
data.bounds.vitals.platformDefaultinteger
data.bounds.vitals.labelstring
data.bounds.vitals.whatstring
data.bounds.replaysobject
data.bounds.replays.mininteger
data.bounds.replays.maxinteger
data.bounds.replays.platformDefaultinteger
data.bounds.replays.labelstring
data.bounds.replays.whatstring
data.bounds.aiEventsobject
data.bounds.aiEvents.mininteger
data.bounds.aiEvents.maxinteger
data.bounds.aiEvents.platformDefaultinteger
data.bounds.aiEvents.labelstring
data.bounds.aiEvents.whatstring

Response 401: Missing, expired or revoked bearer token.

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

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

PATCH /v1/account/retention

Auth: Bearer token. Permission: settings.edit.

Sets the retention window, in days, for one or more data streams. Sending null for a stream resets it to the platform default. Values are clamped to the allowed range for each stream.

Request body: application/json

FieldTypeRequiredDescription
offlinenumber | nullno
screenshotsnumber | nullno
playbacknumber | nullno
deviceLogsnumber | nullno
vitalsnumber | nullno
replaysnumber | nullno
aiEventsnumber | nullno
curl -X PATCH "https://api.brixsignage.com/v1/account/retention" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataRetentionSchedule
data.policyobjectDays kept per stream, only for the streams the workspace has set. An absent stream uses the platform window.
data.policy.offlinenumber
data.policy.screenshotsnumber
data.policy.playbacknumber
data.policy.deviceLogsnumber
data.policy.vitalsnumber
data.policy.replaysnumber
data.policy.aiEventsnumber
data.effectiveobjectDays kept per stream now.
data.effective.offlineinteger
data.effective.screenshotsinteger
data.effective.playbackinteger
data.effective.deviceLogsinteger
data.effective.vitalsinteger
data.effective.replaysinteger
data.effective.aiEventsinteger
data.boundsobject
data.bounds.offlineobject
data.bounds.offline.mininteger
data.bounds.offline.maxinteger
data.bounds.offline.platformDefaultinteger
data.bounds.offline.labelstring
data.bounds.offline.whatstring
data.bounds.screenshotsobject
data.bounds.screenshots.mininteger
data.bounds.screenshots.maxinteger
data.bounds.screenshots.platformDefaultinteger
data.bounds.screenshots.labelstring
data.bounds.screenshots.whatstring
data.bounds.playbackobject
data.bounds.playback.mininteger
data.bounds.playback.maxinteger
data.bounds.playback.platformDefaultinteger
data.bounds.playback.labelstring
data.bounds.playback.whatstring
data.bounds.deviceLogsobject
data.bounds.deviceLogs.mininteger
data.bounds.deviceLogs.maxinteger
data.bounds.deviceLogs.platformDefaultinteger
data.bounds.deviceLogs.labelstring
data.bounds.deviceLogs.whatstring
data.bounds.vitalsobject
data.bounds.vitals.mininteger
data.bounds.vitals.maxinteger
data.bounds.vitals.platformDefaultinteger
data.bounds.vitals.labelstring
data.bounds.vitals.whatstring
data.bounds.replaysobject
data.bounds.replays.mininteger
data.bounds.replays.maxinteger
data.bounds.replays.platformDefaultinteger
data.bounds.replays.labelstring
data.bounds.replays.whatstring
data.bounds.aiEventsobject
data.bounds.aiEvents.mininteger
data.bounds.aiEvents.maxinteger
data.bounds.aiEvents.platformDefaultinteger
data.bounds.aiEvents.labelstring
data.bounds.aiEvents.whatstring

Response 401: Missing, expired or revoked bearer token.

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

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

POST /v1/account/screen-pool

Auth: Bearer token. Permission: billing.edit.

Sets how many screens the workspace pays for. An increase is charged now, prorated, to the payment method on file (a very small amount is added to the renewal instead). A reduction on a paid plan takes effect at the renewal and is not refunded; during the free trial a change takes effect at once. You cannot set the plan below the number of screens that are running. Notes. - An increase is charged now (prorated). A reduction on a paid plan is queued for the renewal and answers scheduled: true; in the trial it changes at once.

Request body: application/json

FieldTypeRequiredDescription
quantityintegeryes
curl -X POST "https://api.brixsignage.com/v1/account/screen-pool" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject | object

Response 401: Missing, expired or revoked bearer token.

Response 402: card_declined or payment_incomplete: the plan did not change (or needs our team).

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

Response 409: screens_in_use (below the screens running), no_subscription, account_cancelled, or under_contract.

Response 422: quantity is not a whole number from 1 to 10000.

Response 502: The change could not be made.

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

POST /v1/account/screen-pool/estimate

Auth: Bearer token. Permission: billing.view.

Returns the prorated cost of changing the screen pool before committing to it, including the exact amount that would be charged today and which card would be used. This is read-only and does not change anything; it uses POST rather than GET because the requested quantity must never be cached. Notes. - A POST because it takes an argument; it changes nothing.

Request body: application/json

FieldTypeRequiredDescription
quantityintegeryes
curl -X POST "https://api.brixsignage.com/v1/account/screen-pool/estimate" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.linesarray of objectLine items of the invoice raised today.
data.lines[].descriptionstring
data.lines[].amountnumber
data.creditsAppliednumberCredit for the unused part of the current term.
data.subTotalnumber
data.amountDueNownumberCharged now, after credits (currency units, not cents).
data.currencyCodestring
data.nextBillingAtstring | null
data.payWithstring | nullThe payment method that is charged (Visa •••• 4242).
data.currentQuantityinteger
data.newQuantityinteger
data.renewalAmountnumber | nullWhat each term costs after the change.
data.chargedTodaybooleanFalse when the amount is too small to charge today (it is added to the renewal).
data.invoicedbooleanThe account pays by invoice; nothing is charged to a card.
data.decreaseRequiresSupportfalseAlways false. Kept for older clients.
data.scheduledAtRenewalbooleanA reduction on a paid plan: it takes effect at renewsAt.
data.renewsAtstring | null
data.inTrialboolean
data.trialEndsAtstring | null
data.minQuantityintegerThe lowest allowed quantity: the screens running now (at least 1).

Response 401: Missing, expired or revoked bearer token.

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

Response 409: no_subscription, account_cancelled, or under_contract.

Response 422: quantity is not a whole number from 1 to 10000.

Response 502: estimate_unavailable.

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

DELETE /v1/account/screen-pool/scheduled

Auth: Bearer token. Permission: billing.edit.

Cancels a screen-pool reduction that is queued to take effect at renewal, keeping the current plan instead. Calling this when nothing is scheduled has no effect. Notes. - Succeeds when nothing is queued too.

curl -X DELETE "https://api.brixsignage.com/v1/account/screen-pool/scheduled" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.oktrue

Response 401: Missing, expired or revoked bearer token.

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

Response 409: no_subscription, account_cancelled, or under_contract.

Response 502: The billing provider did not answer; nothing changed.

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

GET /v1/account/support-access

Auth: Bearer token. Permission: settings.view.

Returns the workspace's current Brix support access policy (always allowed, allowed with notification, or approval required), every access request Brix support has raised along with its decision, and every support session opened on the workspace, with any still in progress marked as live. Notes. - A read that can write: pending requests past their expiry are marked expired first.

curl "https://api.brixsignage.com/v1/account/support-access" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.policySupportAccessPolicy
data.policy.mode"open" | "notify" | "approve"open: Brix support may open the workspace. notify: it may, and the owners are emailed. approve: a person here must approve each request.
data.policy.grantMinutesintegerHow long an approval lasts.
data.policy.requestTtlMinutesintegerHow long a request waits for an answer before it expires.
data.modesarray of object
data.modes[].id"open" | "notify" | "approve"
data.modes[].labelstring
data.modes[].whatstring
data.requestsarray of objectNewest 100.
data.requests[].idstring
data.requests[].staffEmailstringThe Brix support person who asked.
data.requests[].reasonstring
data.requests[].reasonCategorystring | null
data.requests[].status"pending" | "approved" | "denied" | "expired" | "revoked"
data.requests[].requestedAtstringISO-8601 timestamp (UTC).
data.requests[].requestExpiresAtstringISO-8601 timestamp (UTC).
data.requests[].decidedAtstring | null
data.requests[].decidedByEmailstring | null
data.requests[].decidedByNamestring | null
data.requests[].grantExpiresAtstring | null
data.requests[].decisionNotestring | null
data.requests[].grantLiveboolean
data.sessionsarray of objectTimes Brix support opened the workspace, newest 100.
data.sessions[].idstring
data.sessions[].staffEmailstring
data.sessions[].reasonstring
data.sessions[].startedAtstringISO-8601 timestamp (UTC).
data.sessions[].endedAtstring | null
data.sessions[].expiresAtstring | null
data.sessions[].liveboolean
data.sessions[].recordedbooleanThe session was screen-recorded.

Response 401: Missing, expired or revoked bearer token.

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

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

PATCH /v1/account/support-access/policy

Auth: Bearer token. Permission: settings.edit.

Sets whether Brix support may open the workspace: always allowed and recorded, allowed but the workspace is notified as it happens, or only with explicit approval for each request.

Request body: application/json

FieldTypeRequiredDescription
mode"open" | "notify" | "approve"noopen: Brix support may open the workspace. notify: it may, and the owners are emailed. approve: a person here must approve each request.
grantMinutesintegernoHow long an approval lasts.
requestTtlMinutesintegernoHow long a request waits for an answer before it expires.
curl -X PATCH "https://api.brixsignage.com/v1/account/support-access/policy" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataSupportAccessPolicy
data.mode"open" | "notify" | "approve"open: Brix support may open the workspace. notify: it may, and the owners are emailed. approve: a person here must approve each request.
data.grantMinutesintegerHow long an approval lasts.
data.requestTtlMinutesintegerHow long a request waits for an answer before it expires.

Response 401: Missing, expired or revoked bearer token.

Response 403: A Brix support session cannot change this. Also: You do not hold the permission for the whole workspace (a grant at one location is not enough).

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

POST /v1/account/support-access/revoke

Auth: Bearer token. Permission: settings.edit.

Immediately withdraws consent for Brix support access: ends every live support session and cancels any outstanding approval, in that order.

curl -X POST "https://api.brixsignage.com/v1/account/support-access/revoke" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.sessionsEndedinteger
data.grantsRevokedinteger

Response 401: Missing, expired or revoked bearer token.

Response 403: A Brix support session cannot do this. Also: You do not hold the permission for the whole workspace (a grant at one location is not enough).

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

POST /v1/account/upgrade-annual

Auth: Bearer token. Permission: billing.edit.

Switches the workspace's monthly subscription to annual, upfront billing. Returns 409 if the workspace is already on annual billing or has no active subscription.

curl -X POST "https://api.brixsignage.com/v1/account/upgrade-annual" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.cadence"annual"

Response 401: Missing, expired or revoked bearer token.

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

Response 409: no_subscription, under_contract, or already_annual.

Response 502: The switch failed.

Response 503: annual_switch_unavailable: the switch is not self-serve yet; contact support.

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

GET /v1/account/upgrade-annual/estimate

Auth: Bearer token. Permission: billing.view.

Returns the prorated cost of switching from monthly to annual billing before committing to it, including which card would be charged.

curl "https://api.brixsignage.com/v1/account/upgrade-annual/estimate" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataobject
data.linesarray of objectLine items of the invoice raised today.
data.lines[].descriptionstring
data.lines[].amountnumber
data.creditsAppliednumberCredit for the unused part of the current term.
data.subTotalnumber
data.amountDueNownumberCharged now, after credits (currency units, not cents).
data.currencyCodestring
data.nextBillingAtstring | null
data.payWithstring | nullThe payment method that is charged (Visa •••• 4242).

Response 401: Missing, expired or revoked bearer token.

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

Response 409: no_subscription or under_contract.

Response 502: estimate_unavailable.

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