Ligue o site próprio, o channel manager, um chatbot, o BI ou a sua automação às reservas do hotel — com o mesmo preço e a mesma disponibilidade do balcão, e a trava do banco impedindo reserva dupla entre canais.
1Gere a chave
O dono do hotel cria em Configurações → Integrações → Canais → API: chave de canal de venda (só as reservas que ela criar) ou de gestão, com leitura e escrita ou somente leitura. A chave aparece uma vez.
2Consulte
Disponibilidade e preço para duas pessoas:
curl "https://app.hotelgestao.com.br/api/v1/availability?checkIn=2026-10-10&checkOut=2026-10-12&guests=2" \ -H "Authorization: Bearer hg_SUA_CHAVE"
3Reserve
Repetir com a mesma Idempotency-Key devolve a mesma reserva:
curl -X POST "https://app.hotelgestao.com.br/api/v1/reservations" \
-H "Authorization: Bearer hg_SUA_CHAVE" \
-H "Idempotency-Key: pedido-000123" \
-H "Content-Type: application/json" \
-d '{"roomType":"Standard","checkIn":"2026-10-10",
"checkOut":"2026-10-12","guests":2,
"guest":{"name":"Maria Silva","phone":"99988887777"}}'Endereço base: https://app.hotelgestao.com.br/api/v1 · datas em AAAA-MM-DD no dia do hotel · valores em reais · erros em português, com o campo que causou.
Inventário e preço
Unidades livres por tipo e por noite, preço de cada ocupação, taxas e estadia mínima.
Reservas
Criar (um ou vários quartos), listar, alterar observações e cancelar, com trava contra reserva dupla.
Hóspedes
Buscar e cadastrar sem duplicar — só para a chave de gestão do hotel.
Bloqueios
Fechar e reabrir datas de uma unidade (stop-sell).
Avisos e eventos
Reserva, disponibilidade, tarifa e conteúdo: aviso assinado com HMAC e fila para recuperar o que se perdeu.
Conteúdo do anúncio
Endereço, coordenadas, fotos, comodidades e políticas do hotel e de cada tipo.
Para manter em dia: carregue /hotel, /room-types e /inventory, receba os avisos (webhook) e, se ficar fora do ar, recupere em /events a partir do último id. Nos avisos de reserva, checkIn e checkOut são o dia do hotel, como na API.
Cada rota, parâmetro, corpo e resposta. Toque numa rota para abrir.
Dados do estabelecimento e das unidades (quartos, suítes, chalés, camas…).
/hotelDados do hotelTudo o que um anúncio precisa: nome, descrição, endereço em campos, coordenadas, telefone, horários, fotos, comodidades e políticas. O que o hotel não informou sai null (ou vazio) — nunca um valor inventado.
Respostas
200Hotel401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./room-typesTipos de unidadeCada tipo com o identificador estável, quantas unidades tem, a capacidade máxima, a diária-base por número de hóspedes (sem temporada), descrição, comodidades, fotos e as unidades que o compõem.
Respostas
200Tipos401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./roomsUnidadesParâmetros
typena URL · stringFiltra por tipo.Respostas
200Unidades401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./rooms/{id}Uma unidadeParâmetros
idno caminho · string · obrigatórioId da unidade.Respostas
200Unidade401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.404Não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte.O que dá para vender e por quanto, com as regras do hotel aplicadas.
/availabilityDisponibilidade e preço de uma estadiaPor tipo: quantas unidades estão livres no período inteiro e o total da estadia (a mais barata livre do tipo, com temporada e taxas obrigatórias). price é o do número de hóspedes pedido; prices traz todas as ocupações. minStay é a estadia mínima dessas datas — a API informa, quem vende aplica.
Parâmetros
checkInna URL · string (date) · obrigatórioEntrada.checkOutna URL · string (date) · obrigatórioSaída.guestsna URL · integer · padrão 2Número de hóspedes (padrão 2).Respostas
200Disponibilidade400Datas inválidas.401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./inventoryInventário por tipo e por noiteA carga de quem vende: para cada tipo e cada noite da janela, quantas unidades estão livres (available), se a noite está fechada (closed), a estadia mínima (minStay) e a diária de cada ocupação (rates). fees é a tabela de taxas obrigatórias da estadia, para montar o total sem cotar estadia por estadia; optionalFees, as que o hotel cobra à parte (pet, veículo). Janela padrão 30 dias; máxima 366. O total exato de uma estadia é o de /availability.
Parâmetros
fromna URL · string (date)Primeira noite (padrão: hoje no hotel).tona URL · string (date)Dia seguinte à última noite.roomTypena URL · stringSó um tipo: o nome ou o id de /room-types.Respostas
200Inventário400Datas inválidas ou janela acima de 366 dias.401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.404Tipo não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./calendarCalendário por unidadeDia a dia, se cada unidade está livre, e o que a ocupa; minStay traz a estadia mínima de cada noite. Janela padrão 30 dias; máxima 366. Para saber quantas unidades de cada TIPO estão livres, use /inventory.
Parâmetros
fromna URL · string (date)Primeiro dia (padrão: hoje).tona URL · string (date)Dia seguinte ao último.Respostas
200Calendário401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./ratesDiárias por noiteDiária de cada noite por tipo, para o número de hóspedes, com temporada e dia da semana aplicados. A diária não leva taxa por estadia: fees traz a tabela de taxas obrigatórias (limpeza, hóspede extra) e minStay, a estadia mínima de cada noite.
Parâmetros
fromna URL · string (date)Primeira noite (padrão: hoje).tona URL · string (date)Dia seguinte à última noite.guestsna URL · integer · padrão 2Número de hóspedes (padrão 2).Respostas
200Diárias401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./reservationsListar reservasPara sincronizar: guarde o updatedAt mais recente e volte com updatedSince.
Parâmetros
statusna URL · stringUm ou vários, separados por vírgula.updatedSincena URL · string (date-time)checkInFromna URL · string (date)Entrada a partir de.checkInTona URL · string (date)Entrada até (inclusive).externalIdna URL · stringO id da reserva no SEU sistema — para achar a reserva depois de uma queda de conexão.groupIdna URL · stringAs reservas do mesmo pedido de vários quartos.limitna URL · integer · padrão 50cursorna URL · stringO nextCursor da página anterior.Respostas
200Reservas (a chave de canal recebe só as que ela criou)401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./reservationsCriar reservaCom roomType, a API escolhe a unidade livre mais barata do tipo que caiba os hóspedes; com roomId, usa exatamente aquela. Sem total, o preço é o da tabela do hotel (com as taxas obrigatórias).
Vários quartos: mande rooms (até 10) no lugar de roomType/roomId. Entram todos ou nenhum, cada item numa unidade diferente, no mesmo grupo; a resposta é { groupId, reservations, total, paid, balance } e total/paid do pedido são divididos pela tabela de cada quarto.
Idempotente: repetir com o mesmo cabeçalho Idempotency-Key devolve a mesma reserva com duplicate: true, no estado em que ela estiver. O mesmo externalId devolve a reserva enquanto ela estiver viva; depois de cancelada, o mesmo externalId cria outra — é assim que se muda uma estadia (cancele e crie de novo). A mesma chave com datas ou quartos diferentes é recusada com 409, não devolvida calada.
Dinheiro: paid é o que o canal já recebeu; payment.collectedBy diz quem cobra o hóspede. A API não lança nada no caixa do hotel: o caixa é do balcão. Atenção: se o hotel usa a expiração de reserva sem pagamento (policies.unpaidExpiryDays em GET /hotel), a reserva criada com paid: 0 é cancelada sozinha depois desse prazo. O hóspede é reaproveitado pelo documento, ou pelo telefone + nome.
Parâmetros
Idempotency-Keyheader · stringCorpo (JSON)
roomTypestringTipo (o nome, como em /room-types). Obrigatório se não houver roomId nem rooms.roomIdstringUnidade exata.roomslista de objectVários quartos no mesmo pedido (no lugar de roomType/roomId/guests): entram todos ou nenhum.checkInstring (date) · obrigatóriocheckOutstring (date) · obrigatórioguestsintegerguestHospedeEntrada · obrigatóriototalnumberValor acertado no canal (do pedido inteiro). Sem ele, vale a tabela do hotel.paidnumberQuanto já foi pago no canal (do pedido inteiro).paymentPagamentoDoCanalstatusstringchannelstringNome do canal para o relatório (ex.: "Site próprio", "Chatbot").externalIdstringId da reserva no seu sistema (também torna a criação idempotente).notesstringRespostas
200Repetição: a mesma resposta, com duplicate: true201Criada: a reserva; ou, com rooms, o grupo de reservas400Campo inválido (veja field).401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.404roomId/roomType não existe.409Sem unidade livre no período, ou a chave de idempotência já foi usada em outro pedido.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./reservations/{id}Uma reservaParâmetros
idno caminho · string · obrigatórioId da reserva.Respostas
200Reserva401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.404Não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./reservations/{id}Alterar reservaMuda observações, número de hóspedes (até a capacidade da unidade; o valor não é recalculado) e contato do hóspede. Datas, unidade e valores mudam no balcão, onde a troca fica registrada no histórico da reserva; pela API, cancele e crie outra.
Parâmetros
idno caminho · string · obrigatórioId da reserva.Corpo (JSON)
notesstringguestsintegerguestobjectRespostas
200Alterada400Campo não permitido ou inválido.401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.404Não existe.409Reserva cancelada ou encerrada.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./reservations/{id}/cancelCancelar reservaIdempotente. Reserva com check-in feito é cancelada no balcão (409). O que já foi pago fica registrado na reserva; devolução é decisão do hotel, no balcão. Num pedido de vários quartos, cancele cada reserva do grupo. Não comparecimento (no_show) é marcado pelo hotel e chega como reservation.cancelled.
Parâmetros
idno caminho · string · obrigatórioId da reserva.Corpo (JSON)
reasonstringRespostas
200Cancelada401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.404Não existe.409Check-in já feito.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./guestsListar/buscar hóspedesSó chave de gestão. A base de hóspedes é do hotel: a chave de canal de venda recebe 403 (ela já tem o hóspede das reservas que criou).
Parâmetros
qna URL · stringNome, telefone, e-mail ou documento (mín. 2 caracteres).limitna URL · integer · padrão 50cursorna URL · stringO nextCursor da página anterior.Respostas
200Hóspedes401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave de canal de venda: esta rota é só para chave de gestão.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./guestsCadastrar hóspedeSó chave de gestão. Se já existir (mesmo documento, ou mesmo telefone + nome), devolve o cadastro com duplicate: true.
Corpo (JSON)
namestring · obrigatóriophonestringDDD + número, só dígitos (10 a 13).emailstring (email)documentstringCPF, passaporte ou outro documento.Respostas
200Já existia201Criado400Campo inválido.401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura, ou chave de canal de venda.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./guests/{id}Um hóspedeSó chave de gestão.
Parâmetros
idno caminho · string · obrigatórioId do hóspede.Respostas
200Hóspede401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave de canal de venda: esta rota é só para chave de gestão.404Não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte.Fechar datas de uma unidade (stop-sell, manutenção combinada, uso próprio).
/blocks/{uid}Fechar datas de uma unidadeIdempotente pelo uid que VOCÊ escolhe (ex.: stopsell-natal-101): enviar de novo com outras datas move o bloqueio. Na chave de canal de venda o uid é só dela — outra integração do mesmo hotel pode usar o mesmo nome sem mexer no seu bloqueio.
Parâmetros
uidno caminho · string · obrigatórioCorpo (JSON)
roomIdstring · obrigatóriostartstring (date) · obrigatórioendstring (date) · obrigatórioDia seguinte à última noite fechada.reasonstringRespostas
200Bloqueado401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.404roomId não existe.409Já há reserva no período.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./blocks/{uid}Reabrir datasParâmetros
uidno caminho · string · obrigatórioRespostas
200Removido401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.404Não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte.O que a sua chave pode, o webhook dela e a fila de eventos para quem ficou fora do ar.
/meQuem é esta chaveO hotel, o tipo da chave (canal de venda ou gestão), se ela escreve, o limite de chamadas e se tem webhook. Boa primeira chamada de uma integração.
Respostas
200Chave401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./eventsEventos (recuperar o que o webhook não entregou)A mesma fila que alimenta os avisos, com o mesmo data, do mais antigo para o mais novo. Guarde o id do último evento processado e volte com after; na primeira vez, use since com a hora em que começou a carga inicial. nextCursor vem preenchido enquanto houver mais; lastId é o ponto onde você parou. A chave de canal de venda recebe os eventos de reserva e bloqueio só do que ela criou, e os de disponibilidade, tarifa e conteúdo de todos. Os eventos ficam guardados por 30 dias.
Parâmetros
afterna URL · integerO id do último evento que você já processou.sincena URL · string (date-time)A partir deste instante (ISO-8601).typesna URL · stringSó estes tipos, separados por vírgula.limitna URL · integer · padrão 100Respostas
200Eventos400Parâmetro inválido (veja field).401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./webhookWebhook desta chaveO endereço, os eventos assinados e a situação da fila do hotel: quantos avisos esperam entrega e quantos esgotaram as tentativas. O segredo nunca volta aqui.
Respostas
200Webhook401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./webhookConfigurar o webhookLiga (ou muda) o endereço que recebe os avisos desta chave. O segredo whsec_… vem só na primeira configuração ou quando você pede rotateSecret — guarde-o. Sem events, a lista atual fica como está (chave nova: os cinco eventos de reserva e bloqueio); ["*"] assina todos.
Corpo (JSON)
urlstring (uri) · obrigatórioHTTPS, com nome de domínio público.eventslista de stringEventos assinados. ["*"] = todos.rotateSecretbooleanGera um segredo novo (o anterior para de valer na hora).Respostas
200Configurado400Endereço que não é HTTPS público, ou evento desconhecido.401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./webhookRemover o webhookDesliga os avisos desta chave e apaga o segredo. Os eventos continuam em GET /events.
Respostas
200Removido401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./webhook/testMandar um aviso de testeManda agora um evento ping, assinado como os de verdade, para o endereço desta chave, e diz o que o seu servidor respondeu. Até 6 por minuto.
Respostas
200Resultado da entrega401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura.409A chave não tem webhook.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte.Suítes por período (2h, 3h, pernoite) para totem de autoatendimento, tablet da recepção e integrações. Só para hotel do tipo Motel, com a tabela preenchida em Configurações do Sistema → Motel.
/suitesSuítes agora, com preço de cada períodoEstado de cada suíte (livre, ocupada, excedida, limpeza, manutencao, reservada), quanto falta do período em curso e o preço de cada período para aquele tipo de suíte no momento (fim de semana e data especial já aplicados). É o que o totem mostra na tela. Só chave de gestão.
Respostas
200Suítes401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave de canal de venda: esta rota é só para chave de gestão.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./suites/{id}/staysAbrir entrada numa suíteAbre a permanência por período. Sem cadastro do hóspede: a placa é opcional. Uma suíte só pode ter uma entrada aberta (o banco recusa a segunda).
Parâmetros
idno caminho · string · obrigatórioId da suíte (roomId).Corpo (JSON)
periodIdstring · obrigatórioId do período (ex.: 2h, pernoite), como vem em /suites.platestringPlaca do carro (opcional).notestringRespostas
201Entrada aberta401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura, ou chave de canal de venda.404Suíte não encontrada.409Suíte ocupada, em limpeza ou em manutenção.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./staysPermanênciasParâmetros
statusna URL · string · padrão abertaaberta (padrão), agendada, fechada ou cancelada.limitna URL · integer · padrão 50Respostas
200Permanências401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave de canal de venda: esta rota é só para chave de gestão.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./stays/{id}Uma permanência, com a conta do momentoParâmetros
idno caminho · string · obrigatórioId da permanência.Respostas
200Permanência401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave de canal de venda: esta rota é só para chave de gestão.404Não existe.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte./stays/{id}/closeFechar a conta da suíteCalcula período, hora adicional (com tolerância), consumo e desconto, exige que os pagamentos somem o total a pagar, lança no caixa aberto do hotel e devolve a suíte para limpeza.
Parâmetros
idno caminho · string · obrigatórioId da permanência.Corpo (JSON)
paymentslista de object · obrigatóriodiscountnumberDesconto em reais sobre o total.Respostas
200Conta fechada401Chave ausente, inválida ou revogada.402O plano do hotel não inclui a API ou está vencido/bloqueado.403Chave somente leitura, ou chave de canal de venda.404Permanência aberta não encontrada.409Sem caixa aberto no hotel.423Hotel suspenso pela VisionX.429Mais de 120 chamadas por minuto nesta chave (veja o cabeçalho retry-after).500Erro interno — informe o requestId ao suporte.