StayingAPI

Disponibilidad en vivo, búsqueda, detalle de anuncios y comparación de precios entre OTA para Airbnb, Booking.com, Vrbo y Google Hotels en un esquema unificado, expuesto como 7 herramientas MCP de solo lectura y 8 endpoints REST.

Documentación

StayingAPI

MCP de Hoteles y Alquileres Vacacionales: precios en vivo, disponibilidad y reseñas en Booking.com, Airbnb, Vrbo y Google Hotels

Busca alojamientos, compara precios en Booking.com, Airbnb, Vrbo y Google Hotels, y consulta reseñas simplemente preguntándole a tu IA. Un MCP alojado, 300 créditos gratis para empezar, sin tarjeta.
Siete herramientas de solo lectura: búsqueda, disponibilidad, detalle de anuncios, precio, comparación de precios entre OTA, reseñas y sondeo de trabajos, para Claude, ChatGPT, Cursor, Claude Code y cualquier cliente MCP.

Install in Cursor 300 free credits, no card

Website Docs OpenAPI MIT License Glama quality score

4 plataformas de reserva, un solo esquema · 7 herramientas de solo lectura · comparación de precios entre OTA · OAuth 2.1, sin claves pegadas en el agente · 300 créditos gratis para empezar, sin tarjeta StayingAPI es un servicio independiente de datos de alojamiento. StayingAPI no está afiliado, respaldado ni patrocinado por Airbnb, Booking.com, Vrbo o Google Hotels. Estas son marcas comerciales de sus respectivos propietarios, utilizadas aquí de forma descriptiva para indicar las fuentes de datos que la API y el servidor MCP de StayingAPI pueden consultar.


Instalación en una línea

Claude Code

claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp

Claude Desktop, ChatGPT, Cursor o cualquier otro cliente MCP: añade esto como servidor HTTP Streamable:

https://mcp.stayingapi.com/mcp

No hay que pegar ninguna clave de API: la primera llamada abre un inicio de sesión OAuth (cuenta gratuita, 300 créditos, sin tarjeta). Los pasos específicos por cliente están en Instalación rápida, y todo el repositorio también se instala como Plugin de Agente.


Por qué un MCP de Hoteles y Alquileres Vacacionales

Ya estás comparando alojamientos en cuatro sitios a mano: un hotel en Booking.com, un apartamento en Airbnb, una villa en Vrbo y Google Hotels para verificar la tarifa. Cada uno tiene una página diferente, una escala de calificación diferente y ninguna API a la que puedas simplemente registrarte.

Conéctate una vez y luego solo pregunta. Añade este servidor MCP a Claude, ChatGPT, Cursor o cualquier cliente MCP una sola vez, y tu asistente de IA podrá buscar alojamientos reales, cotizar precios reales para tus fechas, comparar la tarifa de una propiedad entre sitios de reserva y leer reseñas normalizadas, todo dentro de la conversación, sin código y sin configuración repetida.

Todo vuelve en un solo esquema unificado. Una habitación de hotel y una villa vacacional devuelven la misma forma de objeto, las calificaciones conservan su escala nativa en lugar de ser reescaladas silenciosamente, y la comparación entre OTA devuelve la oferta de cada sitio más un precio mínimo y mediano calculado, para que no tengas que volver a derivarlos tú mismo.

Una muestra rápida:

Find 2-bed stays in Lisbon for these dates under EUR 150,
compare the top one's price across Airbnb, Booking.com and Vrbo,
and summarize its reviews.

Ese único mensaje abarca tres herramientas — search_stays, compare_prices, get_reviews — sin que escribas ni una línea de código.


Instalar como Plugin de Agente · lo más fácil

La raíz de este repositorio es un paquete conforme a Agent Plugins 1.0.0 — el formato portable publicado el 2026-08-06 y compatible con ChatGPT, Codex, Cursor, GitHub Copilot, Kiro y VS Code. Una sola instalación te da el servidor MCP y una habilidad stays incluida que enseña a tu agente qué herramienta responde a cada pregunta, cómo mantener el despliegue multiplataforma económico, y que Airbnb/Vrbo califican en una escala de 5 puntos mientras que Booking.com califica sobre 10 — para que nunca compare un 9 con un 4.5.

plugin.json                    # Agent Plugins 1.0.0 manifest
mcp.json                       # hosted MCP server, streamable-http, OAuth (no keys)
skills/stays/SKILL.md          # when + how to use the 7 read-only tools
.cursor-plugin/plugin.json     # Cursor plugin manifest, same MCP + skill (+ marketplace.json)

VS Code — Paleta de comandos → Chat: Install Plugin From Source, y luego pega:

https://github.com/stayingapi/hotel-vacation-rental-mcp

O registra un clon local en settings.json:

"chat.pluginLocations": { "/absolute/path/to/hotel-vacation-rental-mcp": true }

Cursor — Customize en la barra lateral → busca el plugin → Install. Para un clon local:

git clone https://github.com/stayingapi/hotel-vacation-rental-mcp ~/.cursor/plugins/local/stayingapi

Luego Developer: Reload Window.

Añadir a Cursor — solo servidor MCP, sin clon. Pega este enlace profundo en tu navegador:

cursor://anysphere.cursor-deeplink/mcp/install?name=stayingapi&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGF5aW5nYXBpLmNvbS9tY3AifQ==

ChatGPT, Codex, GitHub Copilot, Kiro, cualquier otro cliente — apunta el mecanismo de plugins de tu cliente a este repositorio, o a un clon local. Agent Plugins 1.0.0 estandariza el formato de paquete, no la instalación, así que cada cliente gestiona su propio flujo de instalación.

Ejemplo en 30 segundos

Find a 2-bedroom apartment in Split, Croatia for 12-15 June, 2 adults, under EUR 150 a night.

Una llamada a search_stays devuelve Airbnb, Booking.com, Vrbo y Google Hotels fusionados en una sola lista normalizada, cada uno con su URL de reserva. No hay clave de API que configurar — la primera llamada abre un inicio de sesión OAuth (cuenta gratuita, 300 créditos, sin tarjeta). Luego los seguimientos que normalmente requieren veinte pestañas del navegador:

Is that one cheaper on Booking or Airbnb?   → compare_prices (one call, every OTA)
Is it free all week, and what's the min stay? → check_availability (day by day)

Las siete herramientas son de solo lectura — nada aquí puede reservar, cancelar o cambiar una reserva.

No hay credenciales en este paquete — Agent Plugins 1.0.0 prohíbe secretos incrustados, y la autorización es gestionada por el cliente. Verifica el paquete tú mismo:

curl -sO https://agent-plugins.org/schemas/1.0.0/plugin.schema.json
curl -sO https://agent-plugins.org/schemas/1.0.0/mcp.schema.json
npx ajv-cli@5 validate --spec=draft2020 -s plugin.schema.json -d plugin.json
npx ajv-cli@5 validate --spec=draft2020 -s mcp.schema.json    -d mcp.json

Instalación rápida

Requisitos:

  • Una cuenta de StayingAPI (regístrate — 300 créditos gratis, sin tarjeta)
  • O bien OAuth (Claude, ChatGPT — sin gestión de claves en absoluto) o bien una clave de API (stay_live_... / stay_test_...) desde tu panel de control

Recomendado: añade una regla para que tu IA lo invoque automáticamente

Pega esto en las instrucciones personalizadas o el archivo de reglas de tu cliente:

Cuando mencione un hotel, un anuncio de Airbnb/Booking.com/Vrbo/Google Hotels,
un lugar para alojarse, fechas de viaje, o pida comparar precios de alojamiento o
leer reseñas de estancias, usa automáticamente las herramientas MCP de StayingAPI
para obtener datos reales antes de responder.

URL del servidor: https://mcp.stayingapi.com/mcp (transporte HTTP Streamable)

Instalar en Claude (Desktop y Web) — Recomendado

Configuración → Conectores → Añadir conector personalizado → pega:

https://mcp.stayingapi.com/mcp

Claude ejecuta el inicio de sesión OAuth 2.1 por ti en una ventana emergente del navegador, que vincula el conector a tu cuenta de StayingAPI y su saldo de créditos — no se necesita clave de API. Las siete herramientas de solo lectura aparecen entonces en tu lista de herramientas.

¿Prefieres el archivo de configuración de escritorio? Añade a claude_desktop_config.json:

{
  "mcpServers": {
    "stayingapi": {
      "url": "https://mcp.stayingapi.com/mcp"
    }
  }
}
Instalar en Claude Code (CLI)

OAuth (recomendado):

claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp

Luego ejecuta /mcp dentro de Claude Code y completa el aviso de OAuth.

¿Prefieres una clave bearer, o ejecutar sin interfaz?

claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp \
  --header "Authorization: Bearer stay_live_YOUR_KEY_HERE"
Instalar en ChatGPT
  1. Activa el Modo Desarrollador: Configuración → Apps y conectores → Ajustes avanzados.
  2. Ve a Configuración → Conectores → Añadir servidor MCP (Crear en el panel de Conectores).
  3. Pega la URL del servidor:
https://mcp.stayingapi.com/mcp
  1. Completa el inicio de sesión OAuth cuando se te pida — no se necesita clave de API.
Instalar en Cursor (Un clic o manual)

Un clic: usa la insignia Instalar en Cursor en la parte superior de este README.

Manual: añade a ~/.cursor/mcp.json (global) o .cursor/mcp.json (por proyecto):

{
  "mcpServers": {
    "stayingapi": {
      "url": "https://mcp.stayingapi.com/mcp"
    }
  }
}

Para usar una clave bearer en lugar del flujo OAuth, añade un objeto headers con "Authorization": "Bearer stay_live_YOUR_KEY_HERE".

Cualquier otro cliente MCP

Añade https://mcp.stayingapi.com/mcp como servidor MCP HTTP Streamable.

  • Los clientes que admiten OAuth 2.1 con Registro Dinámico de Clientes se autentican automáticamente — no hay nada que configurar.
  • Los clientes que no lo admiten pueden presentar una clave bearer en su lugar: Authorization: Bearer stay_live_....

Solo se enumeran arriba los formatos verificados contra stayingapi.com/docs/mcp a propósito. Si tu cliente no está aquí, la configuración HTTP Streamable genérica es toda la configuración.


Autenticación

Dos formas de entrar, ambas terminan en la misma cuenta y el mismo saldo de créditos:

  • OAuth 2.1 + PKCE (S256) con Registro Dinámico de Clientes — recomendado para Claude y ChatGPT. Autorizas una vez en una ventana emergente del navegador y el conector queda vinculado a tu cuenta de StayingAPI. Los clientes compatibles con DCR descubren todo automáticamente, así que nunca se pega una clave en el agente.
  • Clave de API Bearer — para clientes y scripts basados en claves. Las claves son stay_live_... (despliegue real a fuentes en vivo) o stay_test_... (datos de prueba deterministas, siempre 0 créditos). Envía como Authorization: Bearer stay_live_....

Un saldo, un bucket de tarifas separado. Las llamadas MCP consumen del mismo saldo de créditos único que tus claves REST. REST tiene límite de tarifa por clave; MCP tiene límite de tarifa por usuario — buckets separados, una sola cartera.

Nota de seguridad: trata las claves stay_live_ como contraseñas. El secreto de una clave nueva se muestra una vez y se almacena solo como hash SHA-256, por lo que nunca se puede recuperar. Nunca la confirmes en un repositorio ni la pegues en una configuración compartida; revoca y vuelve a emitir desde el panel de control si una clave se filtra.


Herramientas disponibles

Las siete son de solo lectura (anotadas readOnlyHint: true, idempotentHint: true). No hay herramientas de escritura, así que nada aquí puede reservar, cancelar o cambiar nada. Cada herramienta se corresponde 1:1 con un endpoint REST, ejecuta el mismo pipeline de validación y caché, y devuelve el mismo sobre { data, meta } unificado.

1. search_stays

Descubre propiedades en varias plataformas por ubicación, fechas, ocupación y filtros, fusionadas en un solo esquema. Este es el endpoint de amplitud y la demostración más clara de "un esquema, todas las plataformas".

ParámetroTipoObligatorioNotas
locationstringsíNombre del lugar (Split, HR) o lat,lng
checkIn / checkOutdatenoYYYY-MM-DD; obligatorios juntos; no en el pasado
adults / children / childAges[] / roomsintegernochildAges[] la longitud debe ser igual a children
propertyType[]enum[]nohotel | apartment | house | villa | cottage | other
amenities[]enum[]noTaxonomía canónica de comodidades
minBedrooms / priceMin / priceMax / minGuestRatingnumbernoFiltros aplicados tras la normalización
platforms[]enum[]noairbnb | booking | vrbo | google; controla el despliegue
limit / cursor / sort / currencymixednolimit 1-40; sort = recommended | price_asc | price_desc | rating_desc

Respuesta (recortada):

{
  "data": [
    {
      "id": "stays_booking_abramovic2",
      "platform": "booking",
      "platformListingId": "abramovic2",
      "url": "https://www.booking.com/hotel/hr/abramovic2.html",
      "name": "Apartments Abramović",
      "propertyType": "apartment",
      "location": { "lat": 43.51, "lng": 16.44, "city": "Split", "country": "HR" },
      "starRating": null,
      "guestRating": 9.1, "ratingScale": 10, "reviewCount": 142,
      "maxOccupancy": 4, "bedrooms": 2, "bathrooms": 1,
      "amenities": ["pool", "kitchen", "air_conditioning", "wifi"],
      "host": { "name": "Marko", "isSuperhost": false },
      "price": { "currency": "USD", "nightlyPrice": 303, "totalPrice": 2122, "nights": 7 }
    }
  ],
  "meta": {
    "platforms": ["airbnb", "booking"],
    "cached": false, "partial": false, "currency": "USD",
    "pagination": { "limit": 20, "cursor": null, "nextCursor": "eyJ…", "hasMore": true },
    "platformResults": [
      { "platform": "airbnb", "status": "ok", "cached": false, "count": 18 },
      { "platform": "booking", "status": "ok", "cached": true, "count": 20 }
    ],
    "warnings": []
  }
}

2. check_availability

Disponibilidad día a día para un anuncio conocido (o un lote de anuncios) en una plataforma durante un rango de fechas. Cada día informa si está disponible, su requisito de noches mínimas y si se permiten el check-in, el check-out y la reserva.

ParámetroTipoObligatorioNotas
platformenumsíPlataforma única; no es una herramienta de despliegue
listingId / listingIds[] / urlstringuno deUn id de anuncio, un lote de ids o una URL completa del anuncio
startDate / endDatedatesíNo en el pasado; ventana de hasta 365 días
onlyAvailablebooleannoSi es true, solo se devuelven fechas reservables

Respuesta (recortada):

{
  "data": [
    {
      "platform": "airbnb",
      "listingId": "42307961",
      "dates": [
        { "date": "2026-07-13", "available": true, "minNights": 7, "checkIn": true, "checkOut": false, "bookable": true },
        { "date": "2026-07-14", "available": true, "minNights": 7, "checkIn": false, "checkOut": false, "bookable": true }
      ]
    }
  ],
  "meta": { "platforms": ["airbnb"], "cached": false, "partial": false, "warnings": [] }
}

3. get_listing

Detalle completo normalizado de un anuncio: comodidades en una taxonomía canónica, fotos, anfitrión, geolocalización, calificaciones y — cuando pasas fechas — un precio en vivo incrustado. El detalle se almacena en caché 24 h y cualquier precio incrustado en el TTL de precio de 1 h, compuesto en el momento de la lectura, para que un precio obsoleto nunca viaje con un detalle fresco.

ParámetroTipoObligatorioNotas
platformenumsívrbo | booking | airbnb | google
idstringsíID de listado nativo de la plataforma, tal cual de la fuente
checkIn / checkOutdatenoLa presencia incluye un precio en vivo de mejor esfuerzo
adults / children / childAges[] / currencymixednoSolo se usa con fechas

Respuesta (recortada):

{
  "data": {
    "id": "stays_booking_abramovic2",
    "platform": "booking",
    "platformListingId": "abramovic2",
    "name": "Apartments Abramović",
    "propertyType": "apartment",
    "location": { "lat": 43.51, "lng": 16.44, "city": "Split", "country": "HR" },
    "guestRating": 9.1, "ratingScale": 10, "reviewCount": 142,
    "maxOccupancy": 4, "bedrooms": 2, "bathrooms": 1,
    "amenities": ["pool", "kitchen", "air_conditioning", "wifi"],
    "images": ["https://…"],
    "host": { "name": "Marko", "isSuperhost": false },
    "price": { "currency": "USD", "nightlyPrice": 303, "totalPrice": 2122, "nights": 7 }
  },
  "meta": { "platforms": ["booking"], "cached": false, "partial": false, "warnings": [] }
}

4. get_price

Una cotización de precio real para un listado, para tus fechas y ocupación. Pasa el ID nativo de la plataforma devuelto por search_stays (numérico en Airbnb y Vrbo, un slug en Booking.com y Google Hotels) o una URL completa del listado. La respuesta siempre es un precio numérico real o un error tipificado: nunca el precio de una propiedad diferente.

ParámetroTipoObligatorioNotas
platformenumsívrbo | booking | airbnb | google
listingIdstringsíID nativo de search_stays.platformListingId, o pasa url
checkIn / checkOutdatesíYYYY-MM-DD; checkOut después de checkIn
adults / children / childAges[] / currencymixednoMoneda ISO-4217, se pasa y se repite

Respuesta (recortada):

{
  "data": {
    "platform": "booking",
    "listingId": "abramovic2",
    "currency": "EUR",
    "nightlyPrice": 303,
    "totalPrice": 2122,
    "fees": { "cleaning": null, "service": null, "taxes": null },
    "nights": 7,
    "occupancy": { "adults": 2, "children": 2, "childAges": [8, 13] },
    "source": "booking",
    "url": "https://www.booking.com/hotel/hr/abramovic2.html"
  },
  "meta": { "platforms": ["booking"], "cached": false, "partial": false, "warnings": [] }
}

5. compare_prices

La herramienta insignia. Compara el precio de una propiedad entre sitios de reserva en una sola llamada, resuelto a través del núcleo de Google Hotels. La respuesta incluye las ofertas individuales más los min y median calculados por StayingAPI como campos de primera clase, para que leas el precio más barato y el típico entre sitios sin volver a derivarlos.

ParámetroTipoObligatorioNotas
name / googleHotelId / locationstringuno deNombre de la propiedad a resolver, un ID preciso de Google Hotels o un lugar para desambiguar
checkIn / checkOutdatesíYYYY-MM-DD; no en el pasado
adults / children / childAges[] / currencymixednoMoneda ISO-4217, se pasa y se repite

Respuesta (recortada):

{
  "data": {
    "property": "Hotel X, Sibenik",
    "checkIn": "2026-07-13",
    "checkOut": "2026-07-20",
    "currency": "EUR",
    "min": 2122,
    "median": 2151,
    "offers": [
      { "ota": "booking.com", "totalPrice": 2122, "currency": "EUR", "url": "https://…" },
      { "ota": "expedia", "totalPrice": 2180, "currency": "EUR", "url": "https://…" }
    ]
  },
  "meta": { "platforms": ["google"], "cached": false, "partial": false, "warnings": [] }
}

6. get_reviews

Reseñas normalizadas y paginadas para un listado en una plataforma. Las escalas de calificación nativas se conservan y se repiten junto a cada calificación (Airbnb, Vrbo y TripAdvisor usan 5; Booking.com, Expedia y Hotels.com usan 10) y nunca se reescalan en silencio, de modo que un 9 y un 4,5 no se comparan por accidente.

ParámetroTipoObligatorioNotas
platformenumsíEnum de plataforma
listingId / urlstringuno deID del listado en esa plataforma, o una URL completa del listado
limit / cursormixednolimit 1-100; cursor base64 opaco
language / minRating / sortmixednoFiltro ISO-639-1; sort = recent | rating_desc | rating_asc

Respuesta (recortada):

{
  "data": [
    {
      "platform": "booking",
      "listingId": "abramovic2",
      "reviewId": "r987",
      "rating": 9, "ratingScale": 10,
      "title": "Perfect family stay",
      "text": "Spotless apartment a short walk from the old town…",
      "author": "Jane D.", "date": "2026-05-10", "tripType": "family",
      "language": "en", "ownerResponse": "Thank you!",
      "liked": "Location and cleanliness", "disliked": null
    }
  ],
  "meta": {
    "platforms": ["booking"], "cached": false, "partial": false,
    "pagination": { "limit": 20, "cursor": null, "nextCursor": "eyJ…", "hasMore": true },
    "warnings": []
  }
}

7. get_job

Consulta un raspado de larga duración que se devolvió como trabajo asíncrono. Cuando se proyecta que una solicitud tarde más de aproximadamente 8 segundos, devuelve un identificador de trabajo; el agente llama a get_job hasta que status sea completed o failed. La consulta siempre cuesta 0 créditos: el trabajo subyacente se factura una sola vez, al completarse con éxito.

ParámetroTipoObligatorioNotas
jobIdstringsíEl identificador devuelto por la llamada original. Los resultados se conservan 24 h

Respuesta mientras se ejecuta y luego al completarse (recortada):

// While running - polling is free
{
  "data": { "jobId": "job_3kf…", "status": "running", "pollUrl": "/v1/jobs/job_3kf…", "estimatedSeconds": 12 },
  "meta": { "creditsCharged": 0, "platforms": ["vrbo"] }
}

// On success - the payload arrives in data.result, in the same unified schema
{
  "data": { "jobId": "job_3kf…", "status": "completed", "result": [ /* the endpoint's payload */ ] },
  "meta": {
    "platforms": ["vrbo"], "currency": "USD",
    "platformResults": [ { "platform": "vrbo", "status": "ok", "cached": false, "count": 15 } ],
    "warnings": []
  }
}

Un trabajo fallido aún devuelve éxito con status: "failed" y el motivo anidado en data.error (un objeto { type, code, message, retryable }). El trabajo fallido es gratuito.


Datos que obtienes

Cada llamada devuelve el mismo sobre unificado { data, meta }, ya sea que la propiedad sea un hotel o una casa de vacaciones:

Grupo de camposEjemplos
Identidadid, platform, platformListingId, listado canónico url
Datos principalestipo de propiedad, dormitorios, baños, ocupación máxima, geo (lat/lng/ciudad/país)
CalificacionesguestRating con un ratingScale explícito (5 o 10, nunca reescalado en silencio), reviewCount, starRating
ServiciosTaxonomía canónica en las cuatro plataformas (pool, kitchen, air_conditioning, wifi, ...)
PrecionightlyPrice, totalPrice, nights, currency y un desglose fees (limpieza, servicio, impuestos)
Comparación entre plataformasoffers[] por sitio más min y median calculados por StayingAPI
DisponibilidadDía a día available, minNights, checkIn, checkOut, bookable
ReseñasCalificación en su escala nativa, título, texto, autor, fecha, tipo de viaje, idioma, respuesta del anfitrión, me gusta/no me gusta
Anfitrión y mediosNombre del anfitrión, indicador de superanfitrión, URL de fotos a resolución completa
Metadatos de llamadarequestId, estado por plataforma, indicadores de caché, cursor de paginación, advertencias

Cobertura: Booking.com, Airbnb, Vrbo y Google Hotels: hoteles y alquileres a corto plazo en el mismo esquema, de modo que una integración cubre ambas mitades del mapa de alojamiento.


Casos de uso y mensajes

Caso de usoMensaje de ejemplo
Planificación de viaje"Encuentra estancias de 2 dormitorios en Lisboa del 12 al 19 de mayo por menos de 150 EUR por noche con cocina y aire acondicionado, y ordénalas por calificación de huéspedes."
Arbitraje de precios entre sitios"Este hotel en Split, del 13 al 20 de julio, 2 adultos: ¿cuánto cuesta en Booking.com frente a los otros sitios, y cuánto está por debajo de la mediana el más barato?"
Resumen de reseñas"Trae las últimas 50 reseñas de este listado y dime las tres quejas que se repiten, y si el anfitrión responde."
Verificación de disponibilidad"¿Está libre esta villa de Vrbo para cualquier ventana de 7 noches en agosto, y cuál es la estancia mínima?"
Ajuste familiar"Mismas fechas, 2 adultos y 2 niños de 8 y 13 años: ¿cuál de estos tres lugares realmente nos aloja a todos, y cuál es el total con tarifas?"
Exploración de mercado"Explora apartamentos en Split para la primera semana de julio: ¿cuál es la tarifa nocturna típica y cómo se compara mi propiedad?"
Verificación de paridad de tarifas"Para estos cinco hoteles, compara la tarifa de cada uno entre sitios de reserva y marca cualquiera donde un sitio esté más del 10 por ciento fuera de la mediana."

Precios

Créditos iniciales300 créditos gratuitos al registrarte, sin tarjeta
SandboxLas claves stay_test_ devuelven datos fijos deterministas a 0 créditos, para siempre
Llamadas fallidasLas llamadas fallidas, vacías, bloqueadas y no encontradas nunca se facturan - creditsCharged es 0
Consulta asíncronaLa consulta get_job es siempre 0 créditos; el trabajo se factura una vez, al tener éxito
Planes de pagoBasados en créditos. Costos actuales por llamada y precios de planes: stayingapi.com/pricing

Este README se mantiene sin números en los precios de pago a propósito, para que nunca se desvíe de la página de precios en vivo. MCP y REST usan el mismo saldo único de créditos: no hay una billetera MCP separada ni precios MCP.

Regístrate · Ver precios


Solución de problemas

Rama según error.type (la clase, mapeada 1:1 al estado HTTP) y luego según error.code (una razón estable y más granular). Cada error también lleva un requestId, un indicador retryable y un docUrl.

401 authentication_error - faltan credenciales o son incorrectas

Códigos: missing_api_key, invalid_api_key, revoked_api_key.

  • Verifica que la clave comience con stay_live_ o stay_test_ y que no se haya copiado espacio en blanco accidental.
  • Confirma que la clave no haya sido revocada en tu panel. Una clave revocada devuelve revoked_api_key de inmediato.
  • En clientes OAuth, elimina y vuelve a agregar el conector para reautorizar.
  • La autenticación se verifica antes de la validación, la facturación o cualquier trabajo ascendente, por lo que un 401 nunca se factura.
403 permission_denied - generalmente verificación de correo electrónico

Códigos: email_unverified, scope_insufficient, subscription_required.

  • email_unverified es el común: el crédito en vivo está bloqueado hasta que confirmes el correo de tu cuenta. Tu clave de sandbox stay_test_ no se ve afectada y sigue devolviendo datos fijos completos a costo cero, para que puedas construir de extremo a extremo antes de verificar.
  • subscription_required significa que se intentó una recarga sin una suscripción de pago activa: las recargas son un complemento para suscriptores.
402 insufficient_credits

Código: credit_balance_too_low. El saldo está por debajo de lo que costaría la llamada. Verifícalo programáticamente en lugar de adivinar: el endpoint de cuenta devuelve credits.balance, plan, clave env y tu rateLimit.requestsPerMinute. Recarga o mejora en stayingapi.com/pricing.

400 invalid_request - la solicitud en sí

Códigos más comunes: missing_parameter, invalid_date_range (checkOut debe ser estrictamente posterior a checkIn), date_in_past (evaluado en UTC), child_ages_mismatch (la longitud de childAges[] debe ser igual a children), window_too_long (las ventanas de disponibilidad tienen un tope de 365 días), invalid_cursor, limit_out_of_range, mutually_exclusive_params (pasaste tanto listingId como url, o ninguno), needs_country.

needs_country merece una nota: un slug simple de Booking.com pasado a get_listing es ambiguo, porque los slugs de Booking.com no son únicos a nivel global: el mismo slug existe por país. Pasa el país o pasa la URL completa del listado.

404 not_found - incluido el deliberado

Códigos: listing_not_found, job_not_found, identity_mismatch.

identity_mismatch es intencional: la identidad canónica del listado resuelto no coincidió con lo solicitado, por lo que StayingAPI se niega a devolver una propiedad diferente en lugar de servir datos incorrectos con apariencia plausible. job_not_found también se activa para un trabajo vencido (los resultados se conservan 24 h) o un trabajo que pertenece a otra cuenta: un ID de trabajo no es una capacidad.

429 rate_limited

Código: rate_limit_exceeded. Reintentable: respeta el encabezado Retry-After en lugar de hacer bucles cerrados. MCP tiene límite de velocidad por usuario y REST por clave: depósitos separados, un saldo de créditos compartido.

503 / 504 problemas ascendentes

upstream_unavailable (all_actors_failed, actor_blocked) significa que todas las fuentes primarias y de respaldo fallaron o fueron bloqueadas; upstream_timeout significa que el trabajo ascendente síncrono superó el plazo de la solicitud. Ambos se pueden reintentar con retroceso y ambos cuestan 0 créditos. Para raspados largos, espera la ruta asíncrona: un identificador de trabajo que consultas con get_job.

OAuth no se conectará - Asegúrate de que un bloqueador de ventanas emergentes no esté deteniendo la ventana de inicio de sesión, luego borra las cookies y reintenta la autorización del conector. - El descubrimiento de OAuth comienza desde la respuesta 401 del servidor. Si un cliente no puede conectarse en absoluto, confirma que soporta MCP OAuth 2.1 con Registro Dinámico de Clientes; de lo contrario, recurre a una clave de portador.
Un trabajo está atascado, o "completado" pero vacío

estimatedSeconds es una proyección, no una garantía: un trabajo normalmente termina en decenas de segundos, pero puede superar los 240 segundos en una plataforma lenta, así que presupuesta en minutos. Un trabajo fallido aún devuelve HTTP 200 con status: "failed" y el motivo en data.error, no en un envoltorio de error de nivel superior, así que ramifica según data.status === "failed". Un trabajo completado lleva meta.pagination: null: la paginación por cursor solo se aplica a respuestas de listado devueltas de forma síncrona.


También disponible como API REST

¿Estás construyendo una aplicación o un backend en lugar de un agente? Los mismos datos se entregan como un servicio REST JSON simple.

MCPAPI REST
Mejor paraAsistentes de IA y agentesAplicaciones, backends, pipelines
ConfiguraciónAñade una URL, autoriza una vezClave de portador, integración de código
AutenticaciónOAuth 2.1 + PKCE (sin clave en el agente)Authorization: Bearer stay_live_...
Límite de tasaPor usuarioPor clave
CréditosMismo saldo únicoMismo saldo único
EsquemaEsquema unificado idénticoEsquema unificado idéntico
Cómo empezarEste READMEInicio rápido · Referencia de API · OpenAPI

URL base: https://api.stayingapi.com/v1. Las siete herramientas MCP se corresponden 1:1 con /v1/search, /v1/availability, /v1/listing/{platform}/{id}, /v1/price, /v1/price-compare, /v1/reviews y /v1/jobs/{jobId}.


Conectar

Repositorios relacionados - parte del conjunto de recursos abiertos de StayingAPI: hotel-api · airbnb-api · booking-com-api · vrbo-api · google-hotels-api · travel-api · travel-workflows · travel-skills


Registro MCP

Publicado en el Registro oficial del Protocolo de Contexto de Modelo como:

com.stayingapi/hotel-vacation-rental-mcp

Manifiestos de registro en este repositorio: server.json (registro MCP) · smithery.yaml (Smithery) · glama.json (Glama).


Preguntas frecuentes

¿Existe una API de Airbnb o Booking.com en 2026? No una a la que puedas registrarte y empezar a usar hoy. Airbnb no tiene una API pública abierta: el acceso pasa por sus programas de socios, dirigidos a socios de software aprobados y sistemas de gestión de propiedades, no a desarrolladores en general. La API de demanda de Booking.com es similar: requiere un acuerdo de socio o afiliado y un proceso de aprobación antes de obtener credenciales. Vrbo está dentro del programa de API de socios de Expedia Group, y los datos de Google Hotels fluyen a través de fuentes de socios hoteleros en lugar de una API de desarrollador autoservicio. Esa brecha es por qué "airbnb api" es una de las consultas más buscadas y menos atendidas en la tecnología de viajes. StayingAPI es la alternativa autoservicio: regístrate, obtén una clave con 300 créditos gratuitos y sin tarjeta, y consulta datos de alojamiento en las cuatro fuentes a través de una API REST o este servidor MCP, con cada respuesta normalizada al mismo esquema.

¿Qué es un MCP de hotel o alojamiento? Un MCP de hotel o alojamiento es un servidor de Protocolo de Contexto de Modelo que expone datos de alojamiento como herramientas que un agente de IA puede llamar directamente: buscar estancias, comprobar disponibilidad día a día, obtener detalles completos de listados, cotizar un precio real para fechas específicas, comparar ese precio entre sitios de reserva y leer reseñas normalizadas. En lugar de que tú copies resultados en un chat, el asistente obtiene datos en vivo durante la conversación y razona sobre ellos, lo que significa que puede encadenar pasos por sí mismo: buscar, luego cotizar el mejor candidato, luego resumir sus reseñas. Este está alojado en https://mcp.stayingapi.com/mcp, habla el transporte HTTP Streamable y expone siete herramientas de solo lectura que cubren Booking.com, Airbnb, Vrbo y Google Hotels en un único esquema unificado. Funciona con Claude, ChatGPT, Cursor, Claude Code y cualquier otro cliente MCP, y se autentica mediante OAuth 2.1, por lo que nunca se pega una clave de API en el agente y nada aquí puede reservar, cancelar o cambiar una reserva.

¿Cuál es la diferencia entre la API REST de StayingAPI y este servidor MCP? Son dos puertas de entrada al mismo servicio, no dos productos. La API REST es para aplicaciones, backends y pipelines de datos: envías una clave de portador, obtienes JSON, controlas el bucle. El servidor MCP es para asistentes de IA y agentes: añades una URL, autorizas una vez mediante OAuth 2.1, y las siete herramientas se convierten en cosas que el modelo puede llamar por sí mismo. Debajo son idénticos: la misma validación, el mismo pipeline de adaptador y caché, el mismo esquema unificado, la misma taxonomía de errores y el mismo saldo único de créditos. No hay una billetera MCP separada ni precios MCP separados. La única diferencia real es el límite de tasa: REST se mide por clave, MCP por usuario. Elige REST cuando estés escribiendo el código, MCP cuando el modelo lo haga.

¿En qué se diferencia esto de una API de plataforma única o un scraper? Una API de plataforma única te da la vista de una sola fuente, por lo que las preguntas multiplataforma ("¿es esta villa más barata en Booking.com o Vrbo?") son imposibles de responder por construcción. Un scraper de SERP te entrega una instantánea de página cruda que tú mismo parseas y normalizas, sin escala de calificación, sin taxonomía canónica de comodidades y sin garantía de que la fila que parseaste sea la propiedad que pediste. Este servidor devuelve cuatro fuentes en un esquema, mantiene las escalas de calificación nativas explícitas en lugar de reescalarlas silenciosamente, e incluye compare_prices, que devuelve la oferta de cada sitio más un mínimo y una mediana calculados. También se niega a adivinar: si la identidad canónica de un listado no coincide con lo que pediste, obtienes un error identity_mismatch en lugar de una propiedad incorrecta que parezca plausible. Las llamadas fallidas, vacías y bloqueadas nunca se facturan.

¿Cómo comparo precios de hoteles entre Booking.com, Airbnb y Vrbo con IA? Conecta este servidor MCP a tu asistente y luego pregunta en lenguaje natural: "compara el precio de este hotel para el 13-20 de julio entre sitios de reserva". El modelo llama a compare_prices con el nombre de la propiedad y tus fechas. Vuelve con el total de cada sitio en tu moneda elegida más los campos min y median calculados por StayingAPI, para que el asistente pueda decirte no solo la oferta más barata sino cuánto por debajo de lo típico está. Para alquileres a corto plazo donde la misma propiedad física está listada en varios sitios con nombres diferentes, el flujo habitual es search_stays para encontrar candidatos, luego get_price por plataforma para una cotización exacta en tus fechas y ocupación. Añade la regla de auto-invocación de Instalación rápida y tu asistente usará estas herramientas por sí solo cada vez que menciones una estancia.

¿Puede un agente de IA buscar alquileres vacacionales y a corto plazo, no solo hoteles? Sí, y eso es deliberado: es por eso que este es un MCP de hoteles y alquileres vacacionales. Los hoteles llegan a través de Google Hotels y Booking.com; los alquileres a corto plazo a través de Airbnb y Vrbo. Crucialmente, vuelven en la misma forma de objeto: una habitación de hotel en el centro de la ciudad y una villa vacacional rural devuelven ambas tipo de propiedad, dormitorios, baños, ocupación máxima, una lista canónica de comodidades, una calificación de huéspedes con su escala explícita y un precio con desglose de tarifas. Así, un agente puede responder "qué duerme a 4 con piscina cerca de Split, hotel o apartamento, lo que sea más barato" en una sola pasada, en lugar de que tú ejecutes dos integraciones y las reconcilies. search_stays acepta un filtro platforms[] y un filtro propertyType[], para que puedas limitar solo a alquileres, solo a hoteles, o dejar que ambos compitan.

¿Qué datos devuelve? Cada herramienta devuelve el mismo envoltorio { data, meta }. Los registros de propiedad llevan identidad (plataforma, ID de listado nativo, URL canónica), hechos centrales (tipo de propiedad, dormitorios, baños, ocupación máxima, geo), una calificación de huéspedes con un ratingScale explícito para que un 9-sobre-10 nunca se confunda con un 4.5-sobre-5, una lista canónica de comodidades unificada en las cuatro plataformas, detalles del anfitrión, URLs de fotos en resolución completa y precios con desglose de noche, total, noches y tarifas. La disponibilidad devuelve por día available, minNights, checkIn, checkOut y bookable. Las reseñas devuelven calificación en su escala nativa, título, texto, autor, fecha, tipo de viaje, idioma, respuesta del propietario y gustos/disgustos. El bloque meta siempre informa el ID de solicitud, el estado por plataforma y las banderas de caché, el cursor de paginación y cualquier advertencia, para que puedas distinguir un resultado parcial de uno completo.

¿Cómo lo añado a Claude, ChatGPT o Cursor? Claude Desktop y Claude Web: Configuración, Conectores, Añadir conector personalizado, luego pega https://mcp.stayingapi.com/mcp y completa la ventana emergente de OAuth. Claude Code: claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp, luego ejecuta /mcp y autoriza. ChatGPT: habilita el Modo Desarrollador en Configuración, Aplicaciones y Conectores, Configuración avanzada, luego Configuración, Conectores, Añadir servidor MCP, pega la misma URL y completa el aviso de OAuth. Cursor: usa la insignia de un clic en la parte superior de este README, o añade {"mcpServers":{"stayingapi":{"url":"https://mcp.stayingapi.com/mcp"}}} a ~/.cursor/mcp.json para cada proyecto, o a .cursor/mcp.json para solo uno. Cualquier otro cliente MCP también funciona: añade la misma URL como servidor HTTP Streamable, y los clientes que soporten Registro Dinámico de Clientes negociarán OAuth sin configuración adicional. La configuración toma menos de un minuto en cada caso, porque el servidor está alojado: no hay nada que instalar, ningún runtime que gestionar y ningún paquete que mantener actualizado. El detalle completo por cliente está en Instalación rápida, y solo se listan allí configuraciones verificadas contra la documentación oficial, ya que un bloque de configuración incorrecto te cuesta el único intento de instalación que tienes.

¿Cuánto cuesta? El registro te da 300 créditos gratuitos sin tarjeta, y las claves de sandbox stay_test_ devuelven fixtures deterministas a costo cero para siempre, para que puedas construir y probar toda la integración antes de gastar nada. Después de eso, se basa en créditos, con costos actuales por llamada y precios de planes en la página de precios: este README deliberadamente no lleva números de pago para que nunca queden desactualizados aquí. Tres cosas son siempre gratuitas independientemente del plan: llamadas fallidas, vacías y bloqueadas (creditsCharged es 0), sondeo de get_job y cada llamada de sandbox. MCP y REST usan el mismo saldo único, por lo que añadir el servidor MCP no crea una segunda factura. El crédito en vivo se desbloquea después de que verifiques el correo de tu cuenta; el sandbox funciona completamente antes de eso. ¿Está StayingAPI afiliado a Airbnb, Booking.com, Vrbo o Google Hotels? No. StayingAPI es un servicio independiente. StayingAPI no está afiliado, respaldado ni patrocinado por Airbnb, Booking.com, Vrbo o Google Hotels. Estas son marcas comerciales de sus respectivos propietarios, utilizadas aquí de forma descriptiva para indicar las fuentes de datos que la API y el servidor MCP de StayingAPI pueden consultar. No somos un socio, un revendedor ni una integración autorizada de ninguna plataforma de reservas, no tenemos ningún acuerdo con ninguna de ellas, y ninguna de ellas respalda, revisa ni aprueba este proyecto. Los nombres de las plataformas aparecen a lo largo de este README, en el enum platforms[], y en los parámetros de las herramientas únicamente como etiquetas descriptivas que indican a qué fuente de datos se dirige una llamada determinada, de la misma manera que una herramienta de comparación de precios nombra las tiendas que consulta. StayingAPI no reserva, cancela ni modifica reservas: las siete herramientas son estrictamente de solo lectura, anotadas con readOnlyHint: true, y no existen herramientas de escritura en absoluto. Si necesitas reservar una estancia de verdad, sigue el listado canónico url devuelto con cada propiedad y reserva directamente en esa plataforma.


Obtén tu clave — 300 créditos gratis, sin tarjeta · Documentación de MCP · Precios · Estado

Publicado bajo la Licencia MIT. StayingAPI es un servicio independiente y no está afiliado ni respaldado por ninguna plataforma de reservas. Los nombres de las plataformas son marcas comerciales de sus respectivos propietarios.