API de Voos
API

Autocomplete de Aeroportos

Buscar aeroportos e cidades para formulários de pesquisa

Autocomplete de Aeroportos

A API oferece endpoints para buscar aeroportos e cidades, ideal para implementar campos de autocomplete em formulários de busca de voos.

Busca Inteligente

O sistema busca por código IATA, nome do aeroporto, cidade, estado e país. Perfeito para autocomplete com busca rápida.


POST /api/flights/consulta-aereo/aeroportos

Lista aeroportos filtrados por texto de busca.

Request

POST /api/flights/consulta-aereo/aeroportos?filtro=sao%20paulo
Authorization: Bearer sua_chave_aqui

Parâmetros

ParâmetroTipoObrigatórioDescrição
filtrostringNãoTexto para filtrar aeroportos (busca em nome, cidade, código IATA)

Response

{
  "Success": true,
  "Message": "Aeroportos encontrados com sucesso",
  "Data": [
    {
      "Iata": "GRU",
      "Aeroporto": "Aeroporto Internacional de São Paulo/Guarulhos",
      "Cidade": "São Paulo",
      "Estado": "SP",
      "Pais": "Brasil",
      "Latitude": -23.4356,
      "Longitude": -46.4731
    },
    {
      "Iata": "CGH",
      "Aeroporto": "Aeroporto de Congonhas",
      "Cidade": "São Paulo",
      "Estado": "SP",
      "Pais": "Brasil",
      "Latitude": -23.6261,
      "Longitude": -46.6564
    },
    {
      "Iata": "VCP",
      "Aeroporto": "Aeroporto Internacional de Viracopos",
      "Cidade": "Campinas",
      "Estado": "SP",
      "Pais": "Brasil",
      "Latitude": -23.0074,
      "Longitude": -47.1345
    }
  ]
}

Campos da Resposta

CampoTipoDescrição
IatastringCódigo IATA do aeroporto (3 letras)
AeroportostringNome completo do aeroporto
CidadestringCidade onde o aeroporto está localizado
EstadostringEstado/província (quando aplicável)
PaisstringPaís do aeroporto
LatitudenumberCoordenada de latitude
LongitudenumberCoordenada de longitude

POST /api/flights/consulta-aereo/pesquisar-aeroporto

Busca aeroportos específicos por códigos IATA.

Request

{
  "Iatas": ["GRU", "MIA", "CDG"],
  "PegarFotos": false
}

Parâmetros

ParâmetroTipoObrigatórioDescrição
IatasarraySimLista de códigos IATA para buscar
PegarFotosbooleanNãoSe deve incluir URLs de fotos (padrão: false)

Response

{
  "Success": true,
  "Message": "Aeroportos encontrados",
  "Data": [
    {
      "Iata": "GRU",
      "Aeroporto": "Aeroporto Internacional de São Paulo/Guarulhos",
      "Cidade": "São Paulo",
      "Estado": "SP",
      "Pais": "Brasil",
      "Latitude": -23.4356,
      "Longitude": -46.4731,
      "FotoUrl": "https://..."
    },
    {
      "Iata": "MIA",
      "Aeroporto": "Miami International Airport",
      "Cidade": "Miami",
      "Estado": "FL",
      "Pais": "Estados Unidos",
      "Latitude": 25.7959,
      "Longitude": -80.2870,
      "FotoUrl": "https://..."
    }
  ]
}

Exemplos de Implementação

React com TypeScript

import { useState, useEffect } from 'react';

interface Airport {
  Iata: string;
  Aeroporto: string;
  Cidade: string;
  Estado: string;
  Pais: string;
}

function AirportAutocomplete() {
  const [query, setQuery] = useState('');
  const [airports, setAirports] = useState<Airport[]>([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    if (query.length < 2) {
      setAirports([]);
      return;
    }

    const timer = setTimeout(async () => {
      setLoading(true);
      try {
        const response = await fetch(
          `/api/flights/consulta-aereo/aeroportos?filtro=${encodeURIComponent(query)}`,
          {
            method: 'POST',
            headers: {
              'Authorization': `Bearer ${process.env.API_KEY}`
            }
          }
        );
        
        const data = await response.json();
        if (data.Success) {
          setAirports(data.Data);
        }
      } catch (error) {
        console.error('Erro ao buscar aeroportos:', error);
      } finally {
        setLoading(false);
      }
    }, 300); // Debounce de 300ms

    return () => clearTimeout(timer);
  }, [query]);

  return (
    <div className="relative">
      <input
        type="text"
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="Digite cidade ou aeroporto..."
        className="w-full px-4 py-2 border rounded"
      />
      
      {loading && (
        <div className="absolute top-full mt-1 w-full p-2 bg-white border rounded">
          Buscando...
        </div>
      )}
      
      {airports.length > 0 && (
        <ul className="absolute top-full mt-1 w-full bg-white border rounded shadow-lg max-h-60 overflow-auto">
          {airports.map((airport) => (
            <li
              key={airport.Iata}
              className="px-4 py-2 hover:bg-gray-100 cursor-pointer"
              onClick={() => {
                setQuery(`${airport.Iata} - ${airport.Cidade}`);
                setAirports([]);
              }}
            >
              <div className="font-semibold">
                {airport.Iata} - {airport.Cidade}
              </div>
              <div className="text-sm text-gray-600">
                {airport.Aeroporto}
              </div>
              <div className="text-xs text-gray-500">
                {airport.Estado && `${airport.Estado}, `}{airport.Pais}
              </div>
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

JavaScript Vanilla

class AirportSearch {
  constructor(inputElement, apiKey) {
    this.input = inputElement;
    this.apiKey = apiKey;
    this.debounceTimer = null;
    this.resultsContainer = this.createResultsContainer();
    
    this.input.addEventListener('input', (e) => this.handleInput(e));
  }
  
  createResultsContainer() {
    const container = document.createElement('div');
    container.className = 'airport-results';
    container.style.cssText = `
      position: absolute;
      background: white;
      border: 1px solid #ccc;
      border-radius: 4px;
      max-height: 300px;
      overflow-y: auto;
      display: none;
    `;
    this.input.parentElement.appendChild(container);
    return container;
  }
  
  handleInput(event) {
    const query = event.target.value;
    
    clearTimeout(this.debounceTimer);
    
    if (query.length < 2) {
      this.hideResults();
      return;
    }
    
    this.debounceTimer = setTimeout(() => {
      this.searchAirports(query);
    }, 300);
  }
  
  async searchAirports(query) {
    try {
      const response = await fetch(
        `/api/flights/consulta-aereo/aeroportos?filtro=${encodeURIComponent(query)}`,
        {
          method: 'POST',
          headers: {
            'Authorization': `Bearer ${this.apiKey}`
          }
        }
      );
      
      const data = await response.json();
      
      if (data.Success && data.Data.length > 0) {
        this.showResults(data.Data);
      } else {
        this.hideResults();
      }
    } catch (error) {
      console.error('Erro ao buscar aeroportos:', error);
      this.hideResults();
    }
  }
  
  showResults(airports) {
    this.resultsContainer.innerHTML = airports.map(airport => `
      <div class="airport-item" data-iata="${airport.Iata}" style="padding: 10px; cursor: pointer;">
        <div style="font-weight: bold;">${airport.Iata} - ${airport.Cidade}</div>
        <div style="font-size: 0.9em; color: #666;">${airport.Aeroporto}</div>
        <div style="font-size: 0.8em; color: #999;">
          ${airport.Estado ? airport.Estado + ', ' : ''}${airport.Pais}
        </div>
      </div>
    `).join('');
    
    this.resultsContainer.style.display = 'block';
    
    // Adicionar event listeners
    this.resultsContainer.querySelectorAll('.airport-item').forEach(item => {
      item.addEventListener('click', () => {
        this.selectAirport(item.dataset.iata);
      });
    });
  }
  
  hideResults() {
    this.resultsContainer.style.display = 'none';
  }
  
  selectAirport(iata) {
    this.input.value = iata;
    this.hideResults();
    // Disparar evento customizado
    this.input.dispatchEvent(new CustomEvent('airportSelected', {
      detail: { iata }
    }));
  }
}

// Uso:
const searchInput = document.getElementById('airport-search');
const airportSearch = new AirportSearch(searchInput, 'sua_api_key');

searchInput.addEventListener('airportSelected', (e) => {
  console.log('Aeroporto selecionado:', e.detail.iata);
});

Dicas de UX

Melhores Práticas

  • Use debounce de 300ms para evitar requisições excessivas
  • Exiba resultados a partir de 2 caracteres digitados
  • Mostre código IATA, cidade e nome do aeroporto
  • Adicione loading state durante a busca
  • Feche os resultados ao clicar fora do componente

Exemplo de Exibição

┌─────────────────────────────────────────┐
│ GRU - São Paulo                         │
│ Aeroporto Internacional de SP/Guarulhos │
│ SP, Brasil                              │
├─────────────────────────────────────────┤
│ CGH - São Paulo                         │
│ Aeroporto de Congonhas                  │
│ SP, Brasil                              │
├─────────────────────────────────────────┤
│ VCP - Campinas                          │
│ Aeroporto Internacional de Viracopos    │
│ SP, Brasil                              │
└─────────────────────────────────────────┘

Principais Aeroportos Brasileiros

Para referência rápida:

IATAAeroportoCidade
GRUGuarulhosSão Paulo
CGHCongonhasSão Paulo
GIGGaleãoRio de Janeiro
SDUSantos DumontRio de Janeiro
BSBPresidente Juscelino KubitschekBrasília
CNFTancredo NevesBelo Horizonte
SSADeputado Luís Eduardo MagalhãesSalvador
RECGuararapesRecife
FORPinto MartinsFortaleza
CWBAfonso PenaCuritiba
POASalgado FilhoPorto Alegre
FLNHercílio LuzFlorianópolis

Erros Comuns

CódigoErroSolução
401UnauthorizedVerifique sua API key
400Invalid IATA codeUse códigos IATA de 3 letras
404Airport not foundCódigo IATA não existe
429Rate limit exceededReduza frequência de requisições

Performance

  • Latência típica: 50-200ms
  • Cache recomendado: 24 horas (dados de aeroportos mudam raramente)
  • Rate limit: Compartilhado com outros endpoints (conforme seu plano)

On this page