# Account (part 2 of 4)

> For AI agents: the full docs index is at https://brixsignage.com/llms.txt, and every page has a markdown twin (add .md to the path).

Account is split into 4 pages: [part 1](https://brixsignage.com/developers/api/account.md) (`/v1/account` to `/v1/account/brix-plan/screens/estimate`), [part 2](https://brixsignage.com/developers/api/account-2.md) (`/v1/account/brix-plan/screens/request` to `/v1/account/location-payment`), [part 3](https://brixsignage.com/developers/api/account-3.md) (`/v1/account/location-payment` to `/v1/account/payment-card/complete`), [part 4](https://brixsignage.com/developers/api/account-4.md) (`/v1/account/payment-card/setup` to `/v1/account/upgrade-annual/estimate`).

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](https://brixsignage.com/developers/authentication.md), [Errors and rate limits](https://brixsignage.com/developers/errors-and-rate-limits.md) and [Pagination](https://brixsignage.com/developers/pagination.md).

- [POST /v1/account/brix-plan/screens/request](#post-v1-account-brix-plan-screens-request)
- [PUT /v1/account/brix-plan/trial-plan](#put-v1-account-brix-plan-trial-plan)
- [DELETE /v1/account/brix-plan/trial-plan](#delete-v1-account-brix-plan-trial-plan)
- [POST /v1/account/cancel](#post-v1-account-cancel)
- [POST /v1/account/cancel-deletion](#post-v1-account-cancel-deletion)
- [GET /v1/account/content-scope](#get-v1-account-content-scope)
- [PUT /v1/account/content-scope](#put-v1-account-content-scope)
- [PATCH /v1/account/contract/renewal](#patch-v1-account-contract-renewal)
- [GET /v1/account/data-inventory](#get-v1-account-data-inventory)
- [POST /v1/account/downgrade-monthly](#post-v1-account-downgrade-monthly)
- [GET /v1/account/encryption-key](#get-v1-account-encryption-key)
- [PUT /v1/account/encryption-key](#put-v1-account-encryption-key)
- [DELETE /v1/account/encryption-key](#delete-v1-account-encryption-key)
- [POST /v1/account/encryption-key/verify](#post-v1-account-encryption-key-verify)
- [GET /v1/account/export](#get-v1-account-export)
- [GET /v1/account/export/manifest](#get-v1-account-export-manifest)
- [GET /v1/account/export/part/{part}](#get-v1-account-export-part-part)
- [PATCH /v1/account/invoice-email](#patch-v1-account-invoice-email)
- [GET /v1/account/invoices](#get-v1-account-invoices)
- [GET /v1/account/invoices/{id}/file](#get-v1-account-invoices-id-file)
- [POST /v1/account/invoices/{id}/pay-link](#post-v1-account-invoices-id-pay-link)
- [GET /v1/account/invoices/{id}/pdf](#get-v1-account-invoices-id-pdf)
- [POST /v1/account/invoices/pay-all-link](#post-v1-account-invoices-pay-all-link)
- [POST /v1/account/invoices/pay-links-outstanding](#post-v1-account-invoices-pay-links-outstanding)
- [GET /v1/account/limits](#get-v1-account-limits)
- [GET /v1/account/location-payment](#get-v1-account-location-payment)

Every 4xx and 5xx response below returns this body:

| Field | Type | Description |
| --- | --- | --- |
| `error` | string | Machine-readable code: `unauthorized`, `forbidden`, `not_found`, `validation_error`, `conflict`, `rate_limited`, `internal_error`, … |
| `message` | string | Human-readable explanation. Safe to show an operator. |
| `requestId` | string | Present on 5xx: quote it to support. |

## POST /v1/account/brix-plan/screens/request

Request more screens

Asks for more screens on the plan without billing access. Send `add`, the number of screens, and optionally `sendTo`, an email address that gets the invoice (for example, accounts payable). Without `sendTo`, the invoice goes to the billing contacts of the account. Returns the request with its payment link. Nothing is charged until the invoice is paid. Connected apps cannot make this request.

Auth: Bearer token.

```bash
curl -X POST "https://api.brixsignage.com/v1/account/brix-plan/screens/request" \
  -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.

## PUT /v1/account/brix-plan/trial-plan

Set the plan for the trial's end

During a free trial, sets the plan that starts when the trial ends. The plan uses the list price. We charge the saved card when the trial ends. Nothing is charged now.

**Notes.**
- Nothing is charged now. The plan starts when the trial ends, charged to the saved card.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `cadence` | "monthly" \| "annual" | yes |  |
| `screens` | integer | yes |  |

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.trialPlan` | object |  |
| `data.trialPlan.cadence` | "monthly" \| "annual" |  |
| `data.trialPlan.screens` | integer |  |
| `data.trialPlan.rateCentsPerScreenMonth` | integer |  |
| `data.trialPlan.totalCents` | integer | What the trial's end charges: the whole first period. |
| `data.trialPlan.from` | "chargebee" \| "customer" |  |
| `data.trialPlan.startsAt` | string \| null | When it is charged: the trial's end. On `GET /v1/account` only. |

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

Response 422: Bad `cadence` or `screens`.

Response 503: `price_unavailable`.

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

## DELETE /v1/account/brix-plan/trial-plan

Remove the plan for the trial's end

Removes the plan that was set for the end of the free trial. Nothing is charged when the trial ends, and the screens stop when the trial ends.

**Notes.**
- Nothing is charged when the trial ends.

Auth: Bearer token. Permission: `billing.edit`.

```bash
curl -X DELETE "https://api.brixsignage.com/v1/account/brix-plan/trial-plan" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.trialPlan` | null |  |

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

## POST /v1/account/cancel

Cancel subscription

Submits a cancellation request with a reason. Choosing the reason "Seasonal Business" together with a `restartDate` pauses the account instead of cancelling it. Any other reason schedules cancellation for a fixed number of days after the request. Cancellation can be reversed at any time before it takes effect by calling the reactivate operation.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `reason` | string | yes | Survey answer. `Seasonal Business` pauses the account instead of cancelling it. |
| `restartDate` | string | no | Required for `Seasonal Business`: when the account comes back (future, at most 12 months). |
| `competitor` | string | no |  |
| `returnLikelihood` | number | no |  |
| `comment` | string | no |  |

```bash
curl -X POST "https://api.brixsignage.com/v1/account/cancel" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object \| 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: No such workspace.

Response 409: `payment_required` (unpaid invoice), `already_cancelled`, `under_contract` (an agreed term; contact Brix), or `location_plans_active` (a seasonal pause while a location has its own plan; contact Brix). A cancel schedules each location's own plan to end on the same date.

Response 422: `reason` missing, or a bad `restartDate`.

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/cancel-deletion

Cancel pending account deletion

Stops a scheduled permanent deletion of the workspace before it happens. Call this any time before the deletion date to keep the account and its data.

**Notes.**
- The account stays `cancelled`; reactivate it separately.

Auth: Bearer token. Permission: `billing.edit`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.status` | "active" \| "cancel_scheduled" \| "paused" \| "past_due" \| "suspended" \| "cancelled" |  |
| `data.deletionRequestedAt` | null |  |

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: `not_pending_deletion`.

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

## GET /v1/account/content-scope

Get the default content scope

Read what people in this workspace can see when neither they nor their role has a setting of their own: `all` for all content, or `shared` for only content shared with them.

Auth: Bearer token. Permission: `user.view`.

```bash
curl "https://api.brixsignage.com/v1/account/content-scope" \
  -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.

## PUT /v1/account/content-scope

Set the default content scope

Set the default for people with no setting of their own to `all` or `shared`. People already in the workspace keep what they see today: anyone who would change has their current value saved on their own account first. A connected app cannot call this.

Auth: Bearer token.

```bash
curl -X PUT "https://api.brixsignage.com/v1/account/content-scope" \
  -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.

## PATCH /v1/account/contract/renewal

Set contract auto-renewal

Sets whether the workspace's current contract term renews automatically or ends at term expiry. Choosing not to renew voids any unpaid renewal invoice; choosing to renew allows Brix to invoice the next term automatically. Returns 409 if the workspace has no fixed term, and 404 for white-label workspaces, where this setting does not apply.

**Notes.**
- Turning auto-renew off voids an unpaid renewal invoice.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `renewal` | "renew" \| "non_renewing" | yes |  |

```bash
curl -X PATCH "https://api.brixsignage.com/v1/account/contract/renewal" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.ok` | true |  |
| `data.contract` | BillingTerm | An agreed billing term (a fixed number of screens at a fixed rate for a fixed period). |
| `data.contract.id` | string |  |
| `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.poNumber` | string \| null |  |
| `data.contract.invoiceNumber` | string \| null |  |
| `data.contract.invoicePaid` | boolean \| null |  |
| `data.contract.activatedAt` | string \| null |  |
| `data.contract.screens` | integer |  |
| `data.contract.rateCentsPerScreenMonth` | integer |  |
| `data.contract.termMonths` | integer |  |
| `data.contract.schedule` | "upfront" \| "monthly" \| "annual" |  |
| `data.contract.collect` | "card" \| "invoice" |  |
| `data.contract.currency` | string |  |
| `data.contract.startsAt` | string | Date (YYYY-MM-DD). |
| `data.contract.endsAt` | string | Date (YYYY-MM-DD). |
| `data.contract.totalCents` | integer |  |
| `data.contract.monthlyCents` | integer |  |
| `data.contract.termLabel` | string |  |
| `data.contract.scheduleLabel` | string |  |
| `data.contract.invoiceId` | string \| null |  |
| `data.contract.notes` | string \| null |  |
| `data.contract.createdBy` | string \| null |  |
| `data.contract.prior` | object \| null | The plan before the term started. |
| `data.contract.createdAt` | string | ISO-8601 timestamp (UTC). |
| `data.contract.endedAt` | string \| null |  |
| `data.contract.renewal` | "renew" \| "non_renewing" |  |
| `data.contract.renewalInvoiceId` | string \| 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.next` | object \| null | What the next period starts with, when the customer asked for a change at renewal. |
| `data.changed` | boolean |  |

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: `no_term` (no agreed term), or a term that cannot change here.

Response 422: `renewal` is not `renew` or `non_renewing`.

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

## GET /v1/account/data-inventory

Get data inventory

Returns, for every category of data Brix holds about the workspace, what it is, whether it identifies a person, how long it is kept, whether it is included in a data export, and whether it is deleted when the account is closed. Pass `?counts=1` to include a row count for each category.

Auth: Bearer token. Permission: `settings.view`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `counts` | query | "1" | no | `1` adds a row count per table (slower). |

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.generatedAt` | string | ISO-8601 timestamp (UTC). |
| `data.counted` | boolean |  |
| `data.categories` | array of object |  |
| `data.categories[].id` | string |  |
| `data.categories[].label` | string |  |
| `data.categories[].what` | string |  |
| `data.categories[].personal` | string |  |
| `data.categories[].retention` | string |  |
| `data.categories[].rows` | integer \| null |  |
| `data.categories[].tables` | array of object |  |
| `data.categories[].tables[].table` | string |  |
| `data.categories[].tables[].rows` | integer \| null |  |
| `data.categories[].tables[].inExport` | boolean |  |
| `data.categories[].tables[].exportNote` | string \| null |  |
| `data.categories[].tables[].erasedOnClose` | boolean |  |
| `data.categories[].tables[].retainedNote` | string \| null |  |
| `data.categories[].tables[].strippedFields` | array of string |  |
| `data.residency` | object \| null | Where the workspace's data is stored. `database`, `media` and `backups` are internal store names. |
| `data.notes` | array 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 5XX: Server error. The body carries a `requestId` to quote to support.

## POST /v1/account/downgrade-monthly

Switch to monthly billing

Switches the workspace from annual to monthly billing at the end of the current annual term. Nothing is charged or refunded now.

Auth: Bearer token. Permission: `billing.edit`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.cadence` | "annual" | Unchanged until the annual term ends. |
| `data.scheduledCadence` | "monthly" |  |

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`, `already_monthly`, or `under_contract`.

Response 502: The switch could not be scheduled.

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

## GET /v1/account/encryption-key

Get encryption key status

Returns whether the workspace can use its own encryption key in Azure Key Vault, what that key covers, its identifier, its status, and the progress of re-encrypting existing data under it.

Auth: Bearer token. Permission: `settings.view`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.available` | boolean | Customer-managed keys can be used on this platform. |
| `data.consentUrl` | string \| null | Microsoft admin-consent link for the Key Vault application. A tenant administrator opens it once; null when customer-managed keys are not available. |
| `data.covers` | string |  |
| `data.doesNotCover` | string |  |
| `data.key` | object \| null |  |

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/encryption-key

Enable customer-managed key

Enables encryption with the workspace's own key in Azure Key Vault. Brix verifies the key, generates and wraps a data key, and starts re-encrypting existing secrets under it. Every new secret created after this call is protected with the customer's key.

Auth: Bearer token. Permission: `settings.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `tenantId` | string | yes | Your Microsoft Entra tenant id (a UUID). |
| `keyId` | string | yes | `https://<vault>.vault.azure.net/keys/<name>/<version>`. |

```bash
curl -X PUT "https://api.brixsignage.com/v1/account/encryption-key" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 201: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.available` | boolean | Customer-managed keys can be used on this platform. |
| `data.consentUrl` | string \| null | Microsoft admin-consent link for the Key Vault application. A tenant administrator opens it once; null when customer-managed keys are not available. |
| `data.covers` | string |  |
| `data.doesNotCover` | string |  |
| `data.key` | object \| null |  |
| `data.firstPass` | object | The first re-encryption pass, run inside the request; the rest runs hourly. |
| `data.firstPass.status` | string |  |
| `data.firstPass.remaining` | integer |  |

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: `conflict` (a key is already set; turn it off first) or `key_check_failed`.

Response 422: Bad `tenantId` or `keyId`.

Response 503: `not_available` on this platform.

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

## DELETE /v1/account/encryption-key

Disable customer-managed key

Disables the workspace's customer-managed encryption key. Every secret currently protected by that key is first moved back under the Brix-managed key, so nothing becomes unreadable, and only then is the key record removed. Returns 409 if the customer-managed key can no longer be reached.

**Notes.**
- `key` is null when the first pass moved every secret back; otherwise it shows `disabling` until the hourly pass finishes.

Auth: Bearer token. Permission: `settings.edit`.

```bash
curl -X DELETE "https://api.brixsignage.com/v1/account/encryption-key" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.available` | boolean | Customer-managed keys can be used on this platform. |
| `data.consentUrl` | string \| null | Microsoft admin-consent link for the Key Vault application. A tenant administrator opens it once; null when customer-managed keys are not available. |
| `data.covers` | string |  |
| `data.doesNotCover` | string |  |
| `data.key` | object \| null |  |
| `data.firstPass` | object | The first re-encryption pass, run inside the request; the rest runs hourly. |
| `data.firstPass.status` | string |  |
| `data.firstPass.remaining` | integer |  |

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: No key is set.

Response 409: `key_unavailable`: the vault did not answer, so secrets cannot be moved back.

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

## POST /v1/account/encryption-key/verify

Verify encryption key

Performs a dry run against the workspace's own encryption key: it wraps and unwraps a random test value to confirm the key still works. Nothing is stored or changed.

Auth: Bearer token. Permission: `settings.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `tenantId` | string | yes | Your Microsoft Entra tenant id (a UUID). |
| `keyId` | string | yes | `https://<vault>.vault.azure.net/keys/<name>/<version>`. |

```bash
curl -X POST "https://api.brixsignage.com/v1/account/encryption-key/verify" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.ok` | true |  |

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: `key_check_failed`: the vault refused (`kind` says why).

Response 422: Bad `tenantId` or `keyId`.

Response 503: `not_available` on this platform.

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

## GET /v1/account/export

Download full data export

Returns a data export of the workspace as one downloadable file: the workspace record, its members, nine content tables and the last 365 days of activity-log events. Credentials are never included. Because the file holds every member's personal data, it requires permission to export billing data (`billing.export`) for the whole workspace. Permission to edit billing is not enough. Brix does not email or store the export. For every table and the complete activity log, use the export manifest and its parts.

**Notes.**
- No `{ data }` envelope: the body is the export file (`Content-Disposition: attachment`).
- Credentials are never exported: their columns are kept with `null` or a `[secret; not exported]` / `[encrypted; not exported]` marker.
- `generatedBy.kind` is `user` even when an API key made the export (and then `userId` is absent).
- The complete export (every table, the whole audit log) is `GET /v1/account/export/manifest` and its parts.

Auth: Bearer token. Permission: `billing.export`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `schemaVersion` | 1 |  |
| `generatedAt` | string | ISO-8601 timestamp (UTC). |
| `generatedBy` | object | Always `user`; `userId` is absent for an API key. |
| `generatedBy.kind` | "user" |  |
| `generatedBy.userId` | string |  |
| `workspace` | object | The workspace record (every column; the Screen Lock PIN hash replaced by `kioskHasGlobalPin` inside `prefs`). |
| `people` | array of object |  |
| `people[].id` | string |  |
| `people[].name` | string |  |
| `people[].email` | string |  |
| `people[].status` | string |  |
| `people[].lastLoginAt` | string \| null |  |
| `people[].createdAt` | string | ISO-8601 timestamp (UTC). |
| `content` | object | Nine content tables, one object per row (all columns). |
| `content.screens` | array of object |  |
| `content.mediaAssets` | array of object |  |
| `content.playlists` | array of object |  |
| `content.schedules` | array of object |  |
| `content.layouts` | array of object |  |
| `content.creatives` | array of object |  |
| `content.appInstances` | array of object |  |
| `content.dataSources` | array of object |  |
| `content.banners` | array of object |  |
| `auditEvents` | array of object | The last 365 days only. |
| `limits` | object |  |
| `limits.auditEvents` | string |  |
| `limits.completeness` | 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 5XX: Server error. The body carries a `requestId` to quote to support.

## GET /v1/account/export/manifest

Get export manifest

Describes the contents of a full data export without downloading it: every table of workspace data with its row count, which tables are excluded from the export and why, and which fields are redacted and why. Use this to confirm what an export will and will not contain before downloading it.

Auth: Bearer token. Permission: `billing.export`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.schemaVersion` | integer |  |
| `data.generatedAt` | string | ISO-8601 timestamp (UTC). |
| `data.parts` | array of object |  |
| `data.parts[].part` | string | Pass to `/export/part/:part`. |
| `data.parts[].table` | string |  |
| `data.parts[].rows` | integer |  |
| `data.excluded` | array of object |  |
| `data.excluded[].table` | string |  |
| `data.excluded[].reason` | string |  |
| `data.redactedColumns` | array of string | `table.column` values withheld from every part. |
| `data.notes` | array 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 5XX: Server error. The body carries a `requestId` to quote to support.

## GET /v1/account/export/part/{part}

Download one export part

Downloads one part of a full data export. Results are paged with a cursor rather than an offset, so rows are not skipped or duplicated if data changes while the export is running. Secret values are replaced with a marker rather than removed, so a withheld value can be told apart from one that was never set. Pass `?format=csv` to receive the same data as CSV, encoded with a UTF-8 byte-order mark for compatibility with Excel and guarded against spreadsheet formula injection. Use the `x-brix-next-cursor` response header to fetch the next page.

**Notes.**
- Credentials are never exported: their columns are kept with `null` or a `[secret; not exported]` / `[encrypted; not exported]` marker (the manifest lists them in `redactedColumns`).
- `?format=csv` answers `text/csv` instead, with the cursor in the `X-Brix-Next-Cursor` header.

Auth: Bearer token. Permission: `billing.export`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `part` | path | string | yes | A `part` from the manifest (a table name). |
| `cursor` | query | string | no | `nextCursor` of the previous page. |

```bash
curl "https://api.brixsignage.com/v1/account/export/part/{part}" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | array of object | Rows of the table, all columns (withheld ones marked). |
| `nextCursor` | string \| null | Null on the last page. |

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: No such part.

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

## PATCH /v1/account/invoice-email

Set invoice email

Sets one more email address that receives every invoice Brix issues to a workspace billed directly by Brix. The workspace owners always receive invoices too. Send `null` or an empty string to remove it. Returns 422 if the value is not one email address, and 409 if the workspace is billed through the billing provider.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `email` | string \| null | yes | One more address for every invoice. `null` or empty removes it. |

```bash
curl -X PATCH "https://api.brixsignage.com/v1/account/invoice-email" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.payment` | AccountPayment | Payment 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.card` | object \| null |  |
| `data.payment.backupCard` | object \| null | Charged once when the card is declined. |
| `data.payment.lastPaid` | object \| null | The card the last invoice was paid with. |
| `data.payment.cardAvailable` | boolean | Card payment can be set up for this workspace. |
| `data.payment.invoiceEmail` | string \| null | One 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`.

Response 422: Not one email address.

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

## GET /v1/account/invoices

List invoices

Returns the workspace's invoice history, newest first: invoices Brix issued for an agreed term and invoices of the card subscription. The response includes `configured: false` when billing has not been set up yet.

Auth: Bearer token. Permission: `billing.view`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.configured` | boolean |  |
| `data.invoices` | array of object \| object | Newest first. Amounts are in currency units, not cents. |
| `data.reason` | string | Present when the card subscription's invoices could not be read. |

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.

## GET /v1/account/invoices/{id}/file

Download invoice file

Downloads the PDF file for one invoice belonging to the calling workspace.

**Notes.**
- For an invoice Brix issued, when the PDF cannot be drawn the route answers 302 to the invoice's web page instead.

Auth: Bearer token. Permission: `billing.view`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Invoice id from the list. |
| `inline` | query | string | no | Any value: `Content-Disposition: inline`. |

```bash
curl "https://api.brixsignage.com/v1/account/invoices/{id}/file" \
  -H "Authorization: Bearer $BRIX_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 404: Not an invoice of this workspace.

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/invoices/{id}/pay-link

Create invoice pay link

Creates a shareable payment link for one invoice, which can be paid by card or ACH bank transfer. The link can optionally be emailed directly, for example to forward to a finance team.

**Notes.**
- For an invoice Brix issued, `email` is ignored and `emailed` is always false.

Auth: Bearer token. Permission: `billing.edit`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Invoice id from the list. |

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ttlDays` | number | no | Link lifetime in days, 1–180 (clamped). Default 30. |
| `email` | string | no | Also email the link to this address (card subscription invoices only). |

```bash
curl -X POST "https://api.brixsignage.com/v1/account/invoices/{id}/pay-link" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.url` | string | A web page where anyone with the link can see and pay the invoice. |
| `data.emailed` | boolean |  |

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 an invoice of this workspace.

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

## GET /v1/account/invoices/{id}/pdf

Get invoice PDF link

Returns a short-lived download URL for one invoice's PDF. Brix confirms the invoice belongs to the calling workspace before returning the link.

Auth: Bearer token. Permission: `billing.view`.

Parameters:

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes | Invoice id (a card subscription invoice). |
| `inline` | query | string | no | Any value: the link opens in the browser instead of downloading. |

```bash
curl "https://api.brixsignage.com/v1/account/invoices/{id}/pdf" \
  -H "Authorization: Bearer $BRIX_API_KEY"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.url` | string | A short-lived download link. |

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 an invoice of this workspace (invoices Brix issued have no link here; use `/file`).

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/invoices/pay-all-link

Create pay-all link

Creates one shareable link that lets whoever receives it pay all of the workspace's outstanding invoices at once.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ttlDays` | number | no | Link lifetime in days, 1–180 (clamped). Default 30. |

```bash
curl -X POST "https://api.brixsignage.com/v1/account/invoices/pay-all-link" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.url` | string | One web page that lists and pays every open invoice. |
| `data.ttlDays` | integer |  |

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

## POST /v1/account/invoices/pay-links-outstanding

Create links for outstanding invoices

Creates a separate hosted payment link for every invoice currently outstanding on the workspace.

**Notes.**
- Covers the card subscription's invoices only, not invoices Brix issued.

Auth: Bearer token. Permission: `billing.edit`.

Request body: `application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `ttlDays` | number | no | Link lifetime in days, 1–180 (clamped). Default 30. |

```bash
curl -X POST "https://api.brixsignage.com/v1/account/invoices/pay-links-outstanding" \
  -H "Authorization: Bearer $BRIX_API_KEY" \
  -H "Content-Type: application/json"
```

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.links` | array of object |  |
| `data.links[].invoiceId` | string |  |
| `data.links[].number` | string |  |
| `data.links[].amountDue` | number |  |
| `data.links[].currencyCode` | string |  |
| `data.links[].url` | string |  |
| `data.ttlDays` | integer |  |

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.

## GET /v1/account/limits

Get API limits

Returns the workspace's API usage limits: the number of requests allowed per minute, the time window, and confirmation that the limit is counted per workspace across all API keys rather than per key. Also returns the `RateLimit-*` response headers to expect, and the delivery, retry, and retention behavior for webhooks. Use this before building an integration to size your request rate correctly.

Auth: Bearer token. Permission: `settings.view`.

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

Response 200: Success.

| Field | Type | Description |
| --- | --- | --- |
| `data` | object |  |
| `data.api` | object |  |
| `data.api.perMinute` | integer |  |
| `data.api.windowSeconds` | integer |  |
| `data.api.scope` | string | `workspace`: all keys of the workspace share one budget. |
| `data.api.appliesTo` | string |  |
| `data.api.headers` | array of string |  |
| `data.api.onBreach` | string |  |
| `data.webhooks` | object |  |
| `data.webhooks.maxConsecutiveFailures` | integer |  |
| `data.webhooks.deliveryLogRetentionDays` | integer |  |
| `data.webhooks.delivery` | string |  |
| `data.webhooks.retry` | 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 5XX: Server error. The body carries a `requestId` to quote to support.

## GET /v1/account/location-payment

Get who pays for new locations

Read the account setting that makes new locations pay for their own screens before they go live, whether the account can use it, and each location that pays for itself, marked `awaiting` (no card yet) or `live`. Requires `billing.view` on the whole account.

Auth: Bearer token.

```bash
curl "https://api.brixsignage.com/v1/account/location-payment" \
  -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.
