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"
]
}
}