API · catalog

Operaciones de catalog del contrato OpenAPI que aceptan una clave de API.

Actualizado:

GET /resource-groups

Listar grupos de recursos

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
include_inactivequeryNoboolean default falseIncluye los desactivados (active=false). Por defecto solo los activos.
archivedqueryNoboolean default falseFIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas.

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

POST /resource-groups

Crear grupo de recursos (config:write)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: ResourceGroup

Respuestas

EstadoDescripción
201Creado (ResourceGroup)
defaultError (RFC 9457) (Problem)

GET /resource-groups/{id}

Leer un grupo de recursos (activo o no)

Un elemento desactivado se lee igual, con active=false, para mostrar su detalle y reactivarlo (PATCH con active=true). 404 solo si no existe en el proyecto.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (ResourceGroup)
defaultError (RFC 9457) (Problem)

PATCH /resource-groups/{id}

Editar grupo y miembros (owner/manager o API key config:write)

F3-573 — sumar una persona (recurso staff) al grupo de un servicio de día completo responde 422 service_full_day_invalid. FIU-450 — al enviar member_ids, se ignoran y limpian los ids inexistentes o inactivos, sin 404. Las reservas de esos miembros se conservan y no bloquean la limpieza; quitar una persona activa con ocupación vigente sigue respondiendo 409 team_policy_in_use.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: ResourceGroupPatch

Respuestas

EstadoDescripción
200Actualizado (ResourceGroup)
defaultError (RFC 9457) (Problem)

DELETE /resource-groups/{id}

Baja lógica del grupo (owner/manager, CSRF)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring
modequeryNostring pause, remove, archive, delete default pausepause (por defecto): pausa, como siempre. remove: borra si no tiene historial y archiva si lo tiene. archive: archiva siempre. delete: borra (409 catalog_item_has_history si tiene historial). Con tareas futuras remove, archive y delete responden 409 catalog_item_future_bookings y la lista.

Respuestas

EstadoDescripción
200Baja idempotente, conserva miembros e historial (CatalogDeactivation)
defaultError (RFC 9457) (Problem)

GET /resource-groups/{id}/removal

Qué pasa al eliminar el grupo (borra o archiva; tareas futuras)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (CatalogRemovalPlan)
defaultError (RFC 9457) (Problem)

POST /resource-groups/{id}/restore

Restaurar el grupo archivado (vuelve pausado; se reactiva a propósito)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
204Restaurado
defaultError (RFC 9457) (Problem)

GET /resources

Listar recursos (barberos, mesas, máquinas, salas…)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
kindqueryNoResourceKind
include_inactivequeryNoboolean default falseIncluye los desactivados (active=false). Por defecto solo los activos.
archivedqueryNoboolean default falseFIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas.

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

POST /resources

Crear recurso (config:write)

F4-71 — 409 resource_limit_reached (con limit, used, plan y upgrade_path) si el plan no admite otro recurso activo.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: ResourceCreate

Respuestas

EstadoDescripción
201Creado (Resource)
defaultError (RFC 9457) (Problem)

GET /resources/{id}

Leer un recurso (activo o no)

Un elemento desactivado se lee igual, con active=false, para mostrar su detalle y reactivarlo (PATCH con active=true). 404 solo si no existe en el proyecto.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (Resource)
defaultError (RFC 9457) (Problem)

PATCH /resources/{id}

Editar recurso y asociar o quitar horario (owner/manager o API key config:write)

F4-71 — reactivar (active true) responde 409 resource_limit_reached si el plan no admite otro recurso activo. FIU-370 — capacity_mode y capacity_units ya no se editan acá, los define el equipo (422 capacity_defined_by_team). F3-573 — pasar a kind staff un recurso del grupo de un servicio de día completo responde 422 service_full_day_invalid.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: ResourcePatch

Respuestas

EstadoDescripción
200Actualizado (Resource)
defaultError (RFC 9457) (Problem)

DELETE /resources/{id}

Baja lógica del recurso (owner/manager, CSRF)

Retira al recurso de todos sus equipos en la misma transacción, incluso si el modo remove o archive lo archiva. Conserva las reservas, sus asignaciones y el historial; reactivar el recurso no restaura esas membresías.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring
modequeryNostring pause, remove, archive, delete default pausepause (por defecto): pausa, como siempre. remove: borra si no tiene historial y archiva si lo tiene. archive: archiva siempre. delete: borra (409 catalog_item_has_history si tiene historial). Con tareas futuras remove, archive y delete responden 409 catalog_item_future_bookings y la lista.

Respuestas

EstadoDescripción
200Baja idempotente, conserva historial y reservas (CatalogDeactivation)
defaultError (RFC 9457) (Problem)

GET /resources/{id}/removal

Qué pasa al eliminar el recurso (borra o archiva; tareas futuras)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (CatalogRemovalPlan)
defaultError (RFC 9457) (Problem)

POST /resources/{id}/restore

Restaurar el recurso archivado (vuelve pausado; se reactiva a propósito)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
204Restaurado
defaultError (RFC 9457) (Problem)

GET /schedule-overrides

Excepciones del workspace en un rango local (fin exclusivo)

Acepta fechas o instantes con offset; los instantes se convierten a la zona del workspace. Staff solo ve horarios de sus recursos.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
fromquerySístring / string
toquerySístring / string

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

GET /schedules

Listar horarios

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

POST /schedules

Crear horario semanal (config:write)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: Schedule

Respuestas

EstadoDescripción
201Creado (Schedule)
defaultError (RFC 9457) (Problem)

GET /schedules/{id}

Leer horario del workspace (staff limitado a sus recursos)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (Schedule)
defaultError (RFC 9457) (Problem)

PATCH /schedules/{id}

Editar horario semanal (owner/manager, CSRF)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: SchedulePatch

Respuestas

EstadoDescripción
200Actualizado; nunca reinterpreta las reservas UTC (Schedule)
defaultError (RFC 9457) (Problem)

DELETE /schedules/{id}

Baja lógica del horario (owner/manager, CSRF)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200Baja idempotente, conserva excepciones e historial (CatalogDeactivation)
defaultError (RFC 9457) (Problem)

POST /schedules/{id}/overrides

Bloquear o cambiar horario en una fecha

La excepción reemplaza las aperturas de esa fecha, incluida su noche hacia el día siguiente (F3-503). Cerrar una fecha no corta la madrugada que pertenece a la noche del día anterior. Los tramos siguen la regla de Schedule.rules; pisar la noche del día anterior o la apertura del siguiente responde 422 hours_overlap.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: object

Respuestas

EstadoDescripción
201Creado
defaultError (RFC 9457) (Problem)

DELETE /schedules/{id}/overrides/{date}

Eliminar excepción de horario (owner/manager, CSRF, auditado e idempotente)

Volver a la semana no puede pisar la noche de una excepción vecina (422 hours_overlap, F3-503).

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring
datepathSístring (date)

Respuestas

EstadoDescripción
204Eliminada o ya ausente; conserva reservas y asignaciones
defaultError (RFC 9457) (Problem)

GET /services

Listar servicios

  • Autenticación: Clave de API o sesión del panel
  • Scopes: Ninguno

Parámetros

NombreEnObligatorioTipoDescripción
include_inactivequeryNoboolean default falseIncluye los desactivados (active=false). Por defecto solo los activos.
archivedqueryNoboolean default falseFIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas.

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

POST /services

Crear servicio (config:write)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: ServiceCreate

Respuestas

EstadoDescripción
201Creado (Service)
defaultError (RFC 9457) (Problem)

GET /services/{id}

Leer un servicio (activo o no)

Un elemento desactivado se lee igual, con active=false, para mostrar su detalle y reactivarlo (PATCH con active=true). 404 solo si no existe en el proyecto.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:read

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (Service)
defaultError (RFC 9457) (Problem)

PATCH /services/{id}

Editar servicio (owner/manager, CSRF)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: ServicePatch

Respuestas

EstadoDescripción
200Actualizado; las reservas existentes no se reinterpretan (Service)
defaultError (RFC 9457) (Problem)

DELETE /services/{id}

Baja lógica; conserva y lista reservas activas futuras (owner/manager, CSRF)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring
modequeryNostring pause, remove, archive, delete default pausepause (por defecto): pausa, como siempre. remove: borra si no tiene historial y archiva si lo tiene. archive: archiva siempre. delete: borra (409 catalog_item_has_history si tiene historial). Con tareas futuras remove, archive y delete responden 409 catalog_item_future_bookings y la lista.

Respuestas

EstadoDescripción
200Baja idempotente, ninguna reserva cancelada (CatalogDeactivation)
defaultError (RFC 9457) (Problem)

POST /services/{id}/duplicate

Crear una copia pausada de un servicio (config:write)

Copia configuración, requisitos, formulario, productos y horario independiente. No copia tareas, resultados ni opiniones. Etapas vigentes sólo con service_stages:write (settings:write para API keys); de lo contrario usa etapas base y avisa. Idempotencia de 24 horas.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write, settings:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring (uuid)
Idempotency-KeyheaderSístring

Respuestas

EstadoDescripción
201Copia pausada (ServiceDuplicateOut)
defaultError (RFC 9457) (Problem)

GET /services/{id}/pauses

Listar las pausas por fechas de un servicio (config:read)

Rangos de días (inclusive) en que el servicio no se ofrece. Una pausa cierra el servicio, no a los recursos que lo atienden (F3-320).

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:read

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (object)
defaultError (RFC 9457) (Problem)

POST /services/{id}/pauses

Pausar un servicio por un rango de fechas (owner/manager, CSRF)

Cierra el servicio de from a to (inclusive, fecha local del negocio) sin bloquear a los recursos que lo atienden. Los demás servicios de esos recursos conservan sus horarios. Un servicio sin ventana propia sigue mostrándose sin ella (schedule_id nulo); si la ventana la comparten otros servicios o recursos, el servicio recibe una propia. Un cierre nuevo reemplaza lo que hubiera esos días. 422 invalid_schedule_override si to es anterior a from o el rango pasa de 366 días. Devuelve todas las pausas del servicio.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Cuerpo de la solicitud (obligatorio)

  • application/json: ServicePauseIn

Respuestas

EstadoDescripción
201Pausas del servicio (object)
defaultError (RFC 9457) (Problem)

DELETE /services/{id}/pauses

Reabrir un servicio pausado por fechas (owner/manager, CSRF)

Reabre los días from..to (inclusive) cerrados por pausa; los horarios vuelven a ser los de antes. Si era la última pausa de una ventana generada, el servicio queda sin ventana propia. Idempotente.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring
fromquerySístring (date)
toquerySístring (date)

Respuestas

EstadoDescripción
204Reabierto
defaultError (RFC 9457) (Problem)

GET /services/{id}/removal

Qué pasa al eliminar el servicio (borra o archiva; tareas futuras)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
200OK (CatalogRemovalPlan)
defaultError (RFC 9457) (Problem)

POST /services/{id}/restore

Restaurar el servicio archivado (vuelve pausado; se reactiva a propósito)

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring

Respuestas

EstadoDescripción
204Restaurado
defaultError (RFC 9457) (Problem)

POST /services/import/{id}/confirm

Confirmar una importación de servicios

Scope config:write. Crea todos los servicios de la vista previa o ninguno. Confirmar el mismo id es idempotente (resultado 7 días). 409 services.import_preview_stale si cambió el catálogo, la moneda o venció la vista previa; 404 si es de otro negocio.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring (uuid)

Respuestas

EstadoDescripción
200Successful Response (ServiceImportResult)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

POST /services/import/{id}/undo

Deshacer una importación de servicios

Scope config:write. Borra los servicios creados (o los archiva si ya tienen historial), hasta 7 días y solo si nadie los cambió (409 services.import_undo_stale); con tareas futuras, 409 catalog_item_future_bookings. Repetirlo devuelve el mismo resultado.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Parámetros

NombreEnObligatorioTipoDescripción
idpathSístring (uuid)

Respuestas

EstadoDescripción
200Successful Response (ServiceImportResult)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

POST /services/import/preview

Validar una importación de servicios (vista previa, no crea nada)

Scope config:write. csv, xlsx (base64, hasta 1 MiB) o rows (hasta 2000) con columns (encabezado → name|duration_min|price|team|full_day|bot_offered); hasta 200 servicios. Solo crea: un nombre que ya existe es error de la fila (services.import_exists). team es el nombre o id del equipo (con uno solo activo, se puede omitir). price en moneda mayor con la regla única de montos. Nada se crea hasta confirmar; la vista previa válida dura 30 minutos.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: ServiceImportInput

Respuestas

EstadoDescripción
200Successful Response (ServiceImportPreview)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
404Error (RFC 9457) (Problem)
409Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)
429Error (RFC 9457) (Problem)

POST /services/intake/preview

Preview Intake

Vista previa de formulario y expresiones CEL acotadas. Owner/manager o API key config:write. El servidor calcula; no persiste datos.

  • Autenticación: Clave de API o sesión del panel
  • Scopes: config:write

Cuerpo de la solicitud (obligatorio)

  • application/json: IntakePreviewIn

Respuestas

EstadoDescripción
200Successful Response (IntakePreviewOut)
400Error (RFC 9457) (Problem)
401Error (RFC 9457) (Problem)
403Error (RFC 9457) (Problem)
422Error (RFC 9457) (Problem)