mcpField
S
seats-aero

seats-aero

github.com/borskiその他78077 回インストール2 日前に更新
リポジトリ

seats-aero について

seats-aeroは、複数のマイレージプログラムで特典航空券を検索する旅行計画スキルです。必要マイルを比較し、個別の旅程情報や予約リンクを確認できます。

主な機能

  1. 01路線と日付を指定した特典枠検索
  2. 02プログラム別・客室別の必要マイル比較
  3. 03区間情報と予約リンクの取得
  4. 04地域とプログラムを指定した広範囲検索
  5. 05高額な変動価格特典の除外

活用シーン

  1. 01予定路線と日程の特典航空券探し
  2. 02プログラム間の必要マイル比較
  3. 03地域間のビジネスクラス特典枠の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill seats-aero

インストール後、Claude Code で/seats-aeroを入力して読み込まれたか確認します。

詳細

Seats.aero スキル

27のマイレージプログラム(2026年4月に追加されたSpirit Free SpiritとFrontier Milesを含む)で、キャッシュ済みおよびリアルタイムの特典航空券の空席状況を検索します。最も安い特典航空券を見つけ、プログラムを比較し、予約リンクを取得できます。

参照先: seats.aero | API ドキュメント | ナレッジベース

認証

.env ファイルに SEATS_AERO_API_KEY を設定します。Settings > API tab から取得できます(Pro アカウントが必要です)。

すべてのリクエストで Partner-Authorization ヘッダーを使用します。Pro ユーザーは、非商用利用に限り1日あたり1,000回の API 呼び出しが可能です。

API ベース URL

https://seats.aero/partnerapi

主な概念

セーバーと変動価格

特典航空券の座席は、次の2種類に分かれます。

  • セーバー(固定価格): マイル数が固定され、予測可能です。多くの場合、提携プログラムを通じて予約できるのはこの種類のみです。最もお得です。常に Seats.aero に表示されます。
  • 変動価格: 需要に応じて価格が変わります(現金運賃と同様です)。妥当な場合もあれば、非常に高額な場合もあります。Seats.aero は、デフォルトで割高な変動価格の特典航空券を除外します。
変動価格のフィルターしきい値

以下の1時間あたりのしきい値を超える特典航空券は、自動的に非表示になります。

プログラムエコノミープレミアムエコノミービジネスファースト
American合計 <100K合計 <100K合計 <150K合計 <200K
United7,500/時間10,000/時間14,000/時間20,000/時間(最大10時間)
Delta10,000/時間15,000/時間20,000/時間該当なし
Aeroplan7,500/時間10,000/時間12,500/時間15,000/時間
Flying Blue5,000/時間10,000/時間15,000/時間15,000/時間
Alaska合計 <150K合計 <150K合計 <150K合計 <150K
Aeromexico10,000/時間(最大10時間)15,000/時間20,000/時間該当なし
Etihad10,000/時間(最大10時間)15,000/時間20,000/時間該当なし
JetBlue10,000/時間15,000/時間20,000/時間該当なし
Qantas7,500/時間10,000/時間20,000/時間25,000/時間

高額なものを含むすべての変動価格を確認するには、キャッシュ済み検索/一括検索では include_filtered=true、リアルタイム検索では disable_filters=true または show_dynamic_pricing=true を指定します。

見かけ上の空席

予約可能と表示されていても、実際には座席が存在しない場合があります。原因は次のとおりです。

  • キャッシュ済み/古い検索結果: 鮮度は ComputedLastSeen で確認してください。
  • 同期の遅延: 座席は埋まっていても、提携先のシステムにまだ反映されていない場合があります。
  • 提携先フィードの不具合: プログラムが提携航空会社の空席を誤って表示する場合があります。

ポイントを移行する前に、必ず航空会社の公式サイトで確認してください。 同じアライアンス内の複数のプログラムを比較してください。可能であれば、電話で確認し、座席を仮押さえしてください。

海外プログラムに関する注意点

Smiles、TudoAzul など一部のプログラムでは、現地の納税者番号や現地の支払い方法が必要になる場合や、現地語でしか利用できない場合があります。それでも、結果に表示されるのは手がかりとして利用できるためです。たとえば Azul TudoAzul に United のセーバー特典航空券が表示されていれば、同じ空席を Aeroplan や、利用可能な他の Star Alliance 提携プログラムから予約できる可能性があります。

特典航空券の予約開始日

航空会社によって特典航空券の予約開始時期は異なります(例:Aeroplan は最大358日前から予約を受け付けます)。各航空会社のプログラム別の予約可能日数は、seats.aero/tools/releases で確認できます。検索をいつ開始するか計画する際に役立ちます。

空席状況オブジェクト

Cached Search/Bulk Availability の各結果は、1つの路線・日付・プログラムのすべてのフライトを1つのオブジェクトにまとめた概要です。たとえば、3月16日に Alaska で3便の異なる SFO>LAX 便がある場合、すべてが1つの空席状況オブジェクトに表示されます。MileageCost フィールドには最安の選択肢が表示されます。RemainingSeats フィールドには、全フライトのうち最大の座席数が表示されます。個別のフライト詳細を確認するには、Get Trips を使用してください。

マイレージプログラムのソース

ソースプログラム客室クラス座席数旅程データ税金
eurobonusSAS EuroBonusY/Jはいはいはい
virginatlanticVirgin Atlantic Flying ClubY/W/Jはいはいはい
aeromexicoAeromexico Club PremierY/W/Jはいはいはい
americanAmerican Airlines AAdvantageY/W/J/F残席数が少ない場合のみ*はいはい
deltaDelta SkyMilesY/W/Jはいはいはい
etihadEtihad GuestY/J/Fはいはいはい
unitedUnited MileagePlusY/W/J/Fはいはいはい
emiratesEmirates SkywardsY/W/J/Fいいえ一部**はい
aeroplanAir Canada AeroplanY/W/J/F通常***はいはい
alaskaAlaska Mileage PlanY/W/J/Fはいはいはい
velocityVirgin Australia VelocityY/W/J/Fはいはいはい
qantasQantas Frequent FlyerY/W/J/Fいいえはいはい
connectmilesCopa ConnectMilesY/J/Fいいえはいはい
azulAzul TudoAzulY/Jいいえはいはい
smilesGOL SmilesY/W/J/Fはいはいはい
flyingblueAir France/KLM Flying BlueY/W/J/Fはいはいはい
jetblueJetBlue TrueBlueY/W/J/Fはいはいはい
qatarQatar Privilege ClubY/J/Fいいえはいいいえ
turkishTurkish Miles & SmilesY/Jいいえはいいいえ
singaporeSingapore KrisFlyerY/W/J/Fいいえはいいいえ
ethiopianEthiopian ShebaMilesY/Jはいはいはい
saudiaSaudi AlFursanY/J/Fはいはいはい
finnairFinnair PlusY/W/J/Fはいはいはい
lufthansaLufthansa Miles&MoreY/J/Fはいはいはい
frontierFrontier AirlinesYいいえはいはい
spiritSpirit AirlinesYはいはいはい

* AA は残席が少ない場合のみ座席数を返します。それ以外の場合は 0 と表示されます。 ** Emirates の乗り継ぎ便では、一部のフィールドが欠落している場合があります。 *** Aeroplan では通常、座席数を取得できますが、まれに 0 となる場合があります。

客室クラスコード: Y = エコノミー、W = プレミアムエコノミー、J = ビジネス、F = ファースト

キャッシュ検索(主要エンドポイント)

特定の空港間および日付範囲で、すべてのプログラムの特典航空券の空席状況を検索します。対象の路線や日付を指定して検索する場合に使用してください。

curl -s -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  "https://seats.aero/partnerapi/search?origin_airport=SFO&destination_airport=NRT&start_date=2026-08-01&end_date=2026-08-31" | jq '.'
パラメーター
パラメーター必須説明
origin_airportはいカンマ区切りの空港コード:SFO,LAX
destination_airportはいカンマ区切りの空港コード:NRT,HND
start_dateいいえYYYY-MM-DD 形式
end_dateいいえYYYY-MM-DD 形式
cabinsいいえカンマ区切り:economy,business
sourcesいいえカンマ区切りのプログラムフィルター:aeroplan,united
only_direct_flightsいいえ真偽値。直行便のみを対象にします。
carriersいいえカンマ区切りの航空会社コード:DL,AA
order_byいいえデフォルト:日付と客室クラスの優先順位。lowest_mileage を指定すると、必要マイル数の少ない順になります。
include_tripsいいえ真偽値。レスポンスにフライトの詳細を含めます(処理が遅くなり、サイズが大きくなります)。
minify_tripsいいえ真偽値。include_trips と組み合わせると、パフォーマンス向上のため、各旅程で返すフィールドを少なくします。
include_filteredいいえ真偽値。フィルターで除外された高額な変動制特典航空券を表示します。
takeいいえ1 ページあたりの結果数。10~1000、デフォルトは 500。
skipいいえページネーションのオフセット。
cursorいいえ一貫したページネーションのために、前回のレスポンスから取得したカーソル。
応答フィールド(Availability オブジェクト)

各結果には、1 つの路線/日付/プログラムに関するすべてのフライトがまとめられています。

フィールド説明
IDAvailability ID(フライトの詳細には /trips/{id} と組み合わせて使用します)
Route.OriginAirport出発空港コード
Route.DestinationAirport到着空港コード
Date出発日
Sourceマイレージプログラム
YAvailable、WAvailable、JAvailable、FAvailable各キャビンの空席状況を示すブール値
YMileageCost、WMileageCost、JMileageCost、FMileageCostすべてのフライトのうち最も少ないポイント数(文字列)
YRemainingSeats、WRemainingSeats、JRemainingSeats、FRemainingSeatsすべてのフライトにおける残席数の最大値
YAirlines、WAirlines、JAirlines、FAirlines運航航空会社
YDirect、WDirect、JDirect、FDirect直行便の有無
ComputedLastSeen空席状況が最後に確認された日時

旅行の詳細を取得する

Availability オブジェクトからフライト単位の情報を取得します。区間、予約リンク、座標を含む個々の旅程が返されます。

curl -s -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  "https://seats.aero/partnerapi/trips/{availability_id}" | jq '.'
パラメーター
パラメーター必須説明
idはい(パス)Availability オブジェクト ID
include_filteredいいえ(クエリ)除外された高額な動的料金の結果を含めます
応答フィールド(Trip オブジェクト)
フィールド説明
Cabinエコノミー、プレミアム、ビジネス、ファースト
MileageCostポイント数(整数)
AllianceCostアライアンス提携プログラムを通じた料金(整数)
TotalTaxes税金(セント単位。ドルに換算するには 100 で割ります)
TaxesCurrency通貨コード(空の場合は USD)
RemainingSeats残席数
Stops経由地の数
TotalDuration所要時間(分)
Carriers運航航空会社
FlightNumbersフライト番号の文字列
DepartsAt出発時刻(空港の現地時間)
ArrivesAt到着時刻(空港の現地時間)
AvailabilitySegments個々のフライト区間の配列
Sourceマイレージプログラム

応答には以下も含まれます。

  • 直接予約 URL の label、link、primary のブール値を含む booking_links[]
  • origin_coordinates と destination_coordinates(緯度/経度)
旅行区間のフィールド

AvailabilitySegments 内の各区間:

フィールド説明
FlightNumber例:「TK800」
AircraftCode例:「77W」
AircraftName例:「77W」
OriginAirport区間の出発地
DestinationAirport区間の到着地
DepartsAt出発時刻(空港の現地時間)
ArrivesAt到着時刻(空港の現地時間)
FareClass予約クラスの文字(例:「I」、「X」)
Distance区間の距離(マイル)
Order区間の順序(0 始まり)

空席状況の一括取得

1 つのマイレージプログラムから大量の結果を取得します。広い地域を対象とした検索(例:「北米からヨーロッパへの United のビジネスクラス便をすべて」)に使用します。

curl -s -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  "https://seats.aero/partnerapi/availability?source=united&origin_region=North%20America&destination_region=Europe&cabin=business&start_date=2026-08-01&end_date=2026-09-30" | jq '.'
パラメーター
パラメーター必須説明
sourceはい1 つのマイレージプログラム
cabinいいえエコノミー、プレミアム、ビジネス、ファースト
start_dateいいえYYYY-MM-DD
end_dateいいえYYYY-MM-DD
origin_regionいいえ北米、南米、アフリカ、アジア、ヨーロッパ、オセアニア
destination_regionいいえ上記と同じ
include_filteredいいえブール値。除外された動的料金を表示します。
takeいいえ10~1000。デフォルトは 500
skipいいえページネーションのオフセット
cursorいいえ前回の応答から取得

Get Routes

マイレージプログラムで監視されているすべてのルートを一覧表示します。どの都市間のペアにキャッシュ済みデータがあるかを把握するのに便利です。

curl -s -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  "https://seats.aero/partnerapi/routes?source=united" | jq '.'

ルートオブジェクトの配列を返します。

フィールド説明
OriginAirport出発空港コード
DestinationAirport到着空港コード
OriginRegion出発地域名
DestinationRegion到着地域名
NumDaysOutこのルートを何日前までスキャンするか
Distanceルートの距離
Sourceマイレージプログラム

Live Search

任意の都市間ペアをリアルタイムで検索します(監視対象のルートに限定されません)。商用契約が必要です。 API 経由では Pro ユーザーは利用できません。

応答時間は 5~15 秒です。指数バックオフによる適切なエラー処理を実装してください。

curl -s -X POST -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"origin_airport":"SFO","destination_airport":"NRT","departure_date":"2026-08-15","source":"united","seat_count":2}' \
  "https://seats.aero/partnerapi/live" | jq '.'
パラメーター(JSON ボディ)
パラメーター必須説明
origin_airportはい単一の空港コード
destination_airportはい単一の空港コード
departure_dateはいYYYY-MM-DD
sourceはい単一のマイレージプログラム
seat_countいいえ1~9。デフォルトは 1
disable_filtersいいえすべてのフィルターを無効化(ダイナミックプライシング+空港の不一致)
show_dynamic_pricingいいえダイナミックプライシングのフィルターのみ無効化し、空港フィルタリングは維持

重要: ライブ検索で返される ID は実際の ID ではないため、他の Seats.aero API(Get Trips など)では使用できません。ライブ検索の結果は一時的なものです。

ページネーション

すべてのリストエンドポイントでは skip と cursor を使用します。最初の呼び出しでは、どちらも省略します。レスポンスから cursor の値を保存します。以降の呼び出しでは cursor を渡し、受け取った結果の件数分 skip を増やします。

cursor は Unix タイムスタンプです。不透明な値として扱ってください。ページ間でまれに重複が発生することがあります。ID で重複を除去してください。

便利な jq フィルター

# Business class availability sorted by cheapest miles
... | jq '[.data[] | select(.JAvailable == true) | {date: .Date, origin: .Route.OriginAirport, dest: .Route.DestinationAirport, miles: (.JMileageCost | tonumber), seats: .JRemainingSeats, airlines: .JAirlines, source: .Source, direct: .JDirect}] | sort_by(.miles)'

# Saver vs dynamic detection: if miles < threshold, likely saver
# AA: J saver ~57.5K for transatlantic, dynamic 100K+
# United: J saver ~60-80K for transatlantic, dynamic 100K+
... | jq '[.data[] | select(.JAvailable == true) | {date: .Date, miles: (.JMileageCost | tonumber), source: .Source, type: (if (.JMileageCost | tonumber) < 80000 then "likely_saver" else "dynamic" end)}]'

# Economy availability with 2+ seats
... | jq '[.data[] | select(.YAvailable == true and .YRemainingSeats >= 2) | {date: .Date, origin: .Route.OriginAirport, dest: .Route.DestinationAirport, miles: (.YMileageCost | tonumber), seats: .YRemainingSeats, source: .Source}] | sort_by(.miles)'

# All available cabins for a date range
... | jq '[.data[] | {date: .Date, origin: .Route.OriginAirport, dest: .Route.DestinationAirport, source: .Source, economy: (if .YAvailable then .YMileageCost else null end), business: (if .JAvailable then .JMileageCost else null end), first: (if .FAvailable then .FMileageCost else null end)}]'

# Direct flights only in business
... | jq '[.data[] | select(.JAvailable == true and .JDirect == true) | {date: .Date, miles: .JMileageCost, airlines: .JAirlines, source: .Source}]'

# Check data freshness (stale = potential phantom)
... | jq '[.data[] | {date: .Date, source: .Source, last_seen: .ComputedLastSeen}]'

ワークフロー:旅行計画の検索

  1. 複数の空港と日付範囲を対象にキャッシュ検索を行い、空席状況を確認します
  2. プログラムを比較します。同じルートで、どの source が最も少ないマイル数で済むかを確認します
  3. セーバーとダイナミックを見分けます。低価格(例:AA の大西洋横断便で J が 57.5K)ならセーバーです。高価格(100K 以上)ならダイナミックです
  4. 有望な空席 ID については、必ず Trip Details を取得してください。検索の概要だけで終わらせないでください。検索の概要(JMileageCost)に表示されるのは最安の旅程のみです。トリップ詳細には、概要では表示されないスタンダード/ダイナミックの区分を含め、利用可能なすべてのオプションが表示されます。2 人以上の旅行者を含む検索では、これが必須です
  5. 結果を提示する前に、乗り継ぎ時間のフィルター(下記参照)を適用します
  6. 情報の鮮度を確認します。ComputedLastSeen を確認してください。古い場合(数時間前)、その空席情報は実際には存在しない可能性があります
  7. ポイントを移行する前に、航空会社の公式サイトを確認するか、電話で問い合わせて照合します
  8. トリップのレスポンスに含まれる booking_links を使って、各プログラムのサイトから直接予約します
  9. AwardWallet の残高と照合し、ポイントが十分にあることを確認します

乗り継ぎ品質フィルター

トリップ詳細を取得した後、必ずすべての旅程の乗り継ぎ時間を計算してください。3 時間を超える乗り継ぎにはフラグを付けてください。 最安という理由だけで、乗り継ぎ時間の長い旅程を推奨として何も言わずに提示してはいけません。

最安のオプションの乗り継ぎ時間が 3 時間を超える場合:

  1. 「⚠️ FRA で 8 時間の乗り継ぎ」のように、明確なフラグを付けて表示します
  2. 乗り継ぎ時間が 3 時間未満の次に安い旅程も、あわせて自動的に提示します
  3. ポイントの節約が待ち時間に見合うかどうかはユーザーに判断してもらいます。黙って判断してはいけません

この点が重要な理由: セーバー在庫は最安であることが多い一方、経路は最悪(長い乗り継ぎ、変則的な接続)になりがちです。スタンダード在庫は通常マイル数が 20~30%多くかかりますが、旅程は大幅に良くなります。最安の特典航空券が、必ずしも最良の特典航空券とは限りません。

# Calculate layover duration from trip segments
# TotalDuration = full trip (gate to gate including layovers)
# Sum of individual segment durations = pure flight time
# Layover = TotalDuration - sum(segment durations)
# Flag if any single layover exceeds 180 minutes

curl -s -H "Partner-Authorization: $SEATS_AERO_API_KEY" \
  "https://seats.aero/partnerapi/trips/{id}" | jq '
  .data[] | {
    miles: .MileageCost,
    flights: .FlightNumbers,
    total_min: .TotalDuration,
    segments: [.AvailabilitySegments[] | {
      flight: .FlightNumber,
      from: .OriginAirport,
      to: .DestinationAirport,
      departs: .DepartsAt,
      arrives: .ArrivesAt
    }]
  }
'

結果が空になる場合がある理由

  1. セーバー枠が解放されていません。 ほとんどのプログラムでは、パートナーにのみセーバー特典を表示します。航空会社の公式サイトをご確認ください。
  2. エリート会員/ステータスの制限があります。 一部の座席は、エリート会員またはカード会員にしか表示されません。
  3. ルートが監視対象ではありません。 ルートが Get Routes に含まれていない場合、キャッシュ検索では見つかりません。ライブ検索なら、どのルートでも確認できます。
  4. 検索期間に制限があります。 航空会社によって特典航空券の解放時期は異なります。解放日ツールをご確認ください。
  5. すでに予約されています。 特典枠は常に変動します。空きが出たときに通知を受け取れるよう、アラートを設定してください。

専門ツール(ウェブ UI 専用)

これらのツールは seats.aero のウェブサイトで利用できますが、Partner API 経由では利用できません。

  • Alaska Upgrade Finder(seats.aero/alaska/upgrades):Atmos Gold Guest Upgrade 証書を使って、Alaska のエリート会員が確定できるアップグレード枠を検索します。アップグレードの空き状況を確認するための専用ツールです。
  • Etihad First Class Finder(seats.aero/etihad/first):新たに空きが出た Etihad First Class の座席を追跡する専用ツールです。Etihad F は希少で、非常に人気があります。このツールを使うと、一般検索より早く新しい空き状況を確認できます。
  • Price History:運賃の推移をウェブ UI で確認できますが、API 経由では利用できません。価格履歴チャートを表示するには、seats-aero-web スキル(Patchright ブラウザー自動化)を使用してください。

アラート機能

seats.aero でアラートを作成する際:

  • 時間フィルター:出発時刻と到着時刻の範囲をアラートのフィルターとして指定できます。深夜便を避けたり、午前中の到着を確保したりする場合に便利です。
  • 客室クラス、ルート、プログラムのフィルター:標準的なアラート設定です。
  • 条件に一致する空き状況が見つかると、メールまたはプッシュ通知で通知されます。

サードパーティ連携

Pro アカウントの所有者は、ウェブサイトの「Connect seats.aero」ボタンから、seats.aero をサードパーティアプリに接続できます。

  • aeroconnections.app(@wavydavy 提供):特定の空港から利用できる乗り継ぎ便を可視化するツールです。Pro アカウントでログインすると、現在の特典枠を視覚的なマップで確認できます。思いつかなかった経由地を探すのに便利です。

注意事項

  • レスポンスに含まれる時刻はすべて、現地空港の時刻です。
  • TotalTaxes の単位はセントです(ドルに換算するには 100 で割ってください)。
  • 空席状況オブジェクト内の MileageCost は文字列です。旅行オブジェクト内では整数です。
  • 旅行オブジェクト内の AllianceCost は、アライアンスパートナー経由で予約した場合の費用を示します。
  • 変動価格のフィルターはデフォルトで有効です。すべての結果を表示するには、include_filtered=true を渡してください。
  • 空席状況データはキャッシュされており、リアルタイムではありません。最新性は ComputedLastSeen を確認してください。
  • Pro ユーザー:1 日あたり 1,000 回の API 呼び出しが可能です。失敗したライブ検索はカウントされません。
  • 無料ユーザーが検索できるのは、30 日先までです。Pro にすると 60 日以上先まで検索できます。
  • 検索後のフィルター(最大ポイント数、乗り継ぎ回数、所要時間など)は、検索結果一覧だけでなく、フライト詳細の結果にも直接適用されます。

コメント