Billing groups API

Billing groups endpoints in the Brix REST API: 6 operations (GET, POST, PATCH, DELETE), with auth, permissions and curl examples.

View as Markdown

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

GET/v1/billing-groups

Bearer token billing.view

Returns the workspace's billing groups (who pays for which screens), each with its current count of billable screens. **Notes.** - Sorted by name; not paginated. Unlike the single read, list rows have no createdAt / updatedAt.

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

Response 200 Success.

FieldTypeDescription
dataarray of object
data[].idstring
data[].namestring
data[].financeContactNamestring | null
data[].financeContactEmailstring | nullWhere this group's invoices go.
data[].chargebeeCustomerIdstring | nullThe billing customer linked by Brix; null until linked.
data[].chargebeeSubscriptionIdstring | nullThe subscription linked by Brix; null until linked.
data[].subscriptionStatusstring | null
data[].paymentTermsDaysinteger | nullNet payment terms in days; null = the workspace default.
data[].screenCountintegerScreens billed to this group.

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

POST/v1/billing-groups

Bearer token billing.edit

Creates a billing group with a name and finance contact. Connecting it to an account with the billing provider is a separate step; one is never created automatically here. **Notes.** - The group bills nothing until Brix links it to a billing account.

Request body application/json

FieldTypeRequiredDescription
namestringyes
financeContactNamestringno
financeContactEmailstringnoStored in lower case.
paymentTermsDaysnumbernoNet terms in days; rounded. Not range-checked on create.
curl -X POST "https://api.brixsignage.com/v1/billing-groups" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 201 Success.

FieldTypeDescription
dataBillingGroupA group of screens billed separately (its own invoice and finance contact).
data.idstring
data.namestring
data.financeContactNamestring | null
data.financeContactEmailstring | nullWhere this group's invoices go.
data.chargebeeCustomerIdstring | nullThe billing customer linked by Brix; null until linked.
data.chargebeeSubscriptionIdstring | nullThe subscription linked by Brix; null until linked.
data.subscriptionStatusstring | null
data.paymentTermsDaysinteger | nullNet payment terms in days; null = the workspace default.
data.screenCountintegerScreens billed to this group.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 `name` missing.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

GET/v1/billing-groups/{id}

Bearer token billing.view

Returns one billing group by id.

ParameterInTypeRequiredDescription
idpathstringyesBilling group id.
curl "https://api.brixsignage.com/v1/billing-groups/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataBillingGroupA group of screens billed separately (its own invoice and finance contact).
data.idstring
data.namestring
data.financeContactNamestring | null
data.financeContactEmailstring | nullWhere this group's invoices go.
data.chargebeeCustomerIdstring | nullThe billing customer linked by Brix; null until linked.
data.chargebeeSubscriptionIdstring | nullThe subscription linked by Brix; null until linked.
data.subscriptionStatusstring | null
data.paymentTermsDaysinteger | nullNet payment terms in days; null = the workspace default.
data.screenCountintegerScreens billed to this group.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such group in this workspace.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

PATCH/v1/billing-groups/{id}

Bearer token billing.edit

Updates a billing group's name, finance contact, or invoice terms. **Notes.** - paymentTermsDays is range-checked here (1–365) but not on create.

ParameterInTypeRequiredDescription
idpathstringyesBilling group id.

Request body application/json

FieldTypeRequiredDescription
namestringno
financeContactNamestring | nullno
financeContactEmailstring | nullno
paymentTermsDaysnumber | nullno1–365, or null to use the workspace default.
curl -X PATCH "https://api.brixsignage.com/v1/billing-groups/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataBillingGroupA group of screens billed separately (its own invoice and finance contact).
data.idstring
data.namestring
data.financeContactNamestring | null
data.financeContactEmailstring | nullWhere this group's invoices go.
data.chargebeeCustomerIdstring | nullThe billing customer linked by Brix; null until linked.
data.chargebeeSubscriptionIdstring | nullThe subscription linked by Brix; null until linked.
data.subscriptionStatusstring | null
data.paymentTermsDaysinteger | nullNet payment terms in days; null = the workspace default.
data.screenCountintegerScreens billed to this group.
data.createdAtstringISO-8601 timestamp (UTC).
data.updatedAtstringISO-8601 timestamp (UTC).

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such group.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 Empty `name`, or `paymentTermsDays` outside 1–365.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

DELETE/v1/billing-groups/{id}

Bearer token billing.edit

Soft-deletes a billing group. Returns 409 if any screens are still billed to it; move or remove those screens first.

ParameterInTypeRequiredDescription
idpathstringyesBilling group id.
curl -X DELETE "https://api.brixsignage.com/v1/billing-groups/{id}" \
  -H "Authorization: Bearer $BRIX_API_KEY"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstring
data.deletedtrue

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such group.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 409 `group_in_use`: screens still bill to it; move them first (`PATCH /v1/screens/:id` `billingGroupId`).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

POST/v1/billing-groups/{id}/screens

Bearer token billing.edit

Assigns a batch of screens to a billing group. This updates the destination group, every group the screens are moving from, and the workspace subscription, so screen counts and billing stay in sync.

ParameterInTypeRequiredDescription
idpathstringyesBilling group id.

Request body application/json

FieldTypeRequiredDescription
screenIdsarray of stringyesUp to 500 are read; more are ignored. Ids that are not live screens are skipped.
curl -X POST "https://api.brixsignage.com/v1/billing-groups/{id}/screens" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"

Response 200 Success.

FieldTypeDescription
dataobject
data.idstring
data.assignedintegerScreens moved into the group.
data.skippedintegerIds not moved (unknown, or already in the group).
data.screenCountinteger

Response 401 Missing, expired or revoked bearer token.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 403 You lack `billing.edit` at one of the screens' locations (the response names them in `screenIds`); nothing changes. Also: You do not hold the permission for the whole workspace (a grant at one location is not enough).

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 404 No such group, or none of the ids is a live screen.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

Response 422 `screenIds` missing or empty.

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.

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

FieldTypeDescription
errorstringMachine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, …
messagestringHuman-readable explanation. Safe to show an operator.
requestIdstringPresent on 5xx: quote it to support.