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ámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
q | texto | opcional | Filtra por nombre (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 | opcional | compact (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. |
lang | texto | opcional | Solo con detail: "descriptive": idioma del texto devuelto (por ejemplo "es"). |
full | booleano | opcional | true devuelve el documento completo de cada alojamiento (tarifas, idiomas…), más pesado. Gana a detail. |
limit | número | opcional | Má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 }
]
}| Campo | Significado |
|---|---|
count | Cuántos alojamientos cumplen los filtros, tras aplicar limit. |
total | Total que cumple los filtros, antes de recortar por limit. Si count es menor, hay más. |
items[]._id | El identificador que necesitas para get-accommodation, update-accommodation, etc. |
items[].type | BasicAccommodation, SharedAccommodation o RepeatedAccommodation. |
items[].capacity | Vací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
qcon parte del nombre y revisainternalNameen 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ámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
accommodation | texto | obligatorio* | 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": []
}| Campo | Significado |
|---|---|
_id | El identificador del alojamiento devuelto (igual que item._id). |
resolved | Qué alojamiento se eligió a partir del nombre que diste y por qué. |
item | El 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_candidates | Solo si el nombre no se resolvió a uno solo: lista de coincidencias con _id y título. |
Errores propios
| Situación | Respuesta |
|---|---|
Falta accommodation | success: false, error: "accommodation_intent_required". |
| Nombre que no coincide con ninguno | success: 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_candidatesque devuelve te sirve para elegir el_idcorrecto 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ámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
title | texto | obligatorio | Título público. |
internal_name | texto | recomendado | Nombre interno, el que ves en el listado del panel. No es obligatorio, pero ayuda a identificarlo. |
type | texto | opcional | Subtipo: BasicAccommodation (por defecto), SharedAccommodation o RepeatedAccommodation. Acepta «básico», «compartido», «repetido». |
capacity | número | recomendado | Capacidad (por defecto 1). En compartido no se envía: se calcula a partir de las camas. |
description | texto | opcional | Descripción pública. |
parent | texto | opcional | Un alojamiento de agrupación de nivel superior bajo el que colgarlo, por nombre o _id. Ninguno de los tres tipos lo necesita. |
categories, extras | array | opcional | Categorías y extras asociados, por nombre o _id. |
thumb | texto | opcional | Imagen 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. |
gallery | array | opcional | Galería: lista de imágenes, cada una identificador de una imagen ya subida o una URL pública. |
*Precio e impuesto*
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
price_eur | número | recomendado | Precio de la tarifa base, en euros. Hace falta esto o rates, no ambos. |
rates | array | recomendado | Varias tarifas por temporada y/o rango de personas en lugar de una sola: [{ name, price_eur, season?, pax? }]. Excluyente con price_eur. |
rate_name | texto | opcional | Nombre de la tarifa base (por defecto «Cama» en compartido, «Tarifa Adulto» en los demás). |
tax | texto | recomendado | Impuesto 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
}
}| Campo | Significado |
|---|---|
applied_defaults | Los valores que se han rellenado solos porque no los diste (capacidad, nombre de la tarifa…). |
resolved_type, resolved_tax, resolved_parent, resolved_categories, resolved_extras | Cómo se interpretó cada intención que diste por nombre, con el _id elegido y el motivo. |
payload_preview | Lo 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ón | Respuesta |
|---|---|
Falta title | 400, error: "invalid_params", con details señalando el campo. |
Consejos
- Necesitas exactamente una de
price_eurorates; 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ámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
accommodation | texto | obligatorio | Nombre, nombre interno o _id del alojamiento a editar. |
*Datos generales*
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
title, description | texto | recomendado / opcional | Título y descripción públicos. Se guardan por idioma: no tocan las otras lenguas. |
internal_name | texto | opcional | Nuevo nombre interno. |
thumb | texto | opcional | Imagen destacada: identificador de una imagen ya subida o una URL pública. Se aplica tras editar el alojamiento. Ver Operaciones de imágenes. |
gallery | array | opcional | Galerí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, tags | array | opcional | Reemplazan el conjunto entero (no se suman a lo que ya había). |
alert_text | texto | opcional | Texto de aviso que ve el cliente en la ficha pública. |
*Precio y tarifas*
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
price_eur, rate_name | número / texto | recomendado / opcional | Precio y nombre de la tarifa base (la primera). Editan solo esa tarifa; el resto de tarifas no se toca. |
rates | array | opcional | Sustituye el conjunto completo de tarifas. Excluyente con price_eur/rate_name. |
have_rates_by_person_range | booleano | opcional | Activa el precio por número de huéspedes en las tarifas. |
price_from_eur | número | opcional | Precio «desde» que se muestra en la tienda pública. |
tax | texto | opcional | Nuevo impuesto: "default", "21%", "IVA" o un _id. |
*Capacidad y condiciones de estancia*
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
capacity | número | recomendado | Nueva capacidad (no aplica en compartido). |
stay_min, stay_max | número | opcional | Estancia mínima y máxima, en noches. |
day_enter, day_exit | número | opcional | Día de la semana permitido para entrar/salir: -1 cualquiera, 0-6 domingo a sábado. |
min_time_to_book | número | opcional | Antelación mínima de reserva, en horas. |
*Reservas y pago*
| Parámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
payment_mode | texto | opcional | full, advance o none. |
payment_advance_mode, payment_advance_percent, payment_advance_fixed_eur | texto / número | opcional | Tipo de anticipo (porcentaje o importe fijo) y su valor. Solo con payment_mode: "advance". |
byRequest | booleano | opcional | Si la reserva queda pendiente de confirmación manual. |
checkin_mode | texto | opcional | Check-in online: vacío (todos), leader (solo el titular) u off. |
need_pax_data | booleano | opcional | Si 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."
}| Campo | Significado |
|---|---|
changes | Los 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ón | Respuesta |
|---|---|
| Nombre que no coincide con ningún alojamiento | success: 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), usaratescompleto — no se pueden mezclar. categories,extrasytagsreemplazan 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ámetro | Tipo | Nivel | Qué hace |
|---|---|---|---|
accommodation | texto | obligatorio | Nombre, nombre interno o _id del alojamiento a borrar. |
confirm | booleano | recomendado | Debe 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"]
}| Campo | Significado |
|---|---|
dependencies.children | Cuá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. |
reversible | true: el soporte de Buky puede recuperarlo si lo pides. |
Errores propios
| Situación | Respuesta |
|---|---|
| Nombre que no coincide con ningún alojamiento | success: 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.
