Moblix
Referência da API

Hotéis

Busca, pré-reserva e reserva de hospedagem com disponibilidade em tempo real

Hotéis (Hotels)

Busque hotéis e hospedagens com disponibilidade e preços em tempo real, e crie reservas com pagamento integrado.

Fluxo Completo

Para realizar uma reserva de hotel via API, siga este fluxo de 5 etapas:

  1. Buscar destinos — Use o autocomplete para encontrar o código da cidade
  2. Buscar hotéis — Pesquise hotéis disponíveis com o código da cidade e datas
  3. Detalhes do hotel (opcional) — Obtenha descrição completa, fotos, facilidades
  4. Pré-reservar (Prebook) — Valide a oferta e reserve temporariamente por 20 minutos
  5. Confirmar reserva (Book) — Envie os dados dos hóspedes e pagamento para criar a reserva
GET  /api/v1/hotels/destinations        →  cityCode
POST /api/v1/hotels/search              →  hotels[] com ofertas
POST /api/v1/hotels/details             →  detalhes, fotos, facilidades
POST /api/v1/hotels/prebook             →  prebook_token (20 min)
POST /api/v1/hotels/book                →  booking + pagamento

Os resultados da busca têm validade limitada (~20 minutos). Complete o fluxo de prebook e book dentro desse período para garantir preço e disponibilidade.


1. Buscar Destinos (Autocomplete)

GET /api/v1/hotels/destinations

Busca cidades/destinos disponíveis por nome. Retorna códigos de cidade que devem ser usados como cityCode na busca de hotéis.

Autenticação obrigatória: Requer API key no header Authorization.

Query Parameters

ParâmetroTipoObrigatórioDescrição
qstringSimTermo de busca (mínimo 2 caracteres). Ex: rio de janeiro, paris
limitnumberNãoMáximo de resultados (padrão: 10, máx: 50)

Exemplo de Requisição

curl -X GET "https://app.moblix.net/api/v1/hotels/destinations?q=rio+de+janeiro&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch(
  'https://app.moblix.net/api/v1/hotels/destinations?q=rio+de+janeiro&limit=5',
  {
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY'
    }
  }
);

const data = await response.json();
console.log(data.data.destinations);
import requests

response = requests.get(
    'https://app.moblix.net/api/v1/hotels/destinations',
    params={'q': 'rio de janeiro', 'limit': 5},
    headers={'Authorization': 'Bearer YOUR_API_KEY'}
)

data = response.json()
print(data['data']['destinations'])

Resposta

{
  "data": {
    "destinations": [
      {
        "code": "1650",
        "label": "Rio De Janeiro, Brasil",
        "city": "Rio De Janeiro",
        "country": "Brasil",
        "countryCode": "BR",
        "value": "1650 - Rio De Janeiro"
      },
      {
        "code": "2933",
        "label": "Rio De Janeiro-galeao Airport, Brasil",
        "city": "Rio De Janeiro-galeao Airport",
        "country": "Brasil",
        "countryCode": "BR",
        "value": "2933 - Rio De Janeiro-galeao Airport"
      }
    ],
    "count": 2,
    "query": "Rio de Janeiro"
  },
  "timestamp": "2026-02-19T15:50:18.451Z"
}

Campos da Resposta

CampoTipoDescrição
codestringCódigo da cidade (usar como cityCode na busca)
labelstringNome formatado para exibição
citystringNome da cidade
countrystringNome do país
countryCodestringCódigo do país (ISO 2)
valuestringValor combinado código + nome

2. Buscar Hotéis

POST /api/v1/hotels/search

Realiza uma busca de hotéis disponíveis para as datas especificadas.

Parâmetros

{
  "cityCode": "1650",
  "checkIn": "2026-03-15",
  "checkOut": "2026-03-20",
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "nationality": "BR"
}
CampoTipoObrigatórioDescrição
cityCodestringCondicionalCódigo da cidade (obtido via autocomplete de destinos). Obrigatório se hotelIds não for informado
hotelIdsstring[]CondicionalLista de IDs de hotéis para busca específica (máx. 500). Obrigatório se cityCode não for informado
checkInstringSimData de entrada no formato YYYY-MM-DD
checkOutstringSimData de saída no formato YYYY-MM-DD
adultsnumberSimNúmero total de adultos (1-9)
childrennumberNãoNúmero total de crianças (padrão: 0)
roomsnumberNãoNúmero de quartos (1-5, padrão: 1)
nationalitystringNãoNacionalidade dos hóspedes, código ISO 2 letras (padrão: BR)

Pelo menos um de cityCode ou hotelIds deve ser informado. O cityCode é um código numérico do fornecedor, não o nome da cidade. Use o endpoint de Buscar Destinos para obter o código correto. O hotelIds aceita IDs de hotéis do provedor (campo hotelId da resposta do search).

Exemplo de Requisição

curl -X POST https://app.moblix.net/api/v1/hotels/search \
  -H "Authorization: Bearer mbx_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "cityCode": "1650",
    "checkIn": "2026-03-15",
    "checkOut": "2026-03-20",
    "adults": 2,
    "rooms": 1
  }'
const response = await fetch('https://app.moblix.net/api/v1/hotels/search', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mbx_live_sua_chave_aqui',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    cityCode: '1650',
    checkIn: '2026-03-15',
    checkOut: '2026-03-20',
    adults: 2,
    rooms: 1
  })
});

const data = await response.json();
console.log(data.data.hotels);
import requests

response = requests.post(
    'https://app.moblix.net/api/v1/hotels/search',
    headers={
        'Authorization': 'Bearer mbx_live_sua_chave_aqui',
        'Content-Type': 'application/json'
    },
    json={
        'cityCode': '1650',
        'checkIn': '2026-03-15',
        'checkOut': '2026-03-20',
        'adults': 2,
        'rooms': 1
    }
)

data = response.json()
print(data['data']['hotels'])

Resposta

{
  "data": {
    "hotels": [
      {
        "id": "bestbuy:6931",
        "name": "BELMOND COPACABANA PALACE",
        "hotelId": "6931",
        "hotelSearchCode": "20608180/3661045776465014655/1022",
        "location": {
          "address": "COPACABANA",
          "city": "Rio De Janeiro",
          "country": "Brasil",
          "countryCode": "BR",
          "coordinates": {
            "latitude": -22.967413,
            "longitude": -43.178798
          }
        },
        "rating": 5,
        "stars": 5,
        "images": [
          "https://i.travelapi.com/lodging/1000000/10000/7200/7130/b2fc212d_b.jpg",
          "https://i.travelapi.com/lodging/1000000/10000/7200/7130/b2fc212d_t.jpg"
        ],
        "amenities": [],
        "price": {
          "amount": 4081.00,
          "currency": "BRL",
          "perNight": true,
          "total": 12243.00
        },
        "availability": {
          "checkIn": "2026-03-15",
          "checkOut": "2026-03-18",
          "nights": 3,
          "roomsAvailable": 1
        },
        "description": "IF YOU FAIL TO CHECK-IN FOR THIS RESERVATION...",
        "provider": "BestBuy Travel",
        "offersCount": 1,
        "offers": [
          {
            "hotelSearchCode": "20608180/3661045776465014655/1022",
            "roomBasis": "BB",
            "rooms": ["Superior City View Room"],
            "totalPrice": 12243.00,
            "netPrice": 11243.00,
            "currency": "BRL",
            "nonRefundable": false,
            "cancellationDeadline": "2026-03-13"
          }
        ],
        "searchSessionId": "a8ee0a39-24f5-4e9c-a622-6fc80101fb4e",
        "netPrice": 11243.00
      }
    ],
    "summary": {
      "totalResults": 167,
      "minPrice": 482.33,
      "maxPrice": 4870.00,
      "duration": 16077
    },
    "searchSessionId": "a8ee0a39-24f5-4e9c-a622-6fc80101fb4e",
    "meta": {
      "searchParams": {
        "cityCode": "1650",
        "checkIn": "2026-03-15",
        "checkOut": "2026-03-18",
        "adults": 2,
        "children": 0,
        "rooms": 1,
        "nationality": "BR"
      },
      "teamId": "uuid-do-time"
    }
  },
  "timestamp": "2026-02-19T15:51:00.000Z"
}

Use o campo hotelSearchCode do hotel ou de uma oferta específica para obter detalhes (endpoint details) e para criar a pré-reserva (endpoint prebook). Cada hotel pode ter múltiplas ofertas com diferentes tipos de quarto e regime alimentar.

Estrutura da Resposta

Hotel

CampoTipoDescrição
idstringID único no formato provider:hotelId
namestringNome do hotel
hotelIdstringID do hotel no provedor
hotelSearchCodestringCódigo da melhor oferta (usar no prebook e details)
locationLocationEndereço e coordenadas
ratingnumberCategoria em estrelas (1-5)
starsnumberEstrelas do hotel (1-5)
imagesstring[]URLs das imagens do hotel (thumbnail e imagem principal). Para galeria completa, use o endpoint Details
amenitiesstring[]Lista de comodidades (pode estar vazia na busca). Para lista completa, use o endpoint Details
pricePriceInformações de preço da melhor oferta
availabilityAvailabilityDisponibilidade e datas
descriptionstringDescrição ou observações do hotel
providerstringNome do fornecedor
offersCountnumberNúmero de ofertas/quartos disponíveis
offersOffer[]Lista de todas as ofertas disponíveis para este hotel
searchSessionIdstringID da sessão de busca (usar no prebook)
netPricenumberPreço de custo da melhor oferta (antes do markup)

Location

CampoTipoDescrição
addressstringEndereço do hotel
citystringNome da cidade
countrystringNome do país
countryCodestringCódigo do país (ISO 2)
coordinatesobjectlatitude e longitude

Offer

CampoTipoDescrição
hotelSearchCodestringCódigo da oferta (usar no prebook para esta oferta específica)
roomBasisstringRegime alimentar: RO (Room Only), BB (Bed & Breakfast), HB (Half Board), FB (Full Board), AI (All Inclusive)
roomsstring[]Tipos de quarto disponíveis
totalPricenumberPreço total da estadia (com markup)
netPricenumberPreço de custo (antes do markup)
currencystringMoeda
nonRefundablebooleanSe a oferta é não-reembolsável
cancellationDeadlinestring|nullData limite para cancelamento gratuito (YYYY-MM-DD)

Price

CampoTipoDescrição
amountnumberPreço por diária (melhor oferta)
currencystringMoeda (BRL)
perNightbooleanSempre true — indica que amount é por diária
totalnumberPreço total da estadia (melhor oferta)

Availability

CampoTipoDescrição
checkInstringData de check-in
checkOutstringData de check-out
nightsnumberNúmero de diárias
roomsAvailablenumberQuantidade de ofertas disponíveis

Summary

CampoTipoDescrição
totalResultsnumberTotal de hotéis encontrados
minPricenumberMenor preço por diária
maxPricenumberMaior preço por diária
durationnumberTempo da busca em milissegundos

3. Detalhes do Hotel (Details)

POST /api/v1/hotels/details

Retorna informações detalhadas de um hotel específico, incluindo descrição completa, galeria de fotos, facilidades do hotel e do quarto, e breakdown de preços.

Este endpoint é opcional mas recomendado. Use-o para montar a página de detalhes do hotel antes do usuário selecionar uma oferta para reservar.

Parâmetros

CampoTipoObrigatórioDescrição
hotel_search_codestringSimCódigo da oferta retornado na busca (hotelSearchCode)
hotel_idstringNãoID do hotel no provedor (para informações adicionais)
languagestringNãoIdioma da resposta (padrão: pt). Opções: pt, en, es

Exemplo de Requisição

curl -X POST https://app.moblix.net/api/v1/hotels/details \
  -H "Authorization: Bearer mbx_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "hotel_search_code": "HSC-ABCDEF123456",
    "hotel_id": "12345",
    "language": "pt"
  }'
const response = await fetch('https://app.moblix.net/api/v1/hotels/details', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mbx_live_sua_chave_aqui',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    hotel_search_code: 'HSC-ABCDEF123456',
    hotel_id: '12345',
    language: 'pt'
  })
});

const data = await response.json();
console.log(data.data.hotel_name);
console.log(data.data.pictures);       // Galeria de fotos
console.log(data.data.facilities);     // Facilidades do hotel
console.log(data.data.description);    // Descrição completa
import requests

response = requests.post(
    'https://app.moblix.net/api/v1/hotels/details',
    headers={
        'Authorization': 'Bearer mbx_live_sua_chave_aqui',
        'Content-Type': 'application/json'
    },
    json={
        'hotel_search_code': 'HSC-ABCDEF123456',
        'hotel_id': '12345',
        'language': 'pt'
    }
)

data = response.json()
print(data['data']['hotel_name'])
print(data['data']['pictures'])
print(data['data']['facilities'])

Resposta

{
  "data": {
    "hotel_name": "Copacabana Palace, A Belmond Hotel, Rio de Janeiro",
    "hotel_id": "6931",
    "address": "Avenida Atlantica, 1702, Rio de Janeiro, BR",
    "city_code": "1650",
    "phone": "55-21-25487070",
    "stars": 5,
    "description": "Property Location Copacabana Palace, A Belmond Hotel ficará numa localização central em Rio de Janeiro, a poucos passos de Praia de Copacabana...",
    "facilities": [
      "Piscina ao ar livre",
      "Spa com serviço completo",
      "Restaurante",
      "Bar/lounge",
      "Centro de fitness",
      "Wi-fi grátis",
      "Estacionamento (sobretaxa)",
      "Serviço de quarto 24 horas",
      "Concierge"
    ],
    "room_facilities": [
      "Ar condicionado",
      "Televisor LCD",
      "Cofre no quarto",
      "Mini bar",
      "Secador de cabelo",
      "Toalhas fornecidas",
      "Roupão de banho"
    ],
    "pictures": [
      "https://i.travelapi.com/lodging/1000000/10000/7200/7130/b2fc212d_b.jpg",
      "https://i.travelapi.com/lodging/1000000/10000/7200/7130/667c0367_b.jpg",
      "https://i.travelapi.com/lodging/1000000/10000/7200/7130/dd513758_b.jpg",
      "https://i.travelapi.com/lodging/1000000/10000/7200/7130/abc12345_b.jpg",
      "..."
    ],
    "coordinates": null,
    "price_breakdown": {
      "HotelName": "Copacabana Palace, A Belmond Hotel",
      "Room": { "...": "detalhamento por diária" }
    }
  },
  "timestamp": "2026-02-19T15:52:00.000Z"
}

As coordenadas geográficas são retornadas no endpoint de busca (search). No endpoint de detalhes, coordinates pode ser null dependendo do provedor. Use as coordenadas obtidas na busca para posicionar o hotel no mapa.

Campos da Resposta

CampoTipoDescrição
hotel_namestringNome do hotel
hotel_idstringID do hotel no provedor
addressstringEndereço completo
city_codestringCódigo da cidade
phonestringTelefone do hotel
starsnumberClassificação em estrelas (1-5)
descriptionstringDescrição detalhada do hotel (texto limpo, sem HTML)
facilitiesstring[]Lista de facilidades/amenidades do hotel
room_facilitiesstring[]Lista de facilidades do quarto
picturesstring[]URLs das fotos do hotel (galeria completa)
coordinatesobject|nulllatitude e longitude. Pode ser null — use as coordenadas do endpoint de busca quando disponíveis
price_breakdownobjectDetalhamento de preços por diária

Erros Possíveis

HTTPErroDescrição
400Validation errorCampos obrigatórios faltando
400Provider credentials not configuredCredenciais não configuradas
401UnauthorizedAPI key inválida
500Provider password not foundErro ao decriptar senha

4. Pré-reservar Hotel (Prebook)

POST /api/v1/hotels/prebook

Valida a disponibilidade de uma oferta de hotel e a reserva temporariamente por 20 minutos. Retorna um prebook_token que deve ser usado no próximo passo para confirmar a reserva.

O prebook_token expira em 20 minutos. Após esse prazo, será necessário criar um novo prebook.

Parâmetros

CampoTipoObrigatórioDescrição
hotel_search_codestringSimCódigo da oferta retornado na busca (campo hotelSearchCode da oferta)
search_session_idstringNãoID da sessão de busca (searchSessionId da resposta do search)
check_instringSimData de check-in (YYYY-MM-DD)
check_outstringSimData de check-out (YYYY-MM-DD)
adultsnumberSimNúmero de adultos (1-9)
childrennumberNãoNúmero de crianças (padrão: 0)
roomsnumberNãoNúmero de quartos (1-5, padrão: 1)
room_basisstringNãoTipo de quarto (retornado na oferta)
hotel_namestringSimNome do hotel
hotel_idstringNãoID do hotel (campo id da resposta do search)
unit_pricenumberSimPreço total da estadia (campo price.total do search)
currencystringNãoMoeda, 3 caracteres (padrão: BRL)
net_pricenumberNãoPreço de custo/net (para cálculo de markup)

Exemplo de Requisição

curl -X POST https://app.moblix.net/api/v1/hotels/prebook \
  -H "Authorization: Bearer mbx_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "hotel_search_code": "HSC-ABCDEF123456",
    "search_session_id": "uuid-da-sessao",
    "check_in": "2026-03-15",
    "check_out": "2026-03-20",
    "adults": 2,
    "rooms": 1,
    "hotel_name": "Copacabana Palace",
    "hotel_id": "bestbuy:12345",
    "unit_price": 4500.00,
    "currency": "BRL"
  }'
const response = await fetch('https://app.moblix.net/api/v1/hotels/prebook', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mbx_live_sua_chave_aqui',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    hotel_search_code: 'HSC-ABCDEF123456',
    search_session_id: 'uuid-da-sessao',
    check_in: '2026-03-15',
    check_out: '2026-03-20',
    adults: 2,
    rooms: 1,
    hotel_name: 'Copacabana Palace',
    hotel_id: 'bestbuy:12345',
    unit_price: 4500.00,
    currency: 'BRL'
  })
});

const data = await response.json();
const prebookToken = data.data.prebook_token;
// Salve este token para usar no próximo passo (book)
import requests

response = requests.post(
    'https://app.moblix.net/api/v1/hotels/prebook',
    headers={
        'Authorization': 'Bearer mbx_live_sua_chave_aqui',
        'Content-Type': 'application/json'
    },
    json={
        'hotel_search_code': 'HSC-ABCDEF123456',
        'search_session_id': 'uuid-da-sessao',
        'check_in': '2026-03-15',
        'check_out': '2026-03-20',
        'adults': 2,
        'rooms': 1,
        'hotel_name': 'Copacabana Palace',
        'hotel_id': 'bestbuy:12345',
        'unit_price': 4500.00,
        'currency': 'BRL'
    }
)

data = response.json()
prebook_token = data['data']['prebook_token']
# Salve este token para usar no próximo passo (book)

Resposta de Sucesso (201 Created)

{
  "data": {
    "prebook_token": "pbk_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "hotel_name": "Copacabana Palace",
    "check_in": "2026-03-15",
    "check_out": "2026-03-20",
    "nights": 5,
    "unit_price": 4500.00,
    "currency": "BRL",
    "expires_at": "2026-01-26T10:50:00Z"
  },
  "timestamp": "2026-01-26T10:30:00Z"
}

Campos da Resposta

CampoTipoDescrição
prebook_tokenstringToken para usar no endpoint de book (válido por 20 min)
hotel_namestringNome do hotel
check_instringData de check-in
check_outstringData de check-out
nightsnumberNúmero de diárias
unit_pricenumberPreço total confirmado
currencystringMoeda
expires_atstringData/hora de expiração do token (ISO 8601)

Erros Possíveis

HTTPErroDescrição
400Validation errorCampos obrigatórios faltando ou inválidos
400check_in must be before check_outDatas inválidas
400Provider credentials not configuredCredenciais do provedor não configuradas
401UnauthorizedAPI key inválida

5. Confirmar Reserva (Book)

POST /api/v1/hotels/book

Cria a reserva de hotel definitiva a partir de um prebook_token, com dados dos hóspedes e pagamento integrado.

Parâmetros

CampoTipoObrigatórioDescrição
prebook_tokenstringSimToken obtido no prebook
customer_idstring (UUID)SimID do cliente cadastrado na sua equipe
guestsarraySimLista de hóspedes (mín. 1)
paymentobjectSimDados de pagamento
notesstringNãoObservações internas
special_requestsstringNãoSolicitações especiais (ex: "check-in tardio")

Hóspedes (guests)

CampoTipoObrigatórioDescrição
first_namestringSimNome
last_namestringSimSobrenome
document_typestringNãoTipo: cpf, passport, rg
document_numberstringNãoNúmero do documento
emailstringNãoE-mail do hóspede
phonestringNãoTelefone
birth_datestringNãoData de nascimento (YYYY-MM-DD)

Pagamento (payment)

CampoTipoObrigatórioDescrição
methodstringSimMétodo: pix, credit_card, boleto
installmentsnumberNãoParcelas (1-12, apenas cartão de crédito)
credit_cardobjectCondicionalObrigatório quando method = credit_card
credit_card_holder_infoobjectNãoEndereço do titular (recomendado para cartão)

Cartão de Crédito (payment.credit_card)

CampoTipoObrigatórioDescrição
holder_namestringSimNome impresso no cartão
numberstringSimNúmero do cartão
expiry_monthstringSimMês de validade (2 dígitos, ex: "03")
expiry_yearstringSimAno de validade (4 dígitos, ex: "2028")
ccvstringSimCódigo de segurança (3-4 dígitos)

Endereço do Titular (payment.credit_card_holder_info)

CampoTipoObrigatórioDescrição
namestringSimNome completo do titular
emailstringSimE-mail do titular
cpf_cnpjstringSimCPF ou CNPJ do titular
postal_codestringSimCEP (8 dígitos)
address_numberstringSimNúmero do endereço
phonestringNãoTelefone
address_streetstringNãoRua
address_complementstringNãoComplemento
address_neighborhoodstringNãoBairro
address_citystringNãoCidade
address_statestringNãoEstado (UF)

Exemplo: Reserva com PIX

curl -X POST https://app.moblix.net/api/v1/hotels/book \
  -H "Authorization: Bearer mbx_live_sua_chave_aqui" \
  -H "Content-Type: application/json" \
  -d '{
    "prebook_token": "pbk_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "customer_id": "uuid-do-cliente",
    "guests": [
      {
        "first_name": "João",
        "last_name": "Silva",
        "document_type": "cpf",
        "document_number": "12345678900",
        "email": "joao@example.com",
        "phone": "+5511999999999"
      },
      {
        "first_name": "Maria",
        "last_name": "Silva",
        "document_type": "cpf",
        "document_number": "98765432100"
      }
    ],
    "payment": {
      "method": "pix"
    },
    "special_requests": "Check-in após as 18h"
  }'
const response = await fetch('https://app.moblix.net/api/v1/hotels/book', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer mbx_live_sua_chave_aqui',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    prebook_token: 'pbk_a1b2c3d4-e5f6-7890-abcd-ef1234567890',
    customer_id: 'uuid-do-cliente',
    guests: [
      {
        first_name: 'João',
        last_name: 'Silva',
        document_type: 'cpf',
        document_number: '12345678900',
        email: 'joao@example.com',
        phone: '+5511999999999'
      },
      {
        first_name: 'Maria',
        last_name: 'Silva',
        document_type: 'cpf',
        document_number: '98765432100'
      }
    ],
    payment: {
      method: 'pix'
    },
    special_requests: 'Check-in após as 18h'
  })
});

const data = await response.json();
console.log('Reserva:', data.data.booking.booking_number);
console.log('PIX:', data.data.payment.pix_code);
import requests

response = requests.post(
    'https://app.moblix.net/api/v1/hotels/book',
    headers={
        'Authorization': 'Bearer mbx_live_sua_chave_aqui',
        'Content-Type': 'application/json'
    },
    json={
        'prebook_token': 'pbk_a1b2c3d4-e5f6-7890-abcd-ef1234567890',
        'customer_id': 'uuid-do-cliente',
        'guests': [
            {
                'first_name': 'João',
                'last_name': 'Silva',
                'document_type': 'cpf',
                'document_number': '12345678900',
                'email': 'joao@example.com',
                'phone': '+5511999999999'
            },
            {
                'first_name': 'Maria',
                'last_name': 'Silva',
                'document_type': 'cpf',
                'document_number': '98765432100'
            }
        ],
        'payment': {
            'method': 'pix'
        },
        'special_requests': 'Check-in após as 18h'
    }
)

data = response.json()
print('Reserva:', data['data']['booking']['booking_number'])
print('PIX:', data['data']['payment']['pix_code'])

Exemplo: Reserva com Cartão de Crédito

{
  "prebook_token": "pbk_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "customer_id": "uuid-do-cliente",
  "guests": [
    {
      "first_name": "João",
      "last_name": "Silva",
      "document_type": "cpf",
      "document_number": "12345678900"
    }
  ],
  "payment": {
    "method": "credit_card",
    "installments": 3,
    "credit_card": {
      "holder_name": "JOAO SILVA",
      "number": "4111111111111111",
      "expiry_month": "12",
      "expiry_year": "2028",
      "ccv": "123"
    },
    "credit_card_holder_info": {
      "name": "João Silva",
      "email": "joao@example.com",
      "cpf_cnpj": "12345678900",
      "postal_code": "22041080",
      "address_number": "1702",
      "phone": "+5511999999999"
    }
  }
}

Resposta de Sucesso (201 Created)

Resposta com PIX

{
  "data": {
    "booking": {
      "id": "uuid-da-reserva",
      "booking_number": "BK-1234567890",
      "locator": "ABC123",
      "status": "pending",
      "total_amount": 4500.00,
      "currency": "BRL"
    },
    "payment": {
      "id": "uuid-do-pagamento",
      "method": "pix",
      "amount": 4500.00,
      "status": "pending",
      "pix_qr_code": "data:image/png;base64,...",
      "pix_code": "00020126580014br.gov.bcb.pix...",
      "expires_at": "2026-01-26T11:30:00Z"
    }
  },
  "timestamp": "2026-01-26T10:30:00Z"
}

Resposta com Cartão de Crédito

{
  "data": {
    "booking": {
      "id": "uuid-da-reserva",
      "booking_number": "BK-1234567890",
      "locator": "ABC123",
      "status": "confirmed",
      "total_amount": 4500.00,
      "currency": "BRL"
    },
    "payment": {
      "id": "uuid-do-pagamento",
      "method": "credit_card",
      "amount": 4500.00,
      "status": "paid"
    }
  },
  "timestamp": "2026-01-26T10:30:00Z"
}

Pagamentos com cartão de crédito são confirmados imediatamente (status: "confirmed"). Para PIX e boleto, a reserva fica como pending até o pagamento ser confirmado via webhook.

Campos da Resposta

Booking

CampoTipoDescrição
idstringUUID da reserva
booking_numberstringNúmero da reserva (ex: BK-1234567890)
locatorstringLocalizador da reserva (código curto)
statusstringpending (aguardando pagamento) ou confirmed (pago)
total_amountnumberValor total
currencystringMoeda

Payment

CampoTipoDescrição
idstringUUID do pagamento
methodstringMétodo utilizado
amountnumberValor cobrado
statusstringpending ou paid
pix_qr_codestringQR Code PIX em base64 (apenas para PIX)
pix_codestringCódigo PIX copia-e-cola (apenas para PIX)
boleto_urlstringURL do boleto PDF (apenas para boleto)
payment_urlstringURL de pagamento (quando disponível)
expires_atstringExpiração do pagamento (ISO 8601)

Erros Possíveis

HTTPErroDescrição
400Validation errorCampos obrigatórios faltando ou inválidos
400credit_card data is requiredFaltam dados do cartão
400Prebook token already usedToken já foi utilizado
400No payment provider configuredNenhum gateway suporta o método
404Prebook token not foundToken não encontrado
404Customer not foundCliente não pertence ao time
410Prebook token expiredToken expirou (criar novo prebook)

Fluxo Completo — Exemplo Passo a Passo

Aqui está um exemplo completo de integração, do início ao fim:

const API_URL = 'https://app.moblix.net';
const API_KEY = 'mbx_live_sua_chave_aqui';

const headers = {
  'Authorization': `Bearer ${API_KEY}`,
  'Content-Type': 'application/json'
};

// Passo 1: Buscar código da cidade
const destResult = await fetch(
  `${API_URL}/api/v1/hotels/destinations?q=rio+de+janeiro`,
  { headers }
).then(r => r.json());

const cityCode = destResult.data.destinations[0].code; // "1650"

// Passo 2: Buscar hotéis disponíveis
const searchResult = await fetch(`${API_URL}/api/v1/hotels/search`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    cityCode,
    checkIn: '2026-03-15',
    checkOut: '2026-03-20',
    adults: 2,
    rooms: 1
  })
}).then(r => r.json());

const hotel = searchResult.data.hotels[0];
// hotel.hotelSearchCode → código para usar no details e prebook
// hotel.offers → lista de todas as ofertas disponíveis

// Passo 3 (opcional): Obter detalhes completos do hotel
const details = await fetch(`${API_URL}/api/v1/hotels/details`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    hotel_search_code: hotel.hotelSearchCode,
    hotel_id: hotel.hotelId,
    language: 'pt'
  })
}).then(r => r.json());

console.log('Fotos:', details.data.pictures);
console.log('Facilidades:', details.data.facilities);

// Passo 4: Pré-reservar o hotel (escolha uma oferta específica ou use a melhor)
const selectedOffer = hotel.offers[0]; // ou hotel.hotelSearchCode para a melhor
const prebook = await fetch(`${API_URL}/api/v1/hotels/prebook`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    hotel_search_code: selectedOffer.hotelSearchCode,
    search_session_id: hotel.searchSessionId,
    check_in: '2026-03-15',
    check_out: '2026-03-20',
    adults: 2,
    rooms: 1,
    hotel_name: hotel.name,
    hotel_id: hotel.id,
    unit_price: selectedOffer.totalPrice
  })
}).then(r => r.json());

// Passo 5: Confirmar reserva com pagamento
const booking = await fetch(`${API_URL}/api/v1/hotels/book`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    prebook_token: prebook.data.prebook_token,
    customer_id: 'uuid-do-cliente',
    guests: [
      {
        first_name: 'João',
        last_name: 'Silva',
        document_type: 'cpf',
        document_number: '12345678900',
        email: 'joao@example.com'
      }
    ],
    payment: { method: 'pix' }
  })
}).then(r => r.json());

console.log('Reserva criada:', booking.data.booking.booking_number);
console.log('PIX para pagamento:', booking.data.payment.pix_code);

Modos de Emissão e Pagamento

Como funciona o pagamento

Para a integração com BestBuy Travel, o pagamento é sempre processado no gateway de pagamento da sua agência (via PIX, cartão de crédito ou boleto configurado na Moblix). A BestBuy não processa pagamentos diretamente dos clientes.

Modos de Emissão

Ao configurar as credenciais da BestBuy no painel, você pode escolher entre dois modos de emissão:

Modo Automático (Faturamento)

Cliente paga → Sistema cria reserva automaticamente na BestBuy → Faturamento
  • A reserva é criada automaticamente na BestBuy assim que o pagamento é confirmado
  • Você é faturado automaticamente pela BestBuy pela reserva criada
  • Cliente recebe confirmação imediata com voucher

Modo Manual (Confirmação posterior)

Cliente paga → Pedido interno criado → Agente confirma manualmente → Reserva na BestBuy
  • A reserva fica como "Pendente de Confirmação" após o pagamento
  • Você decide manualmente quando confirmar no fornecedor pelo painel
  • Só é faturado quando você confirmar manualmente

O modo de emissão é configurado em Configurações → Integrações → Provedores de Hotéis no painel da Moblix.

Fluxo de Faturamento

  1. Cliente paga na sua agência (via gateway Moblix)
  2. Você recebe o valor integral do cliente
  3. Fornecedor fatura você pela reserva (apenas no modo automático ou após confirmação manual)
  4. Você é responsável por pagar o fornecedor conforme contrato comercial

Consultar e Gerenciar Reservas

Após criar uma reserva de hotel, você pode consultá-la e gerenciá-la pela API de Reservas:

  • Listar reservasGET /api/v1/bookings?type=hotel
  • Buscar por IDGET /api/v1/bookings/:id
  • AtualizarPATCH /api/v1/bookings/:id
  • CancelarDELETE /api/v1/bookings/:id

Rate Limit

EndpointLimite
/hotels/search30 req/min
/hotels/details60 req/min
/hotels/prebook60 req/min
/hotels/book30 req/min

On this page