---
title: "Flight Price Data: What Fare Tracking Can and Cannot Show"
description: "What one recorded JFK to LAX call shows: price, stops, duration and CO2 per flight. Plus what a single snapshot can't tell you, and a daily tracker's cost."
url: https://perceptlayer.com/blog/flight-price-data-fare-tracking
---

[Blog](https://perceptlayer.com/blog) / [Web data by industry](https://perceptlayer.com/blog/category/web-data)

# Flight Price Data: What Fare Tracking Can and Cannot Show

28 Sept 2026 Perceptlayer 8 min read

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.

## Key takeaways

-   A `GET /v1/google-flights/one-way` call returns `price`, `currency`, `stops`, `total_duration_minutes`, `airline_name`, `emissions` and per-leg times for each flight, and costs 1 credit.
-   In the recorded JFK to LAX sample for 2026-12-15, a $179 JetBlue flight took 384 minutes and a $189 Delta flight took 378. Both were nonstop, so the $10 gap isn't explained by stops or duration.
-   A snapshot is one quote at one moment. It can't show whether $179 is low, normal or high for that route.
-   Fare tracking means calling on a schedule and storing the cheapest price per route and date. Tracking 10 routes for 30 days is 300 calls, or 300 credits.
-   Compare prices only after you check what each source includes, such as bags, and which currency it returns.

## 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:

```bash
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"
```

```json
{
  "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](https://perceptlayer.com/apis/google-flights/one-way).

## 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](https://support.google.com/travel/answer/2475306), 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](https://support.google.com/travel/answer/2475306), 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.

```json
"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.

```python
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](https://perceptlayer.com/blog/schedule-web-data-pulls-cron-queue) covers the options, and the [price tracking agent tutorial](https://perceptlayer.com/blog/price-tracking-agent-python) shows the same idea with alerts. For error handling, see [Errors](https://docs.perceptlayer.com/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](https://perceptlayer.com/apis/google-flights/one-way) | Per-flight price, stops, duration, emissions |
| A date window | [Google Flights Date Range](https://perceptlayer.com/apis/google-flights/date-range) | Takes `from_date` and `to_date`; response not recorded |
| Round trips | [Google Flights Round Trip](https://perceptlayer.com/apis/google-flights/round-trip) | Adds `return_date` |
| A month for one route | [Skyscanner Calendar](https://perceptlayer.com/apis/skyscanner/calendar) | Takes `origin`, `destination`, `month`; response not recorded |
| Fares with baggage detail | [Kiwi.com Flights Search](https://perceptlayer.com/apis/kiwi/flights-search) | `baggage` block per itinerary |
| A date window on Kiwi.com | [Kiwi.com Calendar Cheapest Dates](https://perceptlayer.com/apis/kiwi/calendar-cheapest-dates) | Takes `origin`, `destination`, `start_date`, `end_date`; response not recorded |
| One origin, no fixed destination | [Kiwi.com Explore Price Map](https://perceptlayer.com/apis/kiwi/explore-price-map) | Takes `origin`, `start_date`, `end_date`; response not recorded |

The [Skyscanner Flights Search page](https://perceptlayer.com/apis/skyscanner/flights-search) lists its parameters. It takes place IDs rather than airport codes, which you get from the [autocomplete endpoint](https://perceptlayer.com/apis/skyscanner/autocomplete). 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](https://perceptlayer.com/blog/google-flights-api) covers the endpoints in more depth, and the [hotel price monitoring article](https://perceptlayer.com/blog/hotel-price-data-rate-monitoring) 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](https://perceptlayer.com/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](https://docs.perceptlayer.com/rate-limits) before you parallelise.

To try the first call, [get a free API key](https://perceptlayer.com/signup) and run the One Way request from this article in the playground on the [Google Flights API page](https://perceptlayer.com/apis/google-flights).

## APIs in this post

-   [Google Flights **1 credit per call** · 7 endpoints](https://perceptlayer.com/apis/google-flights)
-   [Kiwi.com **1 credit per call** · 7 endpoints](https://perceptlayer.com/apis/kiwi)
-   [Skyscanner **1 credit per call** · 3 endpoints](https://perceptlayer.com/apis/skyscanner)

## 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](https://support.google.com/travel/answer/6235879), 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](https://support.google.com/travel/answer/2475306), 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](https://docs.perceptlayer.com/errors) list every code.

travel flights fare tracking price data google flights

## More from the blog

1.  [Web data by industry](https://perceptlayer.com/blog/category/web-data) 7 Sept 2026 Perceptlayer 8 min read
    
    ## [Hotel Price Data for Rate Monitoring: Fields and Costs](https://perceptlayer.com/blog/hotel-price-data-rate-monitoring)
    
    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.  [API guides](https://perceptlayer.com/blog/category/api-guides) 28 Aug 2026 Perceptlayer 7 min read
    
    ## [Google Flights API: Fares, Date Ranges and Airports](https://perceptlayer.com/blog/google-flights-api)
    
    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.  [Web data by industry](https://perceptlayer.com/blog/category/web-data) 21 Oct 2026 Perceptlayer 8 min read
    
    ## [Job Posting Data for Labour-Market Research](https://perceptlayer.com/blog/job-posting-data-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.
