# API changes: September 27, 2026

[← Changelog](/docs/changelog) · [September 2026](/docs/changelog/2026-09)

### BC-0927-1: Cowork plans return the new-seat price with the Bitrix24 account's discounts

> Old format supported until: not provided

**Before**

`GET /v1/platform/cowork/plans` returned the list price in every `price.terms[]` entry: `vibesMonth` and `vibesTotal` were the month and term price with the term discount, `discountPercent` was the term discount percentage from the settings.

**After**

`vibesMonth` and `vibesTotal` are the best price of a new seat for this Bitrix24 account: the term discount or a promotion without a seat limit. `discountPercent` is the effective percentage of the winning discount off the undiscounted monthly price. Discounts do not stack: a seat gets one, the largest.

Each term gains these fields:

- `listVibesMonth` — the undiscounted monthly price, for a strike-through price
- `renewalVibesMonth` — the monthly price for this term without a promotion. This is what a renewal charges and what a named order line costs without a quote
- `discount` — the winning discount or `null`: `source` (`TERM` for the term discount, `PROMO` for a promotion), `percent`, `labelKey` and `label`, the promotion caption in the platform language. For the term discount `labelKey` and `label` are `null`
- `offers` — seat-limited promotions the Bitrix24 account can still get: `percent`, `labelKey`, `label`, `vibesMonth`, `vibesTotal`, `renewalVibesMonth` and `seatsLimit`, how many seats are left at that price. Display only

An unknown Bitrix24 account gets promotions only once they are enabled for every account. While promotions are not enabled for the account, `vibesMonth` and `vibesTotal` stay as before, `discountPercent` is the term discount percentage computed from the monthly price (rounding can make it differ from the configured percentage by one), and `offers` is empty.

**What integrators should do**

Price unnamed seats without a quote by `vibesMonth` and `vibesTotal`, as before. Price named lines (`seats[]`) without a quote by `renewalVibesMonth`: the price of a named line depends on whether the employee's seat is paid, and `GET /v1/platform/cowork/plans` does not know that. Overpaying is safe, the remainder stays on the balance as vibes. `POST /v1/platform/cowork/quote` prices the whole order with discounts and returns a quote, and the quote goes into the order.

### NEW-0927-2: Cowork seat price quote for the checkout

The new method `POST /v1/platform/cowork/quote` prices a Cowork seat order with the Bitrix24 account's discounts and issues a quote, a token valid for 14 days. It needs an integration key with the `cowork:quote` scope.

Request body:

- `portalDomain` — required: the same domain that goes into the payment's `metadata.portal_domain`, up to 253 characters
- `portalNetworkId` — optional, up to 200 characters
- `application` — the same order that goes into `payment.paid`, including `parts`, in the `metadata.application` format: `seats[]`, `unassigned[]` and `parts`, how many sale receipts carry the order. Up to 500 seats
- `context` — optional: `buyer` (`client` or `partner`) and `anonymous`. By default `anonymous` is `true`, and named lines are priced by `renewalVibesMonth` without any employee data. `false` is sent only when the buyer is signed in as a user of the same Bitrix24 account. With `buyer` = `partner` the server always treats `anonymous` as `true`
- `contactEmails` — up to three payer addresses, stored with the quote. Unsuitable addresses are dropped

Unknown fields of the body and of `context` do not break the request, the server skips them.

Response:

- `version` and `capturedAt` — the response shape version and the moment of calculation
- `portal` — `known` (the Bitrix24 account was found), `portalNetworkId` and `portalDomain`
- `lines[]` — the order lines in request order: `kind` (`seat` for a named line, `unassigned` for seats without an employee), `index`, the position in `seats[]` or `unassigned[]`, `plan`, `months` and `count`. A named line echoes `userId` and `b24UserId`. Each line has `groups[]`, runs of seats with equal price: `count`, `listVibesMonth`, `vibesMonth`, `vibesTotal`, `renewalVibesMonth` and `discount`, the winning discount or `null` in the same shape as in `GET /v1/platform/cowork/plans`: `source`, `percent`, `labelKey` and `label`
- `totals` — the order totals: `listVibes` (without discounts), `vibes` and `savedVibes`
- `quote` — `token` and `expiresAt`, or `null` when the order has no promotional price and no suitable address is left after filtering

The quote goes into the order: `quote.token` into `application.quoteToken`. Addresses appear neither in the response nor in the quote.

Errors: `400 INVALID_FILTER` (including a missing `portalDomain`, a domain longer than 253 characters or invalid characters in `portalDomain` and `portalNetworkId`), `400 INVALID_APPLICATION`, `401 INVALID_KEY`, `403 INSUFFICIENT_SCOPE`, `413` (a body over 256 KiB) and `429`.

### FIX-0927-3: business process operations on an account without the module answer 409 instead of 404

**Before**

On an account where Business Processes are not included in the plan or are switched off in settings, only the list of running workflows answered `409 BIZPROC_MODULE_NOT_ENABLED` — [GET /v1/workflows](/docs/automation/workflows/list). The other four operations of the section answered `404 ENTITY_NOT_FOUND` in the same account state: [POST /v1/workflows/start](/docs/automation/workflows/start), [DELETE /v1/workflows/:id](/docs/automation/workflows/terminate), [POST /v1/workflows/activity-log](/docs/automation/workflows/activity-log) and [POST /v1/workflows/event](/docs/automation/workflows/event). That answer looked like a wrong template, document or workflow ID, although the IDs were correct.

**After**

All five operations of the section answer the same way in this account state: `409 BIZPROC_MODULE_NOT_ENABLED`. The message names the Bitrix24 method that was called, both possible causes and the action to take: ask an account administrator to enable Business Processes. Other errors of these operations are unchanged.

**Impact on integrators**

No action is required: the refusal was a 4xx and stays a 4xx, and the former `404 ENTITY_NOT_FOUND` was never documented for this state. Retrying with other IDs does not help while Business Processes are unavailable on the account. For stopping a workflow, `404 ENTITY_NOT_FOUND` still means the workflow instance was not found, while `409 BIZPROC_MODULE_NOT_ENABLED` means the module is unavailable and the workflow was not stopped. An integration that treated 404 as a sign of an already finished workflow now sees 409 on such an account, and the workflow is not stopped.

### NEW-0927-4: A Cowork order with a quote is credited at the quote's prices

A Cowork seat order whose `application.quoteToken` carries a quote from `POST /v1/platform/cowork/quote` is now credited at the quote's prices: the promotional price shown to the buyer is fixed for 14 days from the moment the quote is issued. The order amount is `totals.vibes` from the quote response.

- Seats under seat-limited promotions (`offers` in `GET /v1/platform/cowork/plans`) are granted only with a quote in the order. To fix the promotional price and get a seat under such a promotion, call `quote` at the payment step and put `quote.token` into `application.quoteToken`.
- The quote is honoured when it has not expired at the moment of payment and was issued for the same Bitrix24 account (`portalDomain` matches the payment's `metadata.portal_domain`) and the same order. Otherwise the order is not rejected: seats are credited at current prices, as without a quote, and whatever the paid amount does not cover stays on the balance as vibes.
- If a sale receipt is revoked, the quote is not honoured.
- An order without `quoteToken` is credited as before.

### NEW-0927-5: Checklist actions and attaching a file to a task

Ten named `/v1/tasks/:taskId/checklist/...` and `/v1/tasks/:taskId/files/attach` routes are now available for saving a tree, managing members, moving and completing checklist items, managing checklist attachments, and attaching a Disk file to a task. Each route returns the Bitrix24 method result in `data`.
