// docs

MaxMilhas Flights Search

Extrai ofertas de voos da MaxMilhas por aeroporto de origem/destino, datas e passageiros. A API cria a busca, consulta as companhias retornadas e entrega ofertas normalizadas em JSON estruturado.

Tempo de resposta: Em algumas execuções, esta API pode levar até 1 minuto para responder. Isso é normal para este endpoint. Aguarde a conclusão da requisição.

Nota importante: alguns campos podem retornar null em produção, dependendo da página de origem. Nesta documentação, os exemplos de output são preenchidos intencionalmente com valores não nulos para facilitar integração.

Quando a entidade consultada não existe na origem, o extract e a tool MCP retornam 200 com data: null e notFound: true. Esse caso é tratado como resposta concluída, não como erro de servidor.

Chamada HTTP

cURL
curl -X POST https://api.geckoapi.com.br/v1/extract \
  -H "Authorization: Bearer SUA_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
  "target": "maxmilhas.com.br",
  "type": "plp",
  "from": "GRU",
  "to": "GIG",
  "departureDate": "2026-06-20",
  "returnDate": "2026-06-27",
  "numAdults": 1,
  "numChildren": 0,
  "numInfants": 0
}'

Chamada MCP

A mesma seam também aparece no MCP hospedado como uma tool dedicada. Os argumentos reaproveitam os campos do extract, mas target e type já ficam fixos pela tool.

Ver guia completo do MCP

Endpoint

POST /v1/mcp

Tool name

maxmilhas_com_br_plp

Auth

Bearer ou X-API-Key

maxmilhas_com_br_plp tools/call
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "maxmilhas_com_br_plp",
    "arguments": {
      "from": "GRU",
      "to": "GIG",
      "departureDate": "2026-06-20",
      "returnDate": "2026-06-27",
      "numAdults": 1,
      "numChildren": 0,
      "numInfants": 0,
      "executionId": "exec_example_123"
    }
  }
}

Possibilidades de input

Campos suportados nesta API do POST /v1/extract, com regras específicas de obrigatoriedade e condicionais.

Campo Tipo Status Regra Default Exemplo
from
Codigo IATA do aeroporto de origem para busca PLP da Decolar, GOL, LATAM, KAYAK, MaxMilhas e 123Milhas.
string (IATA 3 letras) Obrigatório Código IATA do aeroporto de origem com 3 letras (ex: GRU). - GRU
to
Codigo IATA do aeroporto de destino para busca PLP da Decolar, GOL, LATAM, KAYAK, MaxMilhas e 123Milhas.
string (IATA 3 letras) Obrigatório Código IATA do aeroporto de destino com 3 letras (ex: GIG). - GIG
departureDate
Data de saida para busca PLP da ClickBus, Decolar, GOL, LATAM, KAYAK, MaxMilhas e 123Milhas.
string (YYYY-MM-DD) Obrigatório Data de ida no formato YYYY-MM-DD. - 2026-05-17
returnDate
Data de retorno opcional para busca PLP da ClickBus, Decolar, GOL, LATAM, KAYAK, MaxMilhas e 123Milhas.
string (YYYY-MM-DD) Opcional Data de volta no formato YYYY-MM-DD. Deve ser maior ou igual a departureDate. Quando omitida, a busca é one-way. - 2026-05-20
target
Fonte alvo da extração.
enum Obrigatório Sempre obrigatório e deve ser maxmilhas.com.br. - mercadolivre.com.br
type
Tipo da extração: pdp, idp, plp, quote, review ou places.
enum Obrigatório Sempre obrigatório e deve ser plp. - pdp
numAdults
Quantidade de adultos para Booking, Airbnb, Hoteis.com, Decolar, GOL e LATAM.
integer (1-30) Opcional Quantidade de adultos. Deve ser inteiro entre 1 e 9. 1 2
numChildren
Quantidade de crianças para Booking, Hoteis.com, Decolar, GOL e LATAM.
integer (0-30) Opcional Quantidade de crianças. Deve ser inteiro entre 0 e 9. 0 0
numInfants
Quantidade de bebês para GOL e LATAM PLP. Deve ser menor ou igual à quantidade de adultos.
integer (0-9) Opcional Quantidade de bebês de colo. Deve ser inteiro entre 0 e 9 e menor ou igual a numAdults. 0 0

Exemplos de request

Busca MaxMilhas - ida e volta

Busca round-trip na MaxMilhas com origem, destino, datas e passageiros.

Busca MaxMilhas - ida e volta
{
  "target": "maxmilhas.com.br",
  "type": "plp",
  "from": "GRU",
  "to": "GIG",
  "departureDate": "2026-06-20",
  "returnDate": "2026-06-27",
  "numAdults": 1,
  "numChildren": 0,
  "numInfants": 0
}

Busca MaxMilhas - somente ida

Busca one-way informando apenas departureDate.

Busca MaxMilhas - somente ida
{
  "target": "maxmilhas.com.br",
  "type": "plp",
  "from": "CGH",
  "to": "SDU",
  "departureDate": "2026-07-10",
  "numAdults": 2,
  "numChildren": 0,
  "numInfants": 0
}

Schema de response (leaf paths)

Mapa de paths de saída com tipo esperado para esta API.

responseSchema
{
  "requestId": "string (uuid)",
  "executionId": "string (uuid)",
  "data.source": "string",
  "data.type": "string",
  "data.parser": "string",
  "data.url": "string",
  "data.requestUrl": "string",
  "data.createUrl": "string",
  "data.extractedAt": "string (iso datetime)",
  "data.searchType": "string (ONE_WAY | ROUND_TRIP)",
  "data.from": "string",
  "data.to": "string",
  "data.departureDate": "string (YYYY-MM-DD)",
  "data.returnDate": "string | null",
  "data.numAdults": "number",
  "data.numChildren": "number",
  "data.numInfants": "number",
  "data.cabin": "string",
  "data.searchId": "string | null",
  "data.airlines[]": "string",
  "data.success": "boolean",
  "data.complete": "boolean",
  "data.totalOffers": "number",
  "data.listedOffers": "number",
  "data.pollsPerformed": "number",
  "data.errors": "object",
  "data.cheapestOffer.airline": "string",
  "data.cheapestOffer.offerId": "string | null",
  "data.cheapestOffer.totalPrice": "number | null",
  "data.offers[].position": "number",
  "data.offers[].airline": "string",
  "data.offers[].offerId": "string | null",
  "data.offers[].type": "string | null",
  "data.offers[].cabin": "string | null",
  "data.offers[].totalPrice": "number | null",
  "data.offers[].adultPrice": "number | null",
  "data.offers[].fees": "number | null",
  "data.offers[].serviceCharge": "number | null",
  "data.offers[].boardingFees": "number | null",
  "data.offers[].label": "string | null",
  "data.offers[].baggage": "string | null",
  "data.offers[].minDurationText": "string | null",
  "data.offers[].outbound.carrier": "string | null",
  "data.offers[].outbound.departure": "string | null",
  "data.offers[].outbound.departureTime": "string | null",
  "data.offers[].outbound.arrival": "string | null",
  "data.offers[].outbound.arrivalTime": "string | null",
  "data.offers[].outbound.durationText": "string | null",
  "data.offers[].outbound.stops": "number | null",
  "data.offers[].inbound.carrier": "string | null",
  "data.offers[].inbound.departure": "string | null",
  "data.offers[].inbound.arrival": "string | null"
}

Exemplo de response

responseExample
{
  "requestId": "99999999-1111-4111-8111-999999999999",
  "executionId": "99999999-2222-4222-8222-999999999999",
  "data": {
    "source": "maxmilhas.com.br",
    "type": "plp",
    "parser": "maxmilhas_android_combo_offers",
    "url": "https://www.maxmilhas.com.br/passagens-aereas?from=GRU&to=GIG&departureDate=2026-06-20&returnDate=2026-06-27&numAdults=1&numChildren=0&numInfants=0",
    "requestUrl": "https://bff-mobile.maxmilhas.com.br/v1/combo/offers",
    "createUrl": "https://bff-mobile.maxmilhas.com.br/v1/combo/offers",
    "extractedAt": "2026-05-15T15:00:00.000Z",
    "searchType": "ROUND_TRIP",
    "from": "GRU",
    "to": "GIG",
    "departureDate": "2026-06-20",
    "returnDate": "2026-06-27",
    "numAdults": 1,
    "numChildren": 0,
    "numInfants": 0,
    "cabin": "EC",
    "searchId": "combo-search-id",
    "airlines": [
      "gol",
      "latam"
    ],
    "success": true,
    "complete": true,
    "totalOffers": 2,
    "listedOffers": 2,
    "pollsPerformed": 2,
    "errors": {},
    "cheapestOffer": {
      "position": 1,
      "airline": "latam",
      "offerId": "offer-2",
      "type": "miles",
      "cabin": "EC",
      "totalPrice": 399.99,
      "adultPrice": 360,
      "fees": 39.99,
      "serviceCharge": 20,
      "boardingFees": 19.99,
      "label": "Menor preço",
      "tag": "best_price",
      "baggage": "checked=1x23kg",
      "minDuration": 4200,
      "minDurationText": "1h10m",
      "outbound": {
        "id": "bound-latam-out",
        "carrier": "LA",
        "departure": "GRU",
        "departureTime": "2026-06-20T12:00:00",
        "arrival": "GIG",
        "arrivalTime": "2026-06-20T13:10:00",
        "duration": 4200,
        "durationText": "1h10m",
        "stops": 0,
        "airportChange": false
      },
      "inbound": {
        "id": "bound-latam-in",
        "carrier": "LA",
        "departure": "GIG",
        "departureTime": "2026-06-27T19:00:00",
        "arrival": "GRU",
        "arrivalTime": "2026-06-27T20:10:00",
        "duration": 4200,
        "durationText": "1h10m",
        "stops": 0,
        "airportChange": false
      }
    },
    "offers": [
      {
        "position": 1,
        "airline": "latam",
        "offerId": "offer-2",
        "type": "miles",
        "cabin": "EC",
        "totalPrice": 399.99,
        "adultPrice": 360,
        "fees": 39.99,
        "serviceCharge": 20,
        "boardingFees": 19.99,
        "label": "Menor preço",
        "tag": "best_price",
        "baggage": "checked=1x23kg",
        "minDuration": 4200,
        "minDurationText": "1h10m",
        "outbound": {
          "id": "bound-latam-out",
          "carrier": "LA",
          "departure": "GRU",
          "departureTime": "2026-06-20T12:00:00",
          "arrival": "GIG",
          "arrivalTime": "2026-06-20T13:10:00",
          "duration": 4200,
          "durationText": "1h10m",
          "stops": 0,
          "airportChange": false
        },
        "inbound": {
          "id": "bound-latam-in",
          "carrier": "LA",
          "departure": "GIG",
          "departureTime": "2026-06-27T19:00:00",
          "arrival": "GRU",
          "arrivalTime": "2026-06-27T20:10:00",
          "duration": 4200,
          "durationText": "1h10m",
          "stops": 0,
          "airportChange": false
        }
      },
      {
        "position": 2,
        "airline": "gol",
        "offerId": "offer-1",
        "type": "miles",
        "cabin": "EC",
        "totalPrice": 425.9,
        "adultPrice": 380.4,
        "fees": 45.5,
        "serviceCharge": 20,
        "boardingFees": 25.5,
        "label": "Tarifa recomendada",
        "tag": "recommended",
        "baggage": "checked=1x23kg",
        "minDuration": 3900,
        "minDurationText": "1h05m",
        "outbound": {
          "id": "bound-gol-out",
          "carrier": "G3",
          "departure": "GRU",
          "departureTime": "2026-06-20T09:00:00",
          "arrival": "GIG",
          "arrivalTime": "2026-06-20T10:05:00",
          "duration": 3900,
          "durationText": "1h05m",
          "stops": 0,
          "airportChange": false
        },
        "inbound": {
          "id": "bound-gol-in",
          "carrier": "G3",
          "departure": "GIG",
          "departureTime": "2026-06-27T20:00:00",
          "arrival": "GRU",
          "arrivalTime": "2026-06-27T21:05:00",
          "duration": 3900,
          "durationText": "1h05m",
          "stops": 0,
          "airportChange": false
        }
      }
    ]
  }
}

Referência completa de campos

Path Tipo Descrição Exemplo
data.airlines[] string Companhias retornadas na criação da busca e usadas para polling. gol
data.cabin string Cabine usada no fluxo mobile. EC
data.cheapestOffer.airline string Companhia da oferta mais barata. latam
data.cheapestOffer.offerId string | null Identificador da oferta mais barata. offer-2
data.cheapestOffer.totalPrice number | null Preço total da oferta mais barata. 399.99
data.complete boolean Indica se todas as companhias foram consultadas sem erro final. true
data.createUrl string Endpoint POST /v1/combo/offers da BFF mobile da MaxMilhas. https://bff-mobile.maxmilhas.com.br/v1/combo/offers
data.departureDate string (YYYY-MM-DD) Data de ida solicitada. 2026-06-20
data.errors object Erros por companhia quando algum poll termina sem ofertas. {}
data.extractedAt string (iso datetime) Timestamp ISO em UTC da extração. 2026-05-15T15:00:00.000Z
data.from string Aeroporto de origem. GRU
data.listedOffers number Quantidade de ofertas retornadas no array offers. 2
data.numAdults number Quantidade de adultos enviada para a busca. 1
data.numChildren number Quantidade de crianças enviada para a busca. 0
data.numInfants number Quantidade de bebês enviada para a busca. 0
data.offers[].adultPrice number | null Preço base por adulto quando disponível. 360
data.offers[].airline string Companhia consultada para a oferta. latam
data.offers[].baggage string | null Resumo de bagagem despachada quando disponível. checked=1x23kg
data.offers[].boardingFees number | null Taxas de embarque quando disponíveis. 19.99
data.offers[].cabin string | null Cabine da oferta. EC
data.offers[].fees number | null Taxas totais quando disponíveis. 39.99
data.offers[].inbound.arrival string | null Aeroporto de chegada do trecho de volta. GRU
data.offers[].inbound.carrier string | null Companhia operadora do trecho de volta. LA
data.offers[].inbound.departure string | null Aeroporto de partida do trecho de volta. GIG
data.offers[].label string | null Mensagem ou selo comercial da oferta. Menor preço
data.offers[].minDurationText string | null Duração mínima formatada. 1h10m
data.offers[].offerId string | null Identificador da oferta no payload upstream. offer-2
data.offers[].outbound.arrival string | null Aeroporto de chegada do trecho de ida. GIG
data.offers[].outbound.arrivalTime string | null Horário de chegada do trecho de ida. 2026-06-20T13:10:00
data.offers[].outbound.carrier string | null Companhia operadora do trecho de ida. LA
data.offers[].outbound.departure string | null Aeroporto de partida do trecho de ida. GRU
data.offers[].outbound.departureTime string | null Horário de partida do trecho de ida. 2026-06-20T12:00:00
data.offers[].outbound.durationText string | null Duração formatada do trecho de ida. 1h10m
data.offers[].outbound.stops number | null Quantidade de paradas no trecho de ida. 0
data.offers[].position number Posição da oferta após ordenação por menor preço. 1
data.offers[].serviceCharge number | null Taxa de serviço quando disponível. 20
data.offers[].totalPrice number | null Preço total normalizado. 399.99
data.offers[].type string | null Tipo da oferta retornado pela MaxMilhas. miles
data.parser string Parser interno usado para normalizar o fluxo mobile da MaxMilhas. maxmilhas_android_combo_offers
data.pollsPerformed number Quantidade total de polls executados em todas as companhias. 2
data.requestUrl string Endpoint usado para criar a busca combo offers. https://bff-mobile.maxmilhas.com.br/v1/combo/offers
data.returnDate string | null Data de volta solicitada quando existir. 2026-06-27
data.searchId string | null Identificador da busca retornado pela MaxMilhas. combo-search-id
data.searchType string (ONE_WAY | ROUND_TRIP) Tipo da busca: ONE_WAY ou ROUND_TRIP. ROUND_TRIP
data.source string Fonte lógica executada. maxmilhas.com.br
data.success boolean Indica se ao menos uma oferta foi normalizada. true
data.to string Aeroporto de destino. GIG
data.totalOffers number Total de ofertas normalizadas. 2
data.type string Tipo lógico da API. plp
data.url string URL canônica sintética da busca, usada para auditoria e deduplicação. https://www.maxmilhas.com.br/passagens-aereas?from=GRU&to=GIG&departureDate=2026-06-20&returnDate=2026-06-27&numAdults=1&numChildren=0&numInfants=0
executionId string (uuid) Identificador idempotente da execução. 99999999-2222-4222-8222-999999999999
requestId string (uuid) Identificador da requisição na GeckoAPI. 99999999-1111-4111-8111-999999999999

Erros comuns

Respostas com notFound: true não entram nesta tabela, porque retornam sucesso HTTP 200.

Status errorCode Quando acontece
400 INVALID_PAYLOAD JSON inválido ou violação das regras de validação do payload.
401 UNAUTHORIZED Header Authorization ausente ou token/chave inválida.
402 INSUFFICIENT_CREDITS Saldo de créditos insuficiente para a API solicitada.
403 FORBIDDEN Usuário sem acesso ou API temporariamente desabilitada.
409 EXECUTION_CONFLICT executionId conflita com uma execução em estado incompatível.
429 RATE_LIMIT_EXCEEDED / TOO_MANY_INFLIGHT_REQUESTS Limite de taxa ou limite de requisições em voo excedido.
5xx UPSTREAM_TIMEOUT / UPSTREAM_HTTP_ERROR / WORKER_INVOCATION_FAILED / WORKER_FUNCTION_ERROR / WORKER_INVALID_RESPONSE / INTERNAL_ERROR Falha de servidor no worker, provider/proxy ou gateway. Nesses casos os créditos são estornados automaticamente.