Centro de ayuda›Desarrolladores›Operaciones de alojamientos

Operaciones de alojamientos

Consulta, crea, edita y borra alojamientos básicos, compartidos y repetidos por API v1 o MCP.

Un alojamiento es el tipo de producto de Buky para vender estancias por noches: una habitación, un apartamento, un bungaló o una cama en un dormitorio compartido. Más sobre el concepto en Qué es un alojamiento en BukyApp.

Al crear uno, Buky distingue tres tipos. Básico: una unidad única e indivisible que se reserva entera, como un apartamento o una villa. Compartido: una unidad con varias camas que se venden por separado, como un dormitorio de hostal. Repetido: varias unidades idénticas que se gestionan desde una sola ficha indicando cuántas hay, como 10 bungalós iguales en un camping. Las camas del compartido y las unidades del repetido no se crean con estas operaciones: se añaden en un paso posterior, ya con el alojamiento creado.

Operaciones de esta página: list-accommodations, get-accommodation (solo lectura); create-accommodation, update-accommodation, delete-accommodation (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.

list-accommodations: lista los alojamientos del centro

Devuelve el catálogo de alojamientos del centro: identificador, título, tipo, capacidad y algunos flags. Es el paso previo natural para encontrar el identificador exacto de un alojamiento antes de editarlo o borrarlo. Es de solo lectura: vale con cualquier token.

Cómo llamarla

curl "https://api.bukyapp.com/v1/ops/list-accommodations?q=bungalow" \
  -H "Authorization: Bearer bk_TU_TOKEN"

Por MCP: «Enséñame los alojamientos que tengo» o «Busca los alojamientos que tengan "bungalow" en el nombre».

Parámetros

ParámetroTipoNivelQué hace
qtextoopcionalFiltra por nombre (contiene, sin tildes). Es la búsqueda del panel.
disabledbooleanoopcionaltrue solo desactivados, false solo activos. Por defecto, todos.
created_from, created_tofechaopcionalRango sobre la fecha de creación.
detailtextoopcionalcompact (por defecto): lo esencial para identificar y enumerar. descriptive: textos a texto plano (descripción, condiciones de cancelación…) y referencias resueltas a su título.
langtextoopcionalSolo con detail: "descriptive": idioma del texto devuelto (por ejemplo "es").
fullbooleanoopcionaltrue devuelve el documento completo de cada alojamiento (tarifas, idiomas…), más pesado. Gana a detail.
limitnúmeroopcionalMáximo de resultados, tras aplicar los filtros.

Qué devuelve

Ejemplo real, recortado:

{
  "success": true,
  "detail": "compact",
  "count": 6,
  "total": 6,
  "items": [
    { "_id": "5a5602b07e9fe0036a541d16", "title": "Alojamiento simple", "internalName": null, "type": "BasicAccommodation", "categories": [], "is_disabled": false, "private": false, "capacity": 4 },
    { "_id": "6a37ee385c498030c4a22d97", "title": "hostel test", "internalName": "hostel test", "type": "SharedAccommodation", "categories": [], "is_disabled": false, "private": false, "capacity": null }
  ]
}
CampoSignificado
countCuántos alojamientos cumplen los filtros, tras aplicar limit.
totalTotal que cumple los filtros, antes de recortar por limit. Si count es menor, hay más.
items[]._idEl identificador que necesitas para get-accommodation, update-accommodation, etc.
items[].typeBasicAccommodation, SharedAccommodation o RepeatedAccommodation.
items[].capacityVacío (null) en los compartidos: se deriva de las camas, no es un dato propio.

Los alojamientos borrados no aparecen aquí.

Consejos

  • Si no conoces el nombre exacto, usa q con parte del nombre y revisa internalName en la respuesta para no confundir alojamientos con títulos parecidos.

get-accommodation: obtener un alojamiento por nombre o id

Devuelve el documento completo y fresco de un único alojamiento: es la forma de comprobar «cómo quedó» tras crearlo o editarlo, y de obtener su identificador exacto. Es una operación de solo lectura: vale con cualquier token.

Cómo llamarla

curl "https://api.bukyapp.com/v1/ops/get-accommodation?accommodation=Alojamiento%20simple" \
  -H "Authorization: Bearer bk_TU_TOKEN"

Por MCP: «Enséñame el alojamiento Alojamiento simple».

Parámetros

ParámetroTipoNivelQué hace
accommodationtextoobligatorio*Nombre, nombre interno o _id del alojamiento. Se resuelve contra tu catálogo; si no coincide con uno solo, la respuesta trae los candidatos. También vale como id o accommodation_id (alias que usan las respuestas del propio asistente).

\* El manual lo marca como «recomendado», pero en la práctica es obligatorio: sin él, la operación falla (ver «Errores propios»).

Qué devuelve

Ejemplo real para un alojamiento básico:

{
  "success": true,
  "_id": "5a5602b07e9fe0036a541d16",
  "resolved": { "id": "5a5602b07e9fe0036a541d16", "reason": "match exacto 'Alojamiento simple'" },
  "item": {
    "_id": "5a5602b07e9fe0036a541d16",
    "type": "BasicAccommodation",
    "title": { "es": "Alojamiento simple", "en": "New", "..." : "..." },
    "capacity": 4,
    "rates": [{ "_id": "5e25b5ac73aa1400007271df", "price": 200, "season": { "active": false } }],
    "stayMin": 1,
    "dayEnter": -1,
    "dayExit": -1,
    "children": [],
    "categories": [],
    "extras": []
  },
  "warnings": []
}
CampoSignificado
_idEl identificador del alojamiento devuelto (igual que item._id).
resolvedQué alojamiento se eligió a partir del nombre que diste y por qué.
itemEl documento completo: título, tipo, tarifas (rates, precio en céntimos), capacidad, condiciones de estancia (stayMin, dayEnter, dayExit) y sus children (camas o unidades, si es compartido o repetido).
accommodation_candidatesSolo si el nombre no se resolvió a uno solo: lista de coincidencias con _id y título.

Errores propios

SituaciónRespuesta
Falta accommodationsuccess: false, error: "accommodation_intent_required".
Nombre que no coincide con ningunosuccess: false, error: "accommodation_unresolved" y accommodation_candidates con los alojamientos reales del centro.

Consejos

  • Si no conoces el nombre exacto, llama con cualquier texto: la lista de accommodation_candidates que devuelve te sirve para elegir el _id correcto en la siguiente llamada.

create-accommodation: crear un alojamiento nuevo

Crea un alojamiento raíz: básico por defecto, o compartido/repetido si lo indicas en type. Es una operación de escritura: hace falta un token con permiso de escritura, y necesita al menos una tarifa (price_eur o rates) para guardarse.

Cómo llamarla

curl -X POST https://api.bukyapp.com/v1/ops/create-accommodation \
  -H "Authorization: Bearer bk_TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title": "Bungalow Vista Doc", "internal_name": "DOC-TEST-Bungalow Vista", "price_eur": 65, "capacity": 3, "tax": "21%", "dry_run": true}'

Por MCP: «Crea un alojamiento básico llamado Bungalow Vista Doc, 65 € la noche, capacidad 3».

Parámetros

*Datos del alojamiento*

ParámetroTipoNivelQué hace
titletextoobligatorioTítulo público.
internal_nametextorecomendadoNombre interno, el que ves en el listado del panel. No es obligatorio, pero ayuda a identificarlo.
typetextoopcionalSubtipo: BasicAccommodation (por defecto), SharedAccommodation o RepeatedAccommodation. Acepta «básico», «compartido», «repetido».
capacitynúmerorecomendadoCapacidad (por defecto 1). En compartido no se envía: se calcula a partir de las camas.
descriptiontextoopcionalDescripción pública.
parenttextoopcionalUn alojamiento de agrupación de nivel superior bajo el que colgarlo, por nombre o _id. Ninguno de los tres tipos lo necesita.
categories, extrasarrayopcionalCategorías y extras asociados, por nombre o _id.
thumbtextoopcionalImagen destacada: identificador de una imagen ya subida (la que te da el asistente al adjuntarla, o create-upload) o una URL pública. Se aplica tras crear el alojamiento. Ver Operaciones de imágenes.
galleryarrayopcionalGalería: lista de imágenes, cada una identificador de una imagen ya subida o una URL pública.

*Precio e impuesto*

ParámetroTipoNivelQué hace
price_eurnúmerorecomendadoPrecio de la tarifa base, en euros. Hace falta esto o rates, no ambos.
ratesarrayrecomendadoVarias tarifas por temporada y/o rango de personas en lugar de una sola: [{ name, price_eur, season?, pax? }]. Excluyente con price_eur.
rate_nametextoopcionalNombre de la tarifa base (por defecto «Cama» en compartido, «Tarifa Adulto» en los demás).
taxtextorecomendadoImpuesto a aplicar: "default", "21%", "IVA" o un _id. Por defecto, el impuesto incluido en precio del centro.

Qué devuelve

Prueba en seco de un alojamiento básico:

{
  "success": true,
  "dry_run": true,
  "applied_defaults": { "capacity": 3, "rate_name": "Tarifa Adulto" },
  "resolved_type": { "type": "BasicAccommodation", "reason": "default (BasicAccommodation — alojamiento simple)" },
  "resolved_tax": { "id": "69a181ce5d6272575493bcfd", "reason": "match por percent=21" },
  "resolved_parent": null,
  "payload_preview": {
    "title": { "es": "Bungalow Vista Doc" },
    "type": "BasicAccommodation",
    "taxes": ["69a181ce5d6272575493bcfd"],
    "rates": [{ "description": { "name": "Tarifa Adulto" }, "price": 6500 }],
    "internalName": "DOC-TEST-Bungalow Vista",
    "capacity": 3
  }
}
CampoSignificado
applied_defaultsLos valores que se han rellenado solos porque no los diste (capacidad, nombre de la tarifa…).
resolved_type, resolved_tax, resolved_parent, resolved_categories, resolved_extrasCómo se interpretó cada intención que diste por nombre, con el _id elegido y el motivo.
payload_previewLo que se enviaría a crear. En una llamada real (sin dry_run) la respuesta trae además _id, el identificador del alojamiento creado.

Ejemplos

Compartido (el dormitorio raíz; las camas se añaden después):

{ "title": "Dormitorio Compartido Doc", "internal_name": "DOC-TEST-Dormitorio Compartido", "price_eur": 22, "type": "SharedAccommodation" }

Errores propios

SituaciónRespuesta
Falta title400, error: "invalid_params", con details señalando el campo.

Consejos

  • Necesitas exactamente una de price_eur o rates; no las combines.
  • En compartido no envíes capacity: se deriva del número de camas que añadas después.

update-accommodation: editar un alojamiento existente

Edita un alojamiento con un PUT parcial: solo cambia los campos que le pasas, el resto queda igual. Es una operación de escritura.

Cómo llamarla

curl -X POST https://api.bukyapp.com/v1/ops/update-accommodation \
  -H "Authorization: Bearer bk_TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"accommodation": "Alojamiento simple", "title": "Alojamiento Simple Doc", "price_eur": 75, "dry_run": true}'

Por MCP: «Cambia el título de Alojamiento simple a Alojamiento Simple Doc y sube el precio a 75 €».

Parámetros

*Qué alojamiento editar*

ParámetroTipoNivelQué hace
accommodationtextoobligatorioNombre, nombre interno o _id del alojamiento a editar.

*Datos generales*

ParámetroTipoNivelQué hace
title, descriptiontextorecomendado / opcionalTítulo y descripción públicos. Se guardan por idioma: no tocan las otras lenguas.
internal_nametextoopcionalNuevo nombre interno.
thumbtextoopcionalImagen destacada: identificador de una imagen ya subida o una URL pública. Se aplica tras editar el alojamiento. Ver Operaciones de imágenes.
galleryarrayopcionalGalería: lista de imágenes, cada una identificador de una imagen ya subida o una URL pública. Reemplaza la galería entera, no añade fotos.
categories, extras, tagsarrayopcionalReemplazan el conjunto entero (no se suman a lo que ya había).
alert_texttextoopcionalTexto de aviso que ve el cliente en la ficha pública.

*Precio y tarifas*

ParámetroTipoNivelQué hace
price_eur, rate_namenúmero / textorecomendado / opcionalPrecio y nombre de la tarifa base (la primera). Editan solo esa tarifa; el resto de tarifas no se toca.
ratesarrayopcionalSustituye el conjunto completo de tarifas. Excluyente con price_eur/rate_name.
have_rates_by_person_rangebooleanoopcionalActiva el precio por número de huéspedes en las tarifas.
price_from_eurnúmeroopcionalPrecio «desde» que se muestra en la tienda pública.
taxtextoopcionalNuevo impuesto: "default", "21%", "IVA" o un _id.

*Capacidad y condiciones de estancia*

ParámetroTipoNivelQué hace
capacitynúmerorecomendadoNueva capacidad (no aplica en compartido).
stay_min, stay_maxnúmeroopcionalEstancia mínima y máxima, en noches.
day_enter, day_exitnúmeroopcionalDía de la semana permitido para entrar/salir: -1 cualquiera, 0-6 domingo a sábado.
min_time_to_booknúmeroopcionalAntelación mínima de reserva, en horas.

*Reservas y pago*

ParámetroTipoNivelQué hace
payment_modetextoopcionalfull, advance o none.
payment_advance_mode, payment_advance_percent, payment_advance_fixed_eurtexto / númeroopcionalTipo de anticipo (porcentaje o importe fijo) y su valor. Solo con payment_mode: "advance".
byRequestbooleanoopcionalSi la reserva queda pendiente de confirmación manual.
checkin_modetextoopcionalCheck-in online: vacío (todos), leader (solo el titular) u off.
need_pax_databooleanoopcionalSi exige los datos de cada acompañante.

Qué devuelve

Prueba en seco cambiando título y precio:

{
  "success": true,
  "dry_run": true,
  "_id": "5a5602b07e9fe0036a541d16",
  "changes": {
    "title": { "es": "Alojamiento Simple Doc" },
    "rates": [{ "_id": "5e25b5ac73aa1400007271df", "price": 7500, "season": { "active": false } }]
  },
  "note": "PUT parcial: solo estos campos cambian; customer/_id/__v nunca se envían."
}
CampoSignificado
changesLos campos que realmente van a cambiar, ya en el formato interno (precio en céntimos, título por idioma). En una llamada real, la respuesta confirma que cada uno quedó aplicado.

Errores propios

SituaciónRespuesta
Nombre que no coincide con ningún alojamientosuccess: false, error: "accommodation_unresolved" y accommodation_candidates con los alojamientos reales.

Consejos

  • Si solo quieres tocar el precio de la tarifa base, usa price_eur; para reorganizar todas las tarifas (temporadas, rangos de personas), usa rates completo — no se pueden mezclar.
  • categories, extras y tags reemplazan el conjunto entero: si quieres añadir una categoría sin perder las que ya tenía, incluye también las existentes.

delete-accommodation: borrar un alojamiento

El alojamiento 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.

Cómo llamarla

curl -X POST https://api.bukyapp.com/v1/ops/delete-accommodation \
  -H "Authorization: Bearer bk_TU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"accommodation": "Surf House Doc Ficticio", "confirm": true, "dry_run": true}'

Por MCP: «Borra el alojamiento Surf House Doc Ficticio».

Parámetros

ParámetroTipoNivelQué hace
accommodationtextoobligatorioNombre, nombre interno o _id del alojamiento a borrar.
confirmbooleanorecomendadoDebe ser true para borrar de verdad. Sin él, la operación se queda en modo consulta (te dice qué borraría, sin borrar).

Qué devuelve

Prueba en seco sobre un alojamiento compartido con camas:

{
  "success": true,
  "dry_run": true,
  "would_delete": { "_id": "6a37ee385c498030c4a22d97", "name": "hostel test" },
  "soft_deleted": false,
  "reversible": true,
  "dependencies": {
    "children": 5,
    "note": "El server NO borra los children (units/camas) en el soft-delete: quedarán apuntando al alojamiento borrado (HUÉRFANOS). Las reservas existentes siguen vivas."
  },
  "warnings": ["el alojamiento tiene 5 child(ren) (units/camas) que quedarían HUÉRFANOS"]
}
CampoSignificado
dependencies.childrenCuántas camas o unidades cuelgan de este alojamiento. Si son más de 0, quedarían sin alojamiento «padre» al borrarlo: revísalas antes de confirmar.
reversibletrue: el soporte de Buky puede recuperarlo si lo pides.

Errores propios

SituaciónRespuesta
Nombre que no coincide con ningún alojamientosuccess: false, error: "accommodation_unresolved" y accommodation_candidates con los alojamientos reales.

Consejos

  • Si el alojamiento tiene camas o unidades (compartido o repetido), bórralas o reasígnalas antes: el borrado no las arrastra y quedan huérfanas.

¿Te ha resultado útil este artículo?