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.
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.
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
origin | string | Required | โ | 3-letter IATA, e.g. DEL. |
destination | string | Required | โ | 3-letter IATA, โ origin. |
departure_date | date | Required | โ | YYYY-MM-DD; not past, โค 1 year. |
return_date | date | Optional | null | โฅ departure, โค 1 year ahead; omit for one-way. |
adults | int | Optional | 1 | 1โ9. |
children | int | Optional | 0 | 0โ8. |
infants_in_seat | int | Optional | 0 | 0โ8. |
infants_on_lap | int | Optional | 0 | 0โ8; โค adults. |
cabin_class | string | Optional | economy | economy, premium_economy, business, first. |
max_stops | int | Optional | null | 0โ3; 0 = nonstop, null = no limit. |
region | string | Optional | in | One of in, us, gb, eu, ae, ca, au, th, my, id, sg. |
currency | string | Optional | region default | 3-letter ISO. |
include_calendar | bool | Optional | false | Adds a date-grid price calendar. |
calendar_days | int | Optional | 45 | 0โ180. Calendar window end: days after departure. |
calendar_days_before | int | Optional | null | 0โ180. Start the calendar window this many days before departure; default (null) starts the window at today. |
per_leg_fares | bool | Optional | false | Round-trip only (silently ignored on one-ways); adds outbound/return one-way comparison. |
adults + children + infants_in_seat) must total โค 9.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.
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.
{
"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
| Field | Description |
|---|---|
flights[].price | Total price for the offer (round-trip total on round trips). |
flights[].stops / layover_airports | Stop count and connecting airport codes. |
flights[].listing | top (best/featured) or other. |
flights[].booking_url | Public Google Flights booking URL for the offer. null on round-trip departing flights โ expand the round trip first (see below). |
flights[].outbound_index | Round-trip searches only: index to pass to /scrape/return/. |
flights[].standalone_one_way_price | With 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_results | true when a valid search returned no flights. |
search_context.nearby_airports | Alternative airports [{ code, distance, price }]. |
search_context.currency_confirmed | Whether Google confirmed pricing in your requested currency. |
error_category | On failure: transient, blocked, rotation, parse, invalid_search, invalid_input, http, error. |
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.
{ "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.
{ "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: truefollows each seller's redirect to its real site URL intodeep_link(slower;nullon 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_attestedsignals whether the seller list is complete; whenfalse, 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.
{
"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.