{
 "openapi": "3.1.0",
 "info": {
  "title": "Corissia Hotels API v3",
  "version": "3.0",
  "description": "Read-only API of corissia.com: the hotels, their facts (from the confirmed facts registry; what is not confirmed is reported as unknown) and quotes for an exact stay and guest composition. Dates are never changed silently: an invalid stay gets an explicit error code. A quote is not a reservation: the guest books on the website (request, or booking with a 20% deposit where the room is available). Prices are per room for the stay, the same as on the website."
 },
 "servers": [
  {
   "url": "https://corissia.com/api/v3"
  }
 ],
 "paths": {
  "/": {
   "get": {
    "operationId": "getIndex",
    "summary": "API index",
    "responses": {
     "200": {
      "description": "Index",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Index"
        }
       }
      }
     },
     "405": {
      "description": "Method not allowed (GET and HEAD only)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Too many requests (60 per visitor and minute, 600 in all)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Data not available right now; retry in a minute",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/hotels": {
   "get": {
    "operationId": "listHotels",
    "summary": "The five hotels, for comparison",
    "parameters": [
     {
      "name": "lang",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "de",
        "en"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Hotels",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HotelsList"
        }
       }
      }
     },
     "304": {
      "description": "Not modified"
     },
     "400": {
      "description": "Invalid parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "405": {
      "description": "Method not allowed (GET and HEAD only)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Too many requests (60 per visitor and minute, 600 in all)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Data not available right now; retry in a minute",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/hotels/{hotel_id}": {
   "get": {
    "operationId": "getHotel",
    "summary": "Facts of a hotel and its room types",
    "parameters": [
     {
      "name": "hotel_id",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "hiltonchania",
        "harmony",
        "flair",
        "princess",
        "beach"
       ]
      }
     },
     {
      "name": "lang",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "de",
        "en"
       ],
       "default": "en"
      }
     },
     {
      "name": "category",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Hotel",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HotelDetail"
        }
       }
      }
     },
     "304": {
      "description": "Not modified"
     },
     "400": {
      "description": "Invalid parameter",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown hotel",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "405": {
      "description": "Method not allowed (GET and HEAD only)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Too many requests (60 per visitor and minute, 600 in all)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Data not available right now; retry in a minute",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/quotes": {
   "get": {
    "operationId": "getQuote",
    "summary": "Prices for an exact stay and guest composition",
    "parameters": [
     {
      "name": "hotel",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "hiltonchania",
        "harmony",
        "flair",
        "princess",
        "beach"
       ]
      }
     },
     {
      "name": "checkin",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "checkout",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "format": "date",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     {
      "name": "occupancy",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Rooms separated by |, each room adults or adults-age,age (ages 0-17 on arrival). Example: 2-8,4|2 (URL-encoded 2-8%2C4%7C2). At most 5 rooms."
     },
     {
      "name": "room",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "board",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "BB",
        "HB",
        "AI"
       ]
      }
     },
     {
      "name": "lang",
      "in": "query",
      "required": false,
      "schema": {
       "type": "string",
       "enum": [
        "de",
        "en"
       ],
       "default": "en"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Quote for the exact stay",
      "headers": {
       "ETag": {
        "schema": {
         "type": "string"
        }
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Quote"
        }
       }
      }
     },
     "304": {
      "description": "Not modified"
     },
     "400": {
      "description": "Missing or invalid parameter, or invalid dates",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "Unknown hotel or room type",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "422": {
      "description": "Age restriction, not operating, operation unconfirmed or occupancy not supported",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "405": {
      "description": "Method not allowed (GET and HEAD only)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Too many requests (60 per visitor and minute, 600 in all)",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "503": {
      "description": "Data not available right now; retry in a minute",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Error": {
    "type": "object",
    "properties": {
     "api_version": {
      "const": "3.0"
     },
     "error": {
      "type": "object",
      "properties": {
       "code": {
        "type": "string",
        "enum": [
         "MISSING_PARAMETER",
         "INVALID_PARAMETER",
         "HOTEL_NOT_FOUND",
         "ROOM_NOT_FOUND",
         "NOT_FOUND",
         "CHECKOUT_NOT_AFTER_CHECKIN",
         "CHECKIN_IN_PAST",
         "DATE_OUT_OF_RANGE",
         "AGE_RESTRICTION",
         "HOTEL_NOT_OPERATING",
         "OPERATION_UNCONFIRMED",
         "OCCUPANCY_NOT_SUPPORTED",
         "METHOD_NOT_ALLOWED",
         "RATE_LIMITED",
         "TEMPORARY_ERROR"
        ]
       },
       "message": {
        "type": "string"
       },
       "field": {
        "type": "string"
       },
       "room_index": {
        "type": "integer"
       },
       "min_age": {
        "type": "integer"
       },
       "suggestions": {
        "type": "object",
        "properties": {
         "operating_periods": {
          "type": "array",
          "items": {
           "$ref": "#/components/schemas/OperatingPeriod"
          }
         }
        },
        "additionalProperties": false,
        "required": [
         "operating_periods"
        ]
       }
      },
      "additionalProperties": false,
      "required": [
       "code",
       "message"
      ]
     },
     "request": {
      "type": "object",
      "additionalProperties": {
       "type": "string",
       "maxLength": 200
      },
      "description": "The known parameters as they came, cut to 200 characters."
     }
    },
    "additionalProperties": false,
    "required": [
     "api_version",
     "error",
     "request"
    ]
   },
   "Fact": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "key": {
      "type": "string"
     },
     "status": {
      "type": "string",
      "enum": [
       "verified",
       "unknown"
      ],
      "description": "unknown also covers facts not confirmed yet. Unknown does not mean no."
     },
     "answer": {
      "const": "unknown, ask the hotel"
     },
     "value": {},
     "text": {
      "type": "string"
     },
     "conditions": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "valid_from": {
      "type": "string",
      "format": "date",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
     },
     "valid_to": {
      "type": "string",
      "format": "date",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
     },
     "source": {
      "type": "object",
      "properties": {
       "label": {
        "type": "string"
       },
       "url": {
        "type": "string"
       }
      },
      "additionalProperties": false,
      "required": [
       "label"
      ]
     }
    },
    "additionalProperties": false,
    "required": [
     "id",
     "key",
     "status"
    ]
   },
   "FactGroups": {
    "type": "object",
    "description": "Facts by category (identity, operation, policies, location, pools, dining, services, accessibility, terms, room).",
    "additionalProperties": {
     "type": "array",
     "items": {
      "$ref": "#/components/schemas/Fact"
     }
    }
   },
   "OperatingPeriod": {
    "type": "object",
    "properties": {
     "from": {
      "type": "string",
      "format": "date",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
     },
     "to": {
      "type": "string",
      "format": "date",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
     },
     "source": {
      "type": "string",
      "enum": [
       "master_rates",
       "site_default"
      ],
      "description": "master_rates: the season plan of the hotel; site_default: written dates of the site, an estimate."
     }
    },
    "additionalProperties": false,
    "required": [
     "from",
     "to",
     "source"
    ]
   },
   "HotelRef": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string"
     }
    },
    "additionalProperties": false,
    "required": [
     "id",
     "name",
     "url"
    ]
   },
   "Contact": {
    "type": "object",
    "properties": {
     "phone": {
      "type": "string"
     },
     "request_url": {
      "type": "string"
     }
    },
    "additionalProperties": false,
    "required": [
     "phone",
     "request_url"
    ]
   },
   "Index": {
    "type": "object",
    "properties": {
     "api_version": {
      "const": "3.0"
     },
     "description": {
      "type": "string"
     },
     "openapi": {
      "type": "string"
     },
     "routes": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "path": {
         "type": "string"
        },
        "method": {
         "type": "string"
        }
       },
       "additionalProperties": false,
       "required": [
        "path",
        "method"
       ]
      }
     }
    },
    "additionalProperties": false,
    "required": [
     "api_version",
     "description",
     "openapi",
     "routes"
    ]
   },
   "HotelSummary": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "summary_facts": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Fact"
      }
     },
     "operating_periods": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OperatingPeriod"
      }
     },
     "facts_url": {
      "type": "string"
     },
     "quotes_url_template": {
      "type": "string"
     }
    },
    "additionalProperties": false,
    "required": [
     "id",
     "name",
     "url",
     "summary_facts",
     "operating_periods",
     "facts_url",
     "quotes_url_template"
    ]
   },
   "HotelsList": {
    "type": "object",
    "properties": {
     "api_version": {
      "const": "3.0"
     },
     "lang": {
      "enum": [
       "de",
       "en"
      ]
     },
     "hotels": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/HotelSummary"
      }
     }
    },
    "additionalProperties": false,
    "required": [
     "api_version",
     "lang",
     "hotels"
    ]
   },
   "BookingLimits": {
    "type": "object",
    "properties": {
     "max_adults": {
      "type": "integer"
     },
     "max_children": {
      "type": "integer"
     },
     "max_total": {
      "type": "integer"
     },
     "max_infants": {
      "type": "integer"
     },
     "infants_count_toward_total": {
      "type": "boolean"
     },
     "age_bands": {
      "type": "object",
      "properties": {
       "infant": {
        "const": "0-1"
       },
       "child": {
        "const": "2-12"
       },
       "adult_from": {
        "const": 13
       }
      },
      "additionalProperties": false,
      "required": [
       "infant",
       "child",
       "adult_from"
      ]
     }
    },
    "additionalProperties": false,
    "required": [
     "max_adults",
     "max_children",
     "max_total",
     "max_infants",
     "infants_count_toward_total",
     "age_bands"
    ]
   },
   "Room": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "booking_limits": {
      "$ref": "#/components/schemas/BookingLimits"
     },
     "facts": {
      "$ref": "#/components/schemas/FactGroups"
     }
    },
    "additionalProperties": false,
    "required": [
     "id",
     "name",
     "url",
     "booking_limits",
     "facts"
    ]
   },
   "HotelDetail": {
    "type": "object",
    "properties": {
     "api_version": {
      "const": "3.0"
     },
     "lang": {
      "enum": [
       "de",
       "en"
      ]
     },
     "hotel": {
      "$ref": "#/components/schemas/HotelRef"
     },
     "contact": {
      "$ref": "#/components/schemas/Contact"
     },
     "categories": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "facts": {
      "$ref": "#/components/schemas/FactGroups"
     },
     "rooms": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Room"
      }
     },
     "operating_periods": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/OperatingPeriod"
      }
     }
    },
    "additionalProperties": false,
    "required": [
     "api_version",
     "lang",
     "hotel",
     "contact",
     "categories",
     "facts",
     "rooms",
     "operating_periods"
    ]
   },
   "Rate": {
    "type": "object",
    "properties": {
     "board": {
      "type": "string",
      "enum": [
       "BB",
       "HB",
       "FB",
       "AI"
      ]
     },
     "board_name": {
      "type": "string"
     },
     "price_basis": {
      "const": "per_room_for_stay"
     },
     "single_use": {
      "type": "boolean",
      "description": "Single-occupancy price: 1 adult and nobody else."
     },
     "total": {
      "type": "integer",
      "minimum": 1
     },
     "total_before_discount": {
      "type": "integer",
      "minimum": 1
     },
     "per_night": {
      "type": "array",
      "minItems": 1,
      "items": {
       "type": "object",
       "properties": {
        "date": {
         "type": "string",
         "format": "date",
         "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        "amount": {
         "type": "integer",
         "minimum": 1
        }
       },
       "additionalProperties": false,
       "required": [
        "date",
        "amount"
       ]
      }
     },
     "stay_tax": {
      "type": "object",
      "properties": {
       "total": {
        "type": "integer",
        "minimum": 0
       },
       "included": {
        "const": false
       },
       "payable": {
        "const": "at_hotel"
       }
      },
      "additionalProperties": false,
      "required": [
       "total",
       "included",
       "payable"
      ]
     },
     "deposit": {
      "type": "object",
      "properties": {
       "percent": {
        "const": 20
       },
       "amount": {
        "type": "integer",
        "minimum": 0
       }
      },
      "additionalProperties": false,
      "required": [
       "percent",
       "amount"
      ]
     },
     "balance_at_hotel": {
      "type": "integer",
      "minimum": 0
     },
     "cancellation": {
      "type": "object",
      "properties": {
       "free_until": {
        "oneOf": [
         {
          "type": "string",
          "format": "date",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
         },
         {
          "type": "null"
         }
        ]
       },
       "fee_from": {
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "fee": {
        "const": "deposit"
       }
      },
      "additionalProperties": false,
      "required": [
       "free_until",
       "fee_from",
       "fee"
      ]
     },
     "included_extras": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "type": {
         "const": "airport_transfer"
        },
        "price": {
         "const": 0
        }
       },
       "additionalProperties": false,
       "required": [
        "type",
        "price"
       ]
      }
     },
     "optional_extras": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "type": {
         "const": "sea_view"
        },
        "total": {
         "type": "integer",
         "minimum": 1
        }
       },
       "additionalProperties": false,
       "required": [
        "type",
        "total"
       ]
      }
     }
    },
    "additionalProperties": false,
    "required": [
     "board",
     "board_name",
     "price_basis",
     "single_use",
     "total",
     "per_night",
     "stay_tax",
     "deposit",
     "balance_at_hotel",
     "cancellation",
     "included_extras",
     "optional_extras"
    ]
   },
   "Offer": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
     "room_type": {
      "type": "object",
      "properties": {
       "id": {
        "type": "string"
       },
       "name": {
        "type": "string"
       },
       "url": {
        "type": "string"
       }
      },
      "additionalProperties": false,
      "required": [
       "id",
       "name",
       "url"
      ]
     },
     "rate_status": {
      "type": "string",
      "enum": [
       "published",
       "no_public_rate"
      ],
      "description": "no_public_rate: no price is published for these dates; it does not mean closed or sold out."
     },
     "availability_status": {
      "type": "string",
      "enum": [
       "available",
       "on_request"
      ],
      "description": "available: book with the 20% deposit or send a request. on_request: high demand on some nights; only a request, the booking advisor confirms the room."
     },
     "high_demand_nights": {
      "type": "array",
      "items": {
       "type": "string",
       "format": "date",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      }
     },
     "availability_note": {
      "type": "string"
     },
     "booking_modes": {
      "type": "array",
      "minItems": 1,
      "items": {
       "enum": [
        "request",
        "confirmed_with_deposit"
       ]
      }
     },
     "rates": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Rate"
      }
     }
    },
    "required": [
     "room_type",
     "rate_status",
     "booking_modes",
     "rates"
    ]
   },
   "QuoteRoom": {
    "type": "object",
    "properties": {
     "room_index": {
      "type": "integer"
     },
     "occupancy": {
      "type": "object",
      "properties": {
       "adults": {
        "type": "integer"
       },
       "children_ages": {
        "type": "array",
        "items": {
         "type": "integer"
        }
       },
       "children": {
        "type": "integer"
       },
       "infants": {
        "type": "integer"
       }
      },
      "additionalProperties": false,
      "required": [
       "adults",
       "children_ages",
       "children",
       "infants"
      ]
     },
     "offers": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Offer"
      }
     },
     "not_offered": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "room_type": {
         "type": "string"
        },
        "reason": {
         "const": "OCCUPANCY_NOT_SUPPORTED"
        }
       },
       "additionalProperties": false,
       "required": [
        "room_type",
        "reason"
       ]
      }
     }
    },
    "additionalProperties": false,
    "required": [
     "room_index",
     "occupancy",
     "offers",
     "not_offered"
    ]
   },
   "Quote": {
    "type": "object",
    "properties": {
     "api_version": {
      "const": "3.0"
     },
     "generated_at": {
      "type": "string"
     },
     "currency": {
      "const": "EUR"
     },
     "lang": {
      "enum": [
       "de",
       "en"
      ]
     },
     "request": {
      "type": "object",
      "properties": {
       "hotel": {
        "type": "string"
       },
       "checkin": {
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "checkout": {
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "occupancy": {
        "type": "array",
        "items": {
         "type": "object",
         "properties": {
          "adults": {
           "type": "integer"
          },
          "children_ages": {
           "type": "array",
           "items": {
            "type": "integer"
           }
          }
         },
         "additionalProperties": false,
         "required": [
          "adults",
          "children_ages"
         ]
        }
       },
       "room": {
        "type": [
         "string",
         "null"
        ]
       },
       "board": {
        "type": [
         "string",
         "null"
        ]
       }
      },
      "additionalProperties": false,
      "required": [
       "hotel",
       "checkin",
       "checkout",
       "occupancy",
       "room",
       "board"
      ]
     },
     "hotel": {
      "$ref": "#/components/schemas/HotelRef"
     },
     "stay": {
      "type": "object",
      "properties": {
       "checkin": {
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "checkout": {
        "type": "string",
        "format": "date",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
       },
       "nights": {
        "type": "integer",
        "minimum": 1
       },
       "checkin_from": {
        "type": "string"
       },
       "checkout_until": {
        "type": "string"
       }
      },
      "additionalProperties": false,
      "required": [
       "checkin",
       "checkout",
       "nights"
      ]
     },
     "operation_status": {
      "type": "string",
      "enum": [
       "operating",
       "expected"
      ],
      "description": "expected: the nights fall in written dates of the site, not yet in the season plan."
     },
     "rooms": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/QuoteRoom"
      }
     },
     "deposit_rule": {
      "type": "object",
      "properties": {
       "percent": {
        "const": 20
       },
       "basis": {
        "const": "sum_of_rooms_same_dates"
       },
       "rounding": {
        "const": "nearest_euro_half_up"
       },
       "free_transfer_basis": {
        "const": "sum_of_rooms_same_dates"
       }
      },
      "additionalProperties": false,
      "required": [
       "percent",
       "basis",
       "rounding"
      ]
     },
     "terms": {
      "type": "object",
      "properties": {
       "fact_ids": {
        "type": "array",
        "items": {
         "type": "string"
        }
       },
       "cancellation": {
        "type": "string"
       },
       "deposit": {
        "type": "string"
       },
       "booking_modes": {
        "type": "string"
       }
      },
      "additionalProperties": false,
      "required": [
       "fact_ids"
      ]
     },
     "booking_url": {
      "type": "string"
     },
     "contact": {
      "$ref": "#/components/schemas/Contact"
     },
     "freshness": {
      "type": "object",
      "properties": {
       "prices_as_of": {
        "type": "string"
       },
       "offer_expires": {
        "type": "null"
       },
       "hold": {
        "const": false
       },
       "note": {
        "type": "string"
       }
      },
      "additionalProperties": false,
      "required": [
       "prices_as_of",
       "offer_expires",
       "hold",
       "note"
      ]
     }
    },
    "additionalProperties": false,
    "required": [
     "api_version",
     "generated_at",
     "currency",
     "lang",
     "request",
     "hotel",
     "stay",
     "operation_status",
     "rooms",
     "deposit_rule",
     "terms",
     "booking_url",
     "contact",
     "freshness"
    ]
   }
  }
 }
}
