Plazas contratadas, paquetes de oferta y prueba
La factura sigue las plazas que contratas: crear un empleado ocupa una plaza libre, reducir tiene efecto en la renovación sin abono y eliges a quién se desactiva. Cuatro operaciones nuevas fijan y previsualizan las plazas, la API REST y el MCP compran solos las plazas que faltan, los paquetes de oferta conservan sus precios mientras se mantienen sus mínimos y la prueba responde con su propio motivo.
31 de octubre de 2026 — La factura de las plazas de empleado y de las plazas de NIF adicional pasa a ser la factura de las plazas contratadas. Crear, activar o reactivar ocupa una plaza libre y nunca cobra por sí solo; solo cobra comprar plazas. Desactivar libera una plaza sin bajar la factura y una reducción tiene efecto en la renovación, sin abono, eligiendo a quién se desactiva cuando bajas de las plazas ocupadas. Comprar o crear lo que una reducción iba a quitar la anula.
Los paquetes de oferta, hasta tres líneas con un código que se canjea desde la aplicación o por soporte, conservan su precio pactado mientras se mantienen sus mínimos y la suscripción se paga, y terminan enteros, con todas sus líneas de vuelta al precio de catálogo, si no. No se retira ninguna operación.
Operaciones de esta versión
| Operación | operationId | Herramienta MCP | Qué cambia |
|---|---|---|---|
PATCH /v1/accounts/{account}/employee-seats | public-api.v1.employee-seats.update | update_employee_seats | Nueva. Fija las plazas de empleado contratadas. |
GET /v1/accounts/{account}/additional-nif-seats | public-api.v1.additional-nif-seats.status | get_additional_nif_seats | Nueva. Lee las plazas de NIF adicional contratadas. |
GET /v1/accounts/{account}/additional-nif-seats/preview | public-api.v1.additional-nif-seats.preview | preview_additional_nif_seat_change | Nueva. Previsualiza un cambio de esas plazas. |
PATCH /v1/accounts/{account}/additional-nif-seats | public-api.v1.additional-nif-seats.update | update_additional_nif_seats | Nueva. Fija las plazas de NIF adicional contratadas. |
| Estado de las plazas de empleado | public-api.v1.employee-seats.status | get_employee_seat_billing | quantity son las plazas contratadas. Bloque seats nuevo. reducible_to vale siempre 0. pending_reduction lleva deactivations y offer_package_loss. |
| Vista previa de las plazas de empleado | public-api.v1.employee-seats.preview | preview_employee_seat_charge | Nuevos contracted_seats, seats_to_buy, free_seats_used, included_in_seats, deactivations_required, cancels_pending_reduction y offer_package_loss. already_covered vale siempre false. |
| Cancelar las plazas de empleado | public-api.v1.employee-seats.cancel | cancel_employee_seat_addon | deactivate y accept_offer_package_loss opcionales. Sin deactivate, se desactivan en la renovación todos los empleados activos. |
| Suscribir y cambiar la cantidad de plazas de empleado | public-api.v1.employee-seats.subscribe, public-api.v1.employee-seats.change-quantity | subscribe_employee_seat_addon, change_employee_seat_quantity | Convergen a las plazas contratadas. |
| Crear y reactivar empleados | public-api.v1.employees.create, public-api.v1.employees.reactivate | create_employee, reactivate_employee | Ocupan una plaza libre y compran las que faltan. Envía Idempotency-Key. |
| Crear, activar y recibir NIF | 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 | El mismo comportamiento para las plazas de NIF adicional. Envía Idempotency-Key. |
| Vista previa de plazas de NIF | public-api.v1.companies.seat_charge_preview | get_company_seat_charge_preview | zero_reason puede valer included_in_seats. |
| Lotes de empleados | 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 | Usan las plazas libres y compran solo las que faltan. La cotización devuelve ahora seats_to_buy, free_seats_used, original_quantity, projected_quantity y cancels_pending_reduction. |
| Canjes de oferta de plazas de empleado y de empresa gestionada | public-api.v1.employee-seat-offer-redemptions.* y public-api.v1.gestoria-seat-offer-redemptions.*: list, prepare, show, refresh_quote, confirm y cancel | list, prepare, get, refresh, confirm y cancel de *_seat_offer_redemption | Nuevos apply_to_existing, minimum_quantity y target_quantity, y los nuevos motivos de rechazo. |
Las operaciones que solo ajustan su esquema están en la tabla del final y en la sección de esquema.
Plazas contratadas
El bloque seats del estado publica contracted, occupied, free, agreed_minimum,
agreed_minimum_ends_at, reducible_to, pending_reduction y enforced. reducible_to vale siempre 0
porque una reducción no tiene suelo.
PATCH /v1/accounts/{account}/employee-seats y PATCH /v1/accounts/{account}/additional-nif-seats reciben
{"contracted_seats": N}. Un número mayor compra plazas con un cobro prorrateado con la tarjeta de la
cuenta y Idempotency-Key es obligatoria. Un número menor es una reducción. La vista previa recibe
el mismo parámetro y muestra el importe de hoy, la cantidad de la próxima factura y si anula una reducción
pendiente. Consulta las plazas de empleado y las
plazas de NIF adicional.
Comprar plazas de empleado exige ahora el control horario: con un plan que no lo incluye, PATCH /v1/accounts/{account}/employee-seats, POST /v1/accounts/{account}/employee-seats/subscribe y POST /v1/accounts/{account}/employee-seats/change-quantity responden el nuevo 403 employee_seats_not_in_plan antes de cobrar nada, mientras que bajar o mantener las plazas sigue permitido. Consulta el error.
Compra automática
Sin una plaza libre, la aplicación responde 422 contracted_seats_exhausted y te lleva a comprar antes.
La API REST y el MCP no: crear, activar, reactivar y aceptar un traspaso de NIF compran las plazas que faltan
con un cobro prorrateado y después crean, con los mismos 402 de siempre. Un reintento no cobra dos veces y
la plaza comprada se queda. Envía Idempotency-Key en cada alta: sin ella, un reintento tras un alta que sí
llegó a crearse crea otra entidad. Consulta la compra automática.
Reducción
Una reducción puede llegar hasta 0 y tiene efecto en la renovación, sin abono. Queda como
pending_reduction y las plazas siguen disponibles hasta entonces.
- Por debajo de las ocupadas.
deactivatees una lista de exactamenteocupadas - contratadasentidades activas. Si no, la respuesta es422contracted_seats_selection_required. - Aviso y renovación. Unos días antes, la propietaria recibe los nombres. En la renovación la tarea desactiva a los elegidos y fija la cantidad.
- Se anula con una compra, o con un alta, activación, reactivación, lote o traspaso que ocupe lo que la
reducción iba a quitar, y con un
PATCHa la cantidad actual. UnPATCHmenor la sustituye. - A
0. Exige elegir todas las ocupadas y cancela el add-on al final del periodo.canceles una reducción a0y, sindeactivate, desactiva a todos los empleados activos.
Consulta la reducción.
Paquetes de oferta
Un paquete agrupa hasta tres líneas (plan, plazas de empleado y plazas de NIF adicional) bajo un código. Se
canjea desde la aplicación o por soporte; en REST y MCP su código responde 422
customer_offer_not_eligible con details.reason product.
apply_to_existingaplica una oferta de plazas a las plazas que la cuenta ya tiene y no crea nada. El presupuesto publicatarget_quantityyminimum_quantity.- Condiciones. El paquete conserva sus precios mientras las plazas contratadas de cada línea se mantienen en su mínimo o por encima y la suscripción se paga. Desactivar no lo rompe; reducir sí.
- El precio pactado rige para todas las plazas contratadas, también las compradas después, incluso por la compra automática.
- Fin. Termina entero, con todas las líneas al precio de catálogo desde la siguiente renovación y sin
abono, por
reduction_below_minimum,subscription_ended_unpaid,subscription_cancelled,revoked_by_supportoduration_elapsed. - Confirmación. Una reducción que rompería un paquete se previsualiza con
offer_package_lossy la escritura exigeaccept_offer_package_loss: true; sin él,422offer_package_loss_unconfirmed.
Consulta los paquetes de oferta y el mínimo pactado.
La prueba
Durante la prueba no se cobra nada y los empleados o NIF no ocupan plazas. Ya puedes elegir las plazas
contratadas sin cobro. Un canje de plazas de empleado o de NIF durante la prueba responde 422
customer_offer_not_eligible con details.reason trial_active, en lugar del 409 anterior de los lotes de
empleados y de active_population. Cuando la cuenta empieza a pagar, las entidades más antiguas ocupan las
plazas contratadas y las que no caben pasan a inactivas, sin cobro; con cero plazas contratadas, todas. Consulta
la prueba en las plazas de empleado y
la regla de la prueba en las plazas de NIF.
Errores
customer_offer_not_eligibleconreasonproductresponde422donde antes respondía403.contracted_seats_selection_required:paramdeactivate, condetailsproduct,requested,occupied,required,selectedeinvalid. Encancelsolo se emite con una lista que no cuadra.offer_package_loss_unconfirmed:paramaccept_offer_package_loss, condetailsproduct,package_id,name,effective_atylines.contracted_seats_exhaustedsolo lo emite la aplicación web. La API REST y el MCP compran en su lugar.contracted_seats_below_minimumqueda retirado: no llegó a emitirse.
Los tres códigos son subcódigos de business_rule_violation. Consulta el catálogo de errores.
Eventos
account.seats_updated anuncia cada cambio de las plazas contratadas. Su pending_reduction lleva las
deactivations y la causa reduction_superseded marca una reducción anulada por una compra o una entrada.
account.offer_package_ended anuncia el fin de un paquete, con su motivo y los conceptos de sus líneas, sin
importes. Ambos van a los endpoints de la cuenta. Consulta los webhooks de cuenta.
Ajustes de esquema y qué hacer
Varias operaciones solo cambian en el esquema publicado, sin nada distinto en el cable: las que usaban not
ahora describen la misma regla de otra forma y los campos obligatorios anidados quedan documentados. No tienes
que hacer nada con ellas.
Una serie creada sin number_format nace ahora con {code}-{YYYY}-{0000}, cuatro cifras en lugar de tres. Las
series que ya existen conservan su formato.
Como integrador:
- Envía
Idempotency-Keyen altas, activaciones, reactivaciones y traspasos, que ahora pueden comprar plazas. - Admite
included_in_seatsen el enumzero_reasonde las vistas previas. - Trata
already_coveredcomo siemprefalse. - Si cancelabas el add-on con empleados activos, envía
deactivate: sin él se desactivan todos en la renovación. - Cuenta con que una compra o un alta anule una reducción pendiente.
- Confirma con
accept_offer_package_lossla reducción que rompa un paquete.
La tabla siguiente lista las operaciones de esta versión.
Nuevos endpoints4
| Endpoint | Descripción |
|---|---|
GET/v1/accounts/{account}/additional-nif-seats | Obtener las plazas de NIF adicional |
PATCH/v1/accounts/{account}/additional-nif-seats | Fijar las plazas de NIF adicional contratadas |
PATCH/v1/accounts/{account}/employee-seats | Fijar las plazas de empleado contratadas |
GET/v1/accounts/{account}/additional-nif-seats/preview | Previsualizar un cambio de las plazas de NIF adicional |