Google Flights Price Watch – Alerts, History & Deal Detection
Pricing
from $15.00 / 1,000 route checks
Google Flights Price Watch – Alerts, History & Deal Detection
Schedule it, get each route's best fare with history and Google's price verdict, plus alert rows when fares drop, hit a new low or fall below your target.
Pricing
from $15.00 / 1,000 route checks
Rating
0.0
(0)
Developer
Al Moutasem Nabil
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Give it routes and dates, run it on a schedule, and every run returns each route's best Google Flights fare with its price history, the change since the last check and Google's own low / typical / high verdict — plus an alert row when a fare drops, hits a new low or falls below your target.
Who it's for
- Travel agencies and corporate travel desks watching their top routes every morning.
- Deal newsletters looking for fares that just dropped or went under a threshold.
- Developers building fare-alert apps who want history and alerts without running their own database.
- AI agents that need "is this a good price right now?" answered with numbers and Google's verdict.
- Buyers in the Gulf and Levant: fares in SAR, AED, JOD or EGP, and the local market's prices when you set the proxy country.
What makes it different
Flight scrapers return today's fares and forget them. This Actor remembers:
- History per route. Each run adds a point; the row carries the last 30 checks, the previous price, the change in percent, and the lowest price seen (with when).
- Alert rows you can wire to Slack or email.
below-target,new-low,price-drop(andprice-riseif you want it), at most one per route per run. - Google's verdict built in.
priceLevel(low, typical, high) and Google'stypicalRangefor the trip. - Rolling dates.
"+30d"always means 30 days from the run, and keeps one history line even though the actual date moves every day. - Free failures. A route Google blocked, a route with no flights, or a typo in the input comes back as a free error row that says why — never on the invoice.
Quick start
- Open the Actor, keep the prefilled form, and click Start. It watches two routes: AMM → LHR one-way in 45 days (1 adult), and DXB → CAI round trip in 30 days, back 7 days later (2 adults, target $350):
{"from": "AMM","to": "LHR","departDate": "+45d","routes": [{"from": "DXB","to": "CAI","departDate": "+30d","returnDate": "+37d","adults": 2,"targetPrice": 350}],"currency": "USD","mode": "watch","proxyConfiguration": {"useApifyProxy": true}}
- It finishes in 15–30 seconds and costs $0.035. The first run returns one row per route with the best
fare,
priceLevel,typicalRangeand the top itineraries;previousPriceandchangePctarenulland there are no alerts yet, because there is nothing to compare with. That first run is the baseline. - Run it again (or schedule it) with the same
trackingId: rows now showpreviousPrice,changePctand a longerhistory, and alert rows appear when a rule fires.
Alerts, and getting them into Slack or email
| Alert | Fires when |
|---|---|
below-target | The best fare is at or under the route's targetPrice and no below-target alert has fired for that target yet. Fires again only if the fare falls a further dropThresholdPct while still below, or after it went back above. |
new-low | The best fare is lower than every earlier check of the route. |
price-drop | The best fare fell at least dropThresholdPct (default 10%) since the previous check. |
price-rise | Only with alertOnRise: the best fare rose at least dropThresholdPct. |
When several apply, the first in this table wins, so a route never produces more than one alert per run. The first run for a tracking ID never alerts; a route that is already under its target on that first run alerts on the second.
To be notified:
- Save as task with your routes, then add a Schedule (daily is plenty for most routes).
- Under Integrations, add Slack, Email or a webhook on Run succeeded.
- Every run stores its alert rows alone in the
ALERTSrecord of its key-value store — a JSON array, empty on a quiet run. Point a webhook, Make, Zapier or n8n at it (it is the Alerts output of the run), or filter the dataset ontype = "alert". The dataset's Alerts view shows the same rows in Console.
Input
| Field | Default | What it does |
|---|---|---|
from, to | – | Quick route: 3-letter IATA airport codes, e.g. AMM, LHR. |
departDate | – | YYYY-MM-DD or rolling +Nd (days after the run starts, UTC). |
returnDate | empty = one-way | Same formats. Round-trip fares are the total for the whole trip. |
label | FROM→TO | Your name for the route in the output. |
routes | [] | More routes as JSON: { from, to, departDate, returnDate?, label? } plus any of cabin, adults, children, infantsInSeat, infantsOnLap, maxStops, targetPrice, dateFlex. |
cabin | economy | economy, premium_economy, business or first. |
adults, children, infantsInSeat, infantsOnLap | 1, 0, 0, 0 | Travellers; at most 9 in total and one lap infant per adult. Fares are for all of them together. |
maxStops | any | any, 0 (nonstop), 1 or 2. |
dateFlex | 0 | Also check up to ±3 days around each departure (the return date moves with it). Each extra date is one more route check: 2 = 5 checks per route. |
currency | USD | 3-letter ISO code. |
topN | 10 | Itineraries (cheapest first) kept in each route row, 1–20. |
mode | watch | watch keeps history and raises alerts; snapshot returns today's fares only. |
trackingId | default | Name of the watch. Two schedules with different IDs never share history. |
dropThresholdPct | 10 | Minimum move, in percent, for price-drop and price-rise. |
alertOnRise | false | Also alert on rises. |
targetPrice | none | Default target for every route; a route's own targetPrice wins. |
maxConcurrency | 2 | Routes checked in parallel, 1–5. |
proxyConfiguration | Apify datacenter | Set a proxy country to see that market's fares. |
A run checks at most 100 route-dates (after date flex); anything beyond that is skipped and named in one free
info row. A departure date in the past returns a free date-in-past row and its history is dropped.
Output
Every field is documented in the dataset schema; Console shows an Overview view (one row per route) and an Alerts view. There are four row types:
type: "route"— one per route and date checked successfully (charged as a route check).type: "alert"— one per alert (charged as a price alert), stored right after its route row.type: "error"— free;reasonisblocked,no-flights,parse-failed,invalid-inputordate-in-past, andmessagesays what happened.type: "info"— free; e.g. routes skipped over the 100-check cap.
A few things worth knowing about route rows:
bestPriceis the lowest total fare across everything Google listed ("Top flights" and "Other flights").bestItineraryis that itinerary;itinerariesholds the toptopNwith prices and CO₂ estimates.- For round trips, Google prices the whole trip but lists outbound flights, so itinerary times, airlines and stops describe the outbound flight.
departAt/arriveAtare local times at each airport;durationMinis door to door across time zones.pointOfSaleis the country sent to Google as the market (your proxy country);nullmeans Google chose from the proxy's IP.googleFlightsUrlopens the same search on Google Flights.
Sample output
Real items from the second platform run of the example input in September 2026 (with the DXB→CAI target raised
to $600 to trigger an alert), plus a real error row for an unknown airport. itineraries is shortened to two of nine;
field names and values are otherwise exactly as the Actor returns them.
[{"type": "route","label": "AMM→LHR","from": "AMM","to": "LHR","departDate": "2026-11-10","returnDate": null,"tripType": "one-way","cabin": "economy","passengers": {"adults": 1,"children": 0,"infantsInSeat": 0,"infantsOnLap": 0},"maxStops": null,"currency": "USD","pointOfSale": null,"checkedAt": "2026-09-26T22:06:43Z","bestPrice": 205,"bestItinerary": {"airlines": ["BA"],"airlineNames": ["British Airways"],"flightNumbers": ["BA 401"],"departAt": "2026-11-10T09:40","arriveAt": "2026-11-10T12:30","durationMin": 350,"stops": 0,"layovers": [],"aircraft": ["Airbus A320neo"],"isBest": true},"priceLevel": "typical","typicalRange": {"low": 200,"high": 305},"resultCount": 9,"itineraries": [{"price": 205,"airlines": ["BA"],"airlineNames": ["British Airways"],"flightNumbers": ["BA 401"],"departAt": "2026-11-10T09:40","arriveAt": "2026-11-10T12:30","durationMin": 350,"stops": 0,"layovers": [],"aircraft": ["Airbus A320neo"],"co2Grams": 251000,"co2TypicalGrams": 298000,"isBest": true},{"price": 313,"airlines": ["RJ"],"airlineNames": ["Royal Jordanian"],"flightNumbers": ["RJ 111"],"departAt": "2026-11-10T11:55","arriveAt": "2026-11-10T14:20","durationMin": 325,"stops": 0,"layovers": [],"aircraft": ["Boeing 787"],"co2Grams": 214000,"co2TypicalGrams": 298000,"isBest": true}],"targetPrice": null,"previousPrice": 205,"previousCheckedAt": "2026-09-26T21:55:45Z","changePct": 0,"lowestSeen": 205,"lowestSeenAt": "2026-09-26T21:55:45Z","history": [{"at": "2026-09-26T21:55:45Z","price": 205},{"at": "2026-09-26T22:06:43Z","price": 205}],"googleFlightsUrl": "https://www.google.com/travel/flights?tfs=GhoSCjIwMjYtMTEtMTBqBRIDQU1NcgUSA0xIUkIBAUgBmAEC&hl=en&curr=USD","source": "google-flights"},{"type": "alert","alertType": "below-target","label": "DXB→CAI","from": "DXB","to": "CAI","departDate": "2026-10-26","returnDate": "2026-11-02","currency": "USD","price": 519,"previousPrice": 519,"changePct": 0,"targetPrice": 600,"lowestSeen": 519,"bestItinerary": {"airlines": ["J9"],"airlineNames": ["Jazeera"],"flightNumbers": ["J9 124", "J9 733"],"departAt": "2026-10-26T16:45","arriveAt": "2026-10-26T22:40","durationMin": 415,"stops": 1,"layovers": [{"airport": "KWI","minutes": 120}],"aircraft": ["Airbus A320neo", "Airbus A320"],"isBest": true},"googleFlightsUrl": "https://www.google.com/travel/flights?tfs=GhoSCjIwMjYtMTAtMjZqBRIDRFhCcgUSA0NBSRoaEgoyMDI2LTExLTAyagUSA0NBSXIFEgNEWEJCAgEBSAGYAQE%3D&hl=en&curr=USD","checkedAt": "2026-09-26T22:06:57Z"},{"type": "error","reason": "no-flights","message": "Google found no flights for this route and date. Not charged.","label": "ZZX→LHR","from": "ZZX","to": "LHR","departDate": "2026-10-26","googleFlightsUrl": "https://www.google.com/travel/flights?tfs=GhoSCjIwMjYtMTAtMjZqBRIDWlpYcgUSA0xIUkIBAUgBmAEC&hl=en&curr=USD"}]
Pricing
Pay-per-event; compute and proxy are included.
| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Once per run (per GB of memory; the default 512 MB is one start). |
| Route check | $0.015 | Per route and date checked successfully. Blocked, no-flights and invalid routes are free. |
| Price alert | $0.02 | Per alert row, watch mode only. At most one per route per run. |
- The example input: 2 × $0.015 + $0.005 = $0.035 per run, plus $0.02 for each alert.
- Watching 20 routes daily = 20 × $0.015 + $0.005 = $0.305 per day, about $9.15 for 30 days,
plus $0.02 per alert. With
dateFlex: 2each route becomes 5 checks. - Snapshot mode never charges for alerts.
If you set a maximum cost per run, the Actor stops cleanly when it is reached: it saves the history first, never fetches a route it can no longer charge for, and a route that did not fit is left out of the history, so the next run carries on normally.
Scheduling tips
- Daily is enough for most routes; fares rarely move in a way that matters hour to hour.
- Use rolling dates (
"+30d","+60d") for "what does this route cost a month out" watches, and fixed dates for a trip you are actually planning. A fixed date's history is dropped once the date has passed. - One
trackingIdper schedule, so two watches never overwrite each other's history. - Changing a route starts a new history line. History is keyed on the route, the dates as you typed them, cabin, travellers, stops and currency; a changed target price keeps the history.
- Set the proxy country to your market to see local fares (for example
SAwith currencySAR).
Limits, honestly
- Google Flights only. One-way and round trip; no multi-city.
- No booking. The Actor returns fares and a link to the same search on Google Flights; it does not book or return airline booking links.
- Fares depend on the market. The same route can price differently by point of sale; set the proxy country to your market.
- Currencies. Tested to return their own prices: USD, EUR, GBP, SAR, AED, JOD and EGP. Google may ignore a currency it does not support and show another one.
- Blocking. Google occasionally refuses automated requests. A refused request is retried (through a
residential proxy when the datacenter one was refused) and never billed; if Google refuses 4 routes in a row,
the run stops early and reports the rest as free
blockedrows instead of burning time. - Round trips show outbound flights with the whole-trip price.
- "Price unavailable". When Google lists flights but no prices (it happens on some routes and cabins), the
route returns a free
no-flightsrow. - No personal data. The Actor sends a search and reads public fares; there are no names, accounts or booking details anywhere in it.
Google and Google Flights are trademarks of Google LLC; this Actor is not affiliated with Google.
Changelog
- 0.1 (September 2026) — First release: watch and snapshot modes, rolling dates and date flex, history, change since last check, Google's price level and typical range, four alert types.