Reservei Docs
Referência da API

Voos

Buscar e consultar ofertas de voos através da API Reservei

Voos

Busque ofertas de voos em tempo real. A API Reservei oferece acesso a mais de 300 companhias aéreas com preços calculados automaticamente incluindo markup e taxas da sua agência.

Preços Calculados

Todos os preços retornados já incluem: tarifa base, taxas de embarque, markup configurado e taxa fixa da sua agência. O campo client_amount é o valor final em BRL para cobrar do cliente.

POST /api/v1/flights/search

Busca ofertas de voos disponíveis para o itinerário especificado.

Request

{
  "type": "round_trip",
  "slices": [
    {
      "origin": "GRU",
      "destination": "MIA",
      "departureDate": "2025-03-15"
    },
    {
      "origin": "MIA",
      "destination": "GRU",
      "departureDate": "2025-03-22"
    }
  ],
  "passengers": [
    { "type": "adult", "count": 2 },
    { "type": "child", "count": 1 },
    { "type": "infant_without_seat", "count": 1 }
  ],
  "cabinClass": "economy"
}

Parâmetros do Request

CampoTipoObrigatórioDescrição
typestringSimTipo de viagem: one_way, round_trip ou multi_city
slicesarraySimTrechos da viagem (veja detalhes abaixo)
passengersarraySimLista de passageiros por tipo
cabinClassstringNãoClasse da cabine (padrão: economy)

Objeto Slice

CampoTipoObrigatórioDescrição
originstringSimCódigo IATA do aeroporto/cidade de origem (ex: GRU, SAO)
destinationstringSimCódigo IATA do aeroporto/cidade de destino (ex: MIA, NYC)
departureDatestringSimData de partida no formato YYYY-MM-DD

Você pode usar códigos de aeroporto (ex: GRU, JFK) ou códigos de cidade (ex: SAO, NYC). Códigos de cidade retornam voos de todos os aeroportos da cidade.

Objeto Passenger

CampoTipoObrigatórioDescrição
typestringSimTipo: adult, child, infant_without_seat
countnumberSimQuantidade de passageiros deste tipo

Regras de Passageiros:

  • adult: 12+ anos na data do voo
  • child: 2-11 anos na data do voo
  • infant_without_seat: 0-1 ano (viaja no colo de um adulto)
  • Cada infant_without_seat precisa de um adult associado

Classes de Cabine

ValorDescrição
economyClasse Econômica
premium_economyEconômica Premium
businessClasse Executiva
firstPrimeira Classe

Response

{
  "id": "orq_0000AbCdEf123456",
  "offers": [
    {
      "id": "off_0000GhIjKl789012",
      "total_amount": "1250.50",
      "total_currency": "USD",
      "client_amount": "7825.60",
      "client_currency": "BRL",
      "original_amount": 1250.50,
      "original_currency": "USD",
      "exchange_rate_used": 5.46,
      "base_cost_brl": "6825.73",
      "agency_markup_percent": 12,
      "agency_markup_amount": "819.09",
      "agency_fee_amount": "50.00",
      "total_agency_commission": "869.09",
      "markup_applied": "819.09",
      "fee_applied": "50.00",
      "expires_at": "2025-01-15T16:30:00Z",
      "owner": {
        "iata_code": "LA",
        "name": "LATAM Airlines"
      },
      "slices": [
        {
          "id": "sli_0000MnOpQr345678",
          "origin": {
            "iata_code": "GRU",
            "name": "São Paulo-Guarulhos International Airport",
            "city_name": "São Paulo",
            "iata_city_code": "SAO",
            "time_zone": "America/Sao_Paulo"
          },
          "destination": {
            "iata_code": "MIA",
            "name": "Miami International Airport",
            "city_name": "Miami",
            "iata_city_code": "MIA",
            "time_zone": "America/New_York"
          },
          "duration": "PT9H30M",
          "segments": [
            {
              "id": "seg_0000StUvWx901234",
              "origin": {
                "iata_code": "GRU",
                "name": "São Paulo-Guarulhos International Airport",
                "terminal": "3"
              },
              "destination": {
                "iata_code": "MIA",
                "name": "Miami International Airport",
                "terminal": "J"
              },
              "departing_at": "2025-03-15T08:00:00",
              "arriving_at": "2025-03-15T16:30:00",
              "operating_carrier": {
                "iata_code": "LA",
                "name": "LATAM Airlines",
                "logo_symbol_url": "https://assets.reservei.co/airlines/LA.svg"
              },
              "marketing_carrier": {
                "iata_code": "LA",
                "name": "LATAM Airlines"
              },
              "operating_carrier_flight_number": "8084",
              "marketing_carrier_flight_number": "8084",
              "aircraft": {
                "iata_code": "789",
                "name": "Boeing 787-9"
              },
              "duration": "PT9H30M",
              "distance": "6912.00",
              "passengers": [
                {
                  "passenger_id": "pas_0000YzAbCd567890",
                  "cabin_class": "economy",
                  "cabin_class_marketing_name": "Economy",
                  "fare_basis_code": "YOWBR",
                  "baggages": [
                    {
                      "type": "checked",
                      "quantity": 1
                    },
                    {
                      "type": "carry_on",
                      "quantity": 1
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "passengers": [
        {
          "id": "pas_0000YzAbCd567890",
          "type": "adult",
          "fare_brand_name": "Light",
          "loyalty_programme_accounts": []
        }
      ],
      "conditions": {
        "refund_before_departure": {
          "allowed": false,
          "penalty_amount": null,
          "penalty_currency": null
        },
        "change_before_departure": {
          "allowed": true,
          "penalty_amount": "150.00",
          "penalty_currency": "USD"
        }
      },
      "payment_requirements": {
        "requires_instant_payment": false,
        "price_guarantee_expires_at": "2025-01-15T23:59:00Z",
        "payment_required_by": "2025-01-16T23:59:00Z"
      }
    }
  ],
  "slices": [...],
  "passengers": [...]
}

Campos da Resposta

Offer (Oferta)

CampoTipoDescrição
idstringID único da oferta (usar para criar reserva)
total_amountstringValor original na moeda da companhia
total_currencystringMoeda original (USD, EUR, BRL)
client_amountstringValor final em BRL para cobrar do cliente
client_currencystringSempre BRL
exchange_rate_usednumberTaxa de câmbio aplicada
agency_markup_percentnumberMarkup configurado da sua agência
agency_markup_amountstringValor do markup em BRL
agency_fee_amountstringTaxa fixa da agência em BRL
total_agency_commissionstringTotal de comissão da agência
expires_atstringData/hora de expiração da oferta
ownerobjectCompanhia aérea principal
slicesarrayTrechos da viagem
passengersarrayPassageiros com IDs (usar na reserva)
conditionsobjectCondições de alteração e reembolso

Slice (Trecho)

CampoTipoDescrição
idstringID único do slice
originobjectAeroporto de origem
destinationobjectAeroporto de destino
durationstringDuração total (formato ISO 8601, ex: PT9H30M)
segmentsarrayVoos que compõem o trecho

Segment (Voo)

CampoTipoDescrição
idstringID único do segmento
operating_carrierobjectCompanhia que opera o voo
marketing_carrierobjectCompanhia que vende o voo
operating_carrier_flight_numberstringNúmero do voo operado
departing_atstringData/hora de partida (local)
arriving_atstringData/hora de chegada (local)
aircraftobjectTipo de aeronave
durationstringDuração do voo
passengersarrayDetalhes por passageiro (bagagem, classe)

Baggage (Bagagem)

CampoTipoDescrição
typestringchecked (despachada) ou carry_on (mão)
quantitynumberQuantidade incluída

Conditions (Condições)

CampoTipoDescrição
refund_before_departure.allowedbooleanSe reembolso é permitido
refund_before_departure.penalty_amountstringValor da multa para reembolso
change_before_departure.allowedbooleanSe alteração é permitida
change_before_departure.penalty_amountstringValor da multa para alteração

Exemplos de Busca

{
  "type": "one_way",
  "slices": [
    {
      "origin": "GRU",
      "destination": "LIS",
      "departureDate": "2025-06-15"
    }
  ],
  "passengers": [
    { "type": "adult", "count": 1 }
  ],
  "cabinClass": "economy"
}
{
  "type": "round_trip",
  "slices": [
    {
      "origin": "GRU",
      "destination": "CDG",
      "departureDate": "2025-07-10"
    },
    {
      "origin": "CDG",
      "destination": "GRU",
      "departureDate": "2025-07-25"
    }
  ],
  "passengers": [
    { "type": "adult", "count": 2 }
  ],
  "cabinClass": "economy"
}
{
  "type": "multi_city",
  "slices": [
    {
      "origin": "GRU",
      "destination": "FCO",
      "departureDate": "2025-09-01"
    },
    {
      "origin": "FCO",
      "destination": "BCN",
      "departureDate": "2025-09-08"
    },
    {
      "origin": "BCN",
      "destination": "GRU",
      "departureDate": "2025-09-15"
    }
  ],
  "passengers": [
    { "type": "adult", "count": 2 }
  ],
  "cabinClass": "economy"
}
{
  "type": "round_trip",
  "slices": [
    {
      "origin": "GRU",
      "destination": "JFK",
      "departureDate": "2025-04-20"
    },
    {
      "origin": "JFK",
      "destination": "GRU",
      "departureDate": "2025-04-27"
    }
  ],
  "passengers": [
    { "type": "adult", "count": 1 }
  ],
  "cabinClass": "business"
}

Exemplos de Código

async function searchFlights(searchParams) {
  const response = await fetch('https://app.reservei.co/api/v1/flights/search', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.RESERVEI_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(searchParams)
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.message || 'Erro na busca');
  }

  const data = await response.json();
  return data;
}

// Exemplo de uso
const result = await searchFlights({
  type: 'round_trip',
  slices: [
    { origin: 'GRU', destination: 'MIA', departureDate: '2025-03-15' },
    { origin: 'MIA', destination: 'GRU', departureDate: '2025-03-22' }
  ],
  passengers: [{ type: 'adult', count: 2 }],
  cabinClass: 'economy'
});

// Processar ofertas
result.offers.forEach(offer => {
  console.log(`${offer.owner.name}: R$ ${offer.client_amount}`);
  console.log(`  Duração: ${offer.slices[0].duration}`);
  console.log(`  Bagagem: ${offer.slices[0].segments[0].passengers[0].baggages[0].quantity} mala(s)`);
});
import requests
import os

def search_flights(search_params):
    response = requests.post(
        'https://app.reservei.co/api/v1/flights/search',
        headers={
            'Authorization': f'Bearer {os.environ["RESERVEI_API_KEY"]}',
            'Content-Type': 'application/json'
        },
        json=search_params
    )
    
    response.raise_for_status()
    return response.json()

# Exemplo de uso
result = search_flights({
    'type': 'round_trip',
    'slices': [
        {'origin': 'GRU', 'destination': 'MIA', 'departureDate': '2025-03-15'},
        {'origin': 'MIA', 'destination': 'GRU', 'departureDate': '2025-03-22'}
    ],
    'passengers': [{'type': 'adult', 'count': 2}],
    'cabinClass': 'economy'
})

# Processar ofertas
for offer in result['offers']:
    print(f"{offer['owner']['name']}: R$ {offer['client_amount']}")
    print(f"  Duração: {offer['slices'][0]['duration']}")
<?php

function searchFlights($searchParams) {
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL => 'https://app.reservei.co/api/v1/flights/search',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . getenv('RESERVEI_API_KEY'),
            'Content-Type: application/json'
        ],
        CURLOPT_POSTFIELDS => json_encode($searchParams)
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode !== 200) {
        throw new Exception('Erro na busca de voos');
    }
    
    return json_decode($response, true);
}

// Exemplo de uso
$result = searchFlights([
    'type' => 'round_trip',
    'slices' => [
        ['origin' => 'GRU', 'destination' => 'MIA', 'departureDate' => '2025-03-15'],
        ['origin' => 'MIA', 'destination' => 'GRU', 'departureDate' => '2025-03-22']
    ],
    'passengers' => [['type' => 'adult', 'count' => 2]],
    'cabinClass' => 'economy'
]);

// Processar ofertas
foreach ($result['offers'] as $offer) {
    echo "{$offer['owner']['name']}: R$ {$offer['client_amount']}\n";
}

Entendendo os Preços

A API calcula automaticamente os preços finais aplicando:

┌─────────────────────────────────────────────────────────────┐
│  Tarifa Base (USD/EUR)                                      │
│  Ex: $1,250.50                                              │
└────────────────────────┬────────────────────────────────────┘

                         ▼ × Taxa de Câmbio (5.46)
┌─────────────────────────────────────────────────────────────┐
│  Custo Base em BRL                                          │
│  Ex: R$ 6,827.73                                            │
└────────────────────────┬────────────────────────────────────┘

                         ▼ + Markup da Agência (12%)
┌─────────────────────────────────────────────────────────────┐
│  + Markup                                                   │
│  Ex: R$ 819.33                                              │
└────────────────────────┬────────────────────────────────────┘

                         ▼ + Taxa Fixa
┌─────────────────────────────────────────────────────────────┐
│  + Taxa Fixa                                                │
│  Ex: R$ 50.00                                               │
└────────────────────────┬────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│  VALOR FINAL (client_amount)                                │
│  Ex: R$ 7,697.06                                            │
└─────────────────────────────────────────────────────────────┘

Códigos IATA Comuns (Brasil)

CódigoAeroporto/Cidade
GRUSão Paulo - Guarulhos
CGHSão Paulo - Congonhas
SAOSão Paulo (todos aeroportos)
GIGRio de Janeiro - Galeão
SDURio de Janeiro - Santos Dumont
RIORio de Janeiro (todos aeroportos)
BSBBrasília
CNFBelo Horizonte - Confins
SSASalvador
RECRecife
FORFortaleza
POAPorto Alegre
CWBCuritiba
FLNFlorianópolis

Erros Comuns

CódigoErroSolução
400Invalid request parametersVerifique os campos obrigatórios
400Invalid airport codeUse códigos IATA válidos
400Invalid date formatUse formato YYYY-MM-DD
400Departure date in the pastData deve ser futura
401UnauthorizedVerifique sua API key
429Rate limit exceededAguarde antes de nova requisição

Dicas de Performance

  1. Seja específico: Use códigos de aeroporto quando possível (mais rápido que códigos de cidade)
  2. Limite passageiros: Busque apenas os passageiros necessários
  3. Cache local: Resultados podem ser cacheados por 5-10 minutos
  4. Requisições paralelas: Evite múltiplas buscas simultâneas

As ofertas expiram rapidamente (15-30 minutos). Sempre busque novamente antes de criar uma reserva se muito tempo passou.