Operaciones de bonos
Consulta, crea, edita y borra bonos de sesiones con sus tarifas, caducidad y actividades por API v1 o MCP.
Un bono es un producto que vende créditos: el cliente paga por un número de sesiones o inmersiones y las va canjeando cuando quiere, con una fecha de caducidad. Estas operaciones te dejan enumerar, consultar, crear, editar y borrar bonos por API o por tu asistente de IA. Más sobre el concepto en Qué es un bono de clases.
Operaciones de esta página: list-bonoclasses, get-bonoclass, create-bonoclass, update-bonoclass, delete-bonoclass (solo lectura: list-bonoclasses, get-bonoclass; escritura: create-bonoclass, update-bonoclass, delete-bonoclass).
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-bonoclasses: enumera los bonos del centro
Devuelve el catálogo de bonos: identificador, título, nombre interno, categorías y las tarifas de créditos que vende cada uno. Es el paso previo natural para encontrar el identificador exacto de un bono antes de editarlo o borrarlo. Es de solo lectura: vale con cualquier token.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/list-bonoclasses?q=inmersiones" \
-H "Authorization: Bearer bk_TU_TOKEN"curl -X POST https://api.bukyapp.com/v1/ops/list-bonoclasses \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"q": "inmersiones", "detail": "descriptive", "lang": "es"}'Por MCP: «Enséñame los bonos que tengo» o «Busca los bonos que tengan "inmersiones" en el nombre».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
q | texto | opcional | Filtra por título (contiene, sin tildes). Es la búsqueda del panel. |
disabled | booleano | opcional | true solo desactivados, false solo activos. Por defecto, todos. |
created_from, created_to | fecha | opcional | Rango sobre la fecha de creación. |
detail | texto (compact/descriptive) | opcional | compact (por defecto): lo esencial para identificar y enumerar. descriptive: textos a texto plano (descripción, requisitos, condiciones de cancelación…) y referencias resueltas a su título (actividades, punto de encuentro, categorías), sin tarifas ni flags internos. |
lang | texto | opcional | Solo con detail: "descriptive": cada texto vuelve en ese idioma (por ejemplo "es"; si falta, cae a español o al primero disponible). Sin lang, cada texto es un objeto {idioma: texto} con los idiomas rellenos. |
full | booleano | opcional | true devuelve el documento completo de cada bono (pesado). Gana a detail. |
limit | número | opcional | Máximo de resultados, tras aplicar los filtros. |
Qué devuelve
Ejecución real: la cuenta demo usada para esta página no tiene ningún bono creado todavía, así que la respuesta viene vacía:
{
"success": true,
"detail": "compact",
"count": 0,
"total": 0,
"items": [],
"warnings": []
}Según el manual, cada elemento de items en vista compact trae:
| Campo | Significado |
|---|---|
_id | El identificador que necesitas para get-bonoclass, update-bonoclass, etc. |
title, internalName | Título público y nombre interno del bono (puede venir vacío). |
categories | Identificadores de las categorías donde aparece el bono en la tienda. |
is_disabled | Si el bono está desactivado. |
options | Las tarifas del bono simplificadas a { name, quantity }: cada tarifa que puede comprar el cliente y cuántos créditos da. No incluye el precio; para eso usa get-bonoclass o full:true. |
Los bonos borrados nunca aparecen aquí.
Consejos
- Antes de crear un bono con
create-bonoclass, ejecutalist-bonoclassescon el nombre que piensas usar: si ya existe uno parecido, evitas duplicarlo.
get-bonoclass: consulta el detalle completo de un bono
Devuelve el documento completo y actualizado de un bono, resuelto por nombre o por identificador. Es de solo lectura: vale con cualquier token. Es la forma correcta de comprobar «cómo quedó» un bono tras crearlo o editarlo, y de obtener su identificador exacto.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/get-bonoclass?bonoclass=Bono%2010%20inmersiones" \
-H "Authorization: Bearer bk_TU_TOKEN"curl -X POST https://api.bukyapp.com/v1/ops/get-bonoclass \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"bonoclass": "Bono 10 inmersiones"}'Por MCP, pídeselo directamente a tu asistente: «Enséñame el detalle del bono Bono 10 inmersiones».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
bonoclass | texto | obligatorio | Nombre o identificador del bono a consultar. Se resuelve contra el catálogo real. Acepta los alias id y bonoclass_id. |
Qué devuelve
La cuenta demo usada para esta página no tiene ningún bono creado todavía, así que la ejecución real con un nombre inventado devuelve esto:
{
"success": false,
"error": "bonoclass_unresolved",
"details": "el customer no tiene ninguna entidad de este tipo configurada",
"candidates": [],
"hint": "El customer no tiene ningún bono configurado todavía."
}Cuando el bono existe, la respuesta trae, además de success y operation: _id (el identificador del bono), resolved (qué bono se eligió y por qué) e item: el documento completo y fresco (título, tarifas, actividades, caducidad, impuestos…).
Errores propios
| Situación | Respuesta |
|---|---|
Falta el parámetro bonoclass | 200 con success: false, error: "bonoclass_intent_required". |
| Nombre que no coincide con ningún bono (o la cuenta no tiene ninguno) | 200 con success: false, error: "bonoclass_unresolved" y candidates con las coincidencias, si las hay. |
Consejos
- Si el nombre es ambiguo, la respuesta trae
candidatescon las opciones: repite la llamada con el identificador exacto. - Úsala después de
create-bonoclassoupdate-bonoclasspara confirmar el resultado con datos frescos, sin caché.
create-bonoclass: crea un bono con sus tarifas y caducidad
Crea un bono nuevo: título, tarifas de créditos, caducidad y, opcionalmente, a qué actividades da acceso. Es una operación de escritura; el token no puede tocar usuarios del panel, reembolsos ni pagos, pero sí crear productos como este.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/create-bonoclass \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Bono 10 inmersiones",
"rates": [{ "quantity": 10, "price": 360 }],
"expiration": 365,
"activities": ["Inmersión guiada"],
"dry_run": true
}'Por MCP: «Crea un bono de 10 inmersiones a 360 euros, caduca a los 365 días, válido para Inmersión guiada».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
title | texto | obligatorio | Título público del bono. Es el único campo que la API exige de verdad. |
rates | lista | recomendado | Tarifas: cada una es { quantity, price, name }. quantity son los créditos que da esa tarifa (de 1 a 1000); price va en euros. Puedes poner varias tarifas para vender el mismo bono en distintos tamaños («Pack 2», «Pack 4»…). |
expiration | número | recomendado | Días de validez del bono desde que se compra. Habitual: 365 para bonos de sesiones, 540 para vales regalo. |
activities | lista | recomendado | A qué actividades da derecho el bono, por nombre o identificador. Se resuelven contra tus actividades reales. |
internal_name | texto | recomendado | Nombre interno, solo para organizar tu catálogo; no lo ve el cliente. |
taxes | texto o lista | opcional | Qué impuesto aplicar (por ejemplo "21%" o "default"). Si lo omites, se usa el primero configurado en tu cuenta. |
categories | lista | opcional | Categorías donde aparece el bono en tu tienda. |
payment_mode | texto | opcional | Cómo se paga: full (todo por adelantado, el valor por defecto), advance (anticipo) o none. |
description | texto | opcional | Descripción pública del bono. |
can_share | booleano | opcional | Si varias personas pueden compartir los créditos del mismo bono. Por defecto, no. |
thumb | texto | opcional | Imagen destacada del bono: identificador de una imagen ya subida o URL pública (se valida para evitar accesos no permitidos). Se aplica tras crear el bono. Ver Operaciones de imágenes. |
gallery | lista | opcional | Galería del bono: lista de imágenes, cada una identificador de una imagen ya subida o URL pública. |
Qué devuelve
Prueba en seco real, creando «Bono 10 sesiones de prueba»:
{
"success": true,
"dry_run": true,
"resolved_rates": [
{ "quantity": 10, "price": 15000, "description": { "name": "Bono 10" } }
],
"resolved_activities": [
{ "id": "69dba4d4b227f96a4e3b21a8", "reason": "match exacto por nombre 'Surf Principiante'" }
],
"resolved_taxes": [
{ "id": "69a181ce5d6272575493bcfd", "reason": "default (primer tax del customer)" }
],
"resolved_categories": [],
"payload_preview": {
"title": { "es": "Bono 10 sesiones de prueba", "en": "New", "…": "…" },
"activities": ["69dba4d4b227f96a4e3b21a8"],
"rates": [{ "quantity": 10, "price": 15000 }],
"taxes": ["69a181ce5d6272575493bcfd"],
"expiration": 365
},
"warnings": []
}Al crear de verdad (sin dry_run), la respuesta añade _id con el identificador del bono recién creado.
| Campo | Significado |
|---|---|
_id | Identificador del bono creado. Solo aparece en una creación real, no en una prueba en seco. |
resolved_rates | Las tarifas ya normalizadas: price queda en céntimos aunque tú lo pasaras en euros. |
resolved_activities | A qué actividad se resolvió cada nombre que diste, y por qué. |
resolved_taxes / resolved_categories | Impuesto y categorías resueltos contra tu cuenta real. |
payload_preview | El documento que se crearía. En una prueba en seco, no llega a guardarse. |
Errores propios
| Situación | Respuesta |
|---|---|
Falta title | 400 con error: "invalid_params" y el campo que falta en details. |
Consejos
- Si tu bono tiene varios tamaños («2 inmersiones», «4 inmersiones»…), usa varias entradas en
ratesen vez de crear un bono por tamaño. - Si omites
activities, comprueba conget-bonoclassa qué actividades queda ligado el bono antes de publicarlo. - Para las actividades que puede canjear el bono, mira Operaciones de actividades.
update-bonoclass: edita un bono existente
Edita un bono con un PUT parcial: solo se cambian los campos que le pasas, el resto queda igual. Si pasas rates, activities, taxes, categories o extras, ese campo se reemplaza entero, no se combina con lo que ya había. Es una operación de escritura.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/update-bonoclass \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bonoclass": "Bono 10 inmersiones",
"title": "Bono 10 inmersiones PRO",
"dry_run": true
}'Por MCP: «Cambia el título del bono Bono 10 inmersiones a "Bono 10 inmersiones PRO"».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
bonoclass | texto | obligatorio | Nombre o identificador del bono a editar. |
title | texto | recomendado | Nuevo título público. No toca otros idiomas. |
rates | lista | opcional | Nuevas tarifas (mismo formato que en create-bonoclass). Reemplaza todas las tarifas existentes. |
expiration | número | opcional | Nuevos días de validez tras la compra. |
activities | lista | opcional | Nuevas actividades a las que da acceso. Reemplaza la lista entera. |
taxes / categories | texto o lista | opcional | Nuevo impuesto y nuevas categorías. Reemplazan lo existente. |
internal_name | texto | opcional | Nuevo nombre interno. |
payment_mode | texto | opcional | full, advance o none. |
description | texto | opcional | Nueva descripción pública. |
can_share | booleano | opcional | Si los créditos se pueden compartir entre varias personas. |
price_from_eur | número | opcional | Precio «desde» que se muestra en la tienda pública, en euros. |
alert_text | texto | opcional | Texto de aviso que se muestra al cliente en la ficha del bono. |
user_cant_select / user_can_cancel / user_can_cancel_hours | booleano / booleano / número | opcional | Si el cliente puede elegir sesión directamente, si puede cancelar y con cuánta antelación mínima. |
need_pax_data | booleano | opcional | Si hace falta pedir los datos de cada participante. |
checkin_mode | texto | opcional | Check-in online: vacío (todos), leader (solo el titular) u off. Solo si tu cuenta tiene el check-in online activado. |
payment_advance_mode, payment_advance_percent, payment_advance_fixed_eur | — | opcional | Solo con payment_mode: "advance": si el anticipo es porcentaje o importe fijo, y su valor. |
extras | lista | opcional | Extras que se pueden añadir al bono. Reemplaza la lista entera. |
thumb | texto | opcional | Imagen destacada: mismas reglas que al crear el bono, identificador de una imagen ya subida o URL pública validada. Se aplica tras editar el bono. Ver Operaciones de imágenes. |
gallery | lista | opcional | Galería: lista de imágenes, cada una identificador de una imagen ya subida o URL pública. Se reemplaza entera. |
Qué devuelve
La cuenta demo no tiene ningún bono creado, así que la prueba en seco no llega a resolver uno y devuelve esto:
{
"success": false,
"dry_run": true,
"error": "bonoclass_unresolved",
"details": "el customer no tiene bonos configurados",
"candidates": [],
"hint": "Especifica el bono (título o _id) entre candidates."
}Cuando el bono sí existe y se resuelve, la respuesta trae _id, changes (qué campos cambiaron), resolved_rates, resolved_activities, resolved_taxes, resolved_categories y warnings.
Errores propios
| Situación | Respuesta |
|---|---|
| El nombre no coincide con ningún bono de la cuenta (o no hay ninguno) | 200 con success: false, error: "bonoclass_unresolved" y los candidatos, si los hay, en candidates. |
Consejos
- Si solo quieres previsualizar el cambio, no hace falta nada especial: por API pública, añade
"dry_run": true. - Al reemplazar
ratesoactivities, repite también los valores que quieras conservar: no se fusionan con los anteriores.
delete-bonoclass: da de baja un bono
El bono deja de verse en el catálogo y en la tienda. No puedes deshacerlo desde la API ni desde el asistente, pero el soporte de Buky puede recuperarlo si lo necesitas. Los créditos ya vendidos de ese bono siguen siendo válidos para los clientes que los compraron. Es una operación de escritura.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/delete-bonoclass \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "bonoclass": "Bono 10 sesiones", "confirm": true, "dry_run": true }'Por MCP: «Borra el bono Bono 10 sesiones».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
bonoclass | texto | obligatorio | Nombre o identificador del bono a borrar. |
confirm | booleano | recomendado | Tiene que ser true para borrar de verdad; sin él, la operación se queda en prueba en seco aunque no se lo pidas tú. |
Qué devuelve
La cuenta demo no tiene ningún bono, así que la prueba en seco devuelve:
{
"success": false,
"dry_run": true,
"error": "bonoclass_unresolved",
"details": "el customer no tiene bonos configurados",
"candidates": [],
"hint": "Especifica el bono (título o _id) entre candidates."
}Cuando el bono existe, la respuesta trae _id, soft_deleted: true, reversible: true y warnings.
Errores propios
| Situación | Respuesta |
|---|---|
| El nombre no coincide con ningún bono (o no hay ninguno) | 200 con success: false, error: "bonoclass_unresolved" y los candidatos, si los hay, en candidates. |
Consejos
confirm: truees la única forma de que esta operación llegue a borrar algo; sin él, es siempre una prueba en seco.- Si te equivocas, el soporte de Buky puede recuperarlo.
