Qatar Airways Flight Scraper – Fare Calendar & Flight Status avatar

Qatar Airways Flight Scraper – Fare Calendar & Flight Status

Pricing

from $2.00 / 1,000 flight options

Go to Apify Store
Qatar Airways Flight Scraper – Fare Calendar & Flight Status

Qatar Airways Flight Scraper – Fare Calendar & Flight Status

Scrape Qatar Airways economy fares and live flight status for any route. Fare mode returns the dated lowest-fare calendar: one row per day with the cheapest fare and any promo code. Status mode returns each flight's status, aircraft and scheduled, estimated and actual times. No login.

Pricing

from $2.00 / 1,000 flight options

Rating

0.0

(0)

Developer

R.L.

R.L.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

Qatar Airways Flight Scraper — Dated Lowest Fares & Live Flight Status

Fare coverage note (September 2026)

Qatar Airways moved per-flight cash fares (POST /flight-search/flight-offers) behind Akamai Bot Manager: it now needs a device-bound X-acf-sensor-data sensor token and returns

403 Access Denied
to any headless client (on every proxy type and TLS fingerprint). So schedules mode now returns Qatar's dated lowest-fare calendar — real economy fares from the same API, one row per day — instead of per-flight cash fares. flightStatus mode is unaffected. If Qatar drops the sensor requirement, per-flight fares resume automatically with no change.

Qatar Airways Flight Scraper reads Qatar Airways' own mobile API directly, so it's fast, reliable and complete — no flaky HTML parsing, no headless browser. Read-only public travel data. Export to JSON, CSV, Excel, or an API.

What can it scrape? (two modes)

schedules (default) — Qatar Airways' dated lowest-fare calendar (economy) for a route around your date: one record per day with the lowest available fare and any promo discount. The calendar is returned by default. (Per-flight cash fares with fare families are attempted too, but Qatar now serves that specific endpoint behind Akamai Bot Manager — see Good to know — so it is best-effort and usually returns nothing; the lowest-fare calendar is the reliable fare signal.)

flightStatus — live operational status, one record per flight: arrived / on-time / delayed, aircraft type, and scheduled, estimated and actual departure/arrival times. Set origin + destination + departureDate for every flight on a route/date, or set flightNumber (e.g. QR11) to track a single flight. An empty date means today.

// dated lowest fares DOH -> LHR (calendar is on by default)
{ "origin": "DOH", "destination": "LHR" }
// live status of every DOH -> LHR flight today
{ "mode": "flightStatus", "origin": "DOH", "destination": "LHR" }
// one specific flight
{ "mode": "flightStatus", "flightNumber": "QR11" }

Every row — flight, calendar and status — shares one flat schema, so a mixed export stays a single table; fields that don't apply to a row type are null.

What timezone are the times in?

Times keep their original UTC offsets (e.g. 2026-10-06T01:10:00+03:00), so local times are unambiguous and no timezone is assumed on your behalf.

What inputs does it take?

FieldTypeDefaultDescription
modestringschedulesschedules = dated lowest-fare calendar (economy). flightStatus = live status for a route/date or one flight.
originstringDOHOrigin airport IATA code.
destinationstringLHRDestination airport IATA code.
departureDatestring–Date, or a relative value like "30 days". Schedules: empty = +30 days. Status: empty = today.
returnDatestring–Schedules only. Set for a round trip. Empty = one way.
adultsinteger1Number of adult passengers.
currencystringUSD3-letter currency code for fares.
includeCalendarbooleantrueSchedules only. Emit one record per date from the lowest-fare calendar (the reliable fare signal). Set false to skip it.
flightNumberstring–Flight-status only. One flight, e.g. QR11. Empty = every flight on the route/date.
maxItemsinteger1000 = all results.
proxyConfigurationobjectRESIDENTIALThe Akamai edge blocks datacenter IPs; a residential proxy is set by default.

What does each row contain?

Every row is flat and carries the same keys, with type saying which kind it is and the inapplicable fields set to null.

On every row

FieldDescription
typecalendar, status or flight
origin / destinationIATA codes for the row's route
departure_dateThe date the search or status lookup was for (YYYY-MM-DD)
currencyCurrency of the prices on the row

type: "calendar" — one row per date from the dated lowest-fare calendar:

FieldDescription
calendar_dateThe date this lowest fare is for
calendar_lowest_priceLowest available economy fare for that date, as a number
calendar_discount_codePromo/discount code Qatar applied to that date, when there is one

type: "status" — one row per flight from the flight-status feed:

FieldDescription
flight_numbersSingle-element array with the marketing flight number, e.g. ["QR11"]
operating_airlineCarrier code, normally QR
aircraftEquipment code for the aircraft type
statusQatar's flight status, e.g. on time, departed, arrived, delayed
status_detailQatar's operational status code behind that status
scheduled_departure / estimated_departure / actual_departureTimestamps with their original UTC offsets
scheduled_arrival / estimated_arrival / actual_arrivalSame, for the arrival

type: "flight" — one row per per-flight cash offer. Read the coverage note above first: this row type only appears if Qatar's fare-offers endpoint answers, which it currently does not.

FieldDescription
flight_numbersEvery flight number in the itinerary, in order
operating_airlineOperating airline name for the first segment
aircraftAircraft name for the first segment
departure_time / arrival_timeItinerary start and end, with UTC offsets
duration_minutesTotal itinerary duration in minutes
stopsNumber of stops
cabinAlways ECONOMY — see Good to know
fare_familyFare family code of the cheapest priced offer
price_base / price_totalBase fare and total for that cheapest offer
available_seatsSeats left at that fare, as Qatar reports it
fare_offersArray of every fare family with its total and availableSeats

Which routes and currencies can I use?

Any route Qatar Airways operates. The actor passes the IATA codes you give it straight to Qatar's own API and keeps no route list of its own, so a pair Qatar does not fly simply returns zero rows with a warning in the log rather than an error. Everything is via the Doha hub (DOH):

RegionExample airport codes
HubDOH Doha
EuropeLHR London Heathrow, CDG Paris, FRA Frankfurt, MAD Madrid, MXP Milan, IST Istanbul
North AmericaJFK New York, ORD Chicago, LAX Los Angeles, IAD Washington, YYZ Toronto
Middle East & AfricaDXB Dubai, RUH Riyadh, CAI Cairo, JNB Johannesburg, CPT Cape Town, NBO Nairobi
South AsiaDEL Delhi, BOM Mumbai, BLR Bengaluru, CMB Colombo, KHI Karachi
East Asia & PacificSIN Singapore, BKK Bangkok, HKG Hong Kong, NRT Tokyo, SYD Sydney, MEL Melbourne

Fares can be requested in any of these ten currencies: USD, GBP, EUR, QAR, AED, INR, AUD, CAD, SGD, CHF.

What do the fare and status terms mean?

  • Dated lowest-fare calendar — Qatar's own "cheapest fare per day" view around your date. One row per date, each holding the lowest economy fare available that day for the route. It answers "when is this route cheapest", not "which flight costs what".
  • Per-flight cash fare — the price of one specific itinerary, with each fare family priced separately. This is the type: "flight" row, and the endpoint behind it is currently sensor-walled (see the note at the top).
  • Fare family — Qatar's branded economy fare tiers, returned as the code Qatar uses (fare_family, and one entry per family in fare_offers). The actor reports the code verbatim rather than inventing a label for it.
  • price_base vs price_total — base fare before taxes, fees and surcharges, and the all-in total for the same offer. Compare totals, not bases, across airlines.
  • Scheduled / estimated / actual — the published time, Qatar's current forecast, and what actually happened. A flight that has not departed has no actual_departure; a delay shows up as an estimated_* time later than the scheduled_* one.
  • IATA code — the 3-letter airport code (DOH, LHR). The actor requires it in that form and rejects anything else with a clear message instead of guessing.

Good to know

  • Economy only. Qatar's mobile fare API serves economy on this channel; Business/First return a gateway error and are not offered rather than shipped as an option that fails.
  • Cash per-flight fares are behind Akamai Bot Manager. As of app v26.10.x, Qatar's mobile fare-offers endpoint requires a device-bound X-acf-sensor-data sensor token and returns HTTP 403 "Access Denied" to any client without it (on every residential/mobile exit and TLS fingerprint) — so per-flight cash fares and fare families are not available headlessly. The actor returns the dated lowest-fare calendar instead (real economy fares, still from Qatar's own API), and flight status is unaffected. If Qatar removes the sensor requirement, per-flight fares resume automatically with no change.
  • No login, no booking, no PNR lookup — read-only public search, exactly what the app shows a signed-out user. There is no request signing, API key or OAuth on this surface.
  • Fare availability and prices are point-in-time and market/currency-scoped.

How much does it cost?

Pay per event: $2.00 per 1,000 records. One charge per row delivered, whether it is a calendar date, a status row or a flight offer — nothing is charged for a request that returned no rows.

maxItems bounds the run (default 100, 0 = everything the API returns). A 30-date calendar snapshot is 30 rows, or $0.06; a day of flight status on one route is a handful of rows.

FAQ

Do I need a Qatar Airways account, a Privilege Club login or an API key?

No. This is the read-only public surface the app shows a signed-out user. There is no API key, no OAuth and no request signing — only a client-generated session id and device id, which the actor generates itself. No booking and no PNR lookup either.

Can I get business or first class fares?

No, economy only, and that is deliberate. Qatar's mobile fare channel answers BUSINESS and FIRST with a gateway error, so the actor does not offer a cabin selector it cannot honour.

Can I track one specific flight?

Yes. In flightStatus mode set flightNumber to QR11 or just 11 and you get that flight for the date you asked for; leave it empty and you get every Qatar Airways flight on the route that day. An empty date means today.

Can I price a round trip?

Yes — set returnDate in schedules mode and the search is priced as a return itinerary. The rows still describe the outbound route and its dates, so treat returnDate as part of the pricing request rather than a second set of rows.

What proxy should I use?

Leave the default. Qatar's Akamai edge blocks datacenter IPs, so Apify Proxy with the RESIDENTIAL group is pre-set. On a failure the actor retries from a fresh exit IP and cycles the exit country (GB, DE, US, NL, FR, QA, IN) because some exits get a spurious error from the fare backend; if you pin your own country in the proxy config, it leaves your choice alone.

Can I run it on a schedule?

Yes, and it is the main reason to use it — a daily run of the fare calendar on your route builds a price history no single search can give you. The actor keeps no memory between runs, so de-duplicate on calendar_date (or flight number and date) if you append runs to your own store.

What happens if there are no flights, or I mistype a code?

A route or date with nothing on it finishes successfully with zero rows and a warning in the log, so an empty dataset is never mistaken for a crash. An airport code that is not three letters fails the run immediately with a message naming the offending value.