Build custom pivot reports from AeroAPI flight data
FLIFO Dashboard
Flight information and operational trends
Flight Inspector
Deep-dive into individual flight histories
Fleet Utilization
Aircraft utilization cycles and block hours
Airport Ops
Airport-level operational performance
Airline Comparison
Head-to-head competitive scorecard
Fleet Info
Aircraft type details and fleet composition
Surface Ops
Ground movement, taxi times, and congestion analysis
Route Analysis
Route performance and city-pair analytics
Rebooking
Find alternative flights and check aircraft routing for rebooking decisions
Disruptions
Global delay and cancellation dashboard with interactive disruption map
Weather Exposure
Find which flights flew through lightning, turbulence, icing, and thunderstorms — with the FA flight map for visual confirmation
Diversion Intelligence
Plan IRROP recovery for storm season — see where weather-driven diversions actually went, who else was on the ramp, and how long competitors stayed on the ground
API
Filters
Server-side — reduces pages returned
& cost
⊞
Filters
Drag fields to filter results
Drop filter fields here
☰
Rows
Fields shown as row labels
Drop row fields here
⫼
Columns
Fields shown as column headers
Drop column fields here
Σ
Values
Numeric fields to aggregate
Drop value fields here
HISTORY
API
1 call
× $0.000/pg
=
$0.00–$0.00
$0.00actual
No data loaded
✈
Build Your Report
Select a data source, drag fields into the pivot zones, set your date range, and click Run Report to
fetch data from AeroAPI.
Charts:
✈
FLIFO Dashboard
Enter an operator code and date range, select your charts, and click Run FLIFO to generate an airline
performance report.
🔍
Flight Inspector
Enter a flight ident (e.g. SWA45) or tail number (e.g. N12345) and a date
range to inspect individual flights. Each flight appears as a clickable tile — select one to see the
full track map, OOOI timeline, delays, and derived metrics.
⏱
Fleet Utilization
Enter an operator or airport code and date range to generate fleet utilization data — flight hours, block
hours, cycles, daily utilization, and performance rates by aircraft type.
🛩
Fleet Info
Enter an operator or airport code and date range to see fleet composition — unique aircraft (tail numbers)
by type, with operators broken out for airport queries.
🛫
Airport Operations
Enter an airport code and date range to analyze operational performance — completion rates, on-time stats,
taxi times, gate utilization, terminal breakdowns, and fleet mix.
🛬
Surface Ops Analysis
Analyze ground congestion, taxi queue depth, wave patterns, gate occupancy, and fuel burn at any airport.
Filter by operator to isolate specific operations.
Query Mode: "By Airport"
pulls all traffic (arrivals + departures) — best for cross-traffic analysis. "By Operator" queries operator
flights directly — provides more complete OOOI timestamps for taxi analysis.
ℹ About
Getting Started
The FlightAware Report Builder lets you query AeroAPI using a drag-and-drop pivot table interface. Instead of
writing raw API calls, you pick fields, set filters, and the tool builds and executes the queries for you —
including automatic pagination and date-range chunking.
Platform Features
Vertical sidebar navigation with collapsible tabs for quick access to all analytics modules
Home dashboard with quick-start cards to jump into common workflows
Admin panel for user management, group permissions, and tab access control
Server-side AES-256-GCM encryption for API key storage — keys are never exposed in plaintext
Daily budget tracking and enforcement to prevent unexpected API costs
User registration with admin approval workflow — new accounts require admin review before access is granted
Step 1 — Get an AeroAPI Key
1Go to flightaware.com/aeroapi/portal and sign up.
2Choose a tier — Personal ($0 free trial with limited calls), Standard, or
Premium.
3Copy your API key from the portal dashboard.
Step 2 — Start the Proxy Server
Browsers can't call AeroAPI directly (CORS). Open a terminal and run the local proxy server:
cd /path/to/your/folder
python3 server.py
Then open http://localhost:8090 in your browser. The status bar should show PROXY
✓ in green.
The server uses only Python stdlib — no pip installs needed. It serves
aeroapi-report-builder.html and proxies /aeroapi/* requests to FlightAware. Both
files (server.py and aeroapi-report-builder.html) must be in the same folder.
Step 3 — Save Your API Key
1Click 🔑 Connect in the top-right header to open the API Key Settings modal.
2Paste your AeroAPI key and click 🔒 Save Key (Encrypted). The key is encrypted with AES-256-GCM and validated against /airports/KJFK.
3If valid, the status dot turns green and your name appears in the header.
Your API key is stored securely on the server — it is never exposed in plaintext to the browser.
Step 4 — Build a Report
Choose a Data Source — The dropdown controls which AeroAPI endpoint is called and which
fields appear in the sidebar:
Flights by Ident — Flights for a tail number or flight ID
(/flights/{ident}). With dates >10 days back, auto-routes to
/history/flights/{ident}.
Airport Flights — Arrivals/departures at an airport
(/airports/{ident}/flights). With dates >10 days back, auto-routes to the history endpoint.
Operator Flights — All flights for an airline (/operators/{ident}/flights).
With dates >10 days back, auto-routes to the history endpoint. Great for large pulls like 1 year of AAL
flights.
Airport Info — Static airport data like elevation, timezone
(/airports/{ident})
Operator Info — Airline details like callsign, country (/operators/{ident})
When dates push beyond the 10-day recent-data limit, the tool automatically switches to the
/history/ endpoint. A HISTORY
API badge appears in the cost bar to confirm this. History endpoints cost $0.01/page.
The left sidebar automatically filters to show only fields available for the selected source.
Enter an Identifier — Depends on the source:
Flights: tail number (N108US) or flight ident (SWA45)
Airport: IATA code (DFW, JFK)
Operator: ICAO operator code (AAL, UAL)
Set Date Range — Optional for flight sources (recent data if omitted, auto-routes to history
if >10 days back). The tool automatically chunks requests into time windows and stitches results together.
Recent endpoints use 7-day windows; history endpoints use 1-day (24hr) windows per AeroAPI constraints. A
30-day historical range = ~30 API calls (one per day).
Depth / Record Limit — Choose how many pages to fetch, or select "All records" to paginate
until all data is retrieved. "All records" is the default and is needed for large pulls (e.g., 1 year of AAL
flights). Cost is per page regardless of setting.
Drag Fields — Drag fields from the left sidebar into the four pivot zones:
Filters — Narrow results client-side (e.g. only B738 aircraft, only flights to KJFK). A
field can be in Filters AND in Rows/Columns simultaneously.
Rows — Vertical grouping. Each unique combination becomes a row in the output.
Columns — Horizontal cross-tab. Unique values become column headers.
Both Rows and Columns pull the same data from the API — the difference is how results display in the pivot
table.
Example: You query historical flights for N108US over 30 days with these fields:
Rows: Aircraft Type
Columns: Origin ICAO
Values: COUNT(Flight Ident)
This produces a matrix where each row is an aircraft type, each column is an origin airport, and each cell is
the count of flights — like a cross-tab / pivot table.
If both Aircraft Type and Origin ICAO were in Rows instead, you'd get a flat grouped list
with one row per unique combination, which is simpler but less visual.
Tip: Use Rows for "group by" dimensions and Columns for the dimension you want
spread horizontally. Keep Columns to low-cardinality fields (a field with few unique values) to avoid
extremely wide tables.
Reordering & Moving Fields
You can drag chips between zones — e.g. move a field from Rows to Columns without removing it first. You can
also drag chips within a zone to reorder them (row order affects grouping priority). The "✕ Clear All" button
resets all zones.
Use the ▼ All / ▶ All buttons to expand or collapse all field groups, and the search bar to find fields
quickly.
Cost Estimation
The action bar shows a real-time cost breakdown before you run:
Calls — Number of API calls required for your date range. History endpoints use 1-day
windows, so a 60-day range = 60 calls.
Per-page cost — The AeroAPI price per page for the selected endpoint. History endpoints
cost $0.010/page, recent endpoints $0.005/page.
Min cost — The minimum cost assuming 1 page per call. Actual cost will be higher if there
is more data (each page holds ~15 records and the tool fetches all pages automatically).
The breakdown reads left to right: [calls] × $price/pg = $min – $max
The range shows best-case (1 page per call) to worst-case (40 pages per call,
the AeroAPI pagination limit). After running, the range is replaced with the actual cost in green based on
real pages fetched. A busy operator like AAL over 60 days can easily hit 1,000+ pages — always check the range
before running large queries.
Test Limit
Use the Test limit input to cap the number of API calls for testing. For example, if your
query would make 365 calls, set test limit to 5 to fetch just the first 5 days of data. Leave blank to fetch
everything.
API Filters
When using Airport Flights or Operator Flights, an API FILTERS bar appears below the source selector. These
filters are applied server-side by AeroAPI before data is returned, which reduces the number of pages
fetched and lowers cost:
Flight Type — Filter to Airline or General Aviation flights only. Available for Airport
and Operator endpoints.
Airline — Filter airport results to a specific airline (e.g. AAL for
American, UAL for United). Available for Airport endpoints only.
API filters are the most effective way to reduce cost. If you only need AAL
flights from DFW, setting the Airline filter to AAL means the API returns only matching flights — saving
potentially hundreds of pages per call.
Aborting a Report
While a report is running, the Run button becomes a red ⏹ Abort button showing live
progress: call number, record count, and running cost (e.g. ⏹ 8/62 pg12 · 23,669 recs · $19.70). The
cost bar also updates in real-time so you can watch the meter climb. Click Abort to stop — all data already
fetched is kept and rendered as partial results.
Calculated Fields
The Calculated Fields group in the sidebar provides derived metrics computed automatically
from OOOI times (Out, Off, On, In):
Taxi Out — Minutes from gate departure to wheels-up (actual_off − actual_out)
Taxi In — Minutes from wheels-down to gate arrival (actual_in − actual_on)
Flight Time — Minutes airborne, wheels-up to wheels-down (actual_on − actual_off). Also
available in decimal hours.
Block Time — Total gate-to-gate time (actual_in − actual_out). Also available in decimal
hours.
Drag these into Values with SUM to get total flight hours, AVG for average taxi times, etc.
They work with all grouping and filtering — e.g. SUM of Flight Time (hrs) by Aircraft Type gives fleet
utilization by type.
Date Grouping
When you drag a date/time field (like Actual Out or Scheduled In) into Rows or
Columns, a bucket selector appears on the chip: Raw, Day, Week, Month, Qtr, Year.
Raw — Full datetime (default, one row per flight)
Day — Groups by date (2024-01-15)
Week — ISO week (2024-W03)
Month — Year-month (2024-01)
Qtr — Quarter (2024 Q1)
Year — Year only (2024)
Combined with calculated fields, this enables powerful analyses like: Actual Out bucketed by Month in Rows,
Aircraft Type in Columns, SUM of Flight Time (hrs) in Values → monthly flight hours by fleet type.
Sorting & Column Filters
Sorting: Click any column header to sort ascending, click again for descending. Works in
Pivot, Raw, and flat table views.
Column Filters (Excel-style): Each column header has a small ▼ filter icon. Click it to open
a dropdown showing all unique values in that column with counts. Check/uncheck values to include or exclude
them. Use "Select all" / "Deselect all" for quick toggling, and the search box to find specific values. Active
filters show a yellow ▼ icon. Clear all column filters at once from the results info bar.
Column filters stack with the drag-and-drop zone filters — zone filters apply first (server-side logic), then
column filters narrow the visible rows further.
Checking Usage & Billing
Click 💰 Usage in the header to view your current billing cycle's API usage. This calls
GET /account/usage which is free (no charge). It shows a breakdown by endpoint with query counts
and costs. Data updates every ~10 minutes. For the full dashboard, visit
flightaware.com/commercial/aeroapi/billing/activity/recent.
Viewing Results
After running, results appear in the main area. Use the toolbar to switch between:
Table — Flat or pivoted table depending on your zone configuration
JSON — Raw API response data for debugging
⬇ CSV — Export the current data as a CSV file
Example Workflows
What aircraft types does SWA fly out of Dallas?
Source: Airport Flights — Identifier: KDAL
Rows: Operator (ICAO) — Filter: Operator = SWA
Columns: Aircraft Type — Values: COUNT(Flight Ident)
N108US route history over 30 days:
Source: Flights by Ident — Identifier: N108US — Date: 30-day range (auto-routes to history)
Source: Airport Flights — Identifier: JFK — Date: 7-day range
Rows: Scheduled Out (Gate) — Values: COUNT(Flight Ident)
Full year of AAL flights (large pull):
Source: Operator Flights — Identifier: AAL — Date: Jan 1 to Dec 31 (auto-routes to history)
Depth: "All records" — this will auto-chunk into ~365 daily API calls (history endpoints use 1-day
windows) and paginate each fully
Rows: Origin ICAO, Dest ICAO — Columns: Aircraft Type — Values: COUNT(Flight Ident)
Use the Raw view + CSV export to get the complete dataset
AeroAPI Pricing Reference
Flights by Ident: $0.005/page (recent) · $0.01/page (history)
Airport Flights: $0.01/page
Operator Flights: $0.01/page
Airport Info: $0.005/query
Operator Info: $0.005/query
Account Usage: FREE
Troubleshooting
Status dot stays red — Make sure python3 server.py is running and you opened
http://localhost:8090 (not the file directly)
"Invalid API key" — Double-check your key at flightaware.com/aeroapi/portal.
Make sure you copied the full key with no extra spaces.
No results — Try a known tail number like N108US or a major airport like
KJFK. For historical, make sure the date range includes actual flights.
Run button disabled — You need: (1) a connected profile, (2) an identifier entered, and
(3) at least one field in Rows, Columns, or Values.
Terms of Use
Last updated: March 2026
By accessing Flight Report Builder ("the Service"), you agree to be bound by these terms. If you do not agree, do not use the Service.
1. Eligibility & Account Approval
Access to the Service requires registration and administrator approval. You must provide accurate information and a valid business reason for requesting access. Accounts that are not approved may be removed at the administrator's discretion.
2. Acceptable Use
You agree to use the Service only for lawful purposes related to aviation operations analysis. You will not: (a) share your login credentials with others; (b) attempt to access data or features not assigned to your account; (c) use the Service to compete with or replicate FlightAware products; (d) reverse-engineer, scrape, or redistribute data obtained through the Service.
3. AeroAPI Usage & Costs
The Service queries FlightAware's AeroAPI on your behalf using API keys you provide. You are solely responsible for all API usage costs incurred through your account. The Service provides cost estimates but these are approximations only. You should monitor your usage through FlightAware's billing dashboard.
4. Data & Intellectual Property
Flight data retrieved through the Service is provided by FlightAware and is subject to FlightAware's terms of service. You may not redistribute, resell, or publicly display raw API data without FlightAware's authorization.
5. Service Availability
The Service is provided "as is" without warranty of any kind. We do not guarantee uptime, accuracy, or completeness of data. We may modify, suspend, or discontinue the Service at any time without notice.
6. Limitation of Liability
In no event shall the Service operators be liable for any indirect, incidental, special, or consequential damages arising from your use of the Service, including but not limited to API costs, lost data, or business interruption.
7. Account Termination
Administrators may suspend or terminate your account at any time, with or without cause. Upon termination, your stored data (including encrypted API keys) will be deleted.
8. Changes to Terms
We may update these terms at any time. Continued use of the Service after changes constitutes acceptance of the updated terms.
Privacy Policy
Last updated: March 2026
This Privacy Policy describes how Flight Report Builder ("the Service") collects, uses, and protects your information.
1. Information We Collect
Account Information: When you register, we collect your email address, name, and the reason you provided for requesting access. This information is stored in Cloudflare KV storage.
API Keys: If you provide a FlightAware AeroAPI key, it is encrypted using AES-256-GCM before storage. The plaintext key is never stored or logged on the server.
Usage Data: We may log basic request metadata (timestamps, endpoints accessed) for security and troubleshooting purposes. We do not track your browsing behavior or use analytics trackers.
2. How We Use Your Information
To authenticate you and manage your account
To proxy API requests to FlightAware on your behalf
To enforce access controls and tab permissions assigned by administrators
To notify administrators of new registration requests
3. Data Sharing
We do not sell, rent, or share your personal information with third parties. Your API queries are sent to FlightAware's AeroAPI servers, which are subject to FlightAware's privacy policy. Administrator users can see your name, email, and account status (but not your API key).
4. Data Storage & Security
Your data is stored on Cloudflare's global network using KV storage. API keys are encrypted at rest. Sessions use secure, httpOnly cookies with SameSite=Strict. All connections use HTTPS/TLS.
5. Data Retention
Account data is retained as long as your account is active. If your account is deleted by an administrator, all associated data (profile, encrypted API key, saved reports) is permanently removed from storage.
6. Your Rights
You may request to view, update, or delete your account data by contacting an administrator. Upon deletion, all your data is permanently removed.
7. Contact
For privacy-related questions, contact your system administrator.
Cookie Policy
Last updated: March 2026
Flight Report Builder uses a minimal number of cookies, all of which are essential for the Service to function.
Cookies We Use
Cookie
Purpose
Duration
Type
session
Authentication session token
7 days
Essential
cookieConsent
Records that you accepted the cookie notice
365 days
Essential
What We Don't Use
No advertising or tracking cookies
No third-party analytics (Google Analytics, etc.)
No social media cookies or pixels
No cross-site tracking
Managing Cookies
Because all cookies used by the Service are essential for authentication, disabling them will prevent you from logging in. You can clear cookies through your browser settings at any time, which will log you out.
🔑 API Key Settings
AeroAPI Key
Your API key is encrypted with AES-256-GCM before being stored. It is never exposed in plaintext on the server.
{ } API Call Preview
💰 AeroAPI Usage
Click "💰 Usage" to load your current billing data via
GET /account/usage (no charge).
📋 Report Templates
Save Current Report
Saves: data source, identifier, dates, max
pages, and all pivot zone fields.
Saved Templates
No saved templates yet.
Templates stored in localStorage.
💰 Daily Budget
Set a daily spending limit. When the
limit is reached, all API calls stop and a warning is shown. Resets automatically at midnight UTC.
Today's
Spend$0.00
$0$25
⚠ Non-history airport
endpoints cost ~$0.65/call
FlightAware charges hidden Foresight
prediction fees ($0.06/page) on non-history airport queries (data <10 days old). History endpoints cost
only $0.02/page with no surcharge. Use longer date ranges starting >10 days back to minimize cost.
📂 Data Library
Saved flight data is stored as TSV
files in the ./data/ folder next to server.py. Load any saved dataset to avoid
re-querying the API.
No saved data
files yet. Run a query, then click 💾 Save Data.
📈
Route Analysis Tool
Enter an Origin and Destination airport, plus date range. Use the Target Airline to cross-compare your
strategy against the rest of the market. Generates competitive scorecards and "What-If" schedule scenario
modeling.
Target Strategy
-
Comp: -
Target Avg Block
-
Taxi: -
Industry Baseline
-
Comp: -
Industry Avg Block
-
Taxi: -
Operator Market Overview (Click
any row to expand flight details)
OPERATOR
FLIGHTS
COMPLETION
ON-TIME (A14)
AVG DELAY
AVG BLOCK Derived
TAXI OUT
TAXI IN
⚠ Delay Intelligence
Avg Arrival Delay >15 min detected
Flight Details
⚖
Airline Comparison
Enter an airport and two airline codes to compare operational performance.
Computes 13 competitive metrics including completion factor, on-time performance,
taxi times, gate delays, congestion, fleet signature, and seat capacity.
🔄
Rebooking Companion & Flight Search
Enter a flight number to look up a canceled flight and find alternatives,
or enter origin + destination to search all available flights between two airports.
Each flight shows inbound aircraft status, viability scores, and detailed routing history.
Weather events:+ icing tracked silently for sustained-icing MX flag
Weather Exposure
Enter an airline ICAO operator code, pick a date range, and select weather events.
The scanner uses a 3-stage funnel — geometry (free) → filed route → full track —
to identify which flights actually flew through the selected hazards while keeping
AeroAPI cost bounded. Detection is timestamp-matched against polygon hazards
(SIGMET / AIRMET / G-AIRMET) and point hazards (PIREPs, AIREPs, lightning);
click any row's map icon to open the FlightAware track map with the radar overlay.
Flight data: FlightAware AeroAPI (positions, routes, tracks).
Weather data (all free): NOAA Aviation Weather Center (live + ≤30-day
archive for SIGMETs, AIRMETs, G-AIRMETs, PIREPs and AIREPs in one feed);
Iowa Environmental Mesonet at Iowa State University (>30-day SIGMET archive
and live LSR lightning fallback); NESDIS GOES-19/18 GLM L2 LCFA via AWS
Open Data (historical lightning, ingested nightly to KV).
Turbulence detection requires ≥2 of 5 independent signals to agree —
polygons, human-typed PIREPs, automated AIREPs, and derived shear.
Stage caps: 5,000 filed-route calls / 1,000 track calls per scan.
See WEATHER_SOURCES.md for the full data-source attribution and detection rules.
Disruptions Dashboard
View global flight delays and cancellations with an interactive disruption map.
Click an airline to see where their disruptions are concentrated.
Data from AeroAPI /disruption_counts endpoint.
Diversion Intelligence
Identify weather-driven IRROP events at your hubs over the last 30/90/180 days.
See which alternates absorbed your aircraft and your competitors', how long each
airline stayed on the ground, and where the ramp got crowded. Use it to plan
summer thunderstorm season — or any IRROP-prone window.
Workflow: enter hubs + your operator (and optional competitors),
click Preview cost to size the scan, then run.
Cluster detection (≥3 diversions in a 4-hour window at the same hub) filters out
mech/medical singletons and isolates weather IRROP events.
Diversions are sourced from AeroAPI /history/operators/{op}/flights
with a destination filter, then post-filtered for diverted=true.
⚠ High-Cost Airport Query
Estimated cost (non-history)$0
If all history (>10 days)$0
FlightAware auto-charges
Foresight prediction fees (~$0.60/call) on non-history airport requests (data <10 days old). Move your end
date further back to avoid these charges, or use operator queries instead.
Database Manager
Gate Coordinates
This site uses essential cookies for authentication. By continuing, you agree to our Cookie Policy.