Operaciones de packs
Consulta, crea, edita y borra packs con sus opciones, alojamiento y tarifas por API v1 o MCP.
Un pack combina actividades, alojamiento y extras en un solo producto con un precio conjunto, para vender experiencias completas como un surf camp de una semana o una escapada de fin de semana. Cada pack tiene una o varias opciones (el manual las llama «variaciones»): por ejemplo «3 noches», «5 noches» y «7 noches», cada una con su propia duración y sus propias actividades. Si el pack incluye alojamiento, puedes marcar que los acompañantes que solo se alojan, sin hacer actividades, entren gratis hasta llenar la capacidad de la habitación. Más contexto y capturas en Qué es un pack y cuándo usarlo.
Operaciones de esta página: list-packs, get-pack (solo lectura); create-pack, update-pack, delete-pack (escritura).
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 de esta página, customer_id se toma del token: solo hace falta indicarlo con tokens multicuenta.
list-packs: enumera los packs de la cuenta
Es una operación de solo lectura: vale con cualquier token. Devuelve todos los packs de la cuenta sin tener que adivinar nombres ni provocar un error de get-pack para ver qué existe. Los packs borrados nunca aparecen.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/list-packs?detail=descriptive&disabled=false" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «Enséñame los packs que tengo» o «¿Qué packs están desactivados?».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
q | texto | opcional | Busca por texto en el nombre (sin tildes), igual que el buscador del panel. |
disabled | booleano | opcional | true: solo desactivados. false: solo activos. Sin él, salen todos. |
created_from, created_to | fecha | opcional | Rango de fecha de creación (ISO), igual que el filtro de fecha del panel. |
detail | texto | opcional | compact (por defecto): identificador, título, variaciones y estado. descriptive: además descripción, condiciones, alojamientos y opciones con detalle, todo a texto plano. |
lang | texto | opcional | Solo con detail: "descriptive": cada texto en un único idioma (por ejemplo es). Sin este parámetro, cada texto llega como { idioma: texto }. |
full | texto o booleano | opcional | true: los documentos completos del servidor, sin resumir. Pesa más; gana a detail. |
limit | número | opcional | Recorta el número de resultados a los primeros N. |
Qué devuelve
Ejecución real con la cuenta demo, vista compacta (por defecto):
{
"success": true,
"operation": "list-packs",
"detail": "compact",
"count": 1,
"total": 1,
"items": [
{
"_id": "5dc98fae75a5229e7c921c1e",
"title": "Pack1",
"internalName": null,
"categories": [],
"is_disabled": false,
"variations": ["Opción test"]
}
]
}| Campo | Significado |
|---|---|
items | Los packs que casan los filtros. En vista compacta: identificador, título, nombre interno, categorías, si está desactivado y el título de cada opción (variación). |
count / total | count son las filas devueltas; total son las que casan los filtros antes de aplicar limit. Si count es menor que total, sube el límite o pagina con otro filtro. |
Consejos
- Úsala primero para saber qué packs existen y con qué nombre exacto, y luego pasa ese nombre o el
_idaget-packoupdate-pack. detail: "descriptive"te da la ficha a texto plano (opciones, alojamientos, condiciones) sin tener que pedir el documento completo de cada pack.
get-pack: obtiene el doc completo y al día de un pack
Es una operación de solo lectura: vale con cualquier token. Es la forma de comprobar cómo quedó un pack tras crearlo o editarlo, y de conseguir su identificador exacto.
Cómo llamarla
curl "https://api.bukyapp.com/v1/ops/get-pack?pack=Pack1" \
-H "Authorization: Bearer bk_TU_TOKEN"Por MCP: «Enséñame el pack Pack1» o «¿Qué opciones tiene el pack Surf Camp?».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
pack | texto | obligatorio | Nombre o identificador del pack. También se acepta como id o pack_id: son alias, siguen funcionando igual. Sin este parámetro la operación falla pidiéndolo. |
Qué devuelve
Ejemplo real con la cuenta demo:
{
"success": true,
"operation": "get-pack",
"_id": "5dc98fae75a5229e7c921c1e",
"resolved": { "id": "5dc98fae75a5229e7c921c1e", "reason": "match exacto 'Pack1'" },
"item": {
"_id": "5dc98fae75a5229e7c921c1e",
"title": { "es": "Pack1", "en": "New", "...": "..." },
"variations": [
{ "_id": "61a9d9ae1728d00000d0aaf1", "title": { "es": "Opción test" }, "nights": 6, "activities": [] }
],
"accommodations": [],
"rates": [
{ "_id": "61a9d9c61728d00000d0aaf2", "variation": "61a9d9ae1728d00000d0aaf1", "price": 0, "accommodation": null }
],
"priceMode": "pricePerFullPack",
"paymentMode": "full"
}
}| Campo | Significado |
|---|---|
item | El documento completo del pack: título, opciones (variations), alojamientos elegibles (accommodations), matriz de precio (rates), modo de precio (priceMode) y configuración de pago y fechas. |
resolved | Qué pack se eligió a partir del nombre que diste y por qué. |
Errores propios
| Situación | Respuesta |
|---|---|
| Nombre que no coincide con ningún pack | success: false, error: "pack_unresolved" y pack_candidates con los packs disponibles de la cuenta (en la demo, solo hay uno: «Pack1»). |
Sin parámetro pack | success: false, error: "pack_intent_required". En la práctica el parámetro es obligatorio, aunque el manual lo marque como «recomendado». |
create-pack: crea el contenedor del pack
Es una operación de escritura. Crea el pack vacío —título, descripción e impuestos—; las opciones, los alojamientos y la matriz de precio se añaden después con update-pack. Es el mismo orden en dos pasos que sigue el panel: primero guardas el pack, luego se habilitan las pestañas para configurarlo.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/create-pack \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Semana de Surf Ficticia", "taxes": "IVA", "dry_run": true}'Por MCP: «Crea un pack llamado Surf Camp 7 noches».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
title | texto | obligatorio | Título público del pack, en español. |
taxes | texto o array | recomendado | Impuesto o impuestos a aplicar ("IVA", "21%", "default" o el identificador). Si lo omites, se usa el impuesto por defecto de tu cuenta. |
description | texto | opcional | Descripción pública. |
categories | array | opcional | Categorías del pack, por nombre o identificador. |
extras | array | opcional | Extras disponibles en el pack, por nombre o identificador. |
thumb | texto | opcional | Imagen destacada: identificador de una imagen ya subida (el que te devuelve el chat al adjuntarla) o una URL pública: Buky la descarga y la sube por ti, comprobando antes que la URL es segura. Ya no vale una ruta de fichero de tu ordenador. Se aplica justo después de crear el pack. Ver Operaciones de imágenes. |
gallery | array | opcional | Galería del pack: lista de imágenes, cada una identificador de una imagen ya subida o URL pública. Reemplaza la galería entera. Ver Operaciones de imágenes. |
Qué devuelve
Prueba en seco real, sin pasar impuesto (toma el de la cuenta por defecto):
{
"success": true,
"dry_run": true,
"resolved_taxes": [{ "id": "69a181ce5d6272575493bcfd", "reason": "default (primer tax del customer)" }],
"payload_preview": {
"title": { "es": "Pack de prueba sin impuestos", "en": "New", "...": "..." },
"description": { "es": "", "en": "", "...": "..." },
"taxes": ["69a181ce5d6272575493bcfd"]
}
}| Campo | Significado |
|---|---|
resolved_taxes | El impuesto que se aplicará y por qué (nombre coincidente o el de la cuenta por defecto). |
payload_preview | Lo que se guardaría: el título entra en español y se deja «New» como placeholder en el resto de idiomas hasta que los traduzcas. |
_id (en una escritura real) | Identificador del pack recién creado. Úsalo con update-pack para añadir el resto. |
Errores propios
| Situación | Respuesta |
|---|---|
Sin title | 400 con error: "invalid_params" y title como campo que falta en details. |
thumb o gallery con un valor que no es ni un identificador de imagen ni una URL (por ejemplo, una ruta de tu ordenador) | La prueba en seco devuelve success: false sin más detalle; la imagen se queda pendiente sin subir. |
Consejos
- Después de crear el pack, llama a
update-packconaccommodations,variationsyratespara convertirlo en una estancia o un surfcamp de verdad; sin eso el pack queda como un contenedor vacío.
update-pack: añade opciones, alojamientos y la matriz de precio
Es una operación de escritura. Reescribe el pack entero: obtiene el documento actual, le aplica los cambios que le pases y lo guarda completo. Por eso accommodations, variations, rates, taxes, extras y categories reemplazan el conjunto anterior entero — pasa siempre la lista completa que quieres que quede, no solo lo nuevo. Los identificadores de las opciones y alojamientos que ya existían se conservan si el título o el alojamiento coinciden.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/update-pack \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pack": "Surf Camp", "title": "Surf Camp Pro", "dry_run": true}'Por MCP: «Cambia el título del pack Surf Camp a Surf Camp Pro» o «Añade la opción de 7 noches al pack Surf Camp con alojamiento en Bungalow 1 a 590€».
Parámetros — identidad y catálogo
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
pack | texto | obligatorio | Pack a editar, por título o identificador. |
title | texto | recomendado | Nuevo título público. No afecta a los demás idiomas. |
description | texto | opcional | Nueva descripción pública. |
taxes | array | opcional | Impuestos del pack. Reemplaza el conjunto anterior. |
categories, extras | array | opcional | Categorías y extras del pack, por nombre o identificador. Reemplazan el conjunto anterior. |
internal_name | texto | opcional | Nombre interno, solo visible en el panel. |
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 reservar. |
thumb | texto | opcional | Imagen destacada del pack. Igual que en create-pack: identificador de una imagen ya subida o URL pública (se descarga y sube por ti, con comprobación de seguridad; ya no vale una ruta de fichero de tu ordenador). Ver Operaciones de imágenes. |
gallery | array | opcional | Galería del pack. Igual que en create-pack, pero reemplaza la galería entera. Ver Operaciones de imágenes. |
Parámetros — opciones, alojamientos y precio
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
variations | array | opcional | Las opciones del pack (reemplaza el conjunto). Cada una: title, nights (noches, 0 si no hay alojamiento), activities (lista de {activity, quantity}) y, opcional, un rango de personas. |
accommodations | array | opcional | Los alojamientos entre los que puede elegir el cliente (reemplaza el conjunto). Cada uno: el alojamiento (nombre o identificador) y dos ajustes — haveConditions (aplican las condiciones propias del alojamiento) y haveCompanions (permite acompañantes que solo se alojan, sin actividad, gratis hasta llenar la habitación). |
rates | array | opcional | La matriz de precio (reemplaza el conjunto). Con el modo por defecto, cada tarifa es {price (€), variation, accommodation, season?}: un precio cerrado por cada combinación de opción y alojamiento. |
price_mode | texto | opcional | Cómo se calcula el precio: precio cerrado por opción y alojamiento (por defecto si pasas rates), precio por componente (actividades y alojamiento por separado) o heredado de cada componente. |
Parámetros — programación, fechas y pago
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
schedule_mode, program | texto, array | opcional | Cómo se reparten las sesiones a lo largo del pack: a elegir al reservar (por defecto), automático, o un plan día a día (program, requiere pasar variations en la misma llamada). |
activities_on_start, activities_on_end, can_add_activities, can_add_nights | booleano | opcional | Si las actividades empiezan el día de entrada o terminan el último día, y si el cliente puede añadir actividades o noches sueltas al reservar. |
no_date_required | booleano | opcional | Pack sin fecha de entrada: se vende como un vale que se canjea más adelante. |
availability_mode, available_exact_dates, additional_dates, restrict_dates, available_dates, day_enter_array | — | opcional | Restringen cuándo puede empezar el pack: fechas exactas, rangos bloqueados o permitidos, días de la semana de entrada. |
min_time_to_book | número | opcional | Antelación mínima de reserva, en horas. |
payment_mode, payment_advance_mode, payment_advance_percent, payment_advance_fixed_eur | — | opcional | Si se paga todo, un anticipo o nada por adelantado, y cuánto (porcentaje o importe fijo). |
need_pax_data, checkin_mode | booleano, texto | opcional | Si se piden los datos de cada persona del grupo, y el modo de check-in online (requiere tenerlo activado en la cuenta). |
Qué devuelve
Prueba en seco real: añade una opción de 7 noches con el alojamiento «bungalow 1» a 590 €.
{
"success": true,
"dry_run": true,
"_id": "5dc98fae75a5229e7c921c1e",
"changes": {
"accommodations": [{ "_id": "a9145bff...", "resource": "6a37ee3830e0c1f575f79611", "haveConditions": true, "haveCompanions": true }],
"variations": [{ "_id": "f66f048a...", "title": { "es": "7 NOCHES" }, "nights": 7, "activities": [] }],
"priceMode": "pricePerFullPack",
"rates": [{ "_id": "f1f2455c...", "price": 59000, "variation": "f66f048a...", "accommodation": "6a37ee3830e0c1f575f79611" }]
},
"warnings": [
"se REEMPLAZAN 1 variación(es) por 1 (los _id casados por título se preservan)",
"se REEMPLAZAN 1 rate(s) por 1 (pasa el conjunto completo de la matriz)"
]
}| Campo | Significado |
|---|---|
_id | Identificador del pack editado. |
changes | Cómo queda el pack tras aplicar tus cambios, con los precios ya convertidos a céntimos (590 € → 59000). |
warnings | Avisos sobre qué se reemplaza entero o qué valor por defecto se ha aplicado (por ejemplo, si tu pack no tiene alojamiento, activa activities_on_start para que las fechas no salgan todas cerradas). Léelos siempre: apuntan a un cambio que quizá no querías. |
Errores propios
| Situación | Respuesta |
|---|---|
| Nombre de pack que no coincide con ninguno | success: false, error: "pack_unresolved" con pack_candidates. |
| Alojamiento que no coincide con ninguno de la cuenta | success: false, error: "accommodation_unresolved" con accommodation_candidates: la lista de alojamientos reales para que elijas uno. |
Consejos
- Pasa siempre el conjunto completo de
variations,accommodationsoratesque quieres que quede: un patch parcial borra las que no incluyas. - Prueba primero en seco (sin
dry_run:falseen tu propio backend, o simplemente confiando en este script) para ver el aviso dewarningsantes de aplicar el cambio de verdad. - Para saber qué días puede reservar un pack con una opción y unos acompañantes concretos, usa
get-calendarconpack,option(la opción o variación) yonly_stay(acompañantes que solo se alojan) — ver Operaciones de disponibilidad, calendario y precios.
delete-pack: borra un pack
El pack 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. No afecta a las reservas ya confirmadas de ese pack. Es una operación de escritura.
Cómo llamarla
curl -X POST https://api.bukyapp.com/v1/ops/delete-pack \
-H "Authorization: Bearer bk_TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pack": "Pack Fin de Semana Inventado", "confirm": true, "dry_run": true}'Por MCP: «Borra el pack Fin de Semana Inventado».
Parámetros
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
pack | texto | obligatorio | Pack a borrar, por título o identificador. |
confirm | booleano | recomendado | Tiene que ser true para borrar de verdad. Sin él, la operación solo muestra qué borraría. |
Qué devuelve
Prueba en seco real sobre «Pack1»:
{
"success": true,
"dry_run": true,
"would_delete": { "_id": "5dc98fae75a5229e7c921c1e", "name": "Pack1" },
"soft_deleted": false,
"reversible": true,
"warnings": []
}| Campo | Significado |
|---|---|
would_delete | El pack que se borraría (en una escritura real, esto pasa a ser el _id de nivel superior, junto con soft_deleted: true). |
reversible | true: el soporte de Buky puede recuperarlo si lo pides. |
Errores propios
| Situación | Respuesta |
|---|---|
| Nombre que no coincide con ningún pack | success: false, error: "pack_unresolved" con pack_candidates. |
