Operaciones de formularios
Consulta, crea, edita y borra los formularios de campos extra de reserva y check-in por API v1 o MCP.
Los formularios son los campos extra que Buky le pide a tu cliente al reservar o durante el check-in online: nombre, nivel, alergias, si acepta unas condiciones… Un mismo formulario puede ir suelto, ser un paso del check-in online o mostrarse como contexto de cada sesión (ver Crear formularios personalizados). Estas operaciones enumeran, crean, leen, editan, borran y recuperan el formulario en sí; no gestionan lo que responde cada cliente.
Operaciones de esta página: list-forms, get-form, create-form, update-form, delete-form (solo lectura: list-forms, get-form; escritura: create-form, update-form, delete-form).
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.
list-forms: enumera los formularios del centro
Devuelve los formularios del centro: identificador, título, si son un paso del check-in online o del contexto de sesión, y cuántos campos tienen. Es una operación de solo lectura: vale con cualquier token.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/list-forms" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «¿Qué formularios tengo creados?».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
q | texto | opcional | Filtra por nombre (contiene, sin tildes). Es el mismo buscador del panel. |
detail | texto | opcional | compact (por defecto): lo justo para identificar y enumerar. descriptive: textos en claro y productos resueltos a su título, sin tarifas ni etiquetas internas. |
lang | texto | opcional | Solo con detail: descriptive: cada texto llega en ese idioma (si falta, cae a español). Sin lang, cada texto llega como {idioma: texto}. |
full | booleano | opcional | Devuelve los documentos completos del servidor (pesado). Tiene prioridad sobre detail. |
created_from / created_to | fecha | opcional | Rango de fecha de creación (igual que el filtro del panel). |
limit | número | opcional | Máximo de resultados devueltos, tras aplicar los filtros. |
Qué devuelve
Ejemplo real de la cuenta demo:
{
"success": true,
"detail": "compact",
"count": 1,
"total": 1,
"items": [
{
"_id": "67e57cb572327d54c19cd904",
"title": "Checkin Surf",
"checkin_online": true,
"session_context": false,
"components_count": 3
}
]
}| Campo | Significado |
|---|---|
items | Los formularios: _id, título, si son un paso del check-in online o del contexto de sesión, y cuántos campos tienen (components_count). Con detail: descriptive cada uno trae además descripción, productos afectados y el detalle de los campos. |
total | Formularios que cumplen los filtros, antes de aplicar limit. |
count | Formularios realmente devueltos en items. Si es menor que total, limit recortó la lista. |
Consejos
Usa detail: descriptive cuando quieras revisar un formulario sin pedir el documento completo: te da los productos afectados por su título (no solo el identificador) y el detalle de los campos.
get-form: consulta un formulario completo
Devuelve el documento completo y actualizado de un formulario: título, descripción, campos y configuración de rol. Es una operación de solo lectura: vale con cualquier token.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/get-form?form=Checkin%20Surf" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «Enséñame el formulario de check-in de surf».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
form (o sus alias id, form_id) | texto | obligatorio* | Nombre, título o identificador del formulario. Se resuelve contra el catálogo real; si no hay un único match, la respuesta trae los candidatos. |
\* El manual lo marca como «recomendado», pero en la práctica es obligatorio: sin él, la operación responde con error: "form_intent_required".
Qué devuelve
Ejemplo real, recortado, del formulario «Checkin Surf» de la cuenta demo:
{
"success": true,
"_id": "67e57cb572327d54c19cd904",
"resolved": { "id": "67e57cb572327d54c19cd904", "reason": "match exacto 'Checkin Surf'" },
"item": {
"_id": "67e57cb572327d54c19cd904",
"title": { "es": "Checkin Surf", "en": "Surf Checkin" },
"checkin_online": true,
"checkin_online_mode": "always",
"checkin_online_needDocument": false,
"checkin_online_needSign": false,
"session_context": false,
"components": [
{ "label": { "es": "Nombre completo" }, "type": "text", "required": true },
{ "label": { "es": "Nivel de surf" }, "type": "select", "required": true,
"options": [{ "label": { "es": "Principiante" } }, "..."] },
"..."
]
}
}| Campo | Significado |
|---|---|
_id | El identificador del formulario, para usarlo en el resto de operaciones. |
resolved | Qué formulario se eligió a partir del nombre que diste y por qué (id y reason). |
item | El documento completo: título y descripción por idioma, components (los campos que ve el cliente) y la configuración de rol. |
item.components | Los campos en orden, con su tipo (text, select…), si son obligatorios y, en los select, sus opciones. |
item.checkin_online / _mode / _resources | Si el formulario es un paso del check-in online, en qué modo (always, someProducts, exceptSomeProducts) y a qué productos afecta. |
item.session_context (y los mismos _mode/_resources) | Lo mismo para el contexto de sesión. |
Errores propios de esta operación
| Situación | Respuesta |
|---|---|
Falta form | 200 con success: false y error: "form_intent_required". |
| Nombre que no coincide con ningún formulario | 200 con success: false, error: "form_unresolved" y la lista form_candidates con los formularios disponibles. |
Consejos
Usa get-form después de create-form o update-form para comprobar cómo quedó de verdad el formulario: la operación de escritura confirma los cambios enviados, pero get-form te da el documento completo y fresco.
create-form: crea un formulario o paso de check-in
Crea un formulario nuevo: suelto, como paso del check-in online o como contexto de sesión. Es una operación de escritura: solo un token con permiso de escritura puede ejecutarla, y aquí siempre en modo de prueba (dry_run: true).
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/create-form \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Checkin buceo",
"role": "checkin_online",
"need_document": true,
"components": ["Número de documento"],
"dry_run": true
}'Por MCP: «Crea un formulario de check-in que pida el número de documento y una foto del DNI».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
title | texto | obligatorio | Título del formulario. |
components | lista | obligatorio | Los campos que se piden al cliente. Cada uno es un texto simple (campo de texto corto) o un objeto {label, type, required, options}. Al menos uno. |
description | texto | opcional | Descripción del formulario. Vacía por defecto. |
role | texto | recomendado | plain (formulario suelto, por defecto), checkin_online (paso del check-in online) o session_context (dato visible en el contexto de cada sesión). |
resource_mode | texto | opcional | Solo si role no es plain: always (todos los productos, por defecto), someProducts o exceptSomeProducts. |
resources | lista | opcional* | Productos incluidos o excluidos, por nombre o identificador. |
need_document | booleano | opcional | Solo role: checkin_online. Pide una foto del documento de identidad. Por defecto false. |
need_sign | booleano | opcional | Solo role: checkin_online. Pide firma. Por defecto false. |
need_review | booleano | opcional | Solo role: checkin_online. Fuerza que el check-in pase siempre por revisión manual. Por defecto false. |
\* Obligatorio si resource_mode es someProducts o exceptSomeProducts; sin él la operación no crea nada.
Qué devuelve
Prueba en seco real, con rol checkin_online:
{
"success": true,
"dry_run": true,
"applied_defaults": { "role": "checkin_online", "resource_mode": "always" },
"resolved_role": { "role": "checkin_online", "checkinOnline": true, "sessionContext": false },
"resolved_resources": [],
"payload_preview": {
"title": { "es": "Checkin prueba Kraken", "en": "New", "..." : "..." },
"components": [
{ "label": { "es": "<p>Nivel de surf</p>" }, "type": "select",
"options": [{ "label": { "es": "<p>Principiante</p>" } }, "..."] }
],
"checkin_online": true,
"checkin_online_needDocument": true,
"checkin_online_needSign": true
}
}| Campo | Significado |
|---|---|
applied_defaults | Los valores que se aplican si no los indicas (role: plain, resource_mode: always). |
resolved_role | El rol final y por qué se eligió. |
resolved_resources | Los productos ya resueltos, si usaste resource_mode: someProducts o exceptSomeProducts. |
payload_preview | El formulario tal y como se guardaría: título traducido a los idiomas de la cuenta y cada campo (y cada opción, en los select) con su identificador. |
Al crearlo de verdad (fuera de la prueba en seco), la respuesta trae además el _id del formulario nuevo.
Errores propios de esta operación
| Situación | Respuesta |
|---|---|
Falta title o components | 400 con error: "invalid_params" y el campo que falta en details. |
resource_mode: someProducts (o exceptSomeProducts) sin resources | 200 con success: false y error: "resources_required". |
Consejos
Un campo (component) puede ser solo un texto ("Nombre completo") para un campo de texto corto, o un objeto si necesitas otro tipo: inputSmall, inputBig, select, checkbox, date, file, title o paragraph. Los select necesitan options (al menos una).
update-form: edita título, descripción o rol
Edita un formulario existente: título, descripción o rol. No toca los campos (components); para eso hay que crear el formulario de nuevo. Es una operación de escritura, siempre en modo de prueba aquí.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/update-form \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"form": "Checkin Surf", "title": "Checkin Surf (temporada 2026)", "dry_run": true}'Por MCP: «Cambia el título del formulario Checkin Surf a "Checkin Surf (temporada 2026)"».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
form | texto | obligatorio | Formulario a editar: nombre, título o identificador. |
title | texto | recomendado | Nuevo título. Solo cambia el idioma que envíes; no toca los demás. |
description | texto | opcional | Nueva descripción. Mismo criterio que title. |
role | texto | opcional | Cambia el rol: plain, checkin_online o session_context. |
resource_mode | texto | opcional | Solo si el rol resultante no es plain: always, someProducts o exceptSomeProducts. |
resources | lista | opcional* | Reemplaza los productos incluidos o excluidos. |
need_document, need_sign, need_review | booleano | opcional | Igual que en create-form. Requieren que el rol resultante sea checkin_online. |
\* Obligatorio si resource_mode es someProducts o exceptSomeProducts.
Qué devuelve
Prueba en seco real, cambiando el título:
{
"success": true,
"dry_run": true,
"_id": "67e57cb572327d54c19cd904",
"changes": { "title": { "es": "Checkin Surf (prueba Kraken)" } },
"note": "PUT parcial: solo estos campos cambian; customer/_id/__v nunca se envían. components NO se toca."
}| Campo | Significado |
|---|---|
_id | El identificador del formulario editado. |
changes | Exactamente lo que va a cambiar, ya en la estructura real (por ejemplo, title como objeto por idioma). |
note | Recordatorio de que es una edición parcial y que no toca los campos del formulario. |
Errores propios de esta operación
| Situación | Respuesta |
|---|---|
| Nombre que no coincide con ningún formulario | 200 con success: false, error: "form_unresolved" y form_candidates con los formularios disponibles. |
Consejos
Los campos (components) no se editan con esta operación: para añadir, quitar o reordenar preguntas, crea el formulario de nuevo con create-form y borra el anterior con delete-form.
delete-form: borra un formulario
El formulario deja de verse en el panel y en la tienda. No puedes deshacerlo desde la API ni desde el asistente, pero el soporte de Buky puede recuperarlo si lo necesitas. Es una operación de escritura, siempre en modo de prueba aquí.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/delete-form \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"form": "Checkin Surf", "confirm": true, "dry_run": true}'Por MCP: «Borra el formulario Checkin Surf» (el asistente te pedirá confirmar antes de ejecutarlo de verdad).
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
form | texto | obligatorio | Formulario a borrar: nombre, título o identificador. |
confirm | booleano | recomendado | Debe ser true para borrar de verdad. Sin él, la operación solo muestra qué pasaría (salvaguarda ante un borrado accidental). |
Qué devuelve
Prueba en seco real:
{
"success": true,
"dry_run": true,
"would_delete": { "_id": "67e57cb572327d54c19cd904", "name": "Checkin Surf" },
"soft_deleted": false,
"reversible": true,
"warnings": ["borrado limpio (sin cascada): posibles referencias colgando a este formulario son menores"]
}| Campo | Significado |
|---|---|
would_delete | El formulario que se borraría (_id y nombre). |
soft_deleted | Si de verdad se borró (false en toda prueba en seco). |
reversible | true: el soporte de Buky puede recuperarlo si lo pides. |
warnings | Avisos menores: el borrado no arrastra referencias desde otros sitios al formulario. |
Errores propios de esta operación
| Situación | Respuesta |
|---|---|
| Nombre que no coincide con ningún formulario | 200 con success: false, error: "form_unresolved" y form_candidates con los formularios disponibles. |
Consejos
Si te equivocas, el soporte de Buky puede recuperarlo.
