mcpField
B
bilt

bilt

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

bilt について

bilt は、認証なしで Bilt 旅行ポータルのホテルやフライトを検索するスキルです。現金価格と Bilt Points の必要数を返し、ポイント価値の比較や HaFH 対象ホテルの調査に使えます。予約には対応しません。

主な機能

  1. 01ホテルと客室料金の検索
  2. 02片道・往復フライトの検索
  3. 03現金価格とポイント数の表示
  4. 04HaFH 対象ホテルの識別
  5. 05検索結果を基にした交換価値の計算

活用シーン

  1. 01ポータル価格と特典航空券の比較
  2. 02Bilt Points の交換価値の評価
  3. 03HaFH 対象ホテルの調査

インストール

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

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

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

詳細

Bilt Travel Portal Search

公開 REST API を使用して、Bilt Rewards の旅行ポータルを検索します。検索に認証は不要です。ホテルとフライトの現金価格(USD)と Bilt ポイントの必要数の両方を返します。

重要:Bilt は Duffel のホワイトレーベルです

Bilt の旅行検索は、Duffel 上に直接構築されています。部分的な統合ではなく、完全なホワイトレーベル契約であることを示す証拠がそろっています。

  • フライトのオファー ID は off_XXX、スライスは sli_XXX、セグメントは seg_XXX、航空機は arc_XXX、航空会社は arl_XXX です。いずれも Duffel の ID パターンです。
  • 航空会社と航空機のロゴは assets.duffel.com から配信されています。
  • ホテルのロイヤルティプログラムのロゴは assets.duffel.com/img/stays/loyalty-programmes から配信されています。つまり、ホテルも Duffel Stays です。
  • JWT の organisation_id: org_0000AaALZyFQ... は Duffel の認証パターンです。
  • フィールド名は Duffel と完全に一致します:marketingCarrier、operatingCarrier、cabinClassMarketingName、fareBasisCode、isNDC、ndcRedirectUrl、totalEmissionsKg、slices[].segments[].passengers[].baggages[]。

Bilt が Duffel に追加するもの:

  • totalPointsRequired(固定のポータルレート 1.25 cpp での Bilt ポイントの必要数)
  • isHafh(ホテルの Home Away From Home フラグ)
  • loyaltyProgram.reference(ホテルのブランド提携情報)
  • Bilt 固有のフィルターフィールドをいくつか

ツールキットでの使い分け:

  • 現金払いのみのフライト検索には、duffel skill をお使いください。認証済みの Duffel API キーを使用し、同じデータをより速く返すほか、より多くのパラメーター(複数都市、時間帯、最大乗り継ぎ回数、supplier_timeout の調整)に対応しています。
  • Bilt ポイントに関する情報(CPP、ポータル料金と特典航空券の比較、Bilt のポイント還元計算)には、このスキルをお使いください。ポイント価格は Bilt のエンドポイントでのみ取得できます。
  • Home Away From Home 対象施設の調査には、このスキルをお使いください。isHafh フラグは Bilt 固有で、300 ドル以上の特典がある施設を示します。

重要な理由

  • Bilt ポイントの標準還元率は 1.25 cpp です(1 USD = 80 ポイント)。固定レートのポータルとしては、比較的高い還元率です。
  • **Home Away From Home(HaFH)**は、Bilt のプレミアムホテルプログラムです。Gold および Platinum 会員は、1 滞在につき 300 ドル以上相当の特典を受けられます(2 名分の毎日の朝食、100 ドルの施設クレジット、到着時の客室アップグレード、アーリーチェックイン/レイトチェックアウト、専属の Virtuoso トラベルアドバイザー)。
  • Bilt ポイントは Hyatt、Marriott、Hilton、IHG、United、AA、Air Canada Aeroplan、Air France/KLM、Virgin Atlantic、Cathay、Turkish などに 1:1 で移行できます。そのため、このポータルは移行先の提携プログラムで特典航空券を検索する際の、1.25 cpp という「最低基準」として比較できます。
  • フライト検索は Duffel を利用しています。duffel skill と同じレスポンス形式です。同じ航空会社、同じ運賃クラス、同じセグメント構造です。
  • **検索に認証は不要です。**ブラウザー自動化、ログイン、2FA はすべて不要です。curl だけで検索できます。

使用する場面

  • Bilt ポータルの料金と seats.aero の特典航空券を比較する
  • Bilt ポイントを利用した還元率(CPP)を計算する
  • Bilt Gold/Platinum の特典を組み合わせて利用できる HaFH 対象施設を探す
  • Bilt ポイントを利用する際に、現金払いとポイント払いのどちらがよいか確認する
  • 「還元の最低基準」として参照する:特典航空券の料金がポータル価格を上回る場合は、ポータルのほうがお得です

使用しない場面

  • **Bilt ポイントに関する情報が不要な、現金払いのみのフライト検索。**代わりに duffel をお使いください。Bilt は Duffel のホワイトレーベルなので、Duffel は同じ現金価格とオファー形式をより速く返し、より多くのパラメーターに対応しています。
  • **フライトやホテルの予約。**このスキルで見つけられるのはオファーのみです。予約にはログインと Bilt Mastercard が必要です。対象外です。
  • **特典航空券の検索。**ロイヤルティプログラム全体の特典航空券の空席状況を調べるには、seats-aero をお使いください。
  • **Bilt のプログラム対象外のホテル調査。**Amex FHR/THC と Chase Edit には premium-hotels を、Google Hotels の一般的なメタ検索には serpapi をお使いください。

Bilt ポイントの評価

指標値備考
ポータルでの交換レート1.25 cpp1 ドル = 80 ポイント(標準、固定)
現金からポイントへの換算式points = round(usd / 0.0125)観測されたレスポンスから逆算
TPG による評価(移行時)2.05 cpp最適な提携先に移行した場合

判断基準: Bilt ポイントを提携プログラムに移行すると 1.25 cpp を超える価値が得られる場合は、移行してください。そうでない場合は、ポータルを利用してください。

API ベース

https://api.biltrewards.com/public/travel

すべてのエンドポイントは公開されており、API キーは不要です。標準的な JSON レスポンスを返します。

ホテル検索

ステップ 1:場所の検索 ID を取得する
curl -s "https://api.biltrewards.com/public/travel/hotels/auto-complete?query=New+York" \
  | jq '.searchResults[0].locationSuggestion'

以下が返されます:

{
  "name": "New York",
  "country": {"name": "USA", "code": "US"},
  "region": {"name": "NY", "code": null},
  "searchId": "ChIJOwg_06VPwokRYv534QaPC8g"
}

searchId は Google Places ID です。特定の施設を検索するには、searchType: HOTEL_SEARCH の結果を渡すこともできます。

ステップ 2:ホテルを検索する
curl -s "https://api.biltrewards.com/public/travel/hotels/search" \
  --get \
  --data-urlencode "checkInDate=2026-08-15" \
  --data-urlencode "checkOutDate=2026-08-18" \
  --data-urlencode "numGuestAdults=2" \
  --data-urlencode "numRooms=1" \
  --data-urlencode "searchId=ChIJOwg_06VPwokRYv534QaPC8g" \
  | jq '.hotelResults | length'

通常、100~200 件のホテルが返されます。同期処理のため、ポーリングは不要です。

必須パラメーター
パラメーター型説明
checkInDateYYYY-MM-DD必須
checkOutDateYYYY-MM-DD必須
numGuestAdultsint必須、1 以上
numRoomsint必須、1 以上
searchIdstringオートコンプリートから取得した Google Places ID
任意パラメーター
パラメーター型説明
childrenAgescsv ints例:5 歳と 8 歳の子ども 2 人の場合は 5,8
hotelIdstring特定の acc_XXX 施設を検索
ホテルのレスポンス形式
{
  stayDetails: { checkInDate, checkOutDate, numRooms, numGuestAdults, childrenAges },
  hotelResults: [
    {
      id: "acc_XXX",
      name: "Park Hyatt New York",
      rating: 5,                      // star rating
      description: "...",
      isHafh: true,                   // Home Away From Home flag
      loyaltyProgram: {               // brand affiliation, if any
        name: "World of Hyatt",
        reference: "world_of_hyatt",
        logoUrl: "..."
      },
      address: { street, city, stateProvince, countryCode, postalCode },
      geolocation: { latitude, longitude },
      amenities: [{ description, category }, ...],
      images: [{ url }, ...],
      lowestRateDetails: {
        usdAmounts: { total },        // cash total in USD
        points: 319681,               // Bilt Points cost
        dueAtHotelAmount, dueAtHotelCurrency,
        ...
      }
    }
  ],
  filterDetails: { ... }
}
ホテルの詳細(客室料金)
curl -s "https://api.biltrewards.com/public/travel/hotels/acc_0000AWPt2s3aNc1GpC5bmU?checkInDate=2026-08-15&checkOutDate=2026-08-18&numGuestAdults=2&numRooms=1" \
  | jq '.hotelDetails | {name, isHafh, rates: .roomTypes[0]}'

施設の詳細情報を含む hotelDetails と、利用可能な各料金プランを含む roomTypes が返されます。

便利な jq フィルター
# Top 10 cheapest hotels with HaFH flag and CPP rounded to 2 decimals
curl -s "$URL" | jq '
  [.hotelResults[]
   | select(.lowestRateDetails.usdAmounts.total != null)
   | {name, isHafh, rating,
      cash: .lowestRateDetails.usdAmounts.total,
      points: .lowestRateDetails.points,
      cpp: (((.lowestRateDetails.usdAmounts.total / .lowestRateDetails.points) * 100) * 100 | round / 100),
      brand: .loyaltyProgram.name}]
  | sort_by(.cash) | .[0:10]'

# Only HaFH properties (worth $300+ benefits if Gold/Platinum)
curl -s "$URL" | jq '
  [.hotelResults[]
   | select(.isHafh == true)
   | {name, rating, cash: .lowestRateDetails.usdAmounts.total, points: .lowestRateDetails.points}]
  | sort_by(.cash)'

フライト検索

ステップ 1:検索を送信する
curl -s "https://api.biltrewards.com/public/travel/flights/search" \
  --get \
  --data-urlencode "departureDate=2026-08-15" \
  --data-urlencode "returnDate=2026-08-22" \
  --data-urlencode "origin=SFO" \
  --data-urlencode "destination=NRT" \
  --data-urlencode "adults=1" \
  --data-urlencode "cabinClass=business"

以下が返されます:

{
  "data": {
    "id": "orq_0000B5mQkPhO7VxuWClhZI",
    "totalBatches": 35,
    "remainingBatches": 35,
    "createdAt": "...",
    "clientKey": "..."
  }
}
ステップ 2:結果をポーリングする
curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID"

remainingBatches は 5~15 秒で 0 まで減少します。最初のバッチが返されると、レスポンスに offers 配列が含まれます。完全な結果を取得するには、remainingBatches == 0 になるまで 3~5 秒ごとにポーリングしてください。

# Polling loop
for i in 1 2 3 4 5; do
  RESP=$(curl -s "https://api.biltrewards.com/public/travel/flights/search/$ID")
  REMAINING=$(echo "$RESP" | jq -r '.data.remainingBatches')
  echo "Poll $i: $REMAINING batches remaining"
  [ "$REMAINING" = "0" ] && break
  sleep 4
done
echo "$RESP" | jq '.data.offers | length'
必須パラメーター
パラメーター型説明
departureDateYYYY-MM-DD必須
originIATA 空港コード必須
destinationIATA 空港コード必須
adultsint必須、1 以上
任意パラメーター
パラメーター型説明
returnDateYYYY-MM-DD往復の場合に指定。片道の場合は省略
cabinClassstringeconomy、premium_economy、business、first
childrenint子どもの人数(childrenAges と併用)
infantsint膝上搭乗の幼児の人数
フライトのレスポンス形式

Duffel と同じです(Bilt は Duffel のホワイトラベル版です)。各オファー:

{
  id: "off_XXX",
  totalAmount: 1606.60,        // cash total
  totalCurrency: "USD",
  baseAmount: 1132.00,
  taxAmount: 474.60,
  totalPointsRequired: 128528,  // Bilt Points cost
  totalPointsRequiredWithCredits: null,  // applicable airline credits, if any
  expiresAt: "2026-04-29T08:51:40Z",
  owner: {
    name: "KLM", iataCode: "KL", logoSymbolUrl, conditionsOfCarriageUrl
  },
  isNDC: false,
  passengers: [{ type, loyaltyProgrammeAccounts, id }],
  conditions: { refundBeforeDeparture, changeBeforeDeparture },
  slices: [
    {
      id: "sli_XXX",
      duration: "P1DT4H40M",   // ISO 8601 duration
      fareBrandName: "Standard",
      origin: { iataCode, name, cityName, timeZone },
      destination: { iataCode, name, cityName, timeZone },
      segments: [
        {
          id, duration, departingAt, arrivingAt,
          origin: {...}, destination: {...},
          marketingCarrier: { name, iataCode, ... },
          operatingCarrier: { name, iataCode, ... },
          marketingCarrierFlightNumber: "0606",
          aircraft: { name: "Boeing 787-10", iataCode: "781" },
          stops: [],
          passengers: [
            {
              passengerId,
              fareBasisCode: "THA79NMP",
              cabinClassMarketingName: "ECONOMY",
              baggages: [{ type: "checked"|"carry_on", quantity }]
            }
          ]
        }
      ]
    }
  ]
}
便利な jq フィルター
# Top 5 cheapest offers with CPP calculation (rounded to 2 decimals)
echo "$RESP" | jq '
  [.data.offers[]
   | {airline: .owner.name,
      cash: .totalAmount,
      points: .totalPointsRequired,
      cpp: (((.totalAmount / .totalPointsRequired) * 100) * 100 | round / 100),
      stops: ([.slices[].segments | length] | map(. - 1)),
      route: ([.slices[] | (.origin.iataCode + " -> " + .destination.iataCode)])}]
  | sort_by(.cash) | .[0:5]'

# Group by airline, show cheapest per carrier
echo "$RESP" | jq '
  [.data.offers[]
   | {airline: .owner.name, cash: .totalAmount, points: .totalPointsRequired}]
  | group_by(.airline)
  | map({airline: .[0].airline, cheapest: (min_by(.cash))})'

# Filter to nonstop only
echo "$RESP" | jq '
  [.data.offers[]
   | select(([.slices[].segments | length] | add) == ([.slices | length]))
   | {airline: .owner.name, cash: .totalAmount, points: .totalPointsRequired}]'

出力形式

常に Markdown テーブルを使用してください。 フライトとホテルの両方を表示する場合は、テーブルを分けてください。

ホテル
ホテル星HaFHブランド現金ポイントCPP
Park Hyatt New York5はいHyatt$3,996319,6811.25
The St. Regis NY5いいえMarriott$4,210336,8001.25
フライト(SFO 発 NRT 行きの片道)
航空会社乗り継ぎ所要時間現金ポイントCPP
Air Canada1 回(YVR)14h 5m$87169,7201.25
KLM1 回(AMS)28h 40m$1,607128,5281.25

テーブルの後には、最安の選択肢を強調し、ユーザーが利用資格を満たす HaFH 滞在(Bilt Gold または Platinum ステータスが必要)を示し、CPP が大きく外れている項目(特別なプロモーションや、ポイントのみの「ブースト」料金を示す可能性があります)を指摘してください。

比較ワークフロー

旅行費用を完全に分析するには:

  1. awardwallet で Bilt ポイント残高を確認します。注:Bilt は AwardWallet に登録されています。
  2. seats-aero で 特典航空券の選択肢を確認します。1.25 cpp でのポータル価格と比較します。
  3. transfer-partners で 移行先パートナーを確認します。パートナープログラムで Bilt ポイントを 1.25 cpp を超える価値で利用できる場合は、ポータルではなくポイントを移行します。
  4. chase-travel(CSR/CSP で動的な Points Boost を提供。一部の予約では約 1.5~2.0 cpp ですが、最低価値が保証されるわけではありません)と amex-travel(航空券で約 1.0 cpp)で ほかのポータルも確認します。想定レートではなく、実際のポータル料金を取得します。
  5. ユーザーが Bilt Gold または Platinum のステータスを持っている場合、HaFH の特典は滞在ごとに約 300 ドル以上の価値があります。実質レートの計算時にこれを適用します。

重要な注意事項

  • isHafh: true は Home Away From Home 対象施設を示します。世界中に約 200~300 軒ある高級ホテルです。該当する場合は必ず明記してください。
  • Bilt のポイント移行手数料は無料です。 一部のポータルポイントの交換とは異なり、Bilt からパートナーへの移行は 1:1 で即時に行われます。
  • 予約には Bilt カードが必要です。 主な特典(HaFH、Rent Day のポイント倍率、ステータス)の利用には、Bilt Mastercard の保有が必要です。
  • API のレスポンスには、エージェントのユーザーコンテキストは含まれません。 これは認証なしで利用できる公開パスです。認証済みの呼び出しでは個人向けデータ(保存した検索、ポイント残高など)が返されますが、ログインが必要です。このスキルの対象外です。
  • Stellate(bilt-rewards.stellate.sh) は Bilt の CMS エンドポイントであり、検索バックエンドではありません。マーケティング文や特典の説明を提供します。実際のホテル・航空券の検索データは api.biltrewards.com/public/travel から取得され、上記で網羅しています。

コメント