JustSERPDocs
Google

Google Flights Calendar

The cheapest price of every departure date (and, for a round trip, every return date) in a range, from Google Flights' date picker, answered as the document with `calendar`.

GET
/v1/google/flights/calendar

The cheapest price of every departure date (and, for a round trip, every return date) in a range, from Google Flights' date picker, answered as the document with calendar. A 20 day range with trips of 3 to 10 days is 160 rows. multi_city has no calendar. The parameters google_flights refuses are refused here too, and so are departure_token, booking_token, sort_by and multi_city_json (400). Google's "internal error" is retried; a captcha (/sorry/) is captcha.

Authorization

headerX-API-Key<token>

Your API key.

Query Parameters

cancel_token?string

A name you make up for this request (a UUID is fine), so you can later GET /v1/cancel with it. Only you know it, so only you can cancel. Use a new one for every request, retries included: a cancelled token stays cancelled for a few minutes.

Length1 <= length <= 128
departure_id*string

Airport code or place id; up to 10, comma-separated.

arrival_id*string

Same forms; not a place in departure_id.

outbound_date*string
Formatdate
flight_type?string
Default"round_trip"
Value in"round_trip""one_way"
return_date?string

Required for a round trip; defaults to return_date_start. Sets the trip length when no return range is given.

Formatdate
outbound_date_start?string

Default: outbound_date.

Formatdate
outbound_date_end?string

Default: 60 days on. At most 200 days from the start.

Formatdate
return_date_start?string

With return_date_end: keeps the rows whose return date is in the range (trip lengths 1 to 60 days).

Formatdate
return_date_end?string

Both or neither.

Formatdate
travel_class?string
Default"economy"
Value in"economy""premium_economy""business""first_class"
adults?integer
Range1 <= value
Default1
children?integer
Range0 <= value
Default0
infants_in_seat?integer
Range0 <= value
Default0
infants_on_lap?integer
Range0 <= value
Default0
stops?string
Default"any"
Value in"any""nonstop""one_stop_or_fewer""two_stops_or_fewer"
max_price?integer
included_airlines?string

Airline codes or ONEWORLD, SKYTEAM, STAR_ALLIANCE.

outbound_times?string
Default"0,23,0,23"
return_times?string
Default"0,23,0,23"
included_connecting_airports?string
excluded_connecting_airports?string
layover_duration_min?integer

Minutes.

layover_duration_max?integer

Minutes.

max_flight_duration?integer

Minutes.

currency?string
Default"USD"
hl?string
Default"en"
gl?string
Default"us"

Response Body

The calendar, as the document. When the page could not be parsed, the usual envelope.

application/json
  1. response

The first three keys of every parsed 200 (the answer is the document itself, no success/data envelope): what the search was (search_metadata), what it asked (search_parameters), the parser's own search_information ({} when it has none). The engine's blocks follow, at the same level. An engine whose answer is a list puts it under results.

search_metadata*
search_parameters*

The request's own fields as sent, engine first, without cancel_token.

search_information*

The parser's own, e.g. yelp_search's; otherwise {}.

calendar?array<>
[key: string]?any
Example Request
curl -X GET 'https://api.justserp.com/v1/google/flights/calendar?departure_id=JFK&arrival_id=LHR&outbound_date=2026-12-10&return_date=2026-12-17&outbound_date_start=2026-12-01&outbound_date_end=2026-12-20'
Example Response
{  "search_metadata": {    "id": "string",    "status": "Success",    "created_at": "string",    "request_url": "string",    "html_url": "string"  },  "search_parameters": {},  "search_information": {},  "calendar": [    {      "departure": "2019-08-24",      "return": "2019-08-24",      "price": 0,      "has_no_flights": true,      "is_lowest_price": true    }  ]}