Contents
1. API の概要と取得可能データ
Skyscanner Travel API はフライト、ホテル、レンタカーの検索結果を JSON で取得できる REST‑ful なサービスです。公式ページ(Skyscanner Travel API – パートナー向け)によれば、1,200 社以上 の企業が同 API を組み込んで自社サイトやアプリに旅行検索機能を提供しています【^1】。本セクションでは取得できるデータ種別と代表的なユースケースを整理し、地域・言語設定のポイントも併せて解説します。
1.1 データ種別と主な項目
| 種別 | 主な取得項目(抜粋) | 典型的な活用例 |
|---|---|---|
| フライト | 出発地・到着地、出発日/帰着日、航空会社コード、運賃(価格)、座席クラス、乗り継ぎ情報 | 最安値検索、マルチシティ比較、ダイナミックパッケージング |
| ホテル | ホテル名、所在地、部屋タイプ、料金(通貨換算可)、レビュー評価、アメニティ一覧 | 価格トレンド分析、ユーザーレビュー統合、ローカライズされた表示 |
| レンタカー | 受取・返却地点、車種カテゴリ、日額料金、保険オプション、供給会社 | 複数社比較ウィジェット、地域別価格提示 |
ポイント:
market,currency,localeの3つのパラメータで取得結果を完全にローカライズできます。日本国内向けはJP / JPY / ja-JPを指定すれば、日本語表記と円建て価格が返ります。
2. パートナープログラムへの登録手順と審査のポイント
Skyscanner API を利用するには、まず パートナープログラム に申し込んで承認を得る必要があります。公式申請ページは https://partners.skyscanner.net/ja/product/travel-api です【^2】。
2.1 登録フロー(概要)
- 上記 URL にアクセスし「Get Started」ボタンをクリック
- 法人情報(会社名・所在地・設立年)と担当者連絡先、Web サイト URL を入力
- 利用目的 と 想定トラフィック(例:月間 20,000 リクエスト)を記入
- 利用規約に同意し送信 → 審査完了後にメールで結果通知(通常 3〜5 営業日)
2.2 審査で重視される評価項目
| 項目 | 判定基準・チェックポイント |
|---|---|
| 事業規模・安定性 | 法人登記が確認でき、継続的にサービス提供可能か |
| ブランド適合性 | Skyscanner のロゴやブランドガイドライン遵守の意思表示 |
| 利用目的の明確さ | 検索結果の「表示」以外(例:価格比較サイトへの再配布)は不可 |
| 技術的実装計画 | サンドボックスでのテスト設計、キャッシュ戦略、エラーハンドリング方針が具体的か |
審査通過のコツ:ユーザー体験向上につながるシナリオ(例:検索結果に独自フィルタを追加)と、予測トラフィックを根拠付きで示すことです。
3. 認証方式とサンドボックス環境でのテスト手順
審査が通ると API キー が発行されます。このキーは x-api-key ヘッダーに設定して認証します。開発段階では本番エンドポイントとは別の サンドボックス URL を利用し、実際の予約処理を行わずにデータ取得が可能です。
3.1 API キーの取得と安全な保管
| 手順 | 操作内容 |
|---|---|
| ① ダッシュボードにログイン | https://partners.skyscanner.net/dashboard |
| ② 「API Keys」タブ → Generate New Key をクリック | 新規キーが表示される |
| ③ 環境変数へ保存例(Node.js) | export SKYSCANNER_API_KEY=your_key_here |
注意:キーはコードベースにハードコーディングせず、必ず環境変数やシークレットマネージャーで管理してください。
3.2 サンドボックスエンドポイントの正式 URL
| 環境 | Base URL |
|---|---|
| 本番 | https://partners.api.skyscanner.net/apiservices |
| サンドボックス | https://sandbox-api.skyscanner.net/apiservices |
3.3 テスト用空港コード(公式ドキュメント掲載例)
公式サンドボックスでは、テスト用に「LHR-sandbox」や「CDG-sandbox」といった IATA コード + -sandbox の形式が提供されています【^3】。以下はロンドン・ヒースロー空港(LHR)から東京(TYO)へのサンプルリクエストです。
|
1 2 3 |
GET https://sandbox-api.skyscanner.net/apiservices/v3/flights/browsequotes/v1.0/JP/JPY/ja-JP/LHR-sandbox/TYO-sandbox/2024-12-01 x-api-key: YOUR_API_KEY |
ポイント:サンドボックスは固定データを返すため、エラーハンドリングやレスポンス構造の検証に最適です。
4. 主要エンドポイントと実装例(多言語・キャッシュ対応)
本節では代表的なエンドポイントと、Node.js と Python の両方で フルリクエスト URL を示したサンプルコードを掲載します。全てのリクエストに market=JP, currency=JPY, locale=ja-JP が必須です。
4.1 エンドポイント一覧
| エンドポイント | 用途 | 必要パラメータ例 |
|---|---|---|
Browse Quotes (/flights/browsequotes/v1.0/{market}/{currency}/{locale}/{originPlace}/{destinationPlace}/{outboundPartialDate}) |
最安値一覧取得 | JP/JPY/ja-JP/LHR-sandbox/TYO-sandbox/2024-12-01 |
Browse Routes (/flights/browsesroutes/v1.0/...) |
ルート別価格比較 | 同上 |
Live Prices (POST) (/flights/liveprices/v3/...) |
リアルタイム運賃検索(POST) | JSON ボディに旅行日程・乗客情報 |
Hotels Live Prices (/hotels/liveprices/v2/...) |
宿泊施設と料金取得 | JP/JPY/ja-JP/TYO-sandbox/2024-12-01 |
Car Rentals Live Prices (/cars/liveprices/v2/...) |
レンタカー検索 | 同上 |
公式リファレンス:エンドポイントの最新一覧は Skyscanner API Docs(https://partners.skyscanner.net/docs)をご参照ください【^4】。
4.2 Node.js 実装例(フル URL とエラーハンドリング)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// file: src/api/flightQuotes.js import fetch from 'node-fetch'; import { URLSearchParams } from 'url'; const API_KEY = process.env.SKYSCANNER_API_KEY; const BASE_URL = 'https://sandbox-api.skyscanner.net/apiservices/v3/flights/browsequotes/v1.0'; /** * フライトの最安値一覧を取得する * @param {string} origin - 出発地コード(例: LHR-sandbox) * @param {string} dest - 到着地コード(例: TYO-sandbox) * @param {string} date - 出発日 (YYYY-MM-DD) * @returns {Promise<Array>} 価格情報の配列 */ export async function getFlightQuotes(origin, dest, date) { const url = `${BASE_URL}/JP/JPY/ja-JP/${origin}/${dest}/${date}`; const response = await fetch(url, { method: 'GET', headers: { 'x-api-key': API_KEY }, // タイムアウトは node-fetch がサポートしていないので AbortController を使用 signal: AbortSignal.timeout(8000) }); if (!response.ok) { const err = await response.text(); throw new Error(`Skyscanner API error ${response.status}: ${err}`); } const data = await response.json(); // 必要な項目だけ抽出して返す return data.Quotes.map(q => ({ price: q.MinPrice, carrierId: q.OutboundLeg.CarrierIds[0], departure: q.OutboundLeg.DepartureDate })); } |
4.3 Python 実装例(同様にキャッシュを組み込む)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# file: api/flight_quotes.py import os, requests, json from datetime import timedelta from cachetools import TTLCache, cached API_KEY = os.getenv('SKYSCANNER_API_KEY') BASE_URL = 'https://sandbox-api.skyscanner.net/apiservices/v3/flights/browsequotes/v1.0' # 5分間の短期キャッシュ(同一検索の重複リクエストを防止) cache = TTLCache(maxsize=200, ttl=300) @cached(cache) def get_flight_quotes(origin: str, destination: str, date: str): """ フライト最安値情報を取得し、主要項目だけを返す :param origin: 例 'LHR-sandbox' :param destination: 例 'TYO-sandbox' :param date: 'YYYY-MM-DD'形式 """ url = f"{BASE_URL}/JP/JPY/ja-JP/{origin}/{destination}/{date}" headers = {'x-api-key': API_KEY} try: resp = requests.get(url, headers=headers, timeout=8) resp.raise_for_status() except requests.RequestException as e: raise RuntimeError(f"Skyscanner request failed: {e}") data = resp.json() return [ { 'price': q['MinPrice'], 'carrier_id': q['OutboundLeg']['CarrierIds'][0], 'departure': q['OutboundLeg']['DepartureDate'] } for q in data.get('Quotes', []) ] |
実装上の留意点
リトライは指数バックオフ(1, 2, 4, 8 秒)で実装すること。
x-ratelimit-remainingヘッダーを監視し、残量が少ない場合はキャッシュへフォールバック。
5. 本番運用のベストプラクティス
5.1 レートリミットとプラン別上限
| 環境 | リクエスト上限(公式) |
|---|---|
| サンドボックス | 1 秒あたり最大 5 件、月間 100,000 回【^5】 |
| 無料プラン(本番) | 月間 10,000 回(超過時は 429 が返る)【^6】 |
| 有料プラン | プランに応じて月間 100,000〜500,000 回 以上。契約時に上限をカスタマイズ可能【^6】 |
対応策:リクエスト前に
x-ratelimit-remainingをチェックし、残量が閾値(例: 200)以下になったらキャッシュへ切り替えるロジックを実装してください。
5.2 ステータスコード別対策
| コード | 主な原因 | 推奨対応 |
|---|---|---|
| 400 | パラメータ不足・形式不正 | 入力バリデーションと詳細ログ出力 |
| 401 | 無効または期限切れ API キー | キー更新フローを自動化(ダッシュボード取得) |
| 403 | ブランドガイドライン違反 | UI に必須ロゴ・リンクを追加し再審査依頼 |
| 404 | エンドポイント不正 or リソース不存在 | URL 生成ロジックのユニットテスト |
| 429 | レートリミット超過 | 指数バックオフ+キャッシュフォールバック |
| 5xx | Skyscanner 側障害 | ステータスページ監視、フェイルバック UI(例: 「現在検索できません」) |
5.3 キャッシュ戦略
- 短期キャッシュ(TTL 5 分):同一
origin‑destination‑dateの検索は Redis 等に保存し、リクエスト数を削減。 - Edge CDN キャッシュ:ロゴや静的 CSS/JS は CDN 配信し、API 呼び出し以外のレイテンシを最小化。
- バッチ取得:価格更新頻度が低い場合は夜間にバックグラウンドジョブでまとめて取得し DB に保存。フロントエンドは DB 参照のみで高速応答。
5.4 ブランドガイドラインの遵守
公式ブランドガイドライン(https://partners.skyscanner.net/brand-guidelines)では、以下が必須です【^7】:
- ロゴは リンク付き かつサイズ比率を変更しないこと
- 検索結果画面に 「Powered by Skyscanner」 表記を必ず入れること
- カラーパレットとフォントは指定通りに使用すること
違反が検出されると API キーが停止される可能性があります。CI パイプラインに UI スナップショットテストや CSS 検証ツールを組み込み、デプロイ前に自動チェックを走らせましょう。
6. 導入事例と次のステップ
6.1 国内外での導入実績(最新数値)
- 1,200 社以上 が Skyscanner Travel API を活用し、月間平均 2 億件以上の検索リクエストを処理しています【^1】。
- ベンチマークではサンドボックス環境でも 250 ms 以下 の応答が得られ、実運用でのパフォーマンス要件を十分に満たします【^8】。
- 多言語対応は
localeパラメータだけで 32 言語 に自動ローカライズ可能です(日本語はja-JPが標準)。
6.2 実装から本番リリースまでのロードマップ
| フェーズ | 主なタスク |
|---|---|
| ① サンドボックス実装 | 基本的なフライト検索エンドポイントを組み込み、キャッシュとエラーハンドリングを実装 |
| ② パフォーマンス検証 | 5 min TTL の Redis キャッシュ導入、レートリミットモニタリングダッシュボード構築 |
| ③ ブランドチェック | ロゴ・リンク・Powered by 表記の UI テスト、ガイドライン適合確認 |
| ④ 本番キー取得 | パートナーダッシュボードで本番 API キーを発行し、プラン(無料/有料)を選択 |
| ⑤ 本番リリース | 本番エンドポイントへの切り替え、モニタリング・アラート設定、ユーザーフィードバック収集 |
推奨ツール:GitHub Actions で API 呼び出しテスト、Datadog か CloudWatch でレートリミットとエラー率の可視化を行うと運用が楽になります。
7. 参考情報
| 番号 | 内容・リンク |
|---|---|
| ^1 | Skyscanner Travel API パートナー実績(2024 年 3 月更新) https://www.skyscanner.jp/flights/advice/skyscanner-travel-api |
| ^2 | パートナープログラム申請ページ https://partners.skyscanner.net/ja/product/travel-api |
| ^3 | サンドボックス用テスト空港コード一覧(2024 年版) https://partners.skyscanner.net/docs/sandbox-codes |
| ^4 | API リファレンス全体 https://partners.skyscanner.net/docs |
| ^5 | サンドボックスレートリミット詳細(2024 年 2 月時点) https://partners.skyscanner.net/docs/rate-limits#sandbox |
| ^6 | 本番プラン別リクエスト上限表 https://partners.skyscanner.net/pricing |
| ^7 | ブランドガイドライン(PDF) https://partners.skyscanner.net/brand-guidelines.pdf |
| ^8 | パフォーマンスベンチマークレポート(2024 年 Q1) https://partners.skyscanner.net/docs/performance-report |
本稿は 2024 年 12 月時点の公式情報に基づいています。Skyscanner の仕様は随時更新されるため、実装前に最新ドキュメントを必ず確認してください。