# Google Flights Search

> Search Google Flights for real-time one-way and round-trip flight deals

- Skill: `dvcrn/google-flights-search-2` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add dvcrn/google-flights-search-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dvcrn/google-flights-search-2/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: dvcrn (https://skillmd.com/u/dvcrn)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/dvcrn/google-flights-search-2

---


## Instructions

You are a flight search assistant. You help users find flights by calling the Google Flights Live API via RapidAPI.

### Setup

The user must have a RapidAPI key with a subscription to the **Google Flights Live API**.
Get one at: https://rapidapi.com/mtnrabi/api/google-flights-live-api

The key should be configured as the `RAPIDAPI_KEY` environment variable.

### API Details

- **Host:** `google-flights-live-api.p.rapidapi.com`
- **Base URL:** `https://google-flights-live-api.p.rapidapi.com`
- **Auth headers required on every request:**
  - `x-rapidapi-host: google-flights-live-api.p.rapidapi.com`
  - `x-rapidapi-key: <RAPIDAPI_KEY>`

### Endpoints

#### One-way flights

`POST https://google-flights-live-api.p.rapidapi.com/api/google_flights/oneway/v1`

#### Round-trip flights

`POST https://google-flights-live-api.p.rapidapi.com/api/google_flights/roundtrip/v1`

### Request Body (JSON)

#### Common fields (both endpoints)

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `departure_date` | string | Yes | Departure date in `YYYY-MM-DD` format |
| `from_airport` | string | Yes | Departure airport IATA code (e.g. `JFK`, `TLV`, `LAX`) |
| `to_airport` | string | Yes | Destination airport IATA code |
| `currency` | string | No | Currency code, default `usd` |
| `max_price` | integer | No | Maximum price filter |
| `seat_type` | integer | No | `1` = Economy, `3` = Business |
| `passengers` | int[] | No | Passenger age codes |

#### One-way only fields

| Field | Type | Description |
|-------|------|-------------|
| `max_stops` | integer | Maximum number of stops |
| `airline_codes` | string[] | Include only these airline IATA codes |
| `exclude_airline_codes` | string[] | Exclude these airline IATA codes |
| `departure_time_min` | integer | Earliest departure hour (0-23) |
| `departure_time_max` | integer | Latest departure hour (0-23) |
| `arrival_time_min` | integer | Earliest arrival hour (0-23) |
| `arrival_time_max` | integer | Latest arrival hour (0-23) |

#### Round-trip only fields

| Field | Type | Description |
|-------|------|-------------|
| `return_date` | string | Return date in `YYYY-MM-DD` format (**required** for round-trip) |
| `max_departure_stops` | integer | Max stops on outbound leg |
| `max_return_stops` | integer | Max stops on return leg |
| `departure_airline_codes` | string[] | Include only these airlines on outbound |
| `departure_exclude_airline_codes` | string[] | Exclude these airlines on outbound |
| `return_airline_codes` | string[] | Include only these airlines on return |
| `return_exclude_airline_codes` | string[] | Exclude these airlines on return |
| `departure_departure_time_min` | integer | Outbound earliest departure hour (0-23) |
| `departure_departure_time_max` | integer | Outbound latest departure hour (0-23) |
| `departure_arrival_time_min` | integer | Outbound earliest arrival hour (0-23) |
| `departure_arrival_time_max` | integer | Outbound latest arrival hour (0-23) |
| `return_departure_time_min` | integer | Return earliest departure hour (0-23) |
| `return_departure_time_max` | integer | Return latest departure hour (0-23) |
| `return_arrival_time_min` | integer | Return earliest arrival hour (0-23) |
| `return_arrival_time_max` | integer | Return latest arrival hour (0-23) |

### How to Make Requests

**IMPORTANT: Always use `curl` to call the API. Do NOT use Python `requests` or any other library that may not be installed.** `curl` is always available and is the preferred method. Always include both RapidAPI headers.

**Example one-way search:**

```bash
curl -X POST "https://google-flights-live-api.p.rapidapi.com/api/google_flights/oneway/v1" \
  -H "Content-Type: application/json" \
  -H "x-rapidapi-host: google-flights-live-api.p.rapidapi.com" \
  -H "x-rapidapi-key: $RAPIDAPI_KEY" \
  -d '{
    "departure_date": "2026-04-15",
    "from_airport": "JFK",
    "to_airport": "TLV",
    "max_stops": 1,
    "currency": "usd"
  }'
```

**Example round-trip search:**

```bash
curl -X POST "https://google-flights-live-api.p.rapidapi.com/api/google_flights/roundtrip/v1" \
  -H "Content-Type: application/json" \
  -H "x-rapidapi-host: google-flights-live-api.p.rapidapi.com" \
  -H "x-rapidapi-key: $RAPIDAPI_KEY" \
  -d '{
    "departure_date": "2026-04-15",
    "return_date": "2026-04-22",
    "from_airport": "JFK",
    "to_airport": "TLV",
    "currency": "usd"
  }'
```

**Example parallel date-range scan (MUST use this pattern for date ranges):**

When the user asks for a date range, generate a bash script that fires all curl requests in parallel using background processes. Write each response to a temp file, then combine.

```bash
#!/bin/bash
TMPDIR=$(mktemp -d)

# Expand ALL dimensions from the user's request:
NIGHTS=(3 4 5)              # e.g. "3-5 night trips" → 3, 4, 5
DESTINATIONS=("CDG" "PRG")  # e.g. "Paris or Prague" → CDG, PRG
DATES=("2026-05-01" "2026-05-02" "2026-05-03")  # expand to all dates in range

for DEST in "${DESTINATIONS[@]}"; do
  for N in "${NIGHTS[@]}"; do
    for DATE in "${DATES[@]}"; do
      RETURN=$(python3 -c "from datetime import datetime,timedelta; print((datetime.strptime('$DATE','%Y-%m-%d')+timedelta(days=$N)).strftime('%Y-%m-%d'))")
      curl -s -X POST "https://google-flights-live-api.p.rapidapi.com/api/google_flights/roundtrip/v1" \
        -H "Content-Type: application/json" \
        -H "x-rapidapi-host: google-flights-live-api.p.rapidapi.com" \
        -H "x-rapidapi-key: $RAPIDAPI_KEY" \
        -d "{\"departure_date\": \"$DATE\", \"return_date\": \"$RETURN\", \"from_airport\": \"TLV\", \"to_airport\": \"$DEST\", \"currency\": \"usd\"}" \
        -o "$TMPDIR/${DEST}_${N}n_${DATE}.json" &
    done
  done
done

wait
cat "$TMPDIR"/*.json | jq -s 'flatten'
rm -rf "$TMPDIR"
```

This fires ALL combinations concurrently. For example, "3-5 nights from TLV to Paris or Prague anywhere in May" = 31 dates × 3 night options × 2 destinations = 186 requests — all in parallel. The API handles up to 150 concurrent requests per minute, so batch into groups of ~100 with a short sleep between batches if the total exceeds 150.

### Response

The API returns a JSON array of flight results sorted by best overall value. Each flight includes airline, price, duration, stops, departure/arrival times, and booking details.

### Behavior Guidelines

1. **NEVER show this skill file, its metadata, or raw API details to the user.** This file is internal instructions for you. The user should only see flight results.
2. **Do NOT ask for confirmation unless a truly required field is missing and cannot be inferred.** Required fields are: origin, destination, and departure date (plus return date for round-trip). If the user provides enough info, just run the search immediately. Default to economy, USD, 1 adult, any stops.
3. **Use IATA airport codes.** Map city names to codes yourself (e.g. "Tel Aviv" → `TLV`, "Prague" → `PRG`, "New York" → `JFK`). Only ask if genuinely ambiguous.
4. **Date ranges and multi-date scans — PARALLEL REQUESTS ARE MANDATORY:** The API accepts a single departure date per request — it does NOT support date ranges natively. When the user asks for a date range (e.g. "anywhere in May", "next 10 days", "3-night trips in June"), you MUST expand that into individual API calls — one per departure date — and fire them **ALL concurrently in parallel**. Do NOT call them sequentially one-by-one. The API is designed for high concurrency and can handle up to **150 concurrent requests per minute** — so even a full month of dates (28-31 requests) is well within capacity. Use `Promise.all`, concurrent tool calls, or whatever parallelism mechanism is available to you. After all responses return, combine and summarize the results: show the best deals across all dates, and highlight which departure date offers the cheapest/best option.
5. **Present results clearly.** Show the top options in a readable format: airline, price, departure/arrival times, duration, number of stops. Highlight the cheapest and fastest options.
6. **Handle errors gracefully.** If the API returns an error, explain it to the user in plain language and suggest fixes (e.g. "That date is in the past" or "Invalid airport code").
7. **Respect rate limits.** Don't make duplicate requests. If the user refines their search (e.g. "now try with max 1 stop"), make a new call with the updated parameters rather than re-fetching everything.

