Account API (part 1 of 4)

Account endpoints in the Brix REST API, part 1 of 4: 13 operations from /v1/account, 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.

GET /v1/account

Auth: Bearer token. Permission: billing.view.

Returns the workspace plan, subscription status, screen pool size, trial or paid status, and onboarding progress. Notes. - email, emailVerifiedAt and verificationEmailLastSentAt describe the CALLING user; they are null for an API key. - On a workspace created before the onboarding step existed, a null prefs.onboardingCompletedAt is filled with the workspace's creation time (and saved).

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

Response 200: Success.

FieldTypeDescription
dataAccount
data.scheduledScreenPoolobject | nullA screen plan reduction queued for the renewal.
data.trialPlanobject | nullDuring a free trial billed by us: the plan that starts when the trial ends, charged to the saved card then. Null when none is set.
data.contractBillingTerm | null
data.idstringWorkspace id (the account id support asks for).
data.partnerManagedbooleanA partner (white-label or reseller) manages this workspace. Its screens never show a corner mark, so the console hides the "Logo on screens" switch.
data.whiteLabelbooleanA partner bills this workspace; Brix billing does not apply.
data.freeAccessbooleanThis workspace has free access (an external tester). There is no plan to choose and nothing is billed.
data.status"active" | "cancel_scheduled" | "paused" | "past_due" | "suspended" | "cancelled"
data.pauseUntilstring | null
data.cancelEffectiveAtstring | null
data.cancelReason"provider" | "trial_expired" | "voluntary" | "nonpayment" | null
data.everPaidboolean
data.deletionRequestedAtstring | null
data.billingBannerBillingBanner | null
data.surveyanyThe last cancellation survey ({ reason, competitor, returnLikelihood, comment }), or null.
data.prefsWorkspacePrefsWorkspace preferences. Every key is present (defaults filled in).
data.prefs.timeFormat"12h" | "24h"
data.prefs.weekStart"mon" | "sun"
data.prefs.dateFormat"mdy" | "dmy" | "ymd"
data.prefs.tempUnits"f" | "c"
data.prefs.timeZonestringIANA time zone. Screens without their own zone use it, and so do schedules timed by the workspace.
data.prefs.languagestringBCP 47 language tag.
data.prefs.multinationalbooleanShows the per-location and per-screen language settings.
data.prefs.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.prefs.navExtrasarray of stringConsole pages switched on that the workspace size hides by default.
data.prefs.appBrandingobjectThe look of the on-screen apps.
data.prefs.appBranding.accentstring
data.prefs.appBranding.accent2string
data.prefs.appBranding.theme"dark" | "light"
data.prefs.appBranding.backdrop"brand" | "wash" | "plain" | "aurora" | "dots" | "grid" | "solid"
data.prefs.appBranding.intensitynumber
data.prefs.brandKitsarray of objectSaved looks. An app follows one with config.brandKitId. A write replaces the whole list (at most 50).
data.prefs.brandKits[].idstring
data.prefs.brandKits[].namestring
data.prefs.brandKits[].accentstring
data.prefs.brandKits[].accent2string
data.prefs.brandKits[].theme"dark" | "light"
data.prefs.brandKits[].backdrop"brand" | "wash" | "plain" | "aurora" | "dots" | "grid" | "solid"
data.prefs.brandKits[].intensitynumber
data.prefs.audioobjectDefault screen volume and a master mute.
data.prefs.audio.volumenumber0–100.
data.prefs.audio.mutedboolean
data.prefs.brandobject
data.prefs.brand.companyNamestring
data.prefs.brand.logoUrlstring
data.prefs.requireAltTextboolean
data.prefs.showScreenLogoboolean
data.prefs.keepTvOnInputbooleanDefault for "Keep the TV on this input" on screens that have not set their own.
data.prefs.standbyContentKindstring | nullWhat a screen with nothing to play shows; null = the default card.
data.prefs.standbyContentIdstring | null
data.prefs.tier"simple" | "team" | "enterprise"Workspace size. It sets console defaults, not access.
data.prefs.industrystring | null
data.prefs.onboardingCompletedAtstring | null
data.prefs.setupStepstring | nullWalkthrough position (s1…s5, l1…l6, done).
data.prefs.welcomeDeclinedAtstring | nullWhen the owner declined the setup questions. Null if never declined, or answered later.
data.prefs.aboutYouDuebooleanThe workspace is asked the first-sign-in questions (workspaces created from 2026-10-14).
data.prefs.aboutYouAtstring | nullWhen the first-sign-in questions were answered.
data.prefs.expectedScreensinteger | nullHow many screens the owner said they expect.
data.prefs.orgNameSetboolean
data.prefs.tiersarray of integerLocation tree levels in use.
data.prefs.tierLabelsobjectCustom names for the location tree levels.
data.prefs.requireTwoFactorboolean
data.prefs.requireSsoboolean
data.prefs.requireSsoPendingbooleanSingle sign-on was required, and turns on after the first sign-in through the connection.
data.prefs.requireSsoPendingSincestring | null
data.prefs.aiobject
data.prefs.ai.enabledboolean
data.prefs.ai.featuresobjectPer feature (tags, alt-text, moderation, transcription, translation, focal-region, embedding); an absent feature follows enabled.
data.prefs.ai.dailyCallLimitinteger | null
data.prefs.ai.redactPersonalDataboolean
data.prefs.retentionobjectDays kept per stream, only for the streams the workspace has set. An absent stream uses the platform window.
data.prefs.retention.offlinenumber
data.prefs.retention.screenshotsnumber
data.prefs.retention.playbacknumber
data.prefs.retention.deviceLogsnumber
data.prefs.retention.vitalsnumber
data.prefs.retention.replaysnumber
data.prefs.retention.aiEventsnumber
data.prefs.warehouseobjectData warehouse feed. Set by Brix; not writable here.
data.prefs.warehouse.enabledboolean
data.prefs.warehouse.bucketBindingstringSet by Brix when the data warehouse feed is provisioned.
data.prefs.warehouse.tablesarray of string
data.prefs.warehouse.lookbackDaysinteger
data.prefs.supportAccessSupportAccessPolicy
data.prefs.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.prefs.supportAccess.grantMinutesintegerHow long an approval lasts.
data.prefs.supportAccess.requestTtlMinutesintegerHow long a request waits for an answer before it expires.
data.prefs.kioskHasGlobalPinbooleanA workspace Screen Lock PIN is set. The PIN and its hash are never returned.
data.region"us" | "eu" | "oc" | "apac"Where the workspace's data is stored.
data.dbRegion"us" | "eu" | "oc" | "apac"Where the workspace's records are stored. Can differ from region for workspaces created before regional sign-up: media in the region, records on the primary.
data.billingProvider"chargebee" | "brix"brix: Brix invoices the account (see payment). chargebee: a card subscription.
data.paymentAccountPayment | nullOnly when billingProvider is brix.
data.subscriptionStatusstring | null
data.cadence"monthly" | "annual" | null
data.billableScreensintegerScreens that count toward the bill now.
data.licensedScreensinteger | nullScreens bought (the plan quantity or the term's screens).
data.trialEndsAtstring | null
data.nextBillingAtstring | null
data.currentTermEndsAtstring | null
data.emailVerifiedAtstring | nullThe calling user's; null for an API key.
data.verificationEmailLastSentAtstring | null
data.emailstring | nullThe calling user's email; null for an API key.

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/about-you

Auth: Bearer token. Permission: billing.edit.

Records the answers a new workspace gives at its first sign-in: screenCount, the number of screens you expect (a whole number from 1 to 1,000,000, required), heardFrom, how you heard about Brix (required, except for a customer of a partner), and phone. A phone number is required only for a Google or Microsoft sign-up in the United States or Canada. Returns 422 with the field that is missing or not valid.

Request body: application/json

FieldTypeRequiredDescription
screenCountintegeryesHow many screens the workspace expects. Sets prefs.expectedScreens and the tier.
heardFromstringnoHow they heard about Brix. Required unless the workspace belongs to a partner.
aiPromptstringnoThe question they asked an AI assistant, when heardFrom names one.
phonestringnoRequired for a workspace in the US or Canada when the person has no phone on file (phoneRequired on GET /v1/account/onboarding); optional elsewhere and in a partner's customer workspace. US and Canada numbers get the North-American checks.
curl -X POST "https://api.brixsignage.com/v1/account/about-you" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

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

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

GET /v1/account/billing-address

Auth: Bearer token. Permission: billing.view.

Returns the billing address on file with the billing provider: the country used to determine invoice tax, and, for the United States and Canada, the state and postal code. The response includes configured: false when no billing address has been set yet.

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

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 5XX: Server error. The body carries a requestId to quote to support.

PUT /v1/account/billing-address

Auth: Bearer token. Permission: billing.edit.

Sets the workspace billing address. country is required and validated against the ISO 3166-1 country list. For the United States and Canada, stateCode and zip are also required. This replaces the entire address on file; you cannot update a single field. Notes. - Answers 400 (not 422) for an invalid address, unlike most validation errors.

Request body: application/json

FieldTypeRequiredDescription
countrystringyesCountry code or name.
stateCodestringnoRequired for US and Canada. Stored in upper case.
zipstringnoRequired for US and Canada.
citystringno
line1stringno
curl -X PUT "https://api.brixsignage.com/v1/account/billing-address" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.configuredtrue
data.addressobject
data.address.countrystring | nullISO 3166-1 alpha-2.
data.address.stateCodestring | nullState or province, without the country prefix (CA, ON).
data.address.zipstring | null
data.address.citystring | null
data.address.line1string | null
data.needsStateboolean

Response 400: invalid_country or state_required (400, not 422).

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_customer: billing is not set up yet.

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/billing-mode

Auth: Bearer token. Permission: billing.edit.

Switches the workspace between automatic card charging (auto) and invoice billing (invoice). Switching to invoice billing requires a signed-in user with a verified work email address, so an API key can only switch to automatic charging.

Request body: application/json

FieldTypeRequiredDescription
mode"auto" | "invoice"yes
curl -X POST "https://api.brixsignage.com/v1/account/billing-mode" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.mode"auto" | "invoice"

Response 401: Missing, expired or revoked bearer token.

Response 403: user_required: switching to invoice needs a signed-in user with a verified work email, so an API key can switch only to auto. Also: You do not hold the permission for the whole workspace (a grant at one location is not enough).

Response 409: email_unverified, work_email_required, billing_not_configured, or under_contract.

Response 422: mode is not auto or invoice.

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/brix-plan

Auth: Bearer token. Permission: billing.edit.

Starts a monthly or yearly plan for a workspace billed directly by Brix. Needs a saved card. The first period is charged to the card now; if the payment fails, nothing is created and the response is 402. The plan renews on its end date until it is cancelled.

Request body: application/json

FieldTypeRequiredDescription
cadence"monthly" | "annual"yes
screensintegeryes
curl -X POST "https://api.brixsignage.com/v1/account/brix-plan" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201: Success.

FieldTypeDescription
dataobject
data.contractBillingTermAn agreed billing term (a fixed number of screens at a fixed rate for a fixed period).
data.contract.idstring
data.contract.status"active" | "cancelled" | "awaiting_payment" | "ended"
data.contract.rail"chargebee" | "brix"Who invoices the term: brix (Brix invoices) or chargebee (the card subscription).
data.contract.activateOn"now" | "paid"
data.contract.poNumberstring | null
data.contract.invoiceNumberstring | null
data.contract.invoicePaidboolean | null
data.contract.activatedAtstring | null
data.contract.screensinteger
data.contract.rateCentsPerScreenMonthinteger
data.contract.termMonthsinteger
data.contract.schedule"upfront" | "monthly" | "annual"
data.contract.collect"card" | "invoice"
data.contract.currencystring
data.contract.startsAtstringDate (YYYY-MM-DD).
data.contract.endsAtstringDate (YYYY-MM-DD).
data.contract.totalCentsinteger
data.contract.monthlyCentsinteger
data.contract.termLabelstring
data.contract.scheduleLabelstring
data.contract.invoiceIdstring | null
data.contract.notesstring | null
data.contract.createdBystring | null
data.contract.priorobject | nullThe plan before the term started.
data.contract.createdAtstringISO-8601 timestamp (UTC).
data.contract.endedAtstring | null
data.contract.renewal"renew" | "non_renewing"
data.contract.renewalInvoiceIdstring | null
data.contract.origin"staff" | "self_serve"self_serve — the customer chose this plan on the Billing page; staff — an agreed term set by Brix.
data.contract.nextobject | nullWhat the next period starts with, when the customer asked for a change at renewal.
data.invoiceNumberstring | null

Response 401: Missing, expired or revoked bearer token.

Response 402: card_declined — the first payment failed. Nothing was created.

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, card_required, already_on_plan, or payment_required.

Response 422: Bad cadence or screens.

Response 503: price_unavailable.

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

PUT /v1/account/brix-plan/cadence

Auth: Bearer token. Permission: billing.edit.

Switches the plan between monthly and yearly. The switch takes effect when the current period ends, at the list price of the new cadence. Notes. - The switch takes effect when the current period ends.

Request body: application/json

FieldTypeRequiredDescription
cadence"monthly" | "annual"yes
curl -X PUT "https://api.brixsignage.com/v1/account/brix-plan/cadence" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.contractBillingTermAn agreed billing term (a fixed number of screens at a fixed rate for a fixed period).
data.contract.idstring
data.contract.status"active" | "cancelled" | "awaiting_payment" | "ended"
data.contract.rail"chargebee" | "brix"Who invoices the term: brix (Brix invoices) or chargebee (the card subscription).
data.contract.activateOn"now" | "paid"
data.contract.poNumberstring | null
data.contract.invoiceNumberstring | null
data.contract.invoicePaidboolean | null
data.contract.activatedAtstring | null
data.contract.screensinteger
data.contract.rateCentsPerScreenMonthinteger
data.contract.termMonthsinteger
data.contract.schedule"upfront" | "monthly" | "annual"
data.contract.collect"card" | "invoice"
data.contract.currencystring
data.contract.startsAtstringDate (YYYY-MM-DD).
data.contract.endsAtstringDate (YYYY-MM-DD).
data.contract.totalCentsinteger
data.contract.monthlyCentsinteger
data.contract.termLabelstring
data.contract.scheduleLabelstring
data.contract.invoiceIdstring | null
data.contract.notesstring | null
data.contract.createdBystring | null
data.contract.priorobject | nullThe plan before the term started.
data.contract.createdAtstringISO-8601 timestamp (UTC).
data.contract.endedAtstring | null
data.contract.renewal"renew" | "non_renewing"
data.contract.renewalInvoiceIdstring | null
data.contract.origin"staff" | "self_serve"self_serve — the customer chose this plan on the Billing page; staff — an agreed term set by Brix.
data.contract.nextobject | nullWhat the next period starts with, when the customer asked for a change at renewal.
data.changedboolean
data.effectiveAtstring

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 no_plan.

Response 422: Bad cadence.

Response 503: price_unavailable.

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

GET /v1/account/brix-plan/playing

Auth: Bearer token. Permission: screen.view.

Lists every screen on the plan in the order it was paired. Each screen shows if it plays or waits for payment. Also returns the number of screens the plan pays for.

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

Response 200: Success.

FieldTypeDescription
dataobject
data.capacityinteger | null
data.screensarray of object
data.screens[].idstring
data.screens[].namestring
data.screens[].statusstring
data.screens[].lastSeenAtstring | null
data.screens[].waitingboolean
data.canChooseboolean

Response 401: Missing, expired or revoked bearer token.

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

Response 404: A workspace billed by a partner.

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

PUT /v1/account/brix-plan/playing

Auth: Bearer token. Permission: billing.edit.

When you have more screens than your plan pays for, choose which screens play. Send exactly as many screens as the plan has. The other screens wait for payment. Nothing is charged. Notes. - The other screens wait for payment. Nothing is charged.

Request body: application/json

FieldTypeRequiredDescription
screenIdsarray of stringyes
curl -X PUT "https://api.brixsignage.com/v1/account/brix-plan/playing" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.playingarray of string
data.waitingarray of string

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: screen_not_found, or a workspace billed by a partner.

Response 409: not_brix_billed or no_plan.

Response 422: wrong_count — choose exactly as many as the plan has.

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

GET /v1/account/brix-plan/pool

Auth: Bearer token. Permission: screen.view.

For a workspace billed directly by Brix, returns how many screens the plan pays for, how many play, how many wait for payment, the price of one more screen today, and an open request for more screens. The saved card is shown only to a caller who can edit billing. Returns pool: null for a workspace that is not billed directly by Brix.

curl "https://api.brixsignage.com/v1/account/brix-plan/pool" \
  -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/account/brix-plan/quote

Auth: Bearer token. Permission: billing.view.

Returns the list price of a monthly or yearly plan for a screen count, for a workspace billed directly by Brix. Nothing is charged. Returns 409 for a workspace that is not billed directly by Brix.

ParameterInTypeRequiredDescription
cadencequery"monthly" | "annual"yes
screensqueryintegeryes
curl "https://api.brixsignage.com/v1/account/brix-plan/quote" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200: Success.

FieldTypeDescription
dataBrixPlanQuoteThe price of a plan on Brix's own billing, before anything is charged.
data.cadence"monthly" | "annual"
data.screensinteger
data.rateCentsPerScreenMonthinteger
data.termMonthsinteger
data.schedule"monthly" | "annual"
data.startsAtstring
data.endsAtstring
data.monthlyCentsinteger
data.totalCentsintegerWhat the first payment is for.

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.

Response 422: Bad cadence or screens.

Response 503: price_unavailable.

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

PUT /v1/account/brix-plan/screens

Auth: Bearer token. Permission: billing.edit.

Sets the screen count of the plan. More screens are invoiced now, prorated to the days left in the period, and charged to the saved card. Fewer screens start at the next period and nothing is refunded. The count cannot go below the screens that are running. Notes. - More screens are charged now, prorated to the days left in the period. Fewer screens start at the next period; nothing is refunded.

Request body: application/json

FieldTypeRequiredDescription
screensintegeryes
curl -X PUT "https://api.brixsignage.com/v1/account/brix-plan/screens" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.oktrue
data.effect"now" | "renewal" | "unchanged"
data.contractBillingTermAn agreed billing term (a fixed number of screens at a fixed rate for a fixed period).
data.contract.idstring
data.contract.status"active" | "cancelled" | "awaiting_payment" | "ended"
data.contract.rail"chargebee" | "brix"Who invoices the term: brix (Brix invoices) or chargebee (the card subscription).
data.contract.activateOn"now" | "paid"
data.contract.poNumberstring | null
data.contract.invoiceNumberstring | null
data.contract.invoicePaidboolean | null
data.contract.activatedAtstring | null
data.contract.screensinteger
data.contract.rateCentsPerScreenMonthinteger
data.contract.termMonthsinteger
data.contract.schedule"upfront" | "monthly" | "annual"
data.contract.collect"card" | "invoice"
data.contract.currencystring
data.contract.startsAtstringDate (YYYY-MM-DD).
data.contract.endsAtstringDate (YYYY-MM-DD).
data.contract.totalCentsinteger
data.contract.monthlyCentsinteger
data.contract.termLabelstring
data.contract.scheduleLabelstring
data.contract.invoiceIdstring | null
data.contract.notesstring | null
data.contract.createdBystring | null
data.contract.priorobject | nullThe plan before the term started.
data.contract.createdAtstringISO-8601 timestamp (UTC).
data.contract.endedAtstring | null
data.contract.renewal"renew" | "non_renewing"
data.contract.renewalInvoiceIdstring | null
data.contract.origin"staff" | "self_serve"self_serve — the customer chose this plan on the Billing page; staff — an agreed term set by Brix.
data.contract.nextobject | nullWhat the next period starts with, when the customer asked for a change at renewal.
data.chargedCentsinteger
data.carriedCentsinteger
data.invoiceNumberstring | null
data.collect"card" | "next_invoice" | "invoice"How the added screens were collected. invoice: an invoice went out by email and no card was charged.
data.dueAtstring | nullWhen the invoice, or the amount added to the next invoice, is due.
data.auditstring

Response 401: Missing, expired or revoked bearer token.

Response 402: card_declined — the extra screens were not added.

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, no_plan, below_running, card_required, payment_pending, or payment_required.

Response 422: Bad screens.

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

POST /v1/account/brix-plan/screens/estimate

Auth: Bearer token. Permission: billing.view.

Returns what a new screen count costs today. More screens are charged now, prorated to the days left in the period. Fewer screens start at the next period. Nothing is changed.

Request body: application/json

FieldTypeRequiredDescription
screensintegeryes
curl -X POST "https://api.brixsignage.com/v1/account/brix-plan/screens/estimate" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200: Success.

FieldTypeDescription
dataobject
data.oktrue
data.currentScreensinteger
data.screensinteger
data.effect"now" | "renewal" | "unchanged"
data.chargeCentsinteger
data.periodEndsstring
data.collect"card" | "next_invoice" | "invoice" | nullHow chargeCents is collected. card: charged to the saved card now. next_invoice: added to the next invoice. invoice: the account pays by invoice, so an invoice goes out by email and no card is charged. Null when nothing is due now.
data.needsCardbooleanTrue when the account pays by card and no card is saved. The change is refused until a card is saved.
data.dueAtstring | nullWhen the invoice, or the amount added to the next invoice, is due. Null for a card charge.

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 no_plan.

Response 422: Bad screens.

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