Skip to Content
Busca de VoosExemplos completos

Exemplos completos

Todos os exemplos usam https://api.economilha.com. Substitua sua-api-key-aqui pela sua chave.

1. Busca somente ida (ONE_WAY)

curl -X POST https://api.economilha.com/flights/search \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.economilha.v1+json" \ -H "x-api-key: sua-api-key-aqui" \ -d '{ "airlineLoyalty": ["SMILES"], "tripType": "ONE_WAY", "cabinType": "ECONOMY", "origin": "GRU", "destination": "REC", "departureDate": "2026-03-15", "passengers": { "adults": 1, "children": 0, "infants": 0 } }'

Response 200 OK:

{ "results": [ { "airline": "SMILES", "success": true, "data": { ... } } ], "summary": { "totalAirlinesRequested": 1, "successfulSearches": 1, "failedSearches": 0 } }

2. Ida e volta (ROUND_TRIP)

curl -X POST https://api.economilha.com/flights/search \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.economilha.v1+json" \ -H "x-api-key: sua-api-key-aqui" \ -d '{ "airlineLoyalty": ["LATAM"], "tripType": "ROUND_TRIP", "cabinType": "ECONOMY", "origin": "GRU", "destination": "MIA", "departureDate": "2026-04-10", "returnDate": "2026-04-25", "passengers": { "adults": 2, "children": 1, "infants": 0 } }'

Response 200 OK:

{ "results": [ { "airline": "LATAM", "success": true, "data": { "outbound": { ... }, "inbound": { ... }, "selectedOutboundOfferId": "offer-123" } } ], "summary": { "totalAirlinesRequested": 1, "successfulSearches": 1, "failedSearches": 0 } }

Uma busca ROUND_TRIP consome 2 unidades de quota (ida e volta), contra 1 de um ONE_WAY. Ver Quota e limites.

3. Comparando programas em paralelo

Para montar uma tela de comparação, dispare uma requisição por programa ao mesmo tempo e vá exibindo cada resposta assim que ela chegar:

const PROGRAMAS = ['SMILES', 'LATAM', 'AZUL'] const busca = { tripType: 'ONE_WAY', cabinType: 'ECONOMY', origin: 'GRU', destination: 'MIA', departureDate: '2026-04-10', passengers: { adults: 1 }, responseFormat: 'PARSED' } PROGRAMAS.forEach(async programa => { try { const res = await fetch('https://api.economilha.com/flights/search', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.economilha.v1+json', 'x-api-key': 'sua-api-key-aqui' }, body: JSON.stringify({ ...busca, airlineLoyalty: [programa] }), signal: AbortSignal.timeout(50_000) // rede de segurança; a API já corta em 29s }) const { results } = await res.json() renderizarPrograma(programa, results[0]) // pinta a tela assim que chega } catch { renderizarIndisponivel(programa) // timeout ou erro de rede } })

Evite Promise.all aqui: ele só resolve quando a última chamada terminar, então um programa lento segura na tela dois que já responderam em 4 segundos. Renderize cada resposta individualmente. Ver Comparando vários programas.

4. Busca em dinheiro (CASH)

curl -X POST https://api.economilha.com/flights/search \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.economilha.v1+json" \ -H "x-api-key: sua-api-key-aqui" \ -d '{ "airlineLoyalty": ["GOL"], "tripType": "ONE_WAY", "cabinType": "ECONOMY", "origin": "GRU", "destination": "REC", "departureDate": "2026-04-10", "passengers": { "adults": 1, "children": 0, "infants": 0 }, "priceType": "CASH" }'

Response 200 OK:

{ "results": [ { "airline": "GOL", "success": true, "data": { "outbound": { ... }, "inbound": null } } ], "summary": { "totalAirlinesRequested": 1, "successfulSearches": 1, "failedSearches": 0 } }

O conteúdo de data para buscas em dinheiro é a resposta original e bruta da API da companhia.

5. Dados já tratados (responseFormat = PARSED)

curl -X POST https://api.economilha.com/flights/search \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.economilha.v1+json" \ -H "x-api-key: sua-api-key-aqui" \ -d '{ "airlineLoyalty": ["LATAM"], "tripType": "ONE_WAY", "cabinType": "ECONOMY", "origin": "GRU", "destination": "MIA", "departureDate": "2026-04-10", "passengers": { "adults": 1, "children": 0, "infants": 0 }, "responseFormat": "PARSED" }'

Response 200 OK:

{ "results": [ { "airline": "LATAM", "success": true, "flights": [ { "id": "ba2b7811-9117-4825-a0aa-3d7ea50997a0", "airlineLoyalty": "LATAM", "origin": "GRU", "destination": "MIA", "departureDate": "2026-04-10T22:15:00", "arrivalDate": "2026-04-11T06:30:00", "cabinType": "ECONOMY", "tripType": "ONE_WAY", "direction": "OUTBOUND", "stops": 0, "durationMinutes": 495, "flightCode": "LA8084", "availableSeats": null, "equipment": "789", "fareSource": null, "fares": [ { "fareType": "LATAM_LIGHT", "miles": 45000, "money": 0.0, "taxes": 210.5, "fees": 0.0, "totalMoney": 210.5, "baseMiles": null, "classOfService": null, "productClass": "LIGHT" } ], "legs": [ { "airlineCode": "LA", "flightNumber": "8084", "cabinType": "ECONOMY", "departureAirport": "GRU", "arrivalAirport": "MIA", "departureDate": "2026-04-10T22:15:00", "arrivalDate": "2026-04-11T06:30:00", "equipment": "789", "classOfService": null, "durationMinutes": 495, "isConnection": false } ] } ] } ], "summary": { "totalAirlinesRequested": 1, "successfulSearches": 1, "failedSearches": 0 } }

Quando a busca funciona mas não há disponibilidade, flights volta como []. Isso é diferente de flights: null, que indica falha.

6. Consultar quota

curl -X GET https://api.economilha.com/quota \ -H "Accept: application/vnd.economilha.v1+json" \ -H "x-api-key: sua-api-key-aqui"

Response 200 OK:

{ "limit": 1000, "consumed": 45, "remaining": 955, "usageByCompany": [ { "airlineLoyalty": "SMILES", "consumed": 20 }, { "airlineLoyalty": "LATAM", "consumed": 15 }, { "airlineLoyalty": "AZUL", "consumed": 10 } ] }

7. Erro de validação

Request sem o campo obrigatório origin:

curl -X POST https://api.economilha.com/flights/search \ -H "Content-Type: application/json" \ -H "x-api-key: sua-api-key-aqui" \ -d '{ "airlineLoyalty": ["SMILES"], "tripType": "ONE_WAY", "cabinType": "ECONOMY", "destination": "REC", "departureDate": "2026-03-15", "passengers": { "adults": 1 } }'

Response 422 Unprocessable Entity:

{ "error": { "code": "VALIDATION_ERROR", "message": "Request validation failed", "details": { "errors": [ { "field": "body -> origin", "message": "Field required", "type": "missing" } ] }, "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } }

8. API Key ausente

Response 401 Unauthorized:

{ "error": { "code": "HTTP_ERROR", "message": "API key is required. Please provide a valid x-api-key header.", "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } }

9. Quota insuficiente

Response 402 Payment Required:

{ "error": { "code": "HTTP_ERROR", "message": "Insufficient quota. Required: 2, please check your remaining quota.", "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" } }

10. Media type não suportado

curl -X GET https://api.economilha.com/quota \ -H "Accept: application/xml" \ -H "x-api-key: sua-api-key-aqui"

Response 406 Not Acceptable:

{ "error": { "code": "NOT_ACCEPTABLE", "message": "The requested media type is not supported", "supportedMediaTypes": [ "application/vnd.economilha.v1+json", "application/json" ] } }
Last updated on