Contracted seats, offer packages and the trial
The bill follows the seats you contract: creating an employee takes a free seat, reducing takes effect at renewal with no credit and you choose who is deactivated. Four new operations set and preview the seats, the REST API and MCP buy the missing seats on their own, offer packages keep their prices while their minimums hold, and the trial answers its own reason.
31 October 2026 — The invoice of the employee seats and of the additional tax ID seats is now the invoice of the contracted seats. Creating, activating or reactivating takes a free seat and never charges on its own; only buying seats charges. Deactivating frees a seat without lowering the bill, and a reduction takes effect at renewal, with no credit, choosing who is deactivated when you go below the occupied seats. Buying or creating what a reduction was going to remove cancels it.
Offer packages, up to three lines under one code that is redeemed from the application or by support, keep their agreed price while their minimums hold and the subscription is paid, and end as a whole, with every line back at the catalogue price, if not. No operation is removed.
Operations in this release
| Operation | operationId | MCP tool | What changes |
|---|---|---|---|
PATCH /v1/accounts/{account}/employee-seats | public-api.v1.employee-seats.update | update_employee_seats | New. Sets the contracted employee seats. |
GET /v1/accounts/{account}/additional-nif-seats | public-api.v1.additional-nif-seats.status | get_additional_nif_seats | New. Reads the contracted additional tax ID seats. |
GET /v1/accounts/{account}/additional-nif-seats/preview | public-api.v1.additional-nif-seats.preview | preview_additional_nif_seat_change | New. Previews a change of those seats. |
PATCH /v1/accounts/{account}/additional-nif-seats | public-api.v1.additional-nif-seats.update | update_additional_nif_seats | New. Sets the contracted additional tax ID seats. |
| Employee seat status | public-api.v1.employee-seats.status | get_employee_seat_billing | quantity is the contracted seats. New seats block. reducible_to is always 0. pending_reduction carries deactivations and offer_package_loss. |
| Employee seat preview | public-api.v1.employee-seats.preview | preview_employee_seat_charge | New contracted_seats, seats_to_buy, free_seats_used, included_in_seats, deactivations_required, cancels_pending_reduction and offer_package_loss. already_covered is always false. |
| Employee seat cancel | public-api.v1.employee-seats.cancel | cancel_employee_seat_addon | Optional deactivate and accept_offer_package_loss. Without deactivate, every active employee is deactivated at renewal. |
| Employee seat subscribe and change quantity | public-api.v1.employee-seats.subscribe, public-api.v1.employee-seats.change-quantity | subscribe_employee_seat_addon, change_employee_seat_quantity | They converge on the contracted seats. |
| Creating and reactivating employees | public-api.v1.employees.create, public-api.v1.employees.reactivate | create_employee, reactivate_employee | They take a free seat and buy the missing ones. Send Idempotency-Key. |
| Creating, activating and receiving tax IDs | public-api.v1.companies.create, public-api.v1.companies.activate, public-api.v1.companies.activate_batch, public-api.v1.account.nif_transfers.accept | create_company, activate_company, activate_companies, accept_nif_transfer | Same behaviour for the additional tax ID seats. Send Idempotency-Key. |
| Tax ID seat preview | public-api.v1.companies.seat_charge_preview | get_company_seat_charge_preview | zero_reason can be included_in_seats. |
| Employee batches | public-api.v1.employee-batches.prepare, public-api.v1.employee-batches.refresh_quote, public-api.v1.employee-batches.confirm | prepare_employee_batch, refresh_employee_batch_quote, confirm_employee_batch | They use the free seats and buy only the missing ones. The quote now returns seats_to_buy, free_seats_used, original_quantity, projected_quantity and cancels_pending_reduction. |
| Offer redemptions of employee and managed-company seats | public-api.v1.employee-seat-offer-redemptions.* and public-api.v1.gestoria-seat-offer-redemptions.*: list, prepare, show, refresh_quote, confirm and cancel | list, prepare, get, refresh, confirm and cancel of *_seat_offer_redemption | New apply_to_existing, minimum_quantity and target_quantity, and the new rejection reasons. |
The operations that only adjust their schema are in the table at the bottom and in the schema section.
Contracted seats
The seats block of the status publishes contracted, occupied, free, agreed_minimum,
agreed_minimum_ends_at, reducible_to, pending_reduction and enforced. reducible_to is always 0
because a reduction has no floor.
PATCH /v1/accounts/{account}/employee-seats and PATCH /v1/accounts/{account}/additional-nif-seats take
{"contracted_seats": N}. A larger number buys seats with a prorated charge with the card of the account,
and Idempotency-Key is required. A smaller number is a reduction. The preview takes the same
parameter and shows today's amount, the quantity of the next invoice and whether it cancels a pending
reduction. See employee seats and
additional tax ID seats.
Buying employee seats now needs time tracking: on a plan without it, PATCH /v1/accounts/{account}/employee-seats, POST /v1/accounts/{account}/employee-seats/subscribe and POST /v1/accounts/{account}/employee-seats/change-quantity answer the new 403 employee_seats_not_in_plan before any charge, while lowering or keeping the seats stays allowed. See the error.
Automatic purchase
Without a free seat, the application answers 422 contracted_seats_exhausted and asks you to buy first.
The REST API and MCP do not: creating, activating, reactivating and accepting a tax ID transfer buy the
missing seats with a prorated charge and then create, with the same 402 errors as before. A retry does
not charge twice and the bought seat stays. Send Idempotency-Key on every creation: without it, a retry
after a creation that did go through creates another entity. See
automatic purchase.
Reduction
A reduction can go down to 0 and takes effect at renewal, with no credit. It is stored as a
pending_reduction and the seats stay available until then.
- Below the occupied seats.
deactivateis a list of exactlyoccupied - contractedactive entities. Otherwise the answer is422contracted_seats_selection_required. - Notice and renewal. A few days before, the owner receives the names. At renewal the task deactivates the chosen ones and sets the quantity.
- It is cancelled by a purchase, or by a creation, activation, reactivation, batch or transfer that takes
what the reduction was going to remove, and by a
PATCHto the current quantity. A smallerPATCHreplaces it. - To
0. It requires choosing all the occupied and cancels the add-on at the end of the period.cancelis a reduction to0and, withoutdeactivate, deactivates every active employee.
See reduction.
Offer packages
A package groups up to three lines (plan, employee seats and additional tax ID seats) under one code. It is
redeemed from the application or by support; in REST and MCP its code answers 422
customer_offer_not_eligible with details.reason product.
apply_to_existingapplies a seat offer to the seats the account already has and creates nothing. The quote publishestarget_quantityandminimum_quantity.- Conditions. The package keeps its prices while the contracted seats of each line stay at or above its minimum and the subscription is paid. Deactivating does not break it; reducing does.
- The agreed price applies to every contracted seat, including those bought later, also by the automatic purchase.
- End. It ends as a whole, with every line at the catalogue price from the next renewal and no credit, for
reduction_below_minimum,subscription_ended_unpaid,subscription_cancelled,revoked_by_supportorduration_elapsed. - Confirmation. A reduction that would break a package is previewed with
offer_package_loss, and the write needsaccept_offer_package_loss: true: without it,422offer_package_loss_unconfirmed.
See offer packages and agreed minimum.
The trial
During the trial nothing is charged and employees or tax IDs do not take seats. You can already choose the
contracted seats with no charge. A seat or tax ID redemption during the trial answers 422
customer_offer_not_eligible with details.reason trial_active, instead of the previous 409 of the
employee batches and of active_population. When the account starts paying, the oldest entities occupy the
contracted seats and the ones that do not fit become inactive, with no charge; with no contracted seats, all
of them. See the trial of employee seats and
the trial rule of tax ID seats.
Errors
customer_offer_not_eligiblewithreasonproductanswers422where it answered403.contracted_seats_selection_required:paramdeactivate, withdetailsproduct,requested,occupied,required,selectedandinvalid. Incancelit is only emitted with a list that does not fit.offer_package_loss_unconfirmed:paramaccept_offer_package_loss, withdetailsproduct,package_id,name,effective_atandlines.contracted_seats_exhaustedis only emitted by the web application. The REST API and MCP buy instead.contracted_seats_below_minimumis retired: it was never emitted.
The three codes are subcodes of business_rule_violation. See the error reference.
Events
account.seats_updated announces every change of the contracted seats. Its pending_reduction carries the
deactivations, and the cause reduction_superseded marks a reduction cancelled by a purchase or an entry.
account.offer_package_ended announces the end of a package, with its reason and the concepts of its lines,
without amounts. Both go to the account endpoints. See account webhooks.
Schema adjustments and what to do
Several operations only change in the published schema, with nothing different on the wire: those that used
not now describe the same rule differently, and nested required fields are now documented. Nothing to do
about those.
A series created without number_format now gets {code}-{YYYY}-{0000}, four digits instead of three.
Existing series keep their format.
As an integrator:
- Send
Idempotency-Keyon creations, activations, reactivations and transfers, which can now buy seats. - Accept
included_in_seatsin thezero_reasonenum of the previews. - Treat
already_coveredas alwaysfalse. - If you cancelled the add-on with active employees, send
deactivate: without it all of them are deactivated at renewal. - Expect a purchase or a creation to cancel a pending reduction.
- Confirm with
accept_offer_package_lossa reduction that would break a package.
The table below lists the operations of this release.
New endpoints4
| Endpoint | Description |
|---|---|
GET/v1/accounts/{account}/additional-nif-seats | Retrieve the additional tax ID seats |
PATCH/v1/accounts/{account}/additional-nif-seats | Set the contracted additional tax ID seats |
PATCH/v1/accounts/{account}/employee-seats | Set the contracted employee seats |
GET/v1/accounts/{account}/additional-nif-seats/preview | Preview a change of the additional tax ID seats |