---
name: seats-aero
version: 1.0.0
description: Search award flight availability across airline mileage programs. Find business and first class redemptions using points.
homepage: https://seats.aero
metadata: {"category":"travel","api_base":"https://seats.aero/partnerapi"}
---

# seats.aero API

Search award flight availability across 20+ airline mileage programs. Find economy, premium, business, and first class redemptions using points and miles.

## Getting Your API Key

Pro users can get an API key at https://seats.aero/settings

## Important: Cached Data Only

Pro API access provides **cached search** capabilities only. This means:

- You can search routes that seats.aero actively tracks (mostly routes with direct flights)
- Popular routes like **SFO→LHR** or **JFK-HND** will have extensive availability data
- Obscure routes like **DUB→MSN** may have limited or no cached data
- The `/live` endpoint (real-time searches) is **not available** for Pro API users
- Check when the cached data was last updated for relevancy.

To check if a route is tracked, use the `/routes` endpoint for a specific program.

## Base URL

`https://seats.aero/partnerapi/`

## Authentication

All requests require the `Partner-Authorization` header with your API key:

```
Partner-Authorization: YOUR_API_KEY
```

---

## Endpoints

### 1. Search Cached Availability

**GET /search**

Search for mileage availability across multiple programs with flexible filtering. Returns a summary (one summary per day and route), the ID can be used on the trips API to get detailed info.

**Required Parameters:**
- `origin_airport` - Origin airport codes, comma-delimited (e.g., "SFO,LAX" or "NYC")
- `destination_airport` - Destination codes, comma-delimited (e.g., "FRA,LHR" or "EUR")

**Optional Parameters:**
- `start_date` / `end_date` - Date range in YYYY-MM-DD format
- `cabins` - Filter by cabin: economy, premium, business, first (comma-separated)
- `carriers` - Airline codes to filter (e.g., "DL,AA,UA")
- `only_direct_flights` - Set to `true` for non-stop flights only
- `source` - Filter by specific program (e.g., "aeroplan", "united", "american")
- `take` - Results per page (10-1000, default: 500)
- `order_by` - Use "lowest_mileage" to sort by price
- `include_trips` - Set to `true` to include flight segment details (times, flight numbers) inline with results
- `minify_trips` - With `include_trips=true`, return only trip summary fields (cost, taxes, cabin, stops, seats, duration) for smaller responses

**Example:**
```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&cabins=business,first"
```

---

### 2. Bulk Program Availability

**GET /availability**

Retrieve large availability datasets from a single mileage program.

**Required Parameters:**
- `source` - Mileage program identifier (see Programs below)

**Optional Parameters:**
- `cabin` - Single cabin filter: economy, premium, business, first
- `start_date` / `end_date` - Date filtering
- `origin_region` / `destination_region` - Filter by region (North America, Europe, Asia, etc.)
- `take` - Results per page (default: 500; capped at 1000 when `include_trips=true`)
- `include_trips` - Set to `true` to include flight-level trip details (times, flight numbers) inline with each result; honors the `cabin` filter
- `minify_trips` - With `include_trips=true`, return only trip summary fields (cost, taxes, cabin, stops, seats, duration) for smaller responses

**Example:**
```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/availability?source=aeroplan&cabin=business&destination_region=Asia"
```

#### Pagination

Responses from `/search` and `/availability` include `hasMore`, `moreURL`, and `cursor`. When `hasMore` is `true`, request `https://seats.aero{moreURL}` with the same authorization header and repeat until `hasMore` is `false`. Prefer the returned `moreURL` because it preserves the original cursor and advances `skip` correctly. Deduplicate results by `ID` in case data changes between requests.

---

### 3. Get Trip Details

**GET /trips/{id}**

Retrieve flight-level segment details for an availability record. This helps you understand the actual flight numbers, departure/arrival times, and more.

**Parameters:**
- `id` (path) - Availability object ID from search results
- `include_filtered` - Include dynamically-priced filtered results

**Example:**
```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/trips/abc123-def456"
```

---

### 4. Get Routes

**GET /routes**

Retrieve all route pairs available for a mileage program.

**Required Parameters:**
- `source` - Mileage program identifier

**Example:**
```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/routes?source=united"
```

---

### 5. Get Cheapest Nonstop Destinations

**GET /destinations**

Retrieve reachable airports and the cheapest cached nonstop mileage price per cabin across all programs. Each cabin price is `null` when no nonstop availability is available.

Provide exactly one of:
- `origin_airport` - Find destinations reachable from this three-letter IATA or meta-airport code
- `destination_airport` - Find origins that can reach this three-letter IATA or meta-airport code

**Example:**
```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/destinations?origin_airport=JFK"
```

---

### 6. Live Search (Real-Time) - Partner API Only

**POST /live**

Query real-time availability directly from airline systems.

**Note:** This endpoint is **not available** for Pro API users. It requires a Partner API agreement. Pro users should use the cached `/search` endpoint instead.

---

### 7. Refresh Cached Data

**POST /refresh**

A single idempotent endpoint: each call queues whichever of the given items are stale and not already being refreshed, and reports the current state of everything else — so you poll by repeating the same call until `complete` is true. Each item actually queued costs **one credit** from your daily API quota; everything else (fresh items, items already refreshing, polling calls) costs nothing. If a queued refresh fails, its credit is automatically refunded and the item can be re-queued after a short cooldown.

**Request Body:**
```json
{"availability_ids": ["abc123-def456", "..."]}
```
- `availability_ids` - 1 to 250 availability object IDs from `/search` or `/availability`

**Response:** per-item `status` (`queued`, `processing`, `succeeded`, `failed`, `fresh`, `skipped_outage`, `not_refreshable`, `not_found`, `insufficient_quota`), `queued` (credits charged by this call), `refunded` (credits refunded by this call), `counts`, `complete` (nothing still processing), and your remaining `quota`. Stale items beyond your remaining daily quota are reported `insufficient_quota` (in request order, never charged) — re-submit them once quota frees up or resets. Refreshes typically finish within a minute.

**Example:**
```bash
# First call queues the stale items; repeat the same call to poll.
curl -X POST -H "Partner-Authorization: YOUR_API_KEY" \
  -d '{"availability_ids": ["abc123-def456"]}' \
  "https://seats.aero/partnerapi/refresh"
```

---

## Mileage Programs (source values)

| Program | Source Code |
|---------|-------------|
| Air Canada Aeroplan | `aeroplan` |
| Alaska Atmos Rewards | `alaska` |
| American AAdvantage | `american` |
| Aeromexico | `aeromexico` |
| Avianca LifeMiles | `lifemiles` |
| Azul Fidelidade | `azul` |
| Copa ConnectMiles | `copa` |
| Delta SkyMiles | `delta` |
| Emirates Skywards | `emirates` |
| Ethiopian ShebaMiles | `ethiopian` |
| Etihad Guest | `etihad` |
| Finnair Plus | `finnair` |
| Air France/KLM Flying Blue | `flyingblue` |
| GOL Smiles | `smiles` |
| JetBlue TrueBlue | `jetblue` |
| Lufthansa Miles & More | `lufthansa` |
| Qantas Frequent Flyer | `qantas` |
| Qatar Airways Privilege Club | `qatar` |
| SAS EuroBonus | `eurobonus` |
| Saudia AlFursan | `saudia` |
| Singapore Airlines KrisFlyer | `singapore` |
| Turkish Miles&Smiles | `turkish` |
| United MileagePlus | `united` |
| Virgin Atlantic | `virginatlantic` |
| Virgin Australia Velocity | `velocity` |

---

## Cabin Classes

| Cabin | Code | Field Prefix |
|-------|------|--------------|
| Economy | economy | Y |
| Premium Economy | premium | W |
| Business | business | J |
| First | first | F |

Response fields use these prefixes: `YMileageCost`, `JRemainingSeats`, `FDirect`, etc.

---

## Meta Airport Codes

Use these codes to search multiple airports at once:

| Code | Airports |
|------|----------|
| QBA | SFO, SJC, OAK (San Francisco Bay Area) |
| NYC | JFK, LGA, EWR |
| LON | LGW, LHR, LCY, STN, LTN |
| TYO | HND, NRT |
| PAR | CDG, ORY |
| CHI | ORD, MDW |
| QMI | MIA, FLL, PBI (Miami area) |
| WAS | IAD, DCA, BWI |
| USA | SFO, LAX, JFK, EWR, ORD, ATL, IAD, IAH, DEN, MIA, SEA, DFW, BOS |
| CAL | LAX, SFO, SJC, SAN, OAK, SMF (California) |
| QLA | LAX, BUR, SNA, ONT, LGB (Los Angeles area) |
| WST | LAX, SFO, SJC, SEA, SAN, PDX, DEN, YVR, LAS, SLC, PHX (US West) |
| EST | JFK, LGA, EWR, BOS, PHL, PIT, IAD, DCA, CLT (US East) |
| MIW | ORD, MDW, DTW, CLE, CVG, IND, MSP (US Midwest) |
| GER | MUC, FRA, BER (Germany) |
| JPN | HND, NRT, KIX, ITM (Japan) |
| UKD | LHR, LGW, EDI, MAN (UK) |
| ANZ | SYD, MEL, BNE, PER, AKL, ADL (Australia/NZ) |
| HAW | HNL, OGG, KOA, LIH (Hawaii) |
| EUR | AMS, ATH, BCN, BER, CDG, DUB, FRA, IST, LHR, MUC, MAD, FCO, MXP, ZRH, HEL, ARN, WAW, BRU, LGW, CPH, LIS, VIE, GVA, EDI |
| MEA | DXB, AUH, DOH (Middle East) |
| LAM | EZE, AEP, COR, MDZ, SCL, IPC, LIM, CUZ, BOG, MDE, CTG, UIO, GYE, GIG, GRU, BSB, SSA, REC, FOR, POA, FLN, ASU, MVD, CCS, VVI, LPB, SRE, GEO, PBM, CAY, BZE, GUA, FRS, SAL, SAP, RTB, TGU, LCE, MGA, SJO, LIR, PTY, DAV, BLB, MEX, CUN, GDL, MTY, SJD, PVR, HAV, SNU, VRA, HOG, SCU, PUJ, SDQ, STI, POP, AZS, SJU, PSE, BQN, PAP, CAP, JAK, CYA, PTP, FDF, SBH, SFG (Latin America) |
| SAM | EZE, AEP, COR, MDZ, SCL, IPC, LIM, CUZ, BOG, MDE, CTG, UIO, GYE, GIG, GRU, BSB, SSA, REC, FOR, POA, FLN, ASU, MVD, CCS, VVI, LPB, SRE, GEO, PBM, CAY (South America) |
| CAM | BZE, GUA, FRS, SAL, SAP, RTB, TGU, LCE, MGA, SJO, LIR, PTY, DAV, BLB (Central America) |
| ASA | HND, NRT, SIN, BKK, ICN, HKG, KUL, TPE, PVG, PEK, PKX (Asia) |
| SAS | SIN, KUL, BKK, SGN, HAN, MNL, CGK, DPS (Southeast Asia) |
| INDIA | BOM, DEL, HYD, BLR, MAA, COK, CCU, AMD, TRV |
| SEL | ICN, GMP (Seoul) |
| OSA | KIX, ITM (Osaka) |
| BJS | PEK, PKX (Beijing) |
| UAH | DEN, LAX, SFO, ORD, IAD, EWR, IAH (United hubs) |
| AAH | MIA, DFW, PHX, CLT, PHL, JFK, ORD (American hubs) |
| DLL | ATL, DTW, MSP, SLC, SEA, LAX, JFK, BOS (Delta hubs) |
| CAR | CUR, AUA, BON, AXA, ANU, STT, STX, BGI, HAV, PUJ, SDQ, MBJ, SJU, SXM (Caribbean) |
| CAD | YYZ, YUL, YVR, YYC, YEG, YOW, YHZ, YWG, YQB, YQR, YXE (Canada) |
| MXC | MEX, CUN, GDL, MTY, SJD, PVR (Mexico) |
| AUL | SYD, MEL, BNE, PER, ADL (Australia) |
| YTO | YYZ, YTZ (Toronto) |
| SAO | GRU, CGH, VCP (São Paulo) |
| RIO | GIG, SDU (Rio de Janeiro) |
| CNA | PEK, PKX, PVG, CAN, SZX, CKG, TFU (China) |
| SCH | Schengen area airports |
| BRL | Major Brazil airports |
| QAF | CAI, CMN, ADD, JNB, CPT, NBO, JRO, HLE, ZNZ (Africa) |

---

## Response Format

Availability objects include per-cabin data:

```json
{
  "ID": "availability-id",
  "RouteID": "route-id",
  "Date": "2025-03-15",
  "Source": "aeroplan",
  "YAvailable": true,
  "YMileageCost": "12500",
  "YRemainingSeats": 4,
  "YDirect": true,
  "YAirlines": "AC",
  "JAvailable": true,
  "JMileageCost": "55000",
  "JRemainingSeats": 2,
  "JDirect": false,
  "JAirlines": "AC,LH"
}
```

---

## Filtered vs Unfiltered Availability (Raw Fields)

The API returns two types of mileage pricing data:

**Standard Fields** (e.g., `JMileageCost`, `YMileageCost`):
- Filtered to show only reasonable "saver" level award redemptions
- Best for finding good value redemptions
- These are what most users want

**Raw Fields** (e.g., `JMileageCostRaw`, `YMileageCostRaw`):
- Unfiltered dynamic availability pricing
- May include very expensive redemptions (sometimes 5-10x the saver rate)
- Useful if you need to see all available options regardless of price

To include unfiltered results in your search, add `include_filtered=true` to your request:

```bash
curl -H "Partner-Authorization: YOUR_API_KEY" \
  "https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&include_filtered=true"
```

---

## Tips

1. **Use date ranges** - Searching a month at once is more efficient than day-by-day
2. **Filter by cabin** - Narrow results with `cabins=business,first` for premium travel
3. **Check direct flights** - Use `only_direct_flights=true` to avoid connections
4. **Popular routes work best** - Routes with direct flights (SFO→LHR, JFK→HND) have the most data
5. **Check route coverage** - Use `/routes?source=aeroplan` to see what routes are tracked
6. **Null = unavailable** - Null values for pricing/seats mean that cabin isn't available
7. **Link to results** - Link to individual availability results using `https://seats.aero/i/{ID}` where `{ID}` is the availability object ID from the API response. To link to a search, use `https://seats.aero/s/{ID}`.
8. **Do not browse the site directly** - The seats.aero website is protected by Cloudflare and direct browser automation may be blocked. Use the API endpoints instead.

---

## More Information

- **API Documentation**: https://developers.seats.aero
- **OpenAPI Spec**: https://developers.seats.aero/openapi/partner-api.json
- **Get Pro Access**: https://seats.aero/register
