๐ŸŽ‰ Developer Free Trial โ€” 1 week of full API access, no credit card required. Claim your trial โ†’
Scraper

Google Flights Scraper

Return structured, fully-priced flight offers with per-segment detail for any route and date. Includes optional date-grid calendar pricing, per-leg one-way fares, and round-trip return expansion.

POST /api/v1/flight-scraper/scrape/ โ€” submit
GET /api/v1/flight-scraper/scrape/{job_id}/ โ€” poll

Base URL: https://gumo.co.in ยท Auth: X-API-Key: fsk_โ€ฆ (Flight keys are separate from Hotel keys) ยท See the Overview.

Submit a search

Omit return_date for a one-way search; include it for a round trip.

FieldTypeRequiredDefaultNotes
originstringRequiredโ€”3-letter IATA, e.g. DEL.
destinationstringRequiredโ€”3-letter IATA, โ‰  origin.
departure_datedateRequiredโ€”YYYY-MM-DD; not past, โ‰ค 1 year.
return_datedateOptionalnullโ‰ฅ departure, โ‰ค 1 year ahead; omit for one-way.
adultsintOptional11โ€“9.
childrenintOptional00โ€“8.
infants_in_seatintOptional00โ€“8.
infants_on_lapintOptional00โ€“8; โ‰ค adults.
cabin_classstringOptionaleconomyeconomy, premium_economy, business, first.
max_stopsintOptionalnull0โ€“3; 0 = nonstop, null = no limit.
regionstringOptionalinOne of in, us, gb, eu, ae, ca, au, th, my, id, sg.
currencystringOptionalregion default3-letter ISO.
include_calendarboolOptionalfalseAdds a date-grid price calendar.
calendar_daysintOptional450โ€“180. Calendar window end: days after departure.
calendar_days_beforeintOptionalnull0โ€“180. Start the calendar window this many days before departure; default (null) starts the window at today.
per_leg_faresboolOptionalfalseRound-trip only (silently ignored on one-ways); adds outbound/return one-way comparison.
Seated passengers (adults + children + infants_in_seat) must total โ‰ค 9.
POST /api/v1/flight-scraper/scrape/
curl -X POST https://gumo.co.in/api/v1/flight-scraper/scrape/ \
  -H "X-API-Key: fsk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "origin": "DEL",
    "destination": "BOM",
    "departure_date": "2026-08-19",
    "adults": 1,
    "cabin_class": "economy",
    "max_stops": 0
  }'
# โ†’ 202: { "job_id": "...", "status": "pending", "poll_url": "..." }

Poll for results

Poll every 1โ€“2 seconds until status is completed or failed. The poll body is the full job record โ€” keyed id (not job_id) โ€” echoing your search parameters alongside status, result, error_message, error_category and timing fields.

GET /api/v1/flight-scraper/scrape/{job_id}/
Empty is not failure. A completed job with flights: [] and search_context.no_results: true is a successful search that found nothing โ€” check nearby_airports for alternatives.

Response schema

The result object holds flights[], search_context, search_metadata, and optionally calendar / per_leg_fares. Each flight carries a segments[] array.

result (abridged)
{
  "flights": [
    {
      "airlines": ["SpiceJet"], "carrier_code": "SG",
      "flight_numbers": ["SG510"],
      "origin": "DEL", "destination": "BOM",
      "departure_time": "2026-08-19T04:00:00",
      "arrival_time": "2026-08-19T06:15:00",
      "duration_minutes": 135, "stops": 0, "layover_airports": [],
      "price": 6277, "currency": "INR",
      "booking_token": "CjRIUEJyeEhwTElYRFFB...", "listing": "top",
      "booking_url": "https://www.google.com/travel/flights/booking?tfs=...",
      "segments": [
        {
          "origin": "DEL", "origin_airport": "Indira Gandhi International Airport",
          "destination": "BOM", "destination_airport": "Chhatrapati Shivaji Maharaj Intl",
          "departure_time": "2026-08-19T04:00:00", "arrival_time": "2026-08-19T06:15:00",
          "duration_minutes": 135, "flight_number": "SG510",
          "airline": "SpiceJet", "aircraft": "Boeing 737", "legroom": "29 in"
        }
      ]
    }
  ],
  "search_context": {
    "currency": "INR", "applied_currency": "INR", "currency_confirmed": true,
    "top_offer_count": 3, "other_offer_count": 65,
    "no_results": false, "nearby_airports": []
  },
  "search_metadata": {
    "origin": "DEL", "destination": "BOM",
    "trip_type": "one_way", "cabin_class": "economy",
    "region": "in", "applied_currency": "INR", "full_results": true
  },
  "calendar": null, "per_leg_fares": null,
  "error": null, "error_category": null
}

Key fields

FieldDescription
flights[].priceTotal price for the offer (round-trip total on round trips).
flights[].stops / layover_airportsStop count and connecting airport codes.
flights[].listingtop (best/featured) or other.
flights[].booking_urlPublic Google Flights booking URL for the offer. null on round-trip departing flights โ€” expand the round trip first (see below).
flights[].outbound_indexRound-trip searches only: index to pass to /scrape/return/.
flights[].standalone_one_way_priceWith per_leg_fares: true: the flight's one-way fare, when matched.
segments[]Per-leg detail: airports & names, times, duration, flight number (also split as carrier + number), airline, aircraft, legroom.
search_context.no_resultstrue when a valid search returned no flights.
search_context.nearby_airportsAlternative airports [{ code, distance, price }].
search_context.currency_confirmedWhether Google confirmed pricing in your requested currency.
error_categoryOn failure: transient, blocked, rotation, parse, invalid_search, invalid_input, http, error.
Booking links: every offer carries a ready-made booking_url to the Google Flights booking page, and the booking-options endpoint resolves an offer to its actual sellers with per-seller prices and links.

Round-trip expansion

On a round-trip search, each departing flight is priced as a round-trip total. To see the return options for a chosen outbound, submit an expansion job referencing the completed parent job and the outbound's index.

POST /api/v1/flight-scraper/scrape/return/
POST /scrape/return/
{ "job_id": "<completed round-trip job>", "outbound_index": 3 }
# โ†’ 202 with a new job_id. Poll it: result.return_options[] holds each
#   full round-trip total for that outbound + inbound pairing, and every
#   option carries a populated booking_url.

Guards: 400 if the parent job isn't completed, isn't a round trip, the index is out of range, or the chosen flight has no segments. Expansion jobs never include calendar or per_leg_fares.

Booking options

Resolve a chosen flight to its actual sellers โ€” airlines and OTAs with per-seller prices, booking links and baggage info. Submit an expansion job referencing a completed parent job and the flight's index.

POST /api/v1/flight-scraper/scrape/booking/
POST /scrape/booking/
{ "job_id": "<completed job>", "flight_index": 0, "resolve_deep_links": false }
# โ†’ 202 with a new job_id. Poll it: result.booking_options[] =
#   { provider, provider_code, is_airline, price, currency, display_domain,
#     booking_url, deep_link, flight_numbers, legroom,
#     baggage: { free_checked_bags, free_carry_on, checked_bag_fees } }
# plus price_insights, booking_url, selected_itinerary, baggage_policy_urls.
  • resolve_deep_links: true follows each seller's redirect to its real site URL into deep_link (slower; null on failure).
  • Works on one-way jobs and return-expansion jobs. A round-trip /scrape/ job returns 400 โ€” pick an outbound via /scrape/return/ first, then book from that job.
  • Other 400 guards: parent not completed, index out of range, or the chosen flight has no booking token/segments.
  • search_metadata.marketplace_attested signals whether the seller list is complete; when false, some sellers may be missing.

Calendar & per-leg fares

Calendar pricing โ€” set include_calendar: true to get a date-grid summary: window_start/end, basis (always "one_way"), priced_days, cheapest, most_expensive, median, cheapest_dates, and a per-day days[] array of { date, return_date, price, booking_token } (price is null on days Google couldn't price). The window runs from today (or calendar_days_before before departure) through calendar_days after departure. Prices are one-way even on round trips. A calendar failure never fails the job โ€” it surfaces as search_metadata.calendar_error with calendar: null.

Per-leg fares โ€” set per_leg_fares: true on a round trip to compare booking the round trip vs. two one-ways: currency, outbound_one_way, return_one_way, two_one_ways_total, round_trip_total, round_trip_saving, round_trip_saving_pct, cheaper_as ("round_trip", "two_one_ways", or "either" when within 1%). If any leg couldn't be priced the object is null and the reason appears as search_metadata.per_leg_fares_error.

Batch scraping

Search up to 20 routes that share dates/region in one call.

POST /api/v1/flight-scraper/batch/
POST /api/v1/flight-scraper/batch/results/
POST /flight-scraper/batch/
{
  "departure_date": "2026-08-19", "region": "in",
  "routes": [
    { "origin": "DEL", "destination": "BOM" },
    { "origin": "BLR", "destination": "GOI", "max_stops": 0 }
  ]
}
# โ†’ 202: { "jobs": [ { "job_id", "origin", "destination", "poll_url" }, ... ] }

Batch-level (shared) fields: departure_date, return_date, region, currency, include_calendar, calendar_days, calendar_days_before, per_leg_fares. Per-route overrides: origin, destination, adults, children, infants_in_seat, infants_on_lap, cabin_class, max_stops โ€” dates, region and currency cannot vary per route.

Quota: each route in a batch consumes one request unit.

Next: Hotel Rates (Direct OTA) โ†’ ยท Google Hotels โ†’