Centro de ayuda›Desarrolladores›Operaciones de packs

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ámetroTipoNivelQué hace
qtextoopcionalBusca por texto en el nombre (sin tildes), igual que el buscador del panel.
disabledbooleanoopcionaltrue: solo desactivados. false: solo activos. Sin él, salen todos.
created_from, created_tofechaopcionalRango de fecha de creación (ISO), igual que el filtro de fecha del panel.
detailtextoopcionalcompact (por defecto): identificador, título, variaciones y estado. descriptive: además descripción, condiciones, alojamientos y opciones con detalle, todo a texto plano.
langtextoopcionalSolo con detail: "descriptive": cada texto en un único idioma (por ejemplo es). Sin este parámetro, cada texto llega como { idioma: texto }.
fulltexto o booleanoopcionaltrue: los documentos completos del servidor, sin resumir. Pesa más; gana a detail.
limitnúmeroopcionalRecorta 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"]
    }
  ]
}
CampoSignificado
itemsLos 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 / totalcount 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 _id a get-pack o update-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ámetroTipoNivelQué hace
packtextoobligatorioNombre 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"
  }
}
CampoSignificado
itemEl 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.
resolvedQué pack se eligió a partir del nombre que diste y por qué.

Errores propios

SituaciónRespuesta
Nombre que no coincide con ningún packsuccess: false, error: "pack_unresolved" y pack_candidates con los packs disponibles de la cuenta (en la demo, solo hay uno: «Pack1»).
Sin parámetro packsuccess: 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ámetroTipoNivelQué hace
titletextoobligatorioTítulo público del pack, en español.
taxestexto o arrayrecomendadoImpuesto o impuestos a aplicar ("IVA", "21%", "default" o el identificador). Si lo omites, se usa el impuesto por defecto de tu cuenta.
descriptiontextoopcionalDescripción pública.
categoriesarrayopcionalCategorías del pack, por nombre o identificador.
extrasarrayopcionalExtras disponibles en el pack, por nombre o identificador.
thumbtextoopcionalImagen 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.
galleryarrayopcionalGalerí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"]
  }
}
CampoSignificado
resolved_taxesEl impuesto que se aplicará y por qué (nombre coincidente o el de la cuenta por defecto).
payload_previewLo 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ónRespuesta
Sin title400 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-pack con accommodations, variations y rates para 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ámetroTipoNivelQué hace
packtextoobligatorioPack a editar, por título o identificador.
titletextorecomendadoNuevo título público. No afecta a los demás idiomas.
descriptiontextoopcionalNueva descripción pública.
taxesarrayopcionalImpuestos del pack. Reemplaza el conjunto anterior.
categories, extrasarrayopcionalCategorías y extras del pack, por nombre o identificador. Reemplazan el conjunto anterior.
internal_nametextoopcionalNombre interno, solo visible en el panel.
price_from_eurnúmeroopcionalPrecio «desde» que se muestra en la tienda pública, en euros.
alert_texttextoopcionalTexto de aviso que se muestra al reservar.
thumbtextoopcionalImagen 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.
galleryarrayopcionalGalerí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ámetroTipoNivelQué hace
variationsarrayopcionalLas 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.
accommodationsarrayopcionalLos 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).
ratesarrayopcionalLa 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_modetextoopcionalCó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ámetroTipoNivelQué hace
schedule_mode, programtexto, arrayopcionalCó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_nightsbooleanoopcionalSi 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_requiredbooleanoopcionalPack 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—opcionalRestringen cuándo puede empezar el pack: fechas exactas, rangos bloqueados o permitidos, días de la semana de entrada.
min_time_to_booknúmeroopcionalAntelación mínima de reserva, en horas.
payment_mode, payment_advance_mode, payment_advance_percent, payment_advance_fixed_eur—opcionalSi se paga todo, un anticipo o nada por adelantado, y cuánto (porcentaje o importe fijo).
need_pax_data, checkin_modebooleano, textoopcionalSi 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)"
  ]
}
CampoSignificado
_idIdentificador del pack editado.
changesCómo queda el pack tras aplicar tus cambios, con los precios ya convertidos a céntimos (590 € → 59000).
warningsAvisos 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ónRespuesta
Nombre de pack que no coincide con ningunosuccess: false, error: "pack_unresolved" con pack_candidates.
Alojamiento que no coincide con ninguno de la cuentasuccess: false, error: "accommodation_unresolved" con accommodation_candidates: la lista de alojamientos reales para que elijas uno.

Consejos

  • Pasa siempre el conjunto completo de variations, accommodations o rates que quieres que quede: un patch parcial borra las que no incluyas.
  • Prueba primero en seco (sin dry_run:false en tu propio backend, o simplemente confiando en este script) para ver el aviso de warnings antes 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-calendar con pack, option (la opción o variación) y only_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ámetroTipoNivelQué hace
packtextoobligatorioPack a borrar, por título o identificador.
confirmbooleanorecomendadoTiene 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": []
}
CampoSignificado
would_deleteEl pack que se borraría (en una escritura real, esto pasa a ser el _id de nivel superior, junto con soft_deleted: true).
reversibletrue: el soporte de Buky puede recuperarlo si lo pides.

Errores propios

SituaciónRespuesta
Nombre que no coincide con ningún packsuccess: false, error: "pack_unresolved" con pack_candidates.

¿Te ha resultado útil este artículo?