← Files Hoteler LogARCHIVED FILE

skills/hoteler-log-import-stays/references/generator-input.schema.json

5.36 KB · Oct 5, 2026 · 18:32 UTC

↓ Download file

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Hoteler Log requested stay links",
  "type": "object",
  "additionalProperties": false,
  "required": ["linkCreationRequested", "stays"],
  "properties": {
    "linkCreationRequested": {
      "const": true,
      "description": "Set true only when the user asked to add, import, register, or create Hoteler Log links for the supplied reservation material. This authorizes a review-only link; it does not assert that extracted fields were reviewed."
    },
    "stays": {
      "type": "array",
      "minItems": 1,
      "maxItems": 20,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["hotelName", "checkIn", "checkOut"],
        "properties": {
          "hotelName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Exact catalogued lodging name, or exact unlisted lodging name explicitly confirmed by the user."
          },
          "unlistedHotelNameConfirmed": {
            "type": "boolean",
            "description": "Set true only when a name outside the bundled catalog was visibly marked unlisted and explicitly confirmed. This control field is never encoded into the app payload."
          },
          "checkIn": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
          "checkOut": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
          "bookingChannel": {
            "enum": [
              null,
              "公式サイト",
              "ポイント予約",
              "一休.com",
              "楽天トラベル",
              "じゃらん",
              "JTB",
              "Yahoo!トラベル",
              "Relux",
              "Agoda",
              "Booking.com",
              "Expedia",
              "Trip.com",
              "Hotels.com",
              "Amex FHR",
              "Amex THR",
              "Hotelux",
              "Tablet Hotels",
              "Mr & Mrs Smith",
              "Virtuoso",
              "Visa Luxury Hotel Collection"
            ]
          },
          "priceAmount": {
            "type": ["string", "null"],
            "maxLength": 20,
            "pattern": "^[0-9]+(?:\\.[0-9]+)?$",
            "description": "Reservation amount as a plain nonnegative decimal string. JPY is preserved exactly. A foreign amount requires verified ECB evidence and is converted to whole JPY. Omit or set null when safe evidence is unavailable."
          },
          "priceCurrency": {
            "enum": [null, "JPY", "USD", "EUR", "GBP", "CNY", "KRW", "THB", "SGD", "AUD", "CAD", "CHF", "HKD"],
            "description": "Exact uppercase ISO-style source currency. Must be paired with priceAmount. Generated app payloads always use JPY."
          },
          "exchangeRate": {
            "oneOf": [
              { "type": "null" },
              {
                "type": "object",
                "additionalProperties": false,
                "required": ["provider", "rateDate", "sourceUnitsPerEUR", "jpyPerEUR"],
                "properties": {
                  "provider": { "const": "ECB" },
                  "rateDate": {
                    "type": "string",
                    "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
                  },
                  "sourceUnitsPerEUR": {
                    "type": "string",
                    "maxLength": 40,
                    "pattern": "^(?=.*[1-9])[0-9]+(?:\\.[0-9]+)?$"
                  },
                  "jpyPerEUR": {
                    "type": "string",
                    "maxLength": 40,
                    "pattern": "^(?=.*[1-9])[0-9]+(?:\\.[0-9]+)?$"
                  }
                }
              }
            ],
            "description": "Generator-only ECB evidence. Required for foreign amounts, forbidden for JPY or omitted prices, and never encoded into the Hoteler Log payload."
          },
          "pointsUsed": { "type": ["integer", "null"], "minimum": 0, "maximum": 1000000000 },
          "notes": {
            "enum": [
              null,
              "朝食付き",
              "夕食付き",
              "朝夕食付き",
              "素泊まり",
              "返金不可",
              "現地払い",
              "事前決済",
              "駐車場付き",
              "クラブラウンジ利用",
              "アーリーチェックイン",
              "レイトチェックアウト"
            ]
          }
        },
        "oneOf": [
          {
            "properties": {
              "priceAmount": { "type": "null" },
              "priceCurrency": { "type": "null" },
              "exchangeRate": { "type": "null" }
            }
          },
          {
            "required": ["priceAmount", "priceCurrency"],
            "properties": {
              "priceAmount": { "type": "string" },
              "priceCurrency": { "const": "JPY" },
              "exchangeRate": { "type": "null" }
            }
          },
          {
            "required": ["priceAmount", "priceCurrency", "exchangeRate"],
            "properties": {
              "priceAmount": { "type": "string" },
              "priceCurrency": { "enum": ["USD", "EUR", "GBP", "CNY", "KRW", "THB", "SGD", "AUD", "CAD", "CHF", "HKD"] },
              "exchangeRate": { "type": "object" }
            }
          }
        ]
      }
    }
  }
}

SHA-256: ce0077ced139586c7fbb151651588132028aa17c3ab7d43a7e7b3839f3c2637e