Blog / Web data by industry

Flight Price Data: What Fare Tracking Can and Cannot Show

Flight price data analysis starts with a small set of fields: price, currency, stops, duration, airline and departure times for each itinerary. One API call gives you a snapshot of those fields for a single route and date. It doesn't give you history, so any claim about a price trend needs repeated calls that you store yourself.

This article reads one recorded Google Flights response, lists what it contains and what it leaves out, then shows how to turn snapshots into a fare series.

What fields does a flight price response contain?

A one-way search returns a flights array and a search_metadata object. Each flight carries the fare and the shape of the trip: price, currency, total_duration_minutes, stops, airline_name, an emissions block, a booking_token and a legs list. The metadata echoes the search: origin, destination, date, passengers, cabin class and currency.

Here is the request we recorded, and an excerpt of the response:

curl "https://api.perceptlayer.com/v1/google-flights/one-way?origin=JFK&destination=LAX&departure_date=2026-12-15" \
  -H "X-API-Key: $API_KEY"
{
  "flights": [
    {
      "price": 179,
      "currency": "USD",
      "total_duration_minutes": 384,
      "stops": 0,
      "airline_name": "JetBlue",
      "emissions": {
        "co2_kilograms": 426,
        "typical_co2_kilograms": 344,
        "difference_percent": 24
      },
      "legs": [
        {
          "airline": "B6",
          "flight_number": "2223",
          "departure_airport": "JFK",
          "arrival_airport": "LAX",
          "departure_time": "2026-12-15T08:01:00",
          "arrival_time": "2026-12-15T11:25:00",
          "duration_minutes": 384
        }
      ]
    },
    …
  ],
  "search_metadata": {
    "origin": "JFK",
    "destination": "LAX",
    "departure_date": "2026-12-15",
    "cabin_class": "Economy",
    "sort_by": "Top Flights",
    "currency": "USD",
    …
  }
}

Field reference for the two flights in the sample:

Field JetBlue Delta
price (USD) 179 189
stops 0 0
total_duration_minutes 384 378
legs[0].flight_number 2223 773
legs[0].departure_time 2026-12-15T08:01:00 2026-12-15T09:00:00
emissions.difference_percent 24 -29

Full parameters are on the Google Flights One Way page.

What does a single snapshot tell you?

A snapshot tells you the price of specific itineraries at the moment of the call, and how they differ on stops, duration, airline and timing. In the sample, both flights are nonstop and within six minutes of each other, yet one costs $10 more. The data shows that gap. It doesn't show why.

The sample does support a few comparisons:

  • Price against time in the air. Delta's flight is 6 minutes shorter and $10 more expensive. That's a premium for a different departure hour and airline, not a faster product.
  • Price against emissions. The emissions.difference_percent field is relative to a typical flight on the route, which is 344 kg in both rows. JetBlue's flight is 24% above that figure and Delta's is 29% below it. The cheaper fare has the higher emissions here, but two rows are an anecdote, not a pattern.
  • Spread across the day. Departures at 08:01 and 09:00 are the two times in this excerpt. You'd need the full list to say anything about the spread.

Notice that the search_metadata block also records sort_by as Top Flights for this call. The endpoint also accepts sort_by=cheapest, which is what the tracking script below passes.

What can a snapshot not show?

A snapshot can't show a trend, a baseline or a reason. It has no timestamp history, no record of previous prices for the same flight, no seat counts and no explanation for why a fare changed. The only time axis in the response is the departure date you asked for, not when the price was observed.

That limits the questions you can answer from one call:

Question Answerable from one call? What you'd need
What is the cheapest nonstop on this date right now? Yes One call with max_stops=nonstop
Is this price high for this route? No Repeated calls over weeks for the same route
Will the fare rise next week? No A history, and even then only a guess
Which airline is cheapest most often? No Many dates and many observation days
Did the price drop since yesterday? No A stored copy of yesterday's call

Google states that flight prices are updated roughly once every 24 hours (Google Flights help, 2026). That is Google's description of its own update cycle, and it doesn't say how other sources behave. If you take it at face value, though, a daily schedule is a reasonable starting point for a Google source. Check whether repeated calls within a day return different prices before you pay for more.

What does the price include?

The price field is a fare for the itinerary, and it isn't a total cost of travel. Google's help page says the price shown covers the air transport itself, including VAT/GST and airport taxes, while additional fees such as baggage may apply and vary by airline or booking option (Google Flights help, 2026).

The Kiwi.com endpoint makes this visible. In a recorded GET /v1/kiwi/flights-search response for London to Barcelona on 2026-12-04, two Ryanair itineraries are priced at 29 EUR and 32 EUR. Both show checked_bags_included: 0 and a baggage block with checked_bag_tier_prices: 42.856274 and 85.712548 on the first, 48 and 96 on the second.

"price": { "amount": 29, "currency": "EUR", "formatted": "29 €" },
"stops": 0,
"baggage": {
  "hand_bags_included": 0,
  "checked_bags_included": 0,
  "personal_item_included": 1,
  "checked_bag_tier_prices": [42.856274, 85.712548]
},
…

For a traveller with a checked bag, the 29 EUR headline fare is the smaller part of the cost. If you analyse fares across sources, compare like with like: same cabin, same bags, same currency. On the Google Flights One Way endpoint, include_baggage and bags are parameters you can set, and the response's currency field tells you what you got.

Two units to watch in the Kiwi sample: duration is 7800 and the Google sample uses total_duration_minutes. The Kiwi flight departs 15:35 and arrives 18:45 local time, a 3 hour 10 minute gap that includes the one-hour time difference, so 7800 reads as seconds (130 minutes). Check the unit before you merge two sources into one table.

How do you turn snapshots into a fare series?

You call on a schedule, keep the cheapest fare per route, departure date and observation day, and compare across days. The storage is the part that makes it tracking. The script below does the whole loop in Python and appends one row per route and date to a CSV.

import csv
import datetime as dt
import os

import requests

API = "https://api.perceptlayer.com/v1/google-flights/one-way"
KEY = os.environ["API_KEY"]
ROUTES = [("JFK", "LAX"), ("JFK", "SFO")]
DEPARTURES = ["2026-12-15", "2026-12-16"]

with open("fares.csv", "a", newline="") as f:
    out = csv.writer(f)
    for origin, destination in ROUTES:
        for day in DEPARTURES:
            r = requests.get(
                API,
                headers={"X-API-Key": KEY},
                params={
                    "origin": origin,
                    "destination": destination,
                    "departure_date": day,
                    "sort_by": "cheapest",
                },
                timeout=30,
            )
            if r.status_code != 200:
                print(origin, destination, day, r.status_code, r.text[:200])
                continue
            flights = r.json().get("flights", [])
            if not flights:
                continue
            best = min(flights, key=lambda x: x["price"])
            out.writerow([
                dt.date.today().isoformat(), origin, destination, day,
                best["price"], best["currency"], best["stops"],
                best["total_duration_minutes"], best["airline_name"],
            ])

Run it once a day from cron or a queue. The scheduling comparison covers the options, and the price tracking agent tutorial shows the same idea with alerts. For error handling, see Errors: a failed call costs nothing and returns X-Credits-Used: 0.

The column you add is the observation date. Without it you have prices, but no series.

Which endpoint fits which question?

Pick by the question, not by the source. Only the Google Flights One Way and Kiwi.com Flights Search responses are recorded here. For the date-window and calendar endpoints below, we list the parameters and have no recorded response, so check what they return in the playground before you replace a per-date loop with them.

Question Endpoint Notes
Fares and details for one date Google Flights One Way Per-flight price, stops, duration, emissions
A date window Google Flights Date Range Takes from_date and to_date; response not recorded
Round trips Google Flights Round Trip Adds return_date
A month for one route Skyscanner Calendar Takes origin, destination, month; response not recorded
Fares with baggage detail Kiwi.com Flights Search baggage block per itinerary
A date window on Kiwi.com Kiwi.com Calendar Cheapest Dates Takes origin, destination, start_date, end_date; response not recorded
One origin, no fixed destination Kiwi.com Explore Price Map Takes origin, start_date, end_date; response not recorded

The Skyscanner Flights Search page lists its parameters. It takes place IDs rather than airport codes, which you get from the autocomplete endpoint. We have no recorded Skyscanner response, so check its field names in the playground before you rely on them.

If one source disagrees with another on a price, that's information, not an error. Different sources can quote different fares, bag rules and currencies for the same flight. The Google Flights API guide covers the endpoints in more depth, and the hotel price monitoring article applies the same snapshot logic to rooms.

What does fare tracking cost in credits?

Every successful call to these endpoints costs 1 credit, and failed calls cost nothing. The arithmetic is the number of routes times departure dates times observation days. Two routes, 15 departure dates and 30 daily observations is 2 × 15 × 30 = 900 calls, or 900 credits, which fits inside the 1,000 free credits that come every month after you verify an email.

Scaling it up is multiplication:

Plan Calls per day Days Credits
10 routes, 1 date each 10 30 300
10 routes, 30 dates each 300 30 9,000
100 routes, 30 dates each 3,000 30 90,000

The last row is more than the 50,000-credit Build pack and fits in the 200,000-credit Growth pack. Pricing shows what credits cost. The Date Range endpoint takes from_date and to_date and costs 1 credit per call. We haven't recorded its response, so try it in the playground to see what it returns before you size a budget around it. Rate limits are per account: free accounts get 1 request a second. See Rate limits before you parallelise.

To try the first call, get a free API key and run the One Way request from this article in the playground on the Google Flights API page.

APIs in this post

Frequently asked questions

Can flight price data predict whether a fare will rise?

Not from a snapshot. A single call gives the current quote for a date and nothing about past prices. To estimate direction you need your own stored series for the route. Google's tracking feature sends alerts when prices for a tracked route are likely to go up (Google Flights help, 2026).

How often should I call for fare tracking?

Once a day is a sensible default. Google says flight prices are updated approximately once every 24 hours (Google Flights help, 2026), so more frequent calls to the same search mostly repeat data. Each call is 1 credit, so a daily schedule for one route and date is about 30 credits a month.

Why do two sources show different prices for the same flight?

Sources differ in what they include and which booking option they price. The Kiwi sample lists zero checked bags included, with separate bag prices, while the Google Flights price covers the fare itself and notes that baggage and other fees may apply. Compare cabin, bags and currency before you compare totals.

What happens if a call fails or I run out of credits?

A failed call costs nothing and returns X-Credits-Used: 0. The body has an error object with a code, such as rate_limited (429) or insufficient_credits (402). On 429 and 503, wait the seconds in the Retry-After header. The Errors docs list every code.

  1. Hotel Price Data for Rate Monitoring: Fields and Costs

    The fields a rate-monitoring job needs from Booking, Expedia and Trivago, and what 200 hotels over 30 dates costs, 6,000 credits per source.

  2. Google Flights API: Fares, Date Ranges and Airports

    Get Google Flights fares as JSON: one-way, round-trip and date-range calls, a recorded JFK to LAX response, and the credit cost of a daily fare check.

  3. Job Posting Data for Labour-Market Research

    Which Indeed posting fields support trend analysis, where postings mislead versus hires, and a weekly collection plan that costs 3,000 credits a month.

Start with 1,000 free credits

No password to set. We email you a sign-in link, and your key works on every API.

No credit card. 1,000 free credits a month.