· 14 min read
BTS Airline On-Time Performance Scraper: 48 Data Fields per Record
Each record carries 48 output fields derived from official US Department of Transportation monthly filings, covering network-wide summaries, route metrics, and delay causes. At $5.00 per 1,000 results on the free tier, it processes domestic operations without requiring browser sessions or credentials. The collector fits aviation analysts, travel aggregators, and researchers who need verified government delay distributions and historical punctuality trends. It is not suitable for users seeking real-time live flight status or international routes outside US jurisdictions, as the dataset is strictly domestic and reports on historical monthly aggregates.
Try it: open BTS Airline On-Time Performance Scraper on Apify, sign in on the free plan and run the prefilled example.
Can you try BTS Airline On-Time Performance Scraper before paying?
Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of BTS Airline On-Time Performance Scraper a month, before run-start charges and platform usage.
The example request further down caps maxItems at 20, so a first run returns at most 20 results and costs at most $0.10 in result charges. That is enough to see the real shape of the data before deciding anything.
BTS Airline On-Time Performance Scraper was last updated on 2026-07-14. It is one of 1,729 Actors CrawlerBros publishes on Apify, which together have 746,619 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.
What does it cost to run BTS Airline On-Time Performance Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
Total run expenses are driven primarily by mode and maxItems, which determine how many summary rows are written to the dataset. Single-record modes like carrierMonthSummary or routeMonthSummary generate exactly one item per run, making them the most economical way to validate input values before launching multi-row ranking queries. Adjusting nested metrics or delay breakdowns does not alter billing because fees apply strictly to generated dataset items alongside Apify platform usage.
How do you run BTS Airline On-Time Performance Scraper from the API?
The schema marks 3 of its 10 controls as required: mode, year, month. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for BTS Airline On-Time Performance Scraper, so the request works once your token is in place.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~bts-airline-on-time-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"carrierMonthSummary","carrier":"WN","year":"2025","month":"12","maxItems":20}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"mode": "carrierMonthSummary",
"carrier": "WN",
"year": "2025",
"month": "12",
"maxItems": 20
}
run = client.actor("crawlerbros~bts-airline-on-time-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"mode": "carrierMonthSummary",
"carrier": "WN",
"year": "2025",
"month": "12",
"maxItems": 20
}
const run = await client.actor('crawlerbros~bts-airline-on-time-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.
Which BTS Airline On-Time Performance Scraper inputs matter, and which can you skip?
The input schema exposes 10 controls, but only mode, year, and month are required to compute a dataset. The carrier, originAirport, and destAirport controls determine your aggregation slice, while maxItems caps output volume in ranking modes. For initial runs, stick to the default curated airport and airline menus rather than custom overrides until you confirm BTS reporting coverage.
mode(string): What to compute from the monthly BTS on-time performance file. Default:"carrierMonthSummary".carrier(string): Reporting carrier code. Curated list of current + well-known historical US carriers. Use carrierCodeOverride for any other BTS carrier code (e.g. very old regional codes). Default:"WN".carrierCodeOverride(string): Raw BTS Reporting_Airline code, used instead of carrier if set. For historical codes not in the curated dropdown.originAirport(string): Origin airport code. Curated list of ~115 major US airports. Use originAirportOverride for any other US airport code.originAirportOverride(string): Raw 3-letter BTS Origin airport code, used instead of originAirport if set.destAirport(string): Destination airport code. Curated list of ~115 major US airports. Use destAirportOverride for any other US airport code.destAirportOverride(string): Raw 3-letter BTS Dest airport code, used instead of destAirport if set.year(string): Reporting year. This actor's data source (BTS PREZIP monthly archive) serves 2000-present (typically ~2 months behind the current date). Default:"2025".month(string): Reporting month. Default:"12".maxItems(integer): Cap on ranked records returned. Ignored by the single-record summary modes. Default:20.
Fixed-choice controls: mode accepts carrierMonthSummary (whole network for one airline), routeMonthSummary (one airline, one origin->destination pair), topRoutesByCarrier (Top routes for a carrier (ranked by flight volume)), topCarriersByAirport (Top carriers at an airport (ranked by flight volume, origin airport)); carrier accepts 34 values (default WN), including WN (Southwest Airlines), AA (American Airlines), DL (Delta Air Lines), UA (United Airlines); originAirport accepts 117 values, including ATL (Atlanta Hartsfield-Jackson, GA), DFW (Dallas/Fort Worth, TX), DEN (Denver, CO), ORD (Chicago O'Hare, IL); destAirport accepts 117 values, including ATL (Atlanta Hartsfield-Jackson, GA), DFW (Dallas/Fort Worth, TX), DEN (Denver, CO), ORD (Chicago O'Hare, IL); year accepts 27 values (default 2025), including 2025, 2000, 2001, 2002; month accepts 12 values (default 12), including 12 (December), 1 (January), 2 (February), 3 (March).
What does BTS Airline On-Time Performance Scraper return?
Output items deliver complete monthly aggregations including total scheduled flights, DOT standard on-time rates, and granular attribution splits across carrier, weather, and national airspace delays. They provide concrete operational metrics for domestic services but conspicuously lack specific flight numbers, gate assignments, passenger headcounts, or pricing data.
carrierCode/carrierName- reporting airlineoriginAirport/originCityName/originStateName- departure airport (route / top-carriers-at-airport modes)destAirport/destCityName/destStateName- arrival airport (route / top-routes modes)year/month/monthNamerank- flight-volume rank (top-routes / top-carriers modes only)totalFlights- scheduled flights in the groupcancelledFlights/cancellationRatecancelledByCarrierCount/cancelledByWeatherCount/cancelledByNASCount/cancelledBySecurityCount- cancelled flights by BTS's reported cancellation reason (only present when BTS recorded a cause code; BTS didn't start collecting this code until June 2003)cancelledByCarrierShare/cancelledByWeatherShare/cancelledByNASShare/cancelledBySecurityShare- each reason's share (%) of cancelled flightsdivertedFlights/diversionRateonTimeFlights/delayedFlights/onTimeRate- a flight is on-time if it arrived within 15 minutes of schedule, per DOT convention (cancelled/diverted flights excluded)avgDepDelayMinutes/avgArrDelayMinutesavgTaxiOutMinutes/avgTaxiInMinutes/avgAirTimeMinutes/avgDistanceMilestotalCarrierDelayMinutes/totalWeatherDelayMinutes/totalNASDelayMinutes/totalSecurityDelayMinutes/totalLateAircraftDelayMinutes- total delay minutes attributed to each cause (only present when at least one flight reported delay-cause minutes)carrierDelayShare/weatherDelayShare/nasDelayShare/securityDelayShare/lateAircraftDelayShare- each cause's share (%) of total attributed delay minutessourceUrl- the official BTS On-Time Performance portalsourceDataUrl- the exact monthly government data file this record was computed fromrecordType-carrierMonthSummary/routeMonthSummary/topRouteByCarrier/topCarrierByAirportscrapedAt- when this actor computed the record
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open BTS Airline On-Time Performance Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Select your target mode based on the level of aggregation you need: carrierMonthSummary, routeMonthSummary, topRoutesByCarrier, or topCarriersByAirport.
- Pick a historic year between 2000 and the current reporting window, remembering that BTS archive releases run roughly two months behind the calendar.
- Set month to an integer from 1 to 12 matching the reporting period you want to inspect.
- Configure carrier using a standard 2-letter code such as WN, or provide carrierCodeOverride if targeting a vintage or unlisted carrier.
- Supply originAirport and destAirport if using routeMonthSummary, falling back to originAirportOverride or destAirportOverride for smaller airfields.
- Set maxItems between 1 and 200 if using ranked top-routes or top-carriers modes to restrict result generation.
- Execute the run and verify that totalFlights is greater than zero and recordType matches your requested aggregation mode.
How do you apply it? Three worked playbooks
These are BTS Airline On-Time Performance Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Travel research
Outcome: Compare airlines' on-time reliability before booking
Configure: Set mode to carrierMonthSummary, select carrier to WN, year to 2025, and month to 6.
Working method: Execute a baseline run for one airline, verify onTimeRate and avgArrDelayMinutes, then repeat across competing carriers for the same month.
Deliverable: A comparative dataset containing on-time rates and cancellation totals across competing carriers for a specific travel month.
Stop condition: Stop if onTimeRate returns null across multiple carriers, indicating the target month's archive has not yet been published by BTS.
Use case 2: Route planning
Outcome: Check historical delay stats for a specific origin-destination pair
Configure: Set mode to routeMonthSummary, carrier to DL, originAirport to ATL, destAirport to JFK, year to 2025, and month to 6.
Working method: Query a specific city pair for an airline, inspect cancellationRate and avgDepDelayMinutes, then swap carriers to compare reliability on that route.
Deliverable: A route-specific report detailing arrival delays, taxi times, and diversion rates for an airport pairing.
Stop condition: Stop if totalFlights is 0, which signals that the carrier operated no scheduled flights on that route during that period.
Use case 3: Competitive analysis
Outcome: Benchmark one airline's operational performance against its historical trend
Configure: Set mode to topRoutesByCarrier, carrier to AA, year to 2025, month to 6, and maxItems to 25.
Working method: Extract ranked route performance for an airline across a given month, then run identical configurations over consecutive historical years to track trends.
Deliverable: A ranked tabular breakdown of an airline's highest-volume domestic routes alongside delay-cause distributions over time.
Stop condition: Stop if the returned dataset size is lower than requested due to invalid carrier identifiers or omitted operational records.
What breaks, and how do you design around it?
BTS archives typically lag the calendar by roughly two months, so querying the current or preceding month will simply complete with zero rows. If a regional airport or airline is omitted from curated selectors, route your request through originAirportOverride or carrierCodeOverride instead. When inspecting delay causes, expect empty metrics on groups without reportable delays rather than padded zero values.
When should you not use BTS Airline On-Time Performance Scraper?
Do not use this Actor if your project requires live operational tracking, flight radar monitoring, or day-of departure updates. BTS data files are published in monthly retrospective batches with an inherent multi-month lag, making them useless for real-time disruption monitoring. If you need live schedules, fares, or ticket pricing, use Google Flights Scraper or Skiplagged Flight Search Scraper instead. Furthermore, if you need international carrier networks outside the United States, use OpenFlights Scraper because BTS records track only domestic US flights.
What should you check before trusting the output?
- Halt downstream ingestion if totalFlights equals 0 or is absent, indicating an unreleased reporting month or an unoperated route.
- Verify that onTimeRate is a valid decimal between 0 and 1 whenever totalFlights exceeds delayedFlights.
- Confirm cancellation-cause fields like cancelledByCarrierCount appear only when cancelledFlights is greater than zero.
- Check that delay share percentages such as nasDelayShare sum to 100% only when delay minutes are actively recorded.
- Flag any record where carrierCode or recordType returns undefined or fails schema parsing.
None of this proves a record is correct. It gives a scheduled BTS Airline On-Time Performance Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What does a first run cost using the default example settings?
The example input caps maxItems at 20, so it returns at most 20 results and costs at most $0.10 in result charges. Apify platform usage charges apply additionally based on the runtime memory consumed during data processing.
Can I retrieve delay data for flights operating this week?
No. The Bureau of Transportation Statistics compiles and publishes monthly performance files roughly two months after a month closes. Attempting to query recent weeks or months that BTS has not yet archived will finish with zero records.
Why are cancellation cause breakdown fields missing from my records?
BTS only records cancellation causes when flights were actually cancelled, a practice started in June 2003. When a carrier or route experiences zero cancellations during the queried month, the Actor completely omits those specific fields rather than returning zero values.
Does this scraper support non-US airlines flying international routes?
No. The underlying US DOT on-time performance archive applies strictly to US-certificated air carriers operating domestic flights and select US territorial routes. Foreign carriers and international itineraries are completely excluded from this public dataset.
How do I query an airport or regional airline missing from the dropdown menus?
You can supply custom 3-letter IATA airport codes using originAirportOverride or destAirportOverride. For unlisted regional carriers or historical operators, pass the standard BTS carrier code string directly through the carrierCodeOverride input field.
Where to go next
When you are ready to run it, open BTS Airline On-Time Performance Scraper on Apify; the free plan covers up to 1,000 results a month.
Start with the BTS Airline On-Time Performance Scraper Actor page for the current input schema, pricing tier, and run history.
Other Actors we maintain for related data:
- CryptoBubbles Coin Performance Scraper: Scrape live cryptocurrency performance data from CryptoBubbles - top 1000 coins with price, market cap, volume, and multi-timeframe performance metrics (1m, 5m, 15m, 1h, 4h, 1d, 1w, 1mo, 3mo, 1y).
- BLS Labor Statistics Scraper: Fetch U.S. Bureau of Labor Statistics (BLS) time-series data - employment, unemployment, inflation (CPI), wages, and more - via the free BLS public API v1.
- Google Flights Scraper: Scrape Google Flights search results with price, airline, departure/arrival times, duration, stops.
- Skiplagged Flight Search Scraper: Scrape Skiplagged's flight search results - one-way, round-trip, and multi-route fare comparisons with real prices, airlines, flight numbers, durations, stops, and booking-provider data.
- moveBuddha Moving Company Directory Scraper: Scrape moveBuddha.com's ranked moving-company directory by city, state, or interstate route.
- Statistics Canada Housing Market Data Scraper: Scrape official Statistics Canada housing data: new housing price index, CMHC housing starts/completions, average rents, vacancy rates, condo price index, building permits, mortgage rate, and unsold new-home inventory - by city/CMA.
- OpenFlights Scraper: Scrape global aviation data from OpenFlights - 14,000+ airports, 6,000+ airlines, and 67,000+ routes.
- BLS Labor Statistics Scraper: Scrape US Bureau of Labor Statistics (BLS) employment, unemployment, and wage data by industry sector and state.
Related guides:
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-10-06.
Actor last updated by its maintainers on 2026-07-14.
Run outcome figures cover the 30 day public window ending 2026-10-06.
Featured actors
BTS Airline On-Time Performance Scraper
Scrape US DOT Bureau of Transportation Statistics On-Time Performance data. Get airline on-time rates, delay-cause breakdowns, cancellation and diversion rates by carrier, route, year, and month.
Run on Apify ↗