Google Flights Deals, With Real Bargains Separated From Cheap Short-Hauls
One airport code in, thirty destinations out, each flagged for whether it actually beats what that route normally costs.
When to use this skill
- The user wants "flight deals" or "cheap flights from" a specific airport.
- They know where they are leaving from but not where they are going.
- They want fare-drop discovery for a newsletter, affiliate site, or travel agent.
- They need the cheapest destinations filtered to nonstop, business class, or a weekend-length trip.
Not for: pricing a route you have already chosen (use johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search and the apify-google-flights-api skill) or building a fare history over time (use the companion apify-google-flights-tracking skill). See references/actor-index.md.
Why the baseline matters
Sort any deals feed by price and the top is dominated by short-haul routes that are cheap because they are close. Every row here also carries average_price, what that specific route typically costs, so is_below_typical tells you which fares are genuinely unusual. Measured across three hubs during the build, between 6 and 30 percent of a feed clears its own baseline on a given day.
What you get
One dataset row per destination. result_type separates deal rows from error rows:
price, average_price, savings, savings_percent
is_below_typical, true only when the fare beats that route's own norm
name, country, description, thumbnail for the destination
route, departure_airport_code, arrival_airport_code
outbound_date and return_date for the exact itinerary
airline, stops, flight_duration in minutes, and flight_link
Prerequisites
The Actor
Run it with the Apify CLI
The thirty cheapest destinations from one airport:
apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"JFK","maxDealsPerAirport":30,"currency":"USD"}' \
--json \
--user-agent apify-awesome-skills/apify-google-flights-deals \
2>/dev/null
Nonstop only, under a budget:
apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"LAX","maxStops":"nonstop","maxPrice":400}' \
--json \
--user-agent apify-awesome-skills/apify-google-flights-deals \
2>/dev/null
Business class, weekend-length trips:
apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"ORD","travelClass":"business","travelDuration":"weekend"}' \
--json \
--user-agent apify-awesome-skills/apify-google-flights-deals \
2>/dev/null
Confirm live pricing and the input schema before a large batch:
apify actors info "johnvc/google-flights-deals-api" --json \
--user-agent apify-awesome-skills/apify-google-flights-deals \
2>/dev/null
Every call carries the three flags this repo expects: --json, --user-agent apify-awesome-skills/apify-google-flights-deals, and 2>/dev/null.
Run it from Claude or another AI agent (MCP)
The Actor is MCP-ready. Add the hosted server URL:
https://mcp.apify.com/?tools=actors,docs,johnvc/google-flights-deals-api
Then ask, for example: "Where can I fly cheaply from Chicago next month, and which of those are actually below their normal price?" MCP setup docs: https://docs.apify.com/platform/integrations/mcp
Workflow
- Set
departureId to one IATA code, or departureIds to several. There is no arrival field.
- Leave
outboundDate blank unless dates are fixed; the feed then picks cheap dates and reports the ones it found.
- Apply at most one or two filters at a time so you can tell which one changed the result.
- Filter rows on
is_below_typical rather than sorting on price.
- Rank the survivors by
savings_percent and hand off flight_link for booking.
Inputs
departureId (string): one IATA code, for example JFK
departureIds (array): several home airports in one run
tripType (enum round_trip, one_way, default round_trip)
outboundDate / returnDate (string): leave blank to let the feed choose
travelDuration (enum any, one_week, weekend, two_weeks, default any)
travelClass (enum economy, premium_economy, business, first, default economy)
maxStops (enum any, nonstop, one_stop, two_stops, default any)
maxPrice (integer): budget ceiling
includeAirlines / excludeAirlines (string): mutually exclusive
maxDealsPerAirport (integer, default 30, max 30)
adults, children, infants (integer)
currency (string, default USD), hl (default en), gl (string)
Cost
Billing is pay per event, plus a negligible platform fee per dataset row. Prices below are the BRONZE tier at the time of writing; confirm live prices with the info command above.
- About $0.0025 per deal returned.
- About $0.001 to start a run.
- A full thirty-destination sweep from one airport is about $0.08.
- Three home airports at thirty each is about $0.23.
Suggested confirmation thresholds: warn the user over about $5; get explicit confirmation over about $20. Present cost as "around $X", never a guarantee.
Honest limits
- No arrival airport. This answers where to go, not what a chosen route costs.
- Thirty destinations per airport is the ceiling, not a setting you can raise.
maxDurationMinutes makes the source stop returning the baseline, which switches off savings, savings_percent, and is_below_typical. The Actor logs a warning when you set it. Every other filter keeps the baseline.
- This is a snapshot, not a tracker. It keeps no history and sends no alerts.
- Negative savings are real, not a bug: that route is currently priced above its own norm.
Troubleshooting
- No bargains in the results: normal on a given day. Check whether any row has
is_below_typical true before assuming the run failed.
savings and is_below_typical are missing everywhere: maxDurationMinutes is set. Remove it.
- Empty feed: thin-coverage airport. Try a larger hub nearby.
- An
error row: clean failure, stated plainly; retry once before investigating.
See references/gotchas.md for cost guardrails and error recovery, and references/actor-index.md for the Actor routing table.
Related Actors
1---2name: apify-google-flights-deals3description: Find genuine google flights deals from a home airport with the Apify Google Flights Deals API Actor (johnvc/google-flights-deals-api). Give one IATA code and get the thirty cheapest destinations back as rows, each carrying the fare, what that route typically costs, the saving between them, and an is_below_typical flag. That flag is the point, because a cheap fare and a good deal are different things, and most of a cheapest-first list is short-haul that is cheap because it is close, not because the price is unusual. There is no arrival airport, the feed answers where can I go cheaply rather than what does this route cost. Filter by stops, cabin, budget, or trip length. Use when the user wants flight deals, cheap flights from an airport, fare drop discovery, or destination inspiration priced against a baseline. Pay per deal returned, MCP-ready for Claude and other AI agents.4license: MIT5---67# Google Flights Deals, With Real Bargains Separated From Cheap Short-Hauls89One airport code in, thirty destinations out, each flagged for whether it actually beats what that route normally costs.1011## When to use this skill1213- The user wants "flight deals" or "cheap flights from" a specific airport.14- They know where they are leaving from but not where they are going.15- They want fare-drop discovery for a newsletter, affiliate site, or travel agent.16- They need the cheapest destinations filtered to nonstop, business class, or a weekend-length trip.1718Not for: pricing a route you have already chosen (use `johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search` and the apify-google-flights-api skill) or building a fare history over time (use the companion apify-google-flights-tracking skill). See `references/actor-index.md`.1920## Why the baseline matters2122Sort any deals feed by price and the top is dominated by short-haul routes that are cheap because they are close. Every row here also carries `average_price`, what that specific route typically costs, so `is_below_typical` tells you which fares are genuinely unusual. Measured across three hubs during the build, between 6 and 30 percent of a feed clears its own baseline on a given day.2324## What you get2526One dataset row per destination. `result_type` separates `deal` rows from `error` rows:2728- `price`, `average_price`, `savings`, `savings_percent`29- `is_below_typical`, true only when the fare beats that route's own norm30- `name`, `country`, `description`, `thumbnail` for the destination31- `route`, `departure_airport_code`, `arrival_airport_code`32- `outbound_date` and `return_date` for the exact itinerary33- `airline`, `stops`, `flight_duration` in minutes, and `flight_link`3435## Prerequisites3637- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=awesomeskills).38- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).3940## The Actor4142- Store page: https://apify.com/johnvc/google-flights-deals-api?fpr=9n7kx3&fp_sid=awesomeskills43- Actor ID: `johnvc/google-flights-deals-api`44- Pricing: pay per event; see the cost section below and `references/gotchas.md` for live-price commands.4546## Run it with the Apify CLI4748The thirty cheapest destinations from one airport:4950```bash51apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"JFK","maxDealsPerAirport":30,"currency":"USD"}' \52 --json \53 --user-agent apify-awesome-skills/apify-google-flights-deals \54 2>/dev/null55```5657Nonstop only, under a budget:5859```bash60apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"LAX","maxStops":"nonstop","maxPrice":400}' \61 --json \62 --user-agent apify-awesome-skills/apify-google-flights-deals \63 2>/dev/null64```6566Business class, weekend-length trips:6768```bash69apify actors call "johnvc/google-flights-deals-api" -i '{"departureId":"ORD","travelClass":"business","travelDuration":"weekend"}' \70 --json \71 --user-agent apify-awesome-skills/apify-google-flights-deals \72 2>/dev/null73```7475Confirm live pricing and the input schema before a large batch:7677```bash78apify actors info "johnvc/google-flights-deals-api" --json \79 --user-agent apify-awesome-skills/apify-google-flights-deals \80 2>/dev/null81```8283Every call carries the three flags this repo expects: `--json`, `--user-agent apify-awesome-skills/apify-google-flights-deals`, and `2>/dev/null`.8485## Run it from Claude or another AI agent (MCP)8687The Actor is MCP-ready. Add the hosted server URL:8889`https://mcp.apify.com/?tools=actors,docs,johnvc/google-flights-deals-api`9091Then ask, for example: "Where can I fly cheaply from Chicago next month, and which of those are actually below their normal price?" MCP setup docs: https://docs.apify.com/platform/integrations/mcp9293## Workflow94951. Set `departureId` to one IATA code, or `departureIds` to several. There is no arrival field.962. Leave `outboundDate` blank unless dates are fixed; the feed then picks cheap dates and reports the ones it found.973. Apply at most one or two filters at a time so you can tell which one changed the result.984. Filter rows on `is_below_typical` rather than sorting on `price`.995. Rank the survivors by `savings_percent` and hand off `flight_link` for booking.100101## Inputs102103- `departureId` (string): one IATA code, for example `JFK`104- `departureIds` (array): several home airports in one run105- `tripType` (enum `round_trip`, `one_way`, default `round_trip`)106- `outboundDate` / `returnDate` (string): leave blank to let the feed choose107- `travelDuration` (enum `any`, `one_week`, `weekend`, `two_weeks`, default `any`)108- `travelClass` (enum `economy`, `premium_economy`, `business`, `first`, default `economy`)109- `maxStops` (enum `any`, `nonstop`, `one_stop`, `two_stops`, default `any`)110- `maxPrice` (integer): budget ceiling111- `includeAirlines` / `excludeAirlines` (string): mutually exclusive112- `maxDealsPerAirport` (integer, default 30, max 30)113- `adults`, `children`, `infants` (integer)114- `currency` (string, default `USD`), `hl` (default `en`), `gl` (string)115116## Cost117118Billing is pay per event, plus a negligible platform fee per dataset row. Prices below are the BRONZE tier at the time of writing; confirm live prices with the info command above.119120- About $0.0025 per deal returned.121- About $0.001 to start a run.122- A full thirty-destination sweep from one airport is about $0.08.123- Three home airports at thirty each is about $0.23.124125Suggested confirmation thresholds: warn the user over about $5; get explicit confirmation over about $20. Present cost as "around $X", never a guarantee.126127## Honest limits128129- No arrival airport. This answers where to go, not what a chosen route costs.130- Thirty destinations per airport is the ceiling, not a setting you can raise.131- `maxDurationMinutes` makes the source stop returning the baseline, which switches off `savings`, `savings_percent`, and `is_below_typical`. The Actor logs a warning when you set it. Every other filter keeps the baseline.132- This is a snapshot, not a tracker. It keeps no history and sends no alerts.133- Negative savings are real, not a bug: that route is currently priced above its own norm.134135## Troubleshooting136137- No bargains in the results: normal on a given day. Check whether any row has `is_below_typical` true before assuming the run failed.138- `savings` and `is_below_typical` are missing everywhere: `maxDurationMinutes` is set. Remove it.139- Empty feed: thin-coverage airport. Try a larger hub nearby.140- An `error` row: clean failure, stated plainly; retry once before investigating.141142See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.143144## Related Actors145146- Google Travel Explore API: https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3&fp_sid=awesomeskills147- Google Flights Data Scraper: https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3&fp_sid=awesomeskills148- Google Hotels Search Scraper: https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3&fp_sid=awesomeskills149- Google Maps Photos API: https://apify.com/johnvc/google-maps-photos-api?fpr=9n7kx3&fp_sid=awesomeskills