API · catalog
catalog operations in the OpenAPI contract that accept an API key.
Updated:
GET /resource-groups
Listar grupos de recursos
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
include_inactive | query | No | boolean default false | Incluye los desactivados (active=false). Por defecto solo los activos. |
archived | query | No | boolean default false | FIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas. |
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (RFC 9457) (Problem) |
POST /resource-groups
Crear grupo de recursos (config:write)
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: ResourceGroup
Responses
| Status | Description |
|---|---|
201 | Creado (ResourceGroup) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (ResourceGroup) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: ResourceGroupPatch
Responses
| Status | Description |
|---|---|
200 | Actualizado (ResourceGroup) |
default | Error (RFC 9457) (Problem) |
DELETE /resource-groups/{id}
Baja lógica del grupo (owner/manager, CSRF)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string | |
mode | query | No | string pause, remove, archive, delete default pause | pause (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. |
Responses
| Status | Description |
|---|---|
200 | Baja idempotente, conserva miembros e historial (CatalogDeactivation) |
default | Error (RFC 9457) (Problem) |
GET /resource-groups/{id}/removal
Qué pasa al eliminar el grupo (borra o archiva; tareas futuras)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (CatalogRemovalPlan) |
default | Error (RFC 9457) (Problem) |
POST /resource-groups/{id}/restore
Restaurar el grupo archivado (vuelve pausado; se reactiva a propósito)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
204 | Restaurado |
default | Error (RFC 9457) (Problem) |
GET /resources
Listar recursos (barberos, mesas, máquinas, salas…)
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
kind | query | No | ResourceKind | |
include_inactive | query | No | boolean default false | Incluye los desactivados (active=false). Por defecto solo los activos. |
archived | query | No | boolean default false | FIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas. |
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: ResourceCreate
Responses
| Status | Description |
|---|---|
201 | Creado (Resource) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (Resource) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: ResourcePatch
Responses
| Status | Description |
|---|---|
200 | Actualizado (Resource) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string | |
mode | query | No | string pause, remove, archive, delete default pause | pause (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. |
Responses
| Status | Description |
|---|---|
200 | Baja idempotente, conserva historial y reservas (CatalogDeactivation) |
default | Error (RFC 9457) (Problem) |
GET /resources/{id}/removal
Qué pasa al eliminar el recurso (borra o archiva; tareas futuras)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (CatalogRemovalPlan) |
default | Error (RFC 9457) (Problem) |
POST /resources/{id}/restore
Restaurar el recurso archivado (vuelve pausado; se reactiva a propósito)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
204 | Restaurado |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
from | query | Yes | string / string | |
to | query | Yes | string / string |
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (RFC 9457) (Problem) |
GET /schedules
Listar horarios
- Authentication: API key or dashboard session
- Scopes: None
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (RFC 9457) (Problem) |
POST /schedules
Crear horario semanal (config:write)
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: Schedule
Responses
| Status | Description |
|---|---|
201 | Creado (Schedule) |
default | Error (RFC 9457) (Problem) |
GET /schedules/{id}
Leer horario del workspace (staff limitado a sus recursos)
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (Schedule) |
default | Error (RFC 9457) (Problem) |
PATCH /schedules/{id}
Editar horario semanal (owner/manager, CSRF)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: SchedulePatch
Responses
| Status | Description |
|---|---|
200 | Actualizado; nunca reinterpreta las reservas UTC (Schedule) |
default | Error (RFC 9457) (Problem) |
DELETE /schedules/{id}
Baja lógica del horario (owner/manager, CSRF)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | Baja idempotente, conserva excepciones e historial (CatalogDeactivation) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: object
Responses
| Status | Description |
|---|---|
201 | Creado |
default | Error (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).
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string | |
date | path | Yes | string (date) |
Responses
| Status | Description |
|---|---|
204 | Eliminada o ya ausente; conserva reservas y asignaciones |
default | Error (RFC 9457) (Problem) |
GET /services
Listar servicios
- Authentication: API key or dashboard session
- Scopes: None
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
include_inactive | query | No | boolean default false | Incluye los desactivados (active=false). Por defecto solo los activos. |
archived | query | No | boolean default false | FIU-485 — lista solo los archivados («Archivados»). Los archivados no salen en las demás listas. |
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (RFC 9457) (Problem) |
POST /services
Crear servicio (config:write)
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: ServiceCreate
Responses
| Status | Description |
|---|---|
201 | Creado (Service) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:read
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (Service) |
default | Error (RFC 9457) (Problem) |
PATCH /services/{id}
Editar servicio (owner/manager, CSRF)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: ServicePatch
Responses
| Status | Description |
|---|---|
200 | Actualizado; las reservas existentes no se reinterpretan (Service) |
default | Error (RFC 9457) (Problem) |
DELETE /services/{id}
Baja lógica; conserva y lista reservas activas futuras (owner/manager, CSRF)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string | |
mode | query | No | string pause, remove, archive, delete default pause | pause (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. |
Responses
| Status | Description |
|---|---|
200 | Baja idempotente, ninguna reserva cancelada (CatalogDeactivation) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write,settings:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string (uuid) | |
Idempotency-Key | header | Yes | string |
Responses
| Status | Description |
|---|---|
201 | Copia pausada (ServiceDuplicateOut) |
default | Error (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).
- Authentication: API key or dashboard session
- Scopes:
config:read
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (object) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Request body (required)
application/json: ServicePauseIn
Responses
| Status | Description |
|---|---|
201 | Pausas del servicio (object) |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string | |
from | query | Yes | string (date) | |
to | query | Yes | string (date) |
Responses
| Status | Description |
|---|---|
204 | Reabierto |
default | Error (RFC 9457) (Problem) |
GET /services/{id}/removal
Qué pasa al eliminar el servicio (borra o archiva; tareas futuras)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
200 | OK (CatalogRemovalPlan) |
default | Error (RFC 9457) (Problem) |
POST /services/{id}/restore
Restaurar el servicio archivado (vuelve pausado; se reactiva a propósito)
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string |
Responses
| Status | Description |
|---|---|
204 | Restaurado |
default | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string (uuid) |
Responses
| Status | Description |
|---|---|
200 | Successful Response (ServiceImportResult) |
401 | Error (RFC 9457) (Problem) |
403 | Error (RFC 9457) (Problem) |
404 | Error (RFC 9457) (Problem) |
409 | Error (RFC 9457) (Problem) |
422 | Error (RFC 9457) (Problem) |
429 | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
id | path | Yes | string (uuid) |
Responses
| Status | Description |
|---|---|
200 | Successful Response (ServiceImportResult) |
401 | Error (RFC 9457) (Problem) |
403 | Error (RFC 9457) (Problem) |
404 | Error (RFC 9457) (Problem) |
409 | Error (RFC 9457) (Problem) |
422 | Error (RFC 9457) (Problem) |
429 | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: ServiceImportInput
Responses
| Status | Description |
|---|---|
200 | Successful Response (ServiceImportPreview) |
401 | Error (RFC 9457) (Problem) |
403 | Error (RFC 9457) (Problem) |
404 | Error (RFC 9457) (Problem) |
409 | Error (RFC 9457) (Problem) |
422 | Error (RFC 9457) (Problem) |
429 | Error (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.
- Authentication: API key or dashboard session
- Scopes:
config:write
Request body (required)
application/json: IntakePreviewIn
Responses
| Status | Description |
|---|---|
200 | Successful Response (IntakePreviewOut) |
400 | Error (RFC 9457) (Problem) |
401 | Error (RFC 9457) (Problem) |
403 | Error (RFC 9457) (Problem) |
422 | Error (RFC 9457) (Problem) |