StayingAPI
Disponibilidade em tempo real, busca, detalhes de anúncios e comparação de preços entre OTAs para Airbnb, Booking.com, Vrbo e Google Hotels em um único esquema unificado, expostos como 7 ferramentas MCP somente leitura e 8 endpoints REST.
Documentação
MCP de Hotéis e Aluguéis de Temporada - preços ao vivo, disponibilidade e avaliações em Booking.com, Airbnb, Vrbo e Google Hotels
Pesquise estadias, compare preços em Booking.com, Airbnb, Vrbo e Google Hotels, e consulte avaliações apenas perguntando à sua IA. Um MCP hospedado, 300 créditos grátis para começar, sem cartão.
Sete ferramentas somente leitura - busca, disponibilidade, detalhes do anúncio, preço, comparação de preços entre OTAs, avaliações e consulta de jobs - para Claude, ChatGPT, Cursor, Claude Code e qualquer cliente MCP.
4 plataformas de reserva, um único esquema · 7 ferramentas somente leitura · comparação de preços entre OTAs · OAuth 2.1, sem chave colada no agente · 300 créditos grátis para começar, sem cartão StayingAPI é um serviço independente de dados de hospedagem. StayingAPI não é afiliado, endossado ou patrocinado por Airbnb, Booking.com, Vrbo ou Google Hotels. Essas são marcas registradas de seus respectivos proprietários, usadas aqui de forma descritiva para indicar as fontes de dados que a API e o servidor MCP da StayingAPI podem consultar.
Instale em uma linha
Claude Code
claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp
Claude Desktop, ChatGPT, Cursor ou qualquer outro cliente MCP — adicione como um servidor HTTP Streamable:
https://mcp.stayingapi.com/mcp
Sem chave de API para colar: a primeira chamada abre um login OAuth (conta gratuita, 300 créditos, sem cartão). Etapas por cliente estão em Instalação Rápida, e o repositório inteiro também instala como um Plugin de Agente.
Por que um MCP de Hotéis e Aluguéis de Temporada
Você já compara estadias em quatro sites manualmente: um hotel no Booking.com, um apartamento no Airbnb, uma vila no Vrbo e o Google Hotels para conferir a tarifa. Cada um tem uma página diferente, uma escala de avaliação diferente e nenhuma API que você possa simplesmente assinar.
Conecte uma vez e apenas pergunte. Adicione este servidor MCP ao Claude, ChatGPT, Cursor ou qualquer cliente MCP uma única vez, e seu assistente de IA pode pesquisar estadias reais, cotar preços reais para suas datas, comparar a tarifa de uma propriedade entre sites de reserva e ler avaliações normalizadas - dentro da conversa, sem código e sem configuração repetida.
Tudo retorna em um único esquema unificado. Um quarto de hotel e uma vila de férias retornam o mesmo formato de objeto, as avaliações mantêm sua escala nativa em vez de serem reescaladas silenciosamente, e a comparação entre OTAs retorna a oferta de cada site mais um preço mínimo e mediano calculado, para que você não precise recalcular.
Uma amostra 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.
Esse único prompt abrange três ferramentas - search_stays, compare_prices, get_reviews - sem que você escreva uma linha de código.
Instale como Plugin de Agente · mais fácil
A raiz deste repositório é um pacote Agent Plugins 1.0.0 conforme o padrão — o formato portátil publicado em 2026-08-06 e suportado por ChatGPT, Codex, Cursor, GitHub Copilot, Kiro e VS Code. Uma única instalação fornece o servidor MCP e uma habilidade stays incluída que ensina seu agente qual ferramenta responde a qual pergunta, como manter o fan-out entre plataformas barato, e que Airbnb/Vrbo avaliam em escala de 5 pontos enquanto Booking.com avalia em 10 — para que ele nunca compare um 9 com um 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, depois cole:
https://github.com/stayingapi/hotel-vacation-rental-mcp
Ou registre um clone local em settings.json:
"chat.pluginLocations": { "/absolute/path/to/hotel-vacation-rental-mcp": true }
Cursor — Customize na barra lateral → encontre o plugin → Install. Para um clone local:
git clone https://github.com/stayingapi/hotel-vacation-rental-mcp ~/.cursor/plugins/local/stayingapi
Depois, Developer: Reload Window.
Adicionar ao Cursor — apenas servidor MCP, sem clone. Cole este deeplink no seu navegador:
cursor://anysphere.cursor-deeplink/mcp/install?name=stayingapi&config=eyJ1cmwiOiJodHRwczovL21jcC5zdGF5aW5nYXBpLmNvbS9tY3AifQ==
ChatGPT, Codex, GitHub Copilot, Kiro, qualquer outro cliente — aponte o mecanismo de plugins do seu cliente para este repositório ou para um clone local. O Agent Plugins 1.0.0 padroniza o formato do pacote, não a instalação, então cada cliente tem seu próprio fluxo de instalação.
Exemplo de 30 segundos
Find a 2-bedroom apartment in Split, Croatia for 12-15 June, 2 adults, under EUR 150 a night.
Uma única chamada search_stays retorna Airbnb, Booking.com, Vrbo e Google Hotels mesclados em uma lista normalizada única, cada um com sua URL de reserva. Sem chave de API para configurar — a primeira chamada abre um login OAuth (conta gratuita, 300 créditos, sem cartão). Depois, os acompanhamentos que normalmente exigem vinte abas no 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)
Todas as sete ferramentas são somente leitura — nada aqui pode reservar, cancelar ou alterar uma reserva.
Não há credenciais neste pacote — o Agent Plugins 1.0.0 proíbe segredos embutidos, e a autorização é gerenciada pelo cliente. Verifique o pacote você mesmo:
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
Instalação Rápida
Requisitos:
- Uma conta StayingAPI (cadastre-se - 300 créditos grátis, sem cartão)
- Ou OAuth (Claude, ChatGPT - sem manipulação de chave) ou uma chave de API (
stay_live_.../stay_test_...) do seu painel
Recomendado: adicione uma regra para sua IA invocar automaticamente
Cole isto nas instruções personalizadas ou no arquivo de regras do seu cliente:
Quando eu mencionar um hotel, um anúncio do Airbnb/Booking.com/Vrbo/Google Hotels, um lugar para ficar, datas de viagem, ou pedir para comparar preços de hospedagem ou ler avaliações de estadias, use automaticamente as ferramentas MCP da StayingAPI para buscar dados reais antes de responder.
URL do servidor: https://mcp.stayingapi.com/mcp (transporte HTTP Streamable)
Instalar no Claude (Desktop & Web) - Recomendado
Configurações → Conectores → Adicionar conector personalizado → cole:
https://mcp.stayingapi.com/mcp
O Claude executa o login OAuth 2.1 para você em uma janela do navegador, que vincula o conector à sua conta StayingAPI e ao saldo de créditos - sem chave de API necessária. As sete ferramentas somente leitura aparecem então na sua lista de ferramentas.
Prefere o arquivo de configuração do desktop? Adicione em claude_desktop_config.json:
{
"mcpServers": {
"stayingapi": {
"url": "https://mcp.stayingapi.com/mcp"
}
}
}
Instalar no Claude Code (CLI)
OAuth (recomendado):
claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp
Depois execute /mcp dentro do Claude Code e complete o prompt OAuth.
Prefere uma chave bearer ou executar headless?
claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp \
--header "Authorization: Bearer stay_live_YOUR_KEY_HERE"
Instalar no ChatGPT
- Ative o Modo Desenvolvedor: Configurações → Apps e Conectores → Configurações avançadas.
- Vá para Configurações → Conectores → Adicionar servidor MCP (Criar no painel de Conectores).
- Cole a URL do servidor:
https://mcp.stayingapi.com/mcp
- Complete o login OAuth quando solicitado - sem chave de API necessária.
Instalar no Cursor (Um Clique ou Manual)
Um clique: use o selo Instalar no Cursor no topo deste README.
Manual: adicione em ~/.cursor/mcp.json (global) ou .cursor/mcp.json (por projeto):
{
"mcpServers": {
"stayingapi": {
"url": "https://mcp.stayingapi.com/mcp"
}
}
}
Para usar uma chave bearer em vez do fluxo OAuth, adicione um objeto headers com "Authorization": "Bearer stay_live_YOUR_KEY_HERE".
Qualquer outro cliente MCP
Adicione https://mcp.stayingapi.com/mcp como um servidor MCP HTTP Streamable.
- Clientes que suportam OAuth 2.1 com Registro Dinâmico de Cliente autenticam automaticamente - nada para configurar.
- Clientes que não suportam podem apresentar uma chave bearer:
Authorization: Bearer stay_live_....
Apenas formatos verificados em stayingapi.com/docs/mcp estão listados acima de propósito. Se o seu cliente não está aqui, a configuração genérica de HTTP Streamable é toda a configuração necessária.
Autenticação
Duas formas de acesso, ambas terminando na mesma conta e no mesmo saldo de créditos:
- OAuth 2.1 + PKCE (S256) com Registro Dinâmico de Cliente - recomendado para Claude e ChatGPT. Você autoriza uma vez em uma janela do navegador e o conector é vinculado à sua conta StayingAPI. Clientes com suporte a DCR descobrem tudo automaticamente, então nenhuma chave é colada no agente.
- Chave de API Bearer - para clientes e scripts baseados em chave. As chaves são
stay_live_...(fan-out real para fontes ao vivo) oustay_test_...(fixtures determinísticas de sandbox, sempre 0 créditos). Envie comoAuthorization: Bearer stay_live_....
Um saldo, bucket de taxa separado. Chamadas MCP usam o mesmo saldo único de créditos que suas chaves REST. REST é limitado por chave; MCP é limitado por usuário - buckets separados, uma carteira.
Nota de segurança: trate chaves
stay_live_como senhas. O segredo de uma nova chave é mostrado uma vez e armazenado apenas como hash SHA-256, então nunca é recuperável. Nunca envie uma chave para um repositório nem a cole em uma configuração compartilhada; revogue e recrie pelo painel se uma chave vazar.
Ferramentas Disponíveis
Todas as sete são somente leitura (anotadas readOnlyHint: true, idempotentHint: true). Não há ferramentas de escrita, então nada aqui pode reservar, cancelar ou alterar nada. Cada ferramenta mapeia 1:1 para um endpoint REST, executa o mesmo pipeline de validação e cache, e retorna o mesmo envelope unificado { data, meta }.
1. search_stays
Descubra propriedades em várias plataformas por local, datas, ocupação e filtros, mescladas em um único esquema. Este é o endpoint de amplitude e a demonstração mais clara de "um esquema, todas as plataformas".
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
location | string | sim | Nome do local (Split, HR) ou lat,lng |
checkIn / checkOut | date | não | YYYY-MM-DD; obrigatórios juntos; não no passado |
adults / children / childAges[] / rooms | integer | não | childAges[] comprimento deve ser igual a children |
propertyType[] | enum[] | não | hotel | apartment | house | villa | cottage | other |
amenities[] | enum[] | não | Taxonomia canônica de comodidades |
minBedrooms / priceMin / priceMax / minGuestRating | number | não | Filtros aplicados após a normalização |
platforms[] | enum[] | não | airbnb | booking | vrbo | google; controla o fan-out |
limit / cursor / sort / currency | mixed | não | limit 1-40; sort = recommended | price_asc | price_desc | rating_desc |
Resposta (resumida):
{
"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
Disponibilidade dia a dia para um anúncio conhecido (ou um lote de anúncios) em uma plataforma, em um intervalo de datas. Cada dia informa se está disponível, o requisito mínimo de noites e se check-in, check-out e reserva são permitidos.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
platform | enum | sim | Plataforma única; não é uma ferramenta de fan-out |
listingId / listingIds[] / url | string | um de | Um id de anúncio, um lote de ids ou uma URL completa do anúncio |
startDate / endDate | date | sim | Não no passado; janela de até 365 dias |
onlyAvailable | boolean | não | Se verdadeiro, apenas datas reserváveis são retornadas |
Resposta (resumida):
{
"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
Detalhe completo normalizado de um anúncio: comodidades em taxonomia canônica, fotos, anfitrião, geolocalização, avaliações e — quando você informa datas — um preço ao vivo embutido. O detalhe é armazenado em cache por 24 h e qualquer preço embutido no TTL de preço de 1 h, composto no momento da leitura, para que um preço desatualizado nunca acompanhe um detalhe recente.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
platform | enum | sim | vrbo | booking | airbnb | google |
id | string | sim | ID de listagem nativo da plataforma, exatamente como veio da fonte |
checkIn / checkOut | date | não | A presença incorpora um preço ao vivo de melhor esforço |
adults / children / childAges[] / currency | mixed | não | Usado apenas com datas |
Resposta (resumida):
{
"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
Uma cotação de preço real para uma listagem, para suas datas e ocupação. Envie o ID nativo da plataforma retornado por search_stays (numérico no Airbnb e Vrbo, uma string slug no Booking.com e Google Hotels) ou uma URL completa da listagem. A resposta é sempre um preço numérico real ou um erro tipado - nunca o preço de uma propriedade diferente.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
platform | enum | sim | vrbo | booking | airbnb | google |
listingId | string | sim | ID nativo de search_stays.platformListingId, ou envie url |
checkIn / checkOut | date | sim | YYYY-MM-DD; checkOut após checkIn |
adults / children / childAges[] / currency | mixed | não | Moeda ISO-4217, repassada e ecoada |
Resposta (resumida):
{
"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
A ferramenta principal. Compare o preço de uma propriedade em vários sites de reserva em uma única chamada, resolvido por meio da infraestrutura do Google Hotels. A resposta traz as ofertas individuais, além do min e do median calculados pela StayingAPI como campos de primeira classe, para que você leia o preço mais barato e o típico entre sites sem precisar recalculá-los.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
name / googleHotelId / location | string | um de | Nome da propriedade para resolver, um ID preciso do Google Hotels ou um local para desambiguação |
checkIn / checkOut | date | sim | YYYY-MM-DD; não no passado |
adults / children / childAges[] / currency | mixed | não | Moeda ISO-4217, repassada e ecoada |
Resposta (resumida):
{
"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
Avaliações normalizadas e paginadas para uma listagem em uma plataforma. As escalas de avaliação nativas são preservadas e ecoadas junto com cada avaliação (Airbnb, Vrbo e TripAdvisor usam 5; Booking.com, Expedia e Hotels.com usam 10) e nunca são reescaladas silenciosamente, para que um 9 e um 4,5 não sejam comparados por engano.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
platform | enum | sim | Enum da plataforma |
listingId / url | string | um de | ID da listagem nessa plataforma, ou uma URL completa da listagem |
limit / cursor | mixed | não | limit 1-100; cursor base64 opaco |
language / minRating / sort | mixed | não | Filtro ISO-639-1; sort = recent | rating_desc | rating_asc |
Resposta (resumida):
{
"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
Consulte uma raspagem de longa duração que foi retornada como um trabalho assíncrono. Quando uma solicitação deve levar mais de aproximadamente 8 segundos, ela retorna um identificador de trabalho; o agente chama get_job até que status seja completed ou failed. A consulta custa sempre 0 créditos - o trabalho subjacente é cobrado uma única vez, na conclusão bem-sucedida.
| Parâmetro | Tipo | Obrigatório | Observações |
|---|---|---|---|
jobId | string | sim | O identificador retornado pela chamada original. Os resultados são retidos por 24 h |
Resposta durante a execução e, depois, na conclusão (resumida):
// 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": []
}
}
Um trabalho com falha ainda retorna com sucesso, com status: "failed" e o motivo aninhado em data.error (um objeto { type, code, message, retryable }). Trabalho com falha é gratuito.
Dados que você recebe
Toda chamada retorna o mesmo envelope unificado { data, meta }, seja a propriedade um hotel ou uma casa de temporada:
| Grupo de campos | Exemplos |
|---|---|
| Identidade | id, platform, platformListingId, listagem canônica url |
| Fatos principais | tipo de propriedade, quartos, banheiros, ocupação máxima, geo (lat/lng/cidade/país) |
| Avaliações | guestRating com um ratingScale explícito (5 ou 10, nunca reescalado silenciosamente), reviewCount, starRating |
| Comodidades | Taxonomia canônica em todas as quatro plataformas (pool, kitchen, air_conditioning, wifi, ...) |
| Preço | nightlyPrice, totalPrice, nights, currency e um detalhamento fees (limpeza, serviço, impostos) |
| Comparação entre plataformas | offers[] por site, além do min e do median calculados pela StayingAPI |
| Disponibilidade | available dia a dia, minNights, checkIn, checkOut, bookable |
| Avaliações | Nota na escala nativa, título, texto, autor, data, tipo de viagem, idioma, resposta do anfitrião, curtidas/não curtidas |
| Anfitrião e mídia | Nome do anfitrião, selo de superhost, URLs de fotos em resolução total |
| Metadados da chamada | requestId, status por plataforma, flags de cache, cursor de paginação, avisos |
Cobertura: Booking.com, Airbnb, Vrbo e Google Hotels - hotéis e aluguéis de curta duração no mesmo esquema, então uma única integração cobre as duas metades do mapa de hospedagem.
Casos de uso e prompts
| Caso de uso | Exemplo de prompt |
|---|---|
| Planejamento de viagem | "Encontre estadias de 2 quartos em Lisboa de 12 a 19 de maio por menos de EUR 150 por noite, com cozinha e ar-condicionado, e classifique-as pela avaliação dos hóspedes." |
| Arbitragem de preço entre sites | "Este hotel em Split, 13 a 20 de julho, 2 adultos: quanto custa no Booking.com em comparação com os outros sites, e quão abaixo da mediana está o mais barato?" |
| Resumo de avaliações | "Puxe as últimas 50 avaliações desta listagem e me diga as três reclamações que mais se repetem, e se o anfitrião responde." |
| Verificação de disponibilidade | "Esta vila no Vrbo está livre para alguma janela de 7 noites em agosto, e qual é a estadia mínima?" |
| Adequação para famílias | "Mesmas datas, 2 adultos e 2 crianças de 8 e 13 anos - qual destes três lugares realmente nos acomoda a todos, e qual é o total com taxas?" |
| Varredura de mercado | "Varra apartamentos em Split para a primeira semana de julho - qual é a tarifa noturna típica e como minha propriedade se compara?" |
| Verificação de paridade de tarifas | "Para estes cinco hotéis, compare a tarifa de cada um nos sites de reserva e sinalize qualquer um em que um site esteja mais de 10 por cento abaixo da mediana." |
Preços
| Créditos iniciais | 300 créditos gratuitos no cadastro, sem cartão |
| Sandbox | Chaves stay_test_ retornam fixtures determinísticas a 0 créditos, para sempre |
| Chamadas com falha | Chamadas com falha, vazias, bloqueadas e não encontradas nunca são cobradas - creditsCharged é 0 |
| Consulta assíncrona | A consulta get_job é sempre 0 créditos; o trabalho é cobrado uma única vez, na conclusão |
| Planos pagos | Baseados em créditos. Custos atuais por chamada e preços dos planos: stayingapi.com/pricing |
Este README mantém-se sem números sobre preços pagos de propósito, para nunca divergir da página de preços ao vivo. MCP e REST usam o mesmo saldo único de créditos - não há carteira MCP separada nem preços MCP separados.
Solução de problemas
Divida a análise por error.type (a classe, mapeada 1:1 para o status HTTP) e depois por error.code (um motivo estável e mais granular). Todo erro também traz um requestId, um flag retryable e um docUrl.
401 authentication_error - credenciais ausentes ou inválidas
Códigos: missing_api_key, invalid_api_key, revoked_api_key.
- Verifique se a chave começa com
stay_live_oustay_test_e se não há espaços em branco extras copiados. - Confirme se a chave não foi revogada no seu painel. Uma chave revogada retorna
revoked_api_keyimediatamente. - Em clientes OAuth, remova e adicione novamente o conector para reautorizar.
- A autenticação é verificada antes da validação, cobrança ou qualquer trabalho upstream, então um 401 nunca é cobrado.
403 permission_denied - geralmente verificação de e-mail
Códigos: email_unverified, scope_insufficient, subscription_required.
email_unverifiedé o mais comum: o crédito ao vivo fica bloqueado até você confirmar o e-mail da conta. Sua chave sandboxstay_test_não é afetada e continua retornando fixtures completos a custo zero, para que você possa construir de ponta a ponta antes de verificar.subscription_requiredsignifica que uma recarga foi tentada sem uma assinatura paga ativa - recargas são um complemento para assinantes.
402 insufficient_credits
Código: credit_balance_too_low. O saldo está abaixo do que a chamada custaria. Verifique programaticamente em vez de adivinhar - o endpoint da conta retorna credits.balance, plan, chave env e seu rateLimit.requestsPerMinute. Recarregue ou faça upgrade em stayingapi.com/pricing.
400 invalid_request - a própria solicitação
Códigos mais comuns: missing_parameter, invalid_date_range (checkOut deve ser estritamente após checkIn), date_in_past (avaliado em UTC), child_ages_mismatch (o comprimento de childAges[] deve ser igual a children), window_too_long (janelas de disponibilidade limitadas a 365 dias), invalid_cursor, limit_out_of_range, mutually_exclusive_params (você enviou ambos listingId e url, ou nenhum), needs_country.
needs_country merece uma nota: um slug simples do Booking.com enviado a get_listing é ambíguo, porque os slugs do Booking.com não são globalmente únicos - o mesmo slug existe por país. Envie o país, ou envie a URL completa da listagem.
404 not_found - incluindo o deliberado
Códigos: listing_not_found, job_not_found, identity_mismatch.
identity_mismatch é intencional: a identidade canônica da listagem resolvida não correspondeu ao que foi solicitado, então a StayingAPI se recusa a retornar uma propriedade diferente em vez de servir dados errados com aparência plausível. job_not_found também dispara para um trabalho expirado (os resultados são retidos por 24 h) ou um trabalho pertencente a outra conta - um ID de trabalho não é uma permissão.
429 rate_limited
Código: rate_limit_exceeded. Pode ser repetido - respeite o cabeçalho Retry-After em vez de fazer loop apertado. O MCP é limitado por taxa por usuário e o REST por chave: buckets separados, um saldo de créditos compartilhado.
503 / 504 problemas upstream
upstream_unavailable (all_actors_failed, actor_blocked) significa que toda fonte primária e de fallback falhou ou foi bloqueada; upstream_timeout significa que o trabalho upstream síncrono excedeu o prazo da solicitação. Ambos podem ser repetidos com backoff, e ambos custam 0 créditos. Para raspagens longas, espere o caminho assíncrono: um identificador de trabalho que você consulta com get_job.
OAuth não conecta
- Certifique-se de que um bloqueador de pop-ups não está impedindo a janela de login e, em seguida, limpe os cookies e tente novamente a autorização do conector. - A descoberta OAuth começa a partir da resposta 401 do servidor. Se um cliente não conseguir se conectar de forma alguma, confirme se ele suporta MCP OAuth 2.1 com Dynamic Client Registration - caso contrário, use uma chave bearer como alternativa.Um job está travado ou "concluído", mas vazio
estimatedSeconds é uma projeção, não uma garantia - um job geralmente termina em dezenas de segundos, mas pode exceder 240 segundos em uma plataforma lenta, então planeje em minutos. Um job falho ainda retorna HTTP 200 com status: "failed" e o motivo em data.error, não em um envelope de erro de nível superior, então ramifique em data.status === "failed". Um job concluído carrega meta.pagination: null - a paginação por cursor só se aplica a respostas de lista retornadas de forma síncrona.
Também disponível como API REST
Construindo um aplicativo ou backend em vez de um agente? Os mesmos dados são fornecidos como um serviço REST JSON simples.
| MCP | API REST | |
|---|---|---|
| Melhor para | Assistentes de IA e agentes | Aplicativos, backends, pipelines |
| Configuração | Adicione uma URL, autorize uma vez | Chave bearer, integração de código |
| Autenticação | OAuth 2.1 + PKCE (sem chave no agente) | Authorization: Bearer stay_live_... |
| Limite de taxa | Por usuário | Por chave |
| Créditos | Mesmo saldo único | Mesmo saldo único |
| Esquema | Esquema unificado idêntico | Esquema unificado idêntico |
| Comece aqui | Este README | Início rápido · Referência da API · OpenAPI |
URL base: https://api.stayingapi.com/v1. As sete ferramentas MCP mapeiam 1:1 para /v1/search, /v1/availability, /v1/listing/{platform}/{id}, /v1/price, /v1/price-compare, /v1/reviews e /v1/jobs/{jobId}.
Conecte-se
- Site: stayingapi.com
- Guia MCP: stayingapi.com/docs/mcp
- Documentação: stayingapi.com/docs · OpenAPI: api.stayingapi.com/openapi.json
- Fluxos de trabalho e receitas: stayingapi.com/workflows
- Status: status.stayingapi.com
- Contato: hello@stayingapi.com
- Listado em: awesome-agent-plugins, um diretório de Agent Plugins verificados no padrão aberto, mantido pela mesma equipe
Repositórios relacionados - parte do conjunto de recursos abertos da StayingAPI: hotel-api · airbnb-api · booking-com-api · vrbo-api · google-hotels-api · travel-api · travel-workflows · travel-skills
Registro MCP
Publicado no Model Context Protocol Registry oficial como:
com.stayingapi/hotel-vacation-rental-mcp
Manifestos de registro neste repositório: server.json (registro MCP) · smithery.yaml (Smithery) · glama.json (Glama).
FAQ
Existe uma API do Airbnb ou Booking.com em 2026? Não uma que você possa se inscrever e começar a usar hoje. O Airbnb não tem uma API pública aberta - o acesso passa por seus programas de parceiros, que são voltados para parceiros de software aprovados e sistemas de gerenciamento de propriedades, não para desenvolvedores em geral. A Demand API do Booking.com é semelhante: exige um acordo de parceiro ou afiliado e um processo de aprovação antes de você obter credenciais. O Vrbo está dentro do programa de API de parceiros do Expedia Group, e os dados do Google Hotels fluem por feeds de parceiros de hotéis, em vez de uma API de desenvolvedor self-service. Essa lacuna é o motivo pelo qual "airbnb api" é uma das consultas mais pesquisadas e menos atendidas em tecnologia de viagens. A StayingAPI é a alternativa self-service: inscreva-se, obtenha uma chave com 300 créditos gratuitos e sem cartão, e consulte dados de acomodações nas quatro fontes por meio de uma única API REST ou deste servidor MCP, com cada resposta normalizada para o mesmo esquema.
O que é um MCP de hotel ou acomodação?
Um MCP de hotel ou acomodação é um servidor Model Context Protocol que expõe dados de acomodação como ferramentas que um agente de IA pode chamar diretamente: pesquisar estadias, verificar disponibilidade dia a dia, buscar detalhes completos do anúncio, cotar um preço real para datas específicas, comparar esse preço entre sites de reserva e ler avaliações normalizadas. Em vez de você copiar resultados para um chat, o assistente busca dados ao vivo durante a conversa e raciocina sobre eles, o que significa que ele pode encadear etapas por conta própria: pesquisar, depois precificar o melhor candidato e, em seguida, resumir suas avaliações. Este servidor está hospedado em https://mcp.stayingapi.com/mcp, fala o transporte Streamable HTTP e expõe sete ferramentas somente leitura que cobrem Booking.com, Airbnb, Vrbo e Google Hotels em um único esquema unificado. Funciona com Claude, ChatGPT, Cursor, Claude Code e qualquer outro cliente MCP, e autentica via OAuth 2.1, então nenhuma chave de API é colada no agente e nada aqui pode reservar, cancelar ou alterar uma reserva.
Qual é a diferença entre a API REST da StayingAPI e este servidor MCP? São duas portas de entrada para o mesmo serviço, não dois produtos. A API REST é para aplicativos, backends e pipelines de dados: você envia uma chave bearer, recebe JSON e controla o loop. O servidor MCP é para assistentes de IA e agentes: você adiciona uma URL, autoriza uma vez via OAuth 2.1, e as sete ferramentas se tornam coisas que o modelo pode chamar por conta própria. Por baixo, são idênticos - a mesma validação, o mesmo pipeline de adaptador e cache, o mesmo esquema unificado, a mesma taxonomia de erros e o mesmo saldo único de créditos. Não há carteira MCP separada nem preços MCP separados. A única diferença real é o limite de taxa: REST é medido por chave, MCP por usuário. Escolha REST quando você está escrevendo o código, MCP quando o modelo está.
Como isso é diferente de uma API de plataforma única ou de um scraper?
Uma API de plataforma única dá a você a visão de uma única fonte, então perguntas entre plataformas ("esta vila é mais barata no Booking.com ou no Vrbo?") são impossíveis de responder por construção. Um scraper de SERP entrega um snapshot bruto da página que você mesmo analisa e normaliza, sem escala de avaliação, sem taxonomia canônica de comodidades e sem garantia de que a linha que você analisou é a propriedade que você pediu. Este servidor retorna quatro fontes em um esquema, mantém as escalas de avaliação nativas explícitas em vez de reescaloná-las silenciosamente, e fornece compare_prices, que retorna a oferta de cada site mais um menor e mediano calculados. Ele também se recusa a adivinhar: se a identidade canônica de um anúncio não corresponder ao que você pediu, você recebe um erro identity_mismatch em vez de uma propriedade errada com aparência plausível. Chamadas falhas, vazias e bloqueadas nunca são cobradas.
Como comparo preços de hotéis entre Booking.com, Airbnb e Vrbo com IA?
Conecte este servidor MCP ao seu assistente e pergunte em linguagem natural: "compare o preço deste hotel para 13-20 de julho entre sites de reserva". O modelo chama compare_prices com o nome da propriedade e suas datas. Ele retorna o total de cada site na sua moeda escolhida, além dos campos min e median calculados pela StayingAPI, para que o assistente possa informar não apenas a oferta mais barata, mas o quanto ela está abaixo do típico. Para aluguéis de curto prazo em que a mesma propriedade física está listada em vários sites com nomes diferentes, o fluxo usual é search_stays para encontrar candidatos e, em seguida, get_price por plataforma para uma cotação exata nas suas datas e ocupação. Adicione a regra de invocação automática do Início rápido e seu assistente usará essas ferramentas por conta própria sempre que você mencionar uma estadia.
Um agente de IA pode pesquisar aluguéis de férias e aluguéis de curto prazo, não apenas hotéis?
Sim, e isso é intencional - é por isso que este é um MCP de hotel e aluguel de férias. Hotéis chegam via Google Hotels e Booking.com; aluguéis de curto prazo via Airbnb e Vrbo. Crucialmente, eles retornam no mesmo formato de objeto: um quarto de hotel no centro da cidade e uma vila de férias rural retornam tipo de propriedade, quartos, banheiros, ocupação máxima, uma lista canônica de comodidades, uma avaliação de hóspedes com sua escala explícita e um preço com detalhamento de taxas. Assim, um agente pode responder "o que acomoda 4 com piscina perto de Split, hotel ou apartamento, o que for mais barato" em uma única passada, em vez de você executar duas integrações e reconciliá-las. search_stays aceita um filtro platforms[] e um filtro propertyType[], para que você possa restringir apenas a aluguéis, apenas a hotéis ou deixar ambos competirem.
Quais dados ele retorna?
Cada ferramenta retorna o mesmo envelope { data, meta }. Registros de propriedade carregam identidade (plataforma, ID de listagem nativo, URL canônica), fatos principais (tipo de propriedade, quartos, banheiros, ocupação máxima, geolocalização), uma avaliação de hóspedes com uma ratingScale explícita para que um 9-de-10 nunca seja confundido com um 4,5-de-5, uma lista canônica de comodidades unificada nas quatro plataformas, detalhes do anfitrião, URLs de fotos em resolução total e preços com diária, total, noites e detalhamento de taxas. Disponibilidade retorna available, minNights, checkIn, checkOut e bookable por dia. Avaliações retornam classificação na escala nativa, título, texto, autor, data, tipo de viagem, idioma, resposta do proprietário e curtidas/não curtidas. O bloco meta sempre relata o ID da solicitação, status por plataforma e flags de cache, cursor de paginação e quaisquer avisos, para que você possa distinguir um resultado parcial de um completo.
Como adiciono ao Claude, ChatGPT ou Cursor?
Claude Desktop e Claude Web: Configurações, Conectores, Adicionar conector personalizado e cole https://mcp.stayingapi.com/mcp e conclua o pop-up OAuth. Claude Code: claude mcp add --transport http stayingapi https://mcp.stayingapi.com/mcp, depois execute /mcp e autorize. ChatGPT: ative o Modo Desenvolvedor em Configurações, Apps e Conectores, Configurações avançadas, depois Configurações, Conectores, Adicionar servidor MCP, cole a mesma URL e conclua o prompt OAuth. Cursor: use o selo de um clique no topo deste README, ou adicione {"mcpServers":{"stayingapi":{"url":"https://mcp.stayingapi.com/mcp"}}} a ~/.cursor/mcp.json para cada projeto, ou a .cursor/mcp.json para apenas um. Qualquer outro cliente MCP também funciona - adicione a mesma URL como um servidor HTTP Streamable, e clientes que suportam Dynamic Client Registration negociarão OAuth sem configuração adicional. A configuração leva menos de um minuto em todos os casos, porque o servidor é hospedado: não há nada para instalar, nenhum runtime para gerenciar e nenhum pacote para manter atualizado. Detalhes completos por cliente estão em Início rápido, e apenas configurações verificadas contra a documentação oficial estão listadas lá, pois um bloco de configuração errado custa a única tentativa de instalação que você tem.
Quanto custa?
O cadastro dá 300 créditos gratuitos sem cartão, e chaves de sandbox stay_test_ retornam fixtures determinísticas a custo zero para sempre, então você pode construir e testar toda a integração antes de gastar qualquer coisa. Depois disso, é baseado em créditos, com custos atuais por chamada e preços de planos na página de preços - este README deliberadamente não traz números pagos para que nunca fiquem desatualizados aqui. Três coisas são sempre gratuitas, independentemente do plano: chamadas falhas, vazias e bloqueadas (creditsCharged é 0), polling de get_job e toda chamada de sandbox. MCP e REST usam o mesmo saldo único, então adicionar o servidor MCP não cria uma segunda conta. Créditos ao vivo são desbloqueados após você verificar o e-mail da sua conta; a sandbox funciona totalmente antes disso.
O StayingAPI é afiliado ao Airbnb, Booking.com, Vrbo ou Google Hotels?
Não. O StayingAPI é um serviço independente. O StayingAPI não é afiliado, endossado ou patrocinado pelo Airbnb, Booking.com, Vrbo ou Google Hotels. Essas são marcas registradas de seus respectivos proprietários, usadas aqui de forma descritiva para indicar as fontes de dados que a API e o servidor MCP do StayingAPI podem consultar. Não somos parceiros, revendedores ou integração autorizada de nenhuma plataforma de reservas, não temos acordo com nenhuma delas, e nenhuma delas endossa, revisa ou aprova este projeto. Os nomes das plataformas aparecem ao longo deste README, no enum platforms[] e nos parâmetros das ferramentas, puramente como rótulos descritivos para indicar qual fonte de dados uma determinada chamada visa, da mesma forma que uma ferramenta de comparação de preços nomeia as lojas que verifica. O StayingAPI não reserva, cancela ou modifica reservas: todas as sete ferramentas são estritamente somente leitura, anotadas com readOnlyHint: true, e não há nenhuma ferramenta de escrita. Se você precisar realmente reservar uma estadia, siga a listagem canônica url retornada com cada propriedade e reserve diretamente nessa plataforma.
Obtenha sua chave — 300 créditos grátis, sem cartão · Documentação do MCP · Preços · Status
Lançado sob a Licença MIT. O StayingAPI é um serviço independente e não é afiliado ou endossado por nenhuma plataforma de reservas. Os nomes das plataformas são marcas registradas de seus respectivos proprietários.