scandinavia-transit について
scandinavia-transit は、旅行計画向けにノルウェー、スウェーデン、デンマークの地上交通を検索するスキルです。各国の交通 API を利用して経路や時刻を調べられ、デンマークでは運賃情報も確認できます。
主な機能
- 01ノルウェーの経路・時刻検索
- 02スウェーデンの経路・時刻検索
- 03デンマークの経路・時刻検索
- 04停留所・場所の検索
- 05デンマークの運賃・ゾーン情報
活用シーン
- 01オスロからベルゲンへの移動計画
- 02スウェーデンの都市間列車の検索
- 03デンマークの駅の出発便確認
- 04デンマークの経路と運賃ゾーンの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ borski/ travel-hacking-toolkit --skill scandinavia-transitインストール後、Claude Code で/scandinavia-transitを入力して読み込まれたか確認します。
詳細
スカンジナビア交通機関スキル
ノルウェー、スウェーデン、デンマークの国内交通機関 API を使用して、鉄道、バス、フェリーを検索します。
データソース:
- Entur(ノルウェー) — ノルウェー全土の交通機関を網羅するオープンな GraphQL API
- ResRobot(スウェーデン) — Trafiklab 経由でスウェーデン全土の交通機関を網羅する REST API
- Rejseplanen(デンマーク) — 料金情報を含む、デンマーク全土の交通機関を網羅する REST API(HAFAS)
ノルウェー:Entur(Journey Planner v3)
オープンな GraphQL API です。キーは不要ですが、クライアント名ヘッダーが必要です。ノルウェー全土の交通機関(Vy の列車、バス、フェリー、路面電車、地下鉄)を網羅しています。事業者は 60 社以上です。
経路検索(オスロからベルゲンの例)
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \
-H "Content-Type: application/json" \
-H "ET-Client-Name: $ENTUR_CLIENT_NAME" \
-d '{"query": "{ trip(from: {place: \"NSR:StopPlace:59872\"}, to: {place: \"NSR:StopPlace:548\"}, numTripPatterns: 5) { tripPatterns { startTime duration legs { mode expectedStartTime expectedEndTime fromPlace { name } toPlace { name } line { publicCode name authority { name } } } } } }"}' | jq '.data.trip.tripPatterns[] | {start: .startTime, duration_min: (.duration / 60), legs: [.legs[] | {mode: .mode, from: .fromPlace.name, to: .toPlace.name, line: .line.publicCode, operator: .line.authority.name, depart: .expectedStartTime, arrive: .expectedEndTime}]}'
停留所 ID の検索
停留所 ID の形式は NSR:StopPlace:XXXXX です。ジオコーダーで検索できます。
curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Oslo%20S&size=3" \
-H "ET-Client-Name: $ENTUR_CLIENT_NAME" | jq '[.features[] | {name: .properties.name, id: .properties.id, type: .properties.layer}]'
主な停留所 ID
| 都市 | 停留所 ID | 名称 |
|---|---|---|
| Oslo S | NSR:StopPlace:59872 | Oslo S |
| Bergen | NSR:StopPlace:548 | Bergen stasjon |
| Stavanger | NSR:StopPlace:4130 | Stavanger |
| Trondheim | NSR:StopPlace:41742 | Trondheim S |
| Bodo | NSR:StopPlace:49484 | Bodo stasjon |
ジオコーダーを使えば、任意の停留所を検索できます。空港、フェリーターミナル、バス停にも対応しています。
発車案内
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \
-H "Content-Type: application/json" \
-H "ET-Client-Name: $ENTUR_CLIENT_NAME" \
-d '{"query": "{ stopPlace(id: \"NSR:StopPlace:59872\") { name estimatedCalls(numberOfDepartures: 10) { expectedDepartureTime destinationDisplay { frontText } serviceJourney { journeyPattern { line { publicCode name transportMode } } } } } }"}' | jq '.data.stopPlace | {name: .name, departures: [.estimatedCalls[] | {time: .expectedDepartureTime, destination: .destinationDisplay.frontText, line: .serviceJourney.journeyPattern.line.publicCode, mode: .serviceJourney.journeyPattern.line.transportMode}]}'
注意事項
- GraphQL API です。POST のみ対応しています。エンドポイントは
https://api.entur.io/journey-planner/v3/graphqlです。 - すべてのリクエストに
ET-Client-Nameヘッダーを設定してください。 - レート制限キーはありませんが、節度ある利用が求められます。
- スキーマエクスプローラー:https://api.entur.io/graphql-explorer/journey-planner-v3
- Vy および SJ Nord 経由で、スウェーデンへの一部の国境越え路線にも対応しています。
スウェーデン:ResRobot v2.1
Trafiklab 経由の REST API です。スウェーデン全土の交通機関(SJ の列車、地域バス、フェリー、地下鉄、通勤鉄道)を網羅しています。
認証
.env に RESROBOT_API_KEY を設定します。クエリパラメーター accessId を使用してください。trafiklab.se で無料のキーを取得できます。月間 30,000 回まで呼び出せます。
経路検索(ストックホルムからヨーテボリ)
curl -s "https://api.resrobot.se/v2.1/trip?originId=740000001&destId=740000002&format=json&accessId=$RESROBOT_API_KEY" | jq '[.Trip[] | {start: .LegList.Leg[0].Origin.time, date: .LegList.Leg[0].Origin.date, duration: .duration, legs: [.LegList.Leg[] | {mode: .type, name: .name, from: .Origin.name, to: .Destination.name, depart: .Origin.time, arrive: .Destination.time}]}] | .[0:5]'
停留所 ID の検索
curl -s "https://api.resrobot.se/v2.1/location.name?input=Stockholm&format=json&accessId=$RESROBOT_API_KEY" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'
主な停留所 ID
| 都市 | 停留所 ID | 名称 |
|---|---|---|
| Stockholm C | 740000001 | Stockholm Centralstation |
| Gothenburg C | 740000002 | Goteborg Centralstation |
| Malmo C | 740000003 | Malmo Centralstation |
| Uppsala | 740000025 | Uppsala Centralstation |
| Linkoping | 740000009 | Linkoping Centralstation |
経路検索パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
originId | はい | 出発停留所 ID |
destId | はい | 到着停留所 ID |
date | いいえ | YYYY-MM-DD(デフォルトは今日) |
time | いいえ | HH:MM(デフォルトは現在時刻) |
format | いいえ | json または xml |
numTrips | いいえ | 検索結果の件数(デフォルトは 5) |
products | いいえ | 交通機関の種類を指定するビットマスク |
注意事項
- REST API です。ベース URL は
https://api.resrobot.se/v2.1/です。 - コペンハーゲン行きのオーレスン国境越え列車が含まれます。
- 料金情報はありません。時刻表と経路のみです。
デンマーク:Rejseplanen API 2.0
REST API(HAFAS v2.50.4.1)です。デンマーク全土の交通機関(DSB InterCity/InterCityLyn、S-Tog、地下鉄、地域列車、バス、高速バス、深夜バス、フェリー、Flextur)を網羅しています。特長:運賃とゾーンの料金情報を含みます。
ドキュメント:https://labs.rejseplanen.dk(ログインが必要です)。XSD スキーマ:https://www.rejseplanen.dk/api/xsd
認証
.env に REJSEPLANEN_API_KEY を設定します。クエリパラメーター accessId として渡してください。labs.rejseplanen.dk から申請できます。商用以外の利用は月間 50,000 回まで無料です。
共通パラメーター
| パラメーター | 説明 |
|---|---|
accessId | 必須。 API キーです。 |
format | json または xml。常に format=json を使用してください。 |
lang | デフォルトは da です。英語にするには lang=en を使用してください。 |
製品ビットマスク
| 値 | 製品 | 説明 |
|---|---|---|
| 1 | IC | 都市間列車 |
| 2 | ICL | InterCityLyn(急行) |
| 4 | Re | 地域列車 |
| 8 | その他 | ECE、Eurostar、RailJet、Togbus、DSB Udland |
| 16 | S-Tog | コペンハーゲンの通勤鉄道 |
| 32 | バス | 路線バス |
| 64 | ExpressBus | 急行バス(250S、X-bus) |
| 128 | NightBus | 夜行バス |
| 256 | Flextur | デマンド型交通 |
| 1024 | メトロ | コペンハーゲンメトロ |
列車のみの場合は products=31 です。すべての交通機関を対象にする場合は、パラメーターを省略します。
主な停留所 ID
| 停留所 | extId | 名前 |
|---|---|---|
| København H | 8600626 | København H |
| CPH Lufthavn | 8600858 | CPH Lufthavn |
| Odense St. | 8600512 | Odense St. |
| Aarhus H | 8600053 | Aarhus H |
| Aalborg St. | 8600020 | Aalborg St. |
| Svendborg St. | 8600551 | Svendborg St. |
| Svendborg Færgehavn | 100200261 | Svendborg Færgehavn |
| Ærøskøbing Havn (færge) | 100200222 | Ærøskøbing Havn (færge) |
場所エンドポイント
location.name(名前で検索)
curl -s "https://www.rejseplanen.dk/api/location.name?accessId=$REJSEPLANEN_API_KEY&input=København&format=json&type=S" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, lat: .lat, lon: .lon}] | .[0:10]'
| パラメーター | 必須 | 説明 |
|---|---|---|
input | はい | 検索クエリ |
type | いいえ | S(停留所)、A(住所)、P(POI)、または組み合わせ |
maxNo | いいえ | 最大結果数(デフォルトは10、最大1000) |
products | いいえ | 製品ビットマスクフィルター |
r, refCoordLat, refCoordLong | いいえ | 距離順のランキングに使う半径と基準座標 |
location.nearbystops(座標付近の停留所)
curl -s "https://www.rejseplanen.dk/api/location.nearbystops?accessId=$REJSEPLANEN_API_KEY&originCoordLat=55.672793&originCoordLong=12.564590&r=500&format=json" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, dist: .dist}] | .[0:10]'
originCoordLat/originCoordLong が必要です。省略可能なパラメーター:r(半径、デフォルトは1000m)、maxNo、type、products。
location.details
完全な HAFAS ID を指定して、単一の場所の詳細を取得します(URL エンコードが必要です)。
location.data
数値 ID の範囲(llId から urId)内の場所を取得します。
location.search
フィルター付きの場所検索です。location.name と同じパラメーターに加え、追加のフィルターを指定できます。
location.boundingbox
地理的な範囲(llLat/llLon から urLat/urLon)内のすべての停留所を取得します。
addresslookup
座標付近の住所を取得します。逆ジオコーディングを行います。originCoordLat/originCoordLong が必要です。
経路検索エンドポイント
trip(経路検索)
curl -s "https://www.rejseplanen.dk/api/trip?accessId=$REJSEPLANEN_API_KEY&originId=8600626&destId=8600551&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.TripList.Trip[] | {duration: .duration, legs: [.LegList.Leg[] | {name: .name, type: .type, from: .Origin.name, to: .Destination.name, depTime: .Origin.time, arrTime: .Destination.time, track: .Origin.track}]}] | .[0:3]'
| パラメーター | 必須 | 説明 |
|---|---|---|
originId | はい* | 出発停留所の extId |
destId | はい* | 到着停留所の extId |
originCoordLat/Long | はい* | 座標による出発地の指定(originId の代替) |
destCoordLat/Long | はい* | 座標による到着地の指定(destId の代替) |
date | いいえ | YYYY-MM-DD |
time | いいえ | HH:MM |
searchForArrival | いいえ | 1 = 到着時刻で検索 |
numF | いいえ | 前方の検索結果(1-6) |
numB | いいえ | 後方の検索結果(0-3) |
maxChange | いいえ | 最大乗り換え回数(0-11) |
products | いいえ | 製品ビットマスク |
operators | いいえ | カンマ区切りの運行会社コード |
lines | いいえ | 路線フィルター |
via | いいえ | 経由する停留所 ID |
avoid | いいえ | 回避する停留所 ID |
passlist | いいえ | 1 = 中間停留所を含める |
tariff | いいえ | 1 = 運賃/ゾーン料金を含める |
poly | いいえ | 1 = ポリラインを含める |
context | いいえ | ページ送り用スクロールトークン |
originWalk/Bike/Car | いいえ | アクセス手段の距離 |
destWalk/Bike/Car | いいえ | 出口手段の距離 |
rtMode | いいえ | FULL、INFOS、OFF、REALTIME、SERVER_DEFAULT |
interval(時間帯別の経路検索)
時間帯内のすべての出発便を取得します。trip と同じパラメーターを使用します。
recon(経路の再構築)
ctxRecon トークンから経路を再構築します。パラメーター:ctx(必須)、poly、passlist、tariff。
reachability(到達可能なすべての停留所)
時間/乗り換えの上限内で到達可能なすべての停留所を取得します。パラメーター:originId または座標、duration(1~1439 分)、maxChange(0~11)、forward、products。
出発・到着案内
デフォルトの時間は60分です。
departureBoard / arrivalBoard
curl -s "https://www.rejseplanen.dk/api/departureBoard?accessId=$REJSEPLANEN_API_KEY&id=8600626&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.DepartureBoard.Departure[] | {name: .name, time: .time, direction: .direction, track: .track, rtTime: .rtTime}] | .[0:10]'
パラメーター:id(必須)、date、time、duration(0~1439)、maxJourneys、products、operators、passlist。
multiDepartureBoard / multiArrivalBoard
1回の呼び出しで複数の駅を指定します。複数の id パラメーターを渡します。
nearbyDepartureBoard / nearbyArrivalBoard
座標付近の駅です。パラメーター:originCoordLat/Long、r(デフォルトは1000m)、maxStops(デフォルトは30)。
路線と旅程のエンドポイント
lineinfo
指定日の路線詳細です。lineId、dateが必要です。
linesched
指定日の路線全体の時刻表です。lineId、dateが必要です。
linesearch
事業者別の全路線です。operators(datainfoから取得した、カンマ区切りの値)が必要です。
linematch
パターン文字列で路線を照合します。
trainSearch
列車名で旅程を検索します。最初と最後の停車駅のみを返します。
journeyDetail
旅程の全停車駅一覧です。id(trip/boardから取得した旅程参照)が必要です。fromId/toId、poly、rtModeは省略可能です。
journeyMatch
trainSearchと同様ですが、最初に一致した結果のみ全詳細を返します。
journeypos
境界ボックス内のリアルタイム車両位置です。llLat/llLon/urLat/urLonが必要です。
運賃/料金のエンドポイント
デンマークでは、Rejsekortを通じたゾーン制運賃が採用されています。スカンジナビアでは独自の方式です。
| エンドポイント | 用途 |
|---|---|
trip with tariff=1 | tripの結果に料金を含めます |
spPrice | 出発地/目的地別の定期券料金 |
spPriceForZones | 運賃セット内のゾーン数に応じた1日あたりの料金 |
spDailyZonalPrices | 全乗客タイプを対象とした、ゾーン料金の完全なマトリックス |
spPriceReconstruction | 旅程再構成コンテキストに基づく料金 |
spRefund | 定期券の払い戻し計算 |
spCheck | 定期券の検証(SELFシステム) |
spZoneCheck | ゾーンの接続状況と地下鉄ゾーンの確認 |
stRoutes | 出発地/目的地間の運賃ルート |
stRoutesAddon | 単一の出発地からの運賃ルート |
stStops | 運賃ゾーンと停留所(mode=DSB) |
trfStop | ゾーンのデフォルト停留所 |
convertZones | コンテキストの運賃詳細 |
zoneFromCoordinate | 緯度/経度からゾーンを検索 |
移動詳細のエンドポイント
gisroute
tripの結果から徒歩/自転車ルートの詳細を取得します。ctx(GIS参照)が必要です。
himsearch
リアルタイムの運行障害メッセージです。交通手段、事業者、路線、日付、停留所で絞り込めます。
システム情報
datainfo
全事業者、交通手段、カテゴリです。事業者コードの確認に使用します。
curl -s "https://www.rejseplanen.dk/api/datainfo?accessId=$REJSEPLANEN_API_KEY&format=json" | jq '[.DataInfo.operators.Operator[] | {name: .name, id: .id}] | .[0:20]'
tti
時刻表データプールの情報:ID、作成日、タイプ(ST/ADR/POI)、有効期間です。
レスポンスの構造
extId:停留所の数値ID(クエリに使用します)。idはHAFASの完全な文字列です。rtTime/rtDate:リアルタイムの実績/予測時刻(予定時刻のtime/dateと異なる場合)。- 区間の
type:JNY(旅程)、WALK(徒歩)、TRSF(乗り換え)。 JourneyDetailRef:旅程の全停車駅一覧を取得するには、journeyDetailと併用します。
国境を越えるルート
| ルート | 対応API | メモ |
|---|---|---|
| オスロからストックホルム | Entur + ResRobot | SJの列車、約6時間 |
| マルメからコペンハーゲン | ResRobot + Rejseplanen | Øresundの列車、35分 |
| ヨーテボリからオスロ | Entur + ResRobot | Vy/SJ、約4時間 |
| ストックホルムからコペンハーゲン | ResRobot | SJ/DSB、マルメ経由で約5時間 |
| コペンハーゲンからマルメ | Rejseplanen | デンマーク側から乗車するØresundの列車 |
使用する場面
次の場合にこのスキルを読み込みます。
- スカンジナビアの都市間を移動する列車/バス/フェリーのルートを計画する
- 地上交通機関の時刻表や所要時間を確認する
- 旅程計画用の停留所IDを調べる
- スカンジナビア域内の移動で、列車と飛行機を比較する
- デンマークの公共交通機関の運賃/ゾーンを調べる
- リアルタイムの運行障害を確認する(
himsearch) - 車両の現在位置を追跡する(
journeypos)
次の用途には使用しないでください。
- 予約(検索/時刻表の確認のみ)
- 航空便(Seats.aero、SerpAPI、またはDuffelを使用してください)
- EnturまたはResRobotからの料金取得(料金を提供しているのはRejseplanenのみです)
検索ワークフロー
1. 「AからBへはどう行けばよいですか?」
ステップ1: 国に応じてAPIを選びます(ノルウェー=Entur、スウェーデン=ResRobot、デンマーク=Rejseplanen、国境を越える移動=両方)。
ステップ2: 停留所IDを調べます。
# Norway
curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Flåm&size=3" \
-H "ET-Client-Name: $ENTUR_CLIENT_NAME" | jq '[.features[] | {name: .properties.name, id: .properties.id}]'
# Sweden
curl -s "https://api.resrobot.se/v2.1/location.name?input=Malmö&format=json&accessId=$RESROBOT_API_KEY" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'
# Denmark
curl -s "https://www.rejseplanen.dk/api/location.name?accessId=$REJSEPLANEN_API_KEY&input=Svendborg&format=json&type=S&lang=en" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'
ステップ3: dateとtimeを指定して旅程を検索します。ステップ4(デンマーク): 料金を取得するにはtariff=1を追加します。
2. 「Xから出発する列車は何ですか?」
curl -s "https://www.rejseplanen.dk/api/departureBoard?accessId=$REJSEPLANEN_API_KEY&id=8600626&duration=120&products=31&format=json&lang=en" | jq '[.DepartureBoard.Departure[] | {time: .time, name: .name, direction: .direction, track: .track}]'
3. 「近くには何がありますか?」
curl -s "https://www.rejseplanen.dk/api/location.nearbystops?accessId=$REJSEPLANEN_API_KEY&originCoordLat=55.6736&originCoordLong=12.5681&r=500&format=json&lang=en" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, dist: .dist}]'
停留所の検索を省略するには、nearbyDepartureBoard を使用します。
4. 「Ærø行きのフェリーはありますか?」
curl -s "https://www.rejseplanen.dk/api/trip?accessId=$REJSEPLANEN_API_KEY&originId=100200261&destId=100200222&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.TripList.Trip[] | {legs: [.LegList.Leg[] | {name: .name, from: .Origin.name, to: .Destination.name, depTime: .Origin.time, arrTime: .Destination.time}]}] | .[0:5]'
5. 「列車番号は分かっています。」
trainSearch で列車を検索し、その参照情報を使って journeyDetail を実行すると、全停車駅を確認できます。
6. 「2時間でどこまで行けますか?」
curl -s "https://www.rejseplanen.dk/api/reachability?accessId=$REJSEPLANEN_API_KEY&originId=8600626&duration=120&maxChange=2&format=json" | jq '.'
7. 「運行の乱れはありますか?」
curl -s "https://www.rejseplanen.dk/api/himsearch?accessId=$REJSEPLANEN_API_KEY&format=json&lang=en" | jq '.'
8. 複数の国をまたぐ移動
両端の出発地と目的地から検索します。Øresund列車は、ResRobotとRejseplanenの両方に表示されます。
ヒント
- 常に
format=jsonを指定します。Rejseplanenでは常にlang=enを指定します。 - クエリには、長いHAFASの
id文字列ではなく、数値のextIdを使用します。 - 遅延を確認するには、
rtTime/rtDateを確認します。 passlist=1を指定すると、途中停車駅が表示されます。- 直通便のみを表示するには、
maxChange=0を指定します。 numF/numBまたはcontextのスクロールトークンを使ってページを切り替えます。- プロダクトのビットマスクは加算式です。すべての種類を対象にする場合は省略します。