Documentation
Information for interacting with the TSAWaitTimes.com API can be found below. The Request URLs have variables as part of the URL. The possible variables are below. Responses can be returned in both JSON and XML formats. The data elements can be referenced via the Data Dictionary.
Table of Contents
Variables
These are the potential variables that you will need to pass to the API Request URL.
- {APIKEY} : Your API Key
- {FORMAT} : Either json or xml (Default is json if not specified)
- {CODE} : A 3-character airport code (Example: ATL for Atlanta)
All data can be retrieved via GET calls placed to a specific URL as detailed below.
To record a time, you'll need to POST your request to the specific URL as detailed below.
You are encouraged to cache the results locally for optimal and efficient performance.
Retrieve a list of currently supported airports.
REQUEST GET
- https://www.tsawaittimes.com/api/airports/{APIKEY}/{FORMAT}
RESPONSE
JSON Response
Array
(
[0] => stdClass Object
(
[code] => ATL
[name] => Hartsfield-Jackson Atlanta International
[city] => Atlanta
[state] => GA
[latitude] => 33.63985
[longitude] => -84.4439
[precheck] => 1
)
[1] => stdClass Object
(
[code] => ORD
[name] => Chicago-O'Hare International
[city] => Chicago
[state] => IL
[latitude] => 41.976172
[longitude] => -87.903266
[precheck] => 1
)
[2] => stdClass Object
(
[code] => LAX
[name] => Los Angeles International
[city] => Los Angeles
[state] => CA
[latitude] => 33.942452
[longitude] => -118.40801
[precheck] => 1
)
[3] => stdClass Object
(
[code] => LGA
[name] => LaGuardia
[city] => New York
[state] => NY
[latitude] => 40.77725
[longitude] => -73.8726111
[precheck] => 1
)
[4] => stdClass Object
(
[code] => MCO
[name] => Orlando International
[city] => Orlando
[state] => FL
[latitude] => 28.431374
[longitude] => -81.30839
[precheck] => 1
)
)
XML Response
<airports>
<airport>
<code>ATL</code>
<name>Hartsfield-Jackson Atlanta International</name>
<city>Atlanta</city>
<state>GA</state>
<latitude>33.63985</latitude>
<longitude>-84.4439</longitude>
<precheck>1</precheck>
</airport>
<airport>
<code>ORD</code>
<name>Chicago-O'Hare International</name>
<city>Chicago</city>
<state>IL</state>
<latitude>41.976172</latitude>
<longitude>-87.903266</longitude>
<precheck>1</precheck>
</airport>
<airport>
<code>LAX</code>
<name>Los Angeles International</name>
<city>Los Angeles</city>
<state>CA</state>
<latitude>33.942452</latitude>
<longitude>-118.40801</longitude>
<precheck>1</precheck>
</airport>
<airport>
<code>LGA</code>
<name>LaGuardia</name>
<city>New York</city>
<state>NY</state>
<latitude>40.77725</latitude>
<longitude>-73.8726111</longitude>
<precheck>1</precheck>
</airport>
<airport>
<code>MCO</code>
<name>Orlando International</name>
<city>Orlando</city>
<state>FL</state>
<latitude>28.431374</latitude>
<longitude>-81.30839</longitude>
<precheck>1</precheck>
</airport>
</airports>
Retrieve a list of currently supported checkpoints.
REQUEST GET
- https://www.tsawaittimes.com/api/checkpoints/{APIKEY}/{FORMAT}
RESPONSE
JSON Response
stdClass Object
(
[ABE] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ABI] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ABQ] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ABR] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ACT] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[AGS] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ALB] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[AMA] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ANC] => stdClass Object
(
[Terminal SOUTH] => Array
(
[0] => South Checkpoint
)
)
[ASE] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ATL] => stdClass Object
(
[Terminal FIS] => Array
(
[0] => Concourse E Checkpoint
)
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
[Terminal MHJIT] => Array
(
[0] => Concourse F Departure
)
)
[ATW] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[ATY] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Main Checkpoint
)
)
[AUS] => stdClass Object
(
[Terminal MAIN] => Array
(
[0] => Checkpoint 1
[1] => Checkpoint 2
[2] => Main Checkpoint
)
)
)
XML Response
<checkpoints>
<airport code="ABE">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ABI">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ABQ">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ABR">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ACT">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="AGS">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ALB">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="AMA">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ANC">
<terminal name="Terminal SOUTH">
<checkpoint>South Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ASE">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ATL">
<terminal name="Terminal FIS">
<checkpoint>Concourse E Checkpoint</checkpoint>
</terminal>
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
<terminal name="Terminal MHJIT">
<checkpoint>Concourse F Departure</checkpoint>
</terminal>
</airport>
<airport code="ATW">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="ATY">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="AUS">
<terminal name="Terminal MAIN">
<checkpoint>Checkpoint 1</checkpoint>
<checkpoint>Checkpoint 2</checkpoint>
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
<airport code="AVL">
<terminal name="Terminal MAIN">
<checkpoint>Main Checkpoint</checkpoint>
</terminal>
</airport>
</checkpoints>
Retrieve the current estimated wait time, precheck lanes, and airport conditions for a specific airport.
Airport codes can be retrieved from the GET LIST OF AIRPORTS call. The airport code value should replace the {CODE} variable below.
REQUEST GET
- https://www.tsawaittimes.com/api/airport/{APIKEY}/{CODE}/{FORMAT}
RESPONSE
JSON Response using {CODE} of ATL
stdClass Object
(
[code] => ATL
[name] => Hartsfield-Jackson Atlanta International
[city] => Atlanta
[state] => GA
[latitude] => 33.63985
[longitude] => -84.4439
[utc] => -5
[rightnow] => 11
[rightnow_description] => 10 minutes and 54 seconds
[user_reported] => 20
[precheck] => 1
[faa_alerts] => stdClass Object
(
[ground_stops] => stdClass Object
(
[reason] => WEATHER / SNOW-ICE
[end_time] => 4:45 pm EST
)
[ground_delays] => stdClass Object
(
[reason] => WX/WIND
[average] => 3 hours and 1 minute
)
[general_delays] => stdClass Object
(
[reason] => OTHER:FOG ON RUNWAY
[trend] => Departures are experiencing delays between 31 minutes and 45 minutes and increasing
)
)
[estimated_hourly_times] => Array
(
[0] => stdClass Object
(
[timeslot] => 12 am - 1 am
[waittime] => 2.8
)
[1] => stdClass Object
(
[timeslot] => 1 am - 2 am
[waittime] => 0.0
)
[2] => stdClass Object
(
[timeslot] => 2 am - 3 am
[waittime] => 6.8
)
[3] => stdClass Object
(
[timeslot] => 3 am - 4 am
[waittime] => 13.6
)
[4] => stdClass Object
(
[timeslot] => 4 am - 5 am
[waittime] => 20.5
)
[5] => stdClass Object
(
[timeslot] => 5 am - 6 am
[waittime] => 15.5
)
[6] => stdClass Object
(
[timeslot] => 6 am - 7 am
[waittime] => 9.3
)
[7] => stdClass Object
(
[timeslot] => 7 am - 8 am
[waittime] => 21.9
)
[8] => stdClass Object
(
[timeslot] => 8 am - 9 am
[waittime] => 14.5
)
[9] => stdClass Object
(
[timeslot] => 9 am - 10 am
[waittime] => 14.2
)
[10] => stdClass Object
(
[timeslot] => 10 am - 11 am
[waittime] => 3.8
)
[11] => stdClass Object
(
[timeslot] => 11 am - 12 pm
[waittime] => 20.7
)
[12] => stdClass Object
(
[timeslot] => 12 pm - 1 pm
[waittime] => 20.2
)
[13] => stdClass Object
(
[timeslot] => 1 pm - 2 pm
[waittime] => 14.7
)
[14] => stdClass Object
(
[timeslot] => 2 pm - 3 pm
[waittime] => 9.8
)
[15] => stdClass Object
(
[timeslot] => 3 pm - 4 pm
[waittime] => 13.1
)
[16] => stdClass Object
(
[timeslot] => 4 pm - 5 pm
[waittime] => 10.9
)
[17] => stdClass Object
(
[timeslot] => 5 pm - 6 pm
[waittime] => 9.8
)
[18] => stdClass Object
(
[timeslot] => 6 pm - 7 pm
[waittime] => 6.2
)
[19] => stdClass Object
(
[timeslot] => 7 pm - 8 pm
[waittime] => 8.8
)
[20] => stdClass Object
(
[timeslot] => 8 pm - 9 pm
[waittime] => 4.4
)
[21] => stdClass Object
(
[timeslot] => 9 pm - 10 pm
[waittime] => 3.3
)
[22] => stdClass Object
(
[timeslot] => 10 pm - 11 pm
[waittime] => 15.5
)
)
[precheck_checkpoints] => stdClass Object
(
[Terminal FIS] => stdClass Object
(
[Concourse E Checkpoint] => Closed
)
[Terminal MAIN] => stdClass Object
(
[Main Checkpoint] => Open
)
[Terminal MHJIT] => stdClass Object
(
[Concourse F Departure] => Open
)
)
)
XML Response
<airport>
<code>ATL</code>
<name>Hartsfield-Jackson Atlanta International</name>
<city>Atlanta</city>
<state>GA</state>
<latitude>33.63985</latitude>
<longitude>-84.4439</longitude>
<utc>-5</utc>
<rightnow>11</rightnow>
<rightnow_description>10 minutes and 54 seconds</rightnow_description>
<user_reported>20</user_reported>
<precheck>1</precheck>
<faa_alerts>
<ground_stops>
<reason>WEATHER / SNOW-ICE</reason>
<end_time>4:45 pm EST</end_time>
</ground_stops>
<ground_delays>
<reason>WX/WIND</reason>
<average>3 hours and 1 minute</average>
</ground_delays>
<general_delays>
<reason>OTHER:FOG ON RUNWAY</reason>
<trend>Departures are experiencing delays between 31 minutes and 45 minutes and increasing</trend>
</general_delays>
</faa_alerts>
<estimated_hourly_times>
<hour>
<timeslot>12 am - 1 am</timeslot>
<waittime>2.8</waittime>
</hour>
<hour>
<timeslot>1 am - 2 am</timeslot>
<waittime>0.0</waittime>
</hour>
<hour>
<timeslot>2 am - 3 am</timeslot>
<waittime>6.8</waittime>
</hour>
<hour>
<timeslot>3 am - 4 am</timeslot>
<waittime>13.6</waittime>
</hour>
<hour>
<timeslot>4 am - 5 am</timeslot>
<waittime>20.5</waittime>
</hour>
<hour>
<timeslot>5 am - 6 am</timeslot>
<waittime>15.5</waittime>
</hour>
<hour>
<timeslot>6 am - 7 am</timeslot>
<waittime>9.3</waittime>
</hour>
<hour>
<timeslot>7 am - 8 am</timeslot>
<waittime>21.9</waittime>
</hour>
<hour>
<timeslot>8 am - 9 am</timeslot>
<waittime>14.5</waittime>
</hour>
<hour>
<timeslot>9 am - 10 am</timeslot>
<waittime>14.2</waittime>
</hour>
<hour>
<timeslot>10 am - 11 am</timeslot>
<waittime>3.8</waittime>
</hour>
<hour>
<timeslot>11 am - 12 pm</timeslot>
<waittime>20.7</waittime>
</hour>
<hour>
<timeslot>12 pm - 1 pm</timeslot>
<waittime>20.2</waittime>
</hour>
<hour>
<timeslot>1 pm - 2 pm</timeslot>
<waittime>14.7</waittime>
</hour>
<hour>
<timeslot>2 pm - 3 pm</timeslot>
<waittime>9.8</waittime>
</hour>
<hour>
<timeslot>3 pm - 4 pm</timeslot>
<waittime>13.1</waittime>
</hour>
<hour>
<timeslot>4 pm - 5 pm</timeslot>
<waittime>10.9</waittime>
</hour>
<hour>
<timeslot>5 pm - 6 pm</timeslot>
<waittime>9.8</waittime>
</hour>
<hour>
<timeslot>6 pm - 7 pm</timeslot>
<waittime>6.2</waittime>
</hour>
<hour>
<timeslot>7 pm - 8 pm</timeslot>
<waittime>8.8</waittime>
</hour>
<hour>
<timeslot>8 pm - 9 pm</timeslot>
<waittime>4.4</waittime>
</hour>
<hour>
<timeslot>9 pm - 10 pm</timeslot>
<waittime>3.3</waittime>
</hour>
<hour>
<timeslot>10 pm - 11 pm</timeslot>
<waittime>15.5</waittime>
</hour>
</estimated_hourly_times>
<precheck_checkpoints>
<Terminal name="Terminal FIS">
<checkpoint name="Concourse E Checkpoint" status="Closed"/>
</Terminal>
<Terminal name="Terminal MAIN">
<checkpoint name="Main Checkpoint" status="Open"/>
</Terminal>
<Terminal name="Terminal MHJIT">
<checkpoint name="Concourse F Departure" status="Open"/>
</Terminal>
</precheck_checkpoints>
</airport>
If you plan to allow your end users to submit their wait time experiences for others to know about, you can send those user reports to us. This request will require you to POST to the URL below with the appropriate variables.
REQUEST POST
- https://www.tsawaittimes.com/api/reporttime/{APIKEY}/{FORMAT}
| POST Variable |
Description |
| code |
[STRING] The 3 character airport code. Example: code=ATL for Atlanta Hartsfield-Jackson
FOR TESTING PURPOSES, please use the airport code of XXX
Example: curl -X POST https://www.tsawaittimes.com/api/reporttime/{APIKEY} -d 'code=XXX&user_reported=20' |
| user_reported |
[INTEGER] The user's reported wait time in minutes. |
|
Valid options for user_reported values are below.
5
10
15
20
25
30
35
40
45
50
55
60
75
90
105
120
135
150
165
180
195
210
225
240
|
RESPONSE
JSON Response
Array
(
[0] => stdClass Object
(
[success] => true
)
)
XML Response
<reporttime>
<success>true</success>
</reporttime>
Data Dictionary
Below are the individual data elements and what they mean.
| Data Element |
Description |
| average |
[STRING] The average ground delay time at this airport right now |
| city |
[STRING] The city where the airport is located |
| code |
[STRING] A 3-character IATA airport code |
| end_time |
[STRING] The anticipated end time for an FAA-issued ground stop |
| latitude |
[STRING] The airport's geographic latitude |
| longitude |
[STRING] The airport's geographic longitude |
| name |
[STRING] The name of the airport. If referenced from within the precheck_checkpoints node/array, 'name' may reference either the airport terminal name or the name of the terminal checkpoint. |
| precheck |
[INTEGER] TSA PreCheck indicator. If PreCheck is available, this will be set to 1. Otherwise it will be 0 |
| reason |
[STRING] The reason for a delay or stop. This field is used within the FAA Alerts for ground stops, ground delays, and general delays |
| rightnow |
[INTEGER] The estimated wait time at the airport at this time rounded to nearest integer of minutes. Wait times are estimates, subject to change, and may not be indicative of a traveler's experience. |
| rightnow_description |
[STRING] A consumer-friendly description of the current estimated wait time |
| state |
[STRING] The state where the airport is located |
| success |
[BOOLEAN] Whether or not the request was successful. |
| timeslot |
[STRING] The hour for a particular wait time estimate. Format will be beginning hour to end hour. Example: 5 am - 6 am |
| trend |
[STRING] The current trend for departure delays at this airport right now |
| user_reported |
[INTEGER] Number of wait time minutes being reported by users currently at the airport. A value of zero indicates that we do not currently have user-submitted reports for this airport at this time |
| utc |
[INTEGER] The UTC (Coordinated Universal Time) offset for this airport. Useful for determining current time at the airport. |
| waittime |
[DECIMAL] The estimated wait time for a given timeslot. For example, 10.5 would be 10 minutes and 30 seconds. 10.2 would be 10 minutes and 12 seconds. |
Error Responses
Below are a list of potential error codes you might receive and what they mean.
| Error Message |
Description |
| No API Key Provided |
You need to pass along your API key for each request. This error will also get triggered if an invalid API key is sent. |
| This account has not been verified yet |
You need to verify your email address before an API call can be made. When you created your account, we sent you an email with an authorization link in it. You will need to click that link. You can have another email sent to you from the My Account screen. Just click the grey Unverified Account icon at the top of the page. Please check your Junk or Spam folder if you don't see it within a few seconds. |
| This API key is not active |
We may disable API keys for several reasons including a violation of our terms and conditions or high/abusive usage. Please email us at [email protected] to have your API key reinstated. |
| This API key does not have an active subscription |
All API calls require a paid subscription. You can purchase a subscription from the My Account page. |
| This API key expired on DATE |
Your API subscription has expired. All API calls require a paid subscription. You can extend your subscription from the My Account page. |
| Invalid Airport Code |
Please pass along a valid 3-character airport code. |
| No airport code provided |
When submitting a user-reported time, please POST the variable "code" with a valid 3-character IATA code |
| Invalid Number of Minutes |
The number of minutes submitted was not a valid number. Refer to the documentation for valid integers. |
| Wait Time Not Submitted |
When submitting a user-reported time, please POST the variable "user_reported" with a valid integer of minutes |
| Could not save |
There was an unknown error on our side and we could not save the posted data. |
Frequently Asked Questions
API Questions
We use a combination of data sources including the TSA, FAA, traveler contributions, and our own internal data. The government data is often incomplete so we use additional custom logic to help fill in some of the blanks. Combining historical along with recent data points helps form the basis of the estimates.
All wait times are estimates and may not be reflective of the actual experience that a traveler may have at any given moment. Wait times are a combination of historical, user-submitted data, and additional custom logic.
The TSA itself states on their website "Wait times are based on crowdsourced data provided by passengers and we cannot ensure their accuracy. Prepare for your trip by checking the histogram, which is based on historical data and can estimate how busy your airport is likely to be on your selected day and time of travel."
We use a combination of factors to help determine the estimated wait time.
We did a user survey a few years back and the vast majority of our users did not find the times for individual lines worthwhile - it didn't factor into what they wanted to know which was namely how much earlier they needed to get to the airport & a general sense of how long they'd be waiting. As you might expect, the data diverged depending upon the specific airport and the level of traveler sophistication (road warrior vs infrequent traveler). The frequent travelers often knew where the lines were physically located but the infrequent travelers didn't.
We also noticed that if the times between lines were single minutes different, it wasn't a factor at all for the user completing the survey. It only registered for the user if the delta between Line A and Line B was significant. Then they'd actively seek out the shorter line. Otherwise it didn't matter to them.
While there are pros/cons to that approach, we made the decision at that time to publish a single estimate.
Oftentimes, we simply don't have it. Whether it was not available from the government or we don't have any user-submitted data, there may be times where we don't have full coverage for a particular time of day at a particular airport. We are continually working to provide a more comprehensive data set though.
This is likely because you are calling the API endpoint via browser-side Javascript. To allow this means that anyone looking at your source code from their browser will see your API key and could potentially use your key for their own purposes. As you are responsible for the safekeeping of your API key, please make your API calls to your server and return the results.
Billing Questions
We will send you a reminder email 7 days, 3 days, and 1 day prior to your expiration. You can extend your subscription from the My Account screen.
Yes. All invoices are available on your account page and can be downloaded as a PDF.
Please note that we are not able to offer any refunds. When you make a purchase on TSAWaitTimes.com, we will ask that you accept those terms, so please be sure that you want access to the API before providing payment.
No. This website is not owned or affiliated with the TSA. We are an independent software company (TayTech LLC) located in the state of Wisconsin in the United States.
API Pricing
Self-Service:
Pricing is based upon monthly subscription pricing.
Enterprise
For high-volume websites needing service level agreements, faster support, and indemnification, please contact Joe Dyken to discuss an Enterprise Agreement and associated pricing.
| Months |
Discount |
Total Cost |
|
| 1 |
|
$49.95 |
|
| 3 |
10% Off |
$149.85 $134.87 |
Save $14.99! |
| 6 |
15% Off |
$299.70 $254.75 |
Save $44.96! |
| 12 |
20% Off |
$599.40 $479.52 |
Save $119.88! |
FREE 7 Day Trial: Create a free account, verify your email address, and enjoy a free 7 day trial of the API