---
title: "Historical wait time patterns"
---

> Documentation Index
> Fetch the complete documentation index at: https://flightqueue.com/developers/reference/llms.txt
> Use this file to discover all available pages before exploring further.

# Historical wait time patterns

Path: FlightQueue API › Airports

`GET /airports/{iata}/historical`

Wait patterns by hour and day of week, built from the last 30 days of data on all plans. lookbackDays reports the plan label and does not change the window. The example shows a Pro response.

Access: Premium.

## Authentication

Requires one of the following:

- `BearerAuth`, http, header `Authorization`
- `ApiKeyAuth`, apiKey, in header, header `X-API-Key`

## Path parameters

- `iata` (`getHistorical.path.iata`; string, required) — Three-letter IATA airport code.
  - pattern `^[A-Za-z]{3}$`

## Code samples

### cURL

```bash
curl --request GET \
  --url 'https://flightqueue.com/api/v1/airports/<iata>/historical' \
  --header 'Authorization: Bearer <token>'
```

### TypeScript

```typescript
const url = 'https://flightqueue.com/api/v1/airports/<iata>/historical';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://flightqueue.com/api/v1/airports/<iata>/historical"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

Success

#### Example

```json
{
  "success": true,
  "data": {
    "airportCode": "JFK",
    "lookbackDays": 7,
    "patterns": {
      "airportCode": "JFK",
      "patterns": [
        {
          "airportCode": "JFK",
          "dayOfWeek": 1,
          "hourOfDay": 8,
          "avgSecurityWait": 27,
          "avgImmigrationWait": 19,
          "sampleCount": 14,
          "confidence": 0.7,
          "lastUpdated": "2026-11-06T06:00:00.000Z"
        }
      ],
      "overallAvgSecurity": 22,
      "overallAvgImmigration": 16,
      "totalSamples": 320,
      "peakHours": [
        8,
        17
      ],
      "quietHours": [
        3,
        4
      ],
      "lastUpdated": "2026-11-06T06:00:00.000Z"
    }
  },
  "meta": {
    "requestId": "3f8c2b1e-6d4a-4f7b-9a1e-2c5d8e7f0a12",
    "timestamp": "2026-11-07T12:00:00.000Z"
  }
}
```

- `success` (`getHistorical.response.200.success`; boolean, required)
- `data` (`getHistorical.response.200.data`; any of, required)
  - any of:
    - `object`
      - `airportCode` (`getHistorical.response.200.data.1.airportCode`; string, required) — Three-letter IATA airport code, upper case.
        - pattern `^[A-Z]{3}$`
      - `lookbackDays` (`getHistorical.response.200.data.1.lookbackDays`; integer, required)
        - min -9007199254740991; max 9007199254740991
      - `patterns` (`getHistorical.response.200.data.1.patterns`; object, required)
        - `airportCode` (`getHistorical.response.200.data.1.patterns.airportCode`; string, required) — Three-letter IATA airport code, upper case.
          - pattern `^[A-Z]{3}$`
        - `patterns` (`getHistorical.response.200.data.1.patterns.patterns`; array<object>, required)
          - `airportCode` (`getHistorical.response.200.data.1.patterns.patterns.airportCode`; string, required) — Three-letter IATA airport code, upper case.
            - pattern `^[A-Z]{3}$`
          - `dayOfWeek` (`getHistorical.response.200.data.1.patterns.patterns.dayOfWeek`; integer, required) — 0 = Sunday.
            - min 0; max 6
          - `hourOfDay` (`getHistorical.response.200.data.1.patterns.patterns.hourOfDay`; integer, required)
            - min 0; max 23
          - `avgSecurityWait` (`getHistorical.response.200.data.1.patterns.patterns.avgSecurityWait`; number, required)
          - `avgImmigrationWait` (`getHistorical.response.200.data.1.patterns.patterns.avgImmigrationWait`; number, required)
          - `sampleCount` (`getHistorical.response.200.data.1.patterns.patterns.sampleCount`; integer, required)
            - min -9007199254740991; max 9007199254740991
          - `confidence` (`getHistorical.response.200.data.1.patterns.patterns.confidence`; number, required) — 0 to 1, based on sample count.
          - `lastUpdated` (`getHistorical.response.200.data.1.patterns.patterns.lastUpdated`; string, required) — ISO 8601 timestamp in UTC.
            - format `date-time`; pattern `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$`
        - `overallAvgSecurity` (`getHistorical.response.200.data.1.patterns.overallAvgSecurity`; number, required)
        - `overallAvgImmigration` (`getHistorical.response.200.data.1.patterns.overallAvgImmigration`; number, required)
        - `totalSamples` (`getHistorical.response.200.data.1.patterns.totalSamples`; integer, required)
          - min -9007199254740991; max 9007199254740991
        - `peakHours` (`getHistorical.response.200.data.1.patterns.peakHours`; array<integer>, required)
          - min -9007199254740991; max 9007199254740991
        - `quietHours` (`getHistorical.response.200.data.1.patterns.quietHours`; array<integer>, required)
          - min -9007199254740991; max 9007199254740991
        - `lastUpdated` (`getHistorical.response.200.data.1.patterns.lastUpdated`; string, required) — ISO 8601 timestamp in UTC.
          - format `date-time`; pattern `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$`
    - `object`
      - `airportCode` (`getHistorical.response.200.data.2.airportCode`; string, required) — Three-letter IATA airport code, upper case.
        - pattern `^[A-Z]{3}$`
      - `lookbackDays` (`getHistorical.response.200.data.2.lookbackDays`; integer, required)
        - min -9007199254740991; max 9007199254740991
      - `patterns` (`getHistorical.response.200.data.2.patterns`; array<unknown>, required)
      - `message` (`getHistorical.response.200.data.2.message`; string, required)
- `meta` (`getHistorical.response.200.meta`; object, required)
  - `requestId` (`getHistorical.response.200.meta.requestId`; string, required) — Unique ID for this request. Quote it when you contact support.
    - format `uuid`; pattern `^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$`
  - `timestamp` (`getHistorical.response.200.meta.timestamp`; string, required) — ISO 8601 timestamp in UTC.
    - format `date-time`; pattern `^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$`

### 401

Unauthorized

#### Example

```json
{
  "success": false,
  "error": {
    "code": "MISSING_API_KEY",
    "message": "No API key was sent in X-API-Key or Authorization."
  }
}
```

- `success` (`getHistorical.response.401.success`; boolean, required)
- `error` (`getHistorical.response.401.error`; object, required)
  - `code` (`getHistorical.response.401.error.code`; string, required) — Machine-readable error code.
    - one of `"MISSING_API_KEY"`, `"INVALID_API_KEY"`, `"RATE_LIMIT_EXCEEDED"`, `"PREMIUM_REQUIRED"`, `"ENTERPRISE_REQUIRED"`, `"INVALID_AIRPORT"`, `"INVALID_DATE"`, `"INVALID_BODY"`, `"TOO_MANY_AIRPORTS"`, `"NOT_FOUND"`, `"INTERNAL_ERROR"`
  - `message` (`getHistorical.response.401.error.message`; string, required) — Human-readable explanation.

### 403

Forbidden

#### Example

```json
{
  "success": false,
  "error": {
    "code": "PREMIUM_REQUIRED",
    "message": "The key does not include the premium feature for this endpoint."
  }
}
```

- `success` (`getHistorical.response.403.success`; boolean, required)
- `error` (`getHistorical.response.403.error`; object, required)
  - `code` (`getHistorical.response.403.error.code`; string, required) — Machine-readable error code.
    - one of `"MISSING_API_KEY"`, `"INVALID_API_KEY"`, `"RATE_LIMIT_EXCEEDED"`, `"PREMIUM_REQUIRED"`, `"ENTERPRISE_REQUIRED"`, `"INVALID_AIRPORT"`, `"INVALID_DATE"`, `"INVALID_BODY"`, `"TOO_MANY_AIRPORTS"`, `"NOT_FOUND"`, `"INTERNAL_ERROR"`
  - `message` (`getHistorical.response.403.error.message`; string, required) — Human-readable explanation.

### 429

Too many requests

#### Example

```json
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "The key sent more requests per minute than its tier allows."
  }
}
```

- `success` (`getHistorical.response.429.success`; boolean, required)
- `error` (`getHistorical.response.429.error`; object, required)
  - `code` (`getHistorical.response.429.error.code`; string, required) — Machine-readable error code.
    - one of `"MISSING_API_KEY"`, `"INVALID_API_KEY"`, `"RATE_LIMIT_EXCEEDED"`, `"PREMIUM_REQUIRED"`, `"ENTERPRISE_REQUIRED"`, `"INVALID_AIRPORT"`, `"INVALID_DATE"`, `"INVALID_BODY"`, `"TOO_MANY_AIRPORTS"`, `"NOT_FOUND"`, `"INTERNAL_ERROR"`
  - `message` (`getHistorical.response.429.error.message`; string, required) — Human-readable explanation.


Source: https://flightqueue.com/developers/reference/api/airports/historical/index.md
