Operaciones de automatizaciones
Consulta, crea y edita las automatizaciones de mensajes a clientes por API v1 o MCP.
Una «automatización» es una regla de mensajería: cuando ocurre un evento de la reserva (se confirma, está a punto de empezar, acaba de terminar) o de una sesión, Buky envía un email a partir de una plantilla, sin que nadie tenga que hacer nada a mano. Para crearlas desde el panel, consulta Crear automatizaciones de email; para lo que puede llevar cada plantilla (variables de reserva, idiomas, canal), consulta Personalizar plantillas de mensajes.
Operaciones de esta página: list-automations, get-automation, create-automation, update-automation (solo lectura: list-automations, get-automation; escritura: create-automation, update-automation).
Las bases comunes (autenticación, GET frente a POST, prueba en seco, errores HTTP, límites) están en API v1 — Introducción y primeros pasos. En todas las operaciones, customer_id es opcional: se toma de tu token salvo que uses un token multicuenta.
list-automations: lista las automatizaciones de mensajería
Es una operación de solo lectura: vale con cualquier token. Devuelve las automatizaciones de la cuenta en vista compacta (identificar y enumerar) o, con detail:"descriptive", con el desfase, a qué productos aplica y las plantillas de cada acción ya resueltas a su título. Es la forma de ENUMERAR qué automatizaciones existen sin tener que provocar a propósito un error en get-automation. Las borradas (borrado lógico) nunca aparecen en la lista.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/list-automations?detail=descriptive&lang=es" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «Enséñame las automatizaciones de mensajería que tengo configuradas».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
q | texto | opcional | Busca por el título (contiene, sin tildes). Filtro LOCAL, igual que el buscador del panel. |
disabled | booleano | opcional | true → solo las DESACTIVADAS; false → solo las activas. Por defecto, todas. |
created_from / created_to | fecha | opcional | Rango (ISO) sobre cuándo se creó la automatización. |
detail | enum | opcional | compact (por defecto): _id, título, disparador y número de acciones. descriptive: además el desfase, a qué productos aplica y las acciones con la plantilla resuelta a su título. |
lang | texto | opcional | Solo con detail:"descriptive": los textos vuelven en esa lengua; si falta, cae a es o a la primera disponible. |
full | booleano | opcional | true → los documentos completos del servidor (pesados). Gana a detail. |
limit | número | opcional | Máximo de resultados, tras aplicar los filtros. |
Qué devuelve
Ejemplo real: la cuenta demo usada para esta guía no tiene ninguna automatización creada, así que tanto la vista compacta como la descriptiva devuelven la lista vacía:
{
"success": true,
"detail": "compact",
"count": 0,
"total": 0,
"items": []
}| Campo | Significado |
|---|---|
count | Automatizaciones devueltas en esta respuesta (tras filtros y limit). |
total | Total que cumple los filtros, antes de limit. count < total significa que limit recortó el resultado. |
items | Vista compacta por defecto: _id, title, trigger, número de acciones y si está desactivada. Con detail:"descriptive": suma el desfase, el filtro de productos y las acciones (cada una con la plantilla ya resuelta a su título, to_mode y to). Con full:true: los documentos completos del servidor. |
Consejos
- Antes de crear una automatización con
create-automationo de editar una conupdate-automation, usalist-automationspara ver los títulos exactos que ya existen y evitar duplicados. - Un filtro sin coincidencias devuelve
count: 0eitems: [], no un error — igual que cuando la cuenta todavía no tiene ninguna automatización.
get-automation: consulta una automatización existente
Es una operación de solo lectura. Resuelve una automatización por título o _id y devuelve el documento completo y fresco del servidor: es la forma de comprobar cómo quedó tras crearla o editarla.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/get-automation?automation=Recordatorio%2024h" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «Enséñame la automatización Recordatorio 24h».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
automation | texto | obligatorio | Título o _id de la automatización. El manual lo marca como «recomendado», pero en la práctica es obligatorio: sin él, la operación devuelve error (automation_intent_required). Acepta los alias id y automation_id. |
Qué devuelve
Cuando la automatización existe, la respuesta trae _id, resolved (qué automatización se eligió y por qué) e item, el documento completo: título, trigger, actions con las plantillas vinculadas y trigger_products. La cuenta demo usada para esta guía no tiene ninguna automatización creada todavía, así que toda llamada real cayó en automation_unresolved (ver «Errores propios»); no hay un ejemplo de éxito real que enseñar aquí.
Errores propios
| Situación | Respuesta |
|---|---|
Falta automation | success: false, error: "automation_intent_required". |
| Ninguna automatización coincide (o la cuenta no tiene ninguna) | success: false, error: "automation_unresolved" y candidates con las coincidencias, vacío si no hay ninguna automatización en la cuenta. |
create-automation: crea una automatización de mensajería
Es una operación de escritura. Crea una automatización replicando el alta del panel: valida el evento disparador, resuelve la plantilla de cada acción contra el catálogo real de tu cuenta y, si filtras por producto, también los productos. Siempre envía al menos un email: actions no puede ir vacío. El script de esta guía fuerza siempre dry_run:true: no hay forma de crear una automatización de verdad con él.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/create-automation \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Recordatorio 24h",
"trigger": "session:start:before",
"offset_mode": "custom", "offset_quantity": 24, "offset_unit": "hours",
"actions": [{"template": "Recordatorio de sesión", "to_mode": "pax"}],
"trigger_products": {"mode": "someProducts", "products": ["Surf Principiante"]},
"dry_run": true
}'Por MCP: «Crea una automatización que mande un recordatorio 24 horas antes de cada sesión de Surf Principiante, a cada participante».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace | ||
|---|---|---|---|---|---|
title | texto | obligatorio | Título de la automatización, string plano (no traducible). Es el que ves en el listado del panel. | ||
actions | array | obligatorio | Acciones de email, al menos una: { template, to_mode?, to? }. template es el nombre o _id de una plantilla ya creada; se resuelve contra tu catálogo real, nunca se inventa. to_mode es buyer (quien reservó, por defecto), custom (un email fijo, exige to), pax o staff (solo tienen sentido con un disparador de sesión). | ||
trigger | texto | recomendado | Evento disparador: order:confirmed (por defecto, al confirmar la reserva), order:start:before, order:end:after o session:start:before. Acepta sinónimos en lenguaje natural («al confirmar», «antes del inicio»). Los tres primeros son eventos de la reserva (ver Operaciones de reservas); el último, de una sesión concreta (ver Operaciones de sesiones). | ||
trigger_products | objeto | opcional | Filtro de productos: `{ mode: "always"(por defecto) \ | "someProducts" \ | "exceptSomeProducts", products?, groups? }. Con someProducts/exceptSomeProducts, products (nombres o _id) y/o groups (tipos completos como "activities"`) son obligatorios y se resuelven contra el catálogo real. |
offset_mode | texto | opcional | Solo con disparadores de antes/después: "exact" (justo en el momento) o "custom" (cantidad a elegir). order:confirmed no admite offset. | ||
offset_quantity, offset_unit | número / texto | opcional | Cantidad y unidad ("days" por defecto, o "hours") del offset custom. Pasar offset_quantity implica offset_mode: "custom". |
Qué devuelve
Respuesta real de la prueba en seco, para un alta mínima (confirmación de reserva a todos los productos):
{
"success": true,
"dry_run": true,
"resolved_trigger": { "trigger": "order:confirmed", "contextType": "order", "supportsOffset": false, "reason": "default (order:confirmed — al confirmarse la reserva)" },
"resolved_products_mode": { "mode": "always", "requiresProducts": false, "reason": "default (always — aplica a todos los productos)" },
"resolved_actions": [
{ "template_id": "68062452db8ece2373ccbc12", "template_reason": "match por nombre 'Nueva plantilla'", "to_mode": "buyer", "to": "", "sessionScoped": false }
],
"resolved_products": [],
"warnings": [],
"payload_preview": {
"title": "Prueba Documentacion Confirmacion",
"trigger": "order:confirmed",
"actions": [{ "template": "68062452db8ece2373ccbc12", "to_mode": "buyer", "to": "" }],
"trigger_products_mode": "always"
}
}| Campo | Significado |
|---|---|
resolved_trigger | Evento aplicado, en qué contexto corre (order o session) y si admite offset. |
resolved_products_mode | Filtro de productos aplicado. |
resolved_actions | Cada acción con la plantilla ya resuelta a _id y el modo de destinatario. |
resolved_products | Solo con someProducts/exceptSomeProducts: los productos resueltos a _id. |
warnings | Avisos que no bloquean la creación, por ejemplo un to_mode de sesión (pax/staff) en un disparador de reserva: la acción se crea pero en ese evento no habrá destinatarios de sesión que resolver. |
payload_preview | Lo que se enviaría a crear, ya con nombres resueltos a _id. |
En la prueba en seco no hay _id: como no se llega a crear nada, no existe todavía. En una creación real la respuesta trae el _id de la automatización creada en su lugar.
Ejemplos
Filtrando por producto y con offset personalizado, probado en seco de verdad:
{
"title": "Recordatorio sesión",
"trigger": "session:start:before",
"offset_mode": "custom", "offset_quantity": 24, "offset_unit": "hours",
"actions": [{ "template": "Nueva plantilla", "to_mode": "pax" }],
"trigger_products": { "mode": "someProducts", "products": ["69dba4d4b227f96a4e3b21a8"] }
}Aviso interno a un email fijo del negocio, también probado en seco:
{
"title": "Aviso interno nueva reserva",
"actions": [{ "template": "Nueva plantilla", "to_mode": "custom", "to": "reservas@mareasurf.example" }]
}Errores propios
| Situación | Respuesta |
|---|---|
Falta title | 400, error: "invalid_params", campo title marcado como required. |
template que no coincide con ninguna plantilla | error: "template_unresolved" y template_candidates con las plantillas reales de tu cuenta. |
products de trigger_products que no coincide, o coincide con varios | error: "product_unresolved" y product_candidates con los productos de los cuatro catálogos. |
trigger que no es uno de los cuatro válidos | error: "trigger_invalid" y trigger_candidates con la lista completa. |
to_mode: "custom" sin to | error: "recipient_email_required". |
Consejos
- Antes de fijar la plantilla o los productos, deja que la operación falle una vez:
template_candidatesyproduct_candidateste dan los nombres exactos de tu cuenta, sin adivinar. - Usa
to_mode: "pax"o"staff"solo contrigger: "session:start:before"; con un disparador de reserva la automatización se crea pero el aviso lo indica: en ese evento no hay destinatarios de sesión. - Con
trigger_products.mode: "always"(el valor por defecto) no hace falta mandarproducts; se ignora si lo mandas.
update-automation: edita título o disparador
Es una operación de escritura. Cambia solo los campos que le pases: título y/o evento disparador (con su offset). No sirve para tocar las acciones de email ni el filtro de productos — para recomponerlos hay que volver a llamar a create-automation. El script de esta guía fuerza siempre dry_run:true.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/update-automation \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"automation": "Recordatorio 24h", "trigger": "order:start:before", "dry_run": true}'Por MCP: «Cambia el disparador de la automatización Recordatorio 24h a antes de que empiece la reserva».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
automation | texto | obligatorio | Automatización a editar: título plano o _id. Se resuelve antes de mirar el resto de campos. |
title | texto | recomendado | Nuevo título, string plano. |
trigger | texto | opcional | Nuevo evento disparador, mismo enum que en create-automation. |
offset_mode | texto | opcional | "exact" o "custom"; solo válido si el disparador (el nuevo o el que ya tenía) admite offset. |
offset_quantity, offset_unit | número / texto | opcional | Cantidad y unidad del offset custom. |
Qué devuelve
La cuenta demo de esta guía no tiene ninguna automatización creada, así que toda prueba real cayó en automation_unresolved antes de llegar a aplicar cambios — la resolución de automation se valida primero, incluso antes que un trigger inválido:
{
"success": false,
"dry_run": true,
"error": "automation_unresolved",
"details": "el customer no tiene automatizaciones configuradas",
"automation_intent": "Recordatorio 24h",
"candidates": [],
"hint": "Especifica la automatización (título plano o _id) entre candidates."
}Según el manual, con una automatización real la respuesta trae _id (el de la automatización editada, que no cambia) y changes: exactamente los campos que se van a modificar, ya normalizados (igual que en update-client).
Errores propios
| Situación | Respuesta |
|---|---|
Falta automation | 400, error: "invalid_params", campo automation marcado como required. |
El título o _id no coincide con ninguna automatización de la cuenta | error: "automation_unresolved" y candidates con las coincidencias, vacío si la cuenta no tiene ninguna. |
trigger que no es uno de los cuatro válidos | error: "trigger_invalid" y trigger_candidates con la lista completa (mismo comportamiento que en create-automation). |
Consejos
- Si necesitas cambiar la plantilla, el destinatario o el filtro de productos, no hay atajo: recompón la automatización entera con
create-automation. - Antes de cambiar el
trigger, comprueba conget-automationsi la automatización ya tenía un offset: cambiar a un disparador que no admite offset (order:confirmed) lo deja sin efecto.
