openapi: 3.0.3 info: title: HotelRunner Custom Apps REST API description: >- The HotelRunner Custom Apps REST API lets a property's PMS or revenue management system connect to HotelRunner - retrieve room/rate configuration, push availability and rate updates, retrieve and acknowledge reservations, fire reservation state-change events, list connected sales channels, and read setup reference data. All Custom Apps endpoints require `token` and `hr_id` query-string credentials issued from the property's HotelRunner Partners extranet ("My Property" section, or a sandbox test property for PMS partners). HotelRunner can also push new and updated reservations to a partner-hosted HTTPS URL as a webhook (see the Realtime Push documentation) - this is not modeled as an OpenAPI path because HotelRunner is the caller, not the server, for that flow. Endpoints and fields below are transcribed from HotelRunner's public developer docs at developers.hotelrunner.com; fields not explicitly shown in an example response are marked as modeled/inferred in comments where relevant. version: v2 contact: name: HotelRunner url: https://developers.hotelrunner.com/ servers: - url: https://app.hotelrunner.com/api/v2/apps description: Custom Apps REST API (production) - url: https://app.hotelrunner.com description: Public reference/services data endpoints security: - tokenAuth: [] tags: - name: Inventory description: Room types, master rates, availability, and restrictions. - name: Reservations description: Retrieve, confirm, cancel, and acknowledge reservations. - name: Channels description: Connected OTA / sales channel status. - name: Reference Data description: Read-only lookup data used for property and integration setup. paths: /rooms: get: operationId: listRooms tags: - Inventory summary: Get room list description: >- Returns all rooms/room types and their master rate configuration for the property identified by hr_id, including which channels each room is connected to and whether availability, restrictions, and price updates are enabled for it. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' responses: '200': description: A list of rooms. content: application/json: schema: type: object properties: rooms: type: array items: $ref: '#/components/schemas/Room' '401': $ref: '#/components/responses/Unauthorized' /rooms/~: put: operationId: updateRoomDateRange tags: - Inventory summary: Update room availability/rates/restrictions over a date range description: >- Updates availability, price, stop-sale, min/max stay, and CTA/CTD restrictions for a single room type's master rate across a start/end date range, optionally scoped to specific weekdays and channel codes. Parameters are passed as query-string values, not a JSON body. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' - name: room_code in: query required: true description: The room code to update. schema: type: string - name: '@rooms.inv_code' in: query required: true description: >- Inventory code to update. Only updates the room type and its master rate. schema: type: string - name: '@rooms.rate_code' in: query required: false description: Rate code to update when price_update is enabled for the room. schema: type: string - name: start_date in: query required: true schema: type: string format: date - name: end_date in: query required: true schema: type: string format: date - name: availability in: query required: false schema: type: integer - name: price in: query required: false schema: type: number - name: stop_sale in: query required: false schema: type: integer enum: [0, 1] - name: cta in: query required: false description: Closed to arrival. schema: type: integer enum: [0, 1] - name: ctd in: query required: false description: Closed to departure. schema: type: integer enum: [0, 1] - name: min_stay in: query required: false schema: type: integer - name: max_stay in: query required: false schema: type: integer - name: days in: query required: false description: 'Weekday filter, Sunday=0 through Saturday=6.' schema: type: array items: type: integer minimum: 0 maximum: 6 - name: channel_codes in: query required: false description: Restrict the update to specific channel codes. schema: type: array items: type: string responses: '200': description: Update accepted or queued for retry. content: application/json: schema: $ref: '#/components/schemas/UpdateResult' '401': $ref: '#/components/responses/Unauthorized' /rooms/daily: put: operationId: updateRoomsMultiDates tags: - Inventory summary: Bulk update rooms across multiple dates description: >- Updates availability, price, and restrictions for one or more rooms across up to 90 explicit dates per call, optionally scoped to specific channel codes per room. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' requestBody: required: true content: application/json: schema: type: object properties: rooms: type: array items: type: object required: - inv_code - dates properties: inv_code: type: string channel_codes: type: array items: type: string dates: type: array maxItems: 90 items: type: object required: - date properties: date: type: string format: date availability: type: string price: type: string min_stay: type: integer max_stay: type: integer stop_sale: type: integer enum: [0, 1] cta: type: integer enum: [0, 1] ctd: type: integer enum: [0, 1] responses: '200': description: Update accepted, queued for retry, or partially failed. content: application/json: schema: allOf: - $ref: '#/components/schemas/UpdateResult' - type: object properties: errors: type: array items: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /reservations: get: operationId: listReservations tags: - Reservations summary: Retrieve reservations description: >- Lists reservations for the property, defaulting to undelivered reservations from the last 10 days. Supports pagination and filters for a specific reservation number, modified reservations, and booked (created) reservations. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' - name: from_date in: query description: 'Format YYYY-MM-DD. Defaults to 10 days before today.' schema: type: string format: date - name: from_last_update_date in: query schema: type: string format: date - name: per_page in: query schema: type: integer default: 10 - name: page in: query schema: type: integer default: 1 - name: reservation_number in: query schema: type: string - name: undelivered in: query schema: type: boolean default: true - name: modified in: query schema: type: boolean default: false - name: booked in: query schema: type: boolean default: false responses: '200': description: A page of reservations. content: application/json: schema: type: object properties: reservations: type: array items: $ref: '#/components/schemas/Reservation' count: type: integer current_page: type: integer pages: type: integer '401': $ref: '#/components/responses/Unauthorized' /reservations/fire: put: operationId: updateReservationState tags: - Reservations summary: Confirm or cancel a reservation description: >- Fires a state-change event on a reservation identified by its HotelRunner reservation number (hr_number). Use event=confirm to confirm and event=cancel to cancel, supplying a cancel_reason when cancelling. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' - name: hr_number in: query required: true description: The reservation code in HotelRunner. schema: type: string - name: event in: query required: true schema: type: string enum: [confirm, cancel] - name: cancel_reason in: query required: false description: Required when event=cancel. schema: type: string enum: [customer, no_room, no_show, invalid_price] responses: '200': description: State change result. content: application/json: schema: $ref: '#/components/schemas/StatusResult' '401': $ref: '#/components/responses/Unauthorized' /reservations/~: put: operationId: confirmReservationDelivery tags: - Reservations summary: Confirm reservation delivery description: >- Acknowledges that a reservation delivered via the retrieve/realtime push flow was received and processed by the PMS, identified by the message_uid found at the end of the reservation's JSON payload. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' - name: message_uid in: query required: true description: Unique ID of the reservation delivery message. schema: type: string - name: pms_number in: query required: false description: The reservation number in the connecting PMS. schema: type: string responses: '200': description: Acknowledgement result. content: application/json: schema: $ref: '#/components/schemas/StatusResult' '401': $ref: '#/components/responses/Unauthorized' /infos/connected_channels: get: operationId: listConnectedChannels tags: - Channels summary: List connected channels description: >- Returns all OTA / sales channels connected to the property along with counts of in-progress, succeeded, and failed distribution updates for each channel. parameters: - $ref: '#/components/parameters/Token' - $ref: '#/components/parameters/HrId' responses: '200': description: Connected channel list. content: application/json: schema: type: object properties: channels: type: array items: $ref: '#/components/schemas/Channel' '401': $ref: '#/components/responses/Unauthorized' /api/property/types.json: get: operationId: getPropertyKinds tags: - Reference Data summary: Get property kinds description: Returns the id-name mapping of property kinds (Villa, Resort, etc). responses: '200': description: Property kind list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /api/room/types.json: get: operationId: getRoomKinds tags: - Reference Data summary: Get room kinds description: Returns the id-name mapping of room kinds (Apartment, Bungalow, etc). responses: '200': description: Room kind list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /api/currency/currencies.json: get: operationId: getCurrencies tags: - Reference Data summary: Get currencies description: Returns the selectable currency list for a property. responses: '200': description: Currency list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /services/get-property-services: get: operationId: getPropertyServices tags: - Reference Data summary: Get property services description: >- Returns the id-name mapping of general property services shown on a property's listing. Path documented under HotelRunner's Services navigation; exact JSON response is modeled on the sibling reference endpoints. responses: '200': description: Property service list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /services/get-property-facilities: get: operationId: getPropertyFacilities tags: - Reference Data summary: Get property facilities description: >- Returns the id-name mapping of property facilities. Path documented under HotelRunner's Services navigation; exact JSON response is modeled on the sibling reference endpoints. responses: '200': description: Property facility list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /services/get-room-amenities: get: operationId: getRoomAmenities tags: - Reference Data summary: Get room amenities description: >- Returns the id-name mapping of room amenities. Path documented under HotelRunner's Services navigation; exact JSON response is modeled on the sibling reference endpoints. responses: '200': description: Room amenity list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' /services/country-codes: get: operationId: getCountryCodes tags: - Reference Data summary: Get country codes description: Returns the ISO country code list used across property and guest setup. responses: '200': description: Country code list. content: application/json: schema: type: object additionalProperties: type: string /services/channel-list: get: operationId: getChannelList tags: - Reference Data summary: Get channel list description: >- Returns the master list of OTA / sales channel codes HotelRunner can connect a property to, independent of which channels a given property currently has enabled. responses: '200': description: Channel code list. content: application/json: schema: $ref: '#/components/schemas/IdNameList' components: securitySchemes: tokenAuth: type: apiKey in: query name: token description: >- API token issued in the property's HotelRunner Partners extranet ("My Property" section) or PMS sandbox account. Always sent together with the hr_id query parameter identifying the property. parameters: Token: name: token in: query required: true description: Authentication token for the property. schema: type: string HrId: name: hr_id in: query required: true description: HotelRunner property identifier. schema: type: string responses: Unauthorized: description: Missing or invalid token/hr_id. content: application/json: schema: $ref: '#/components/schemas/StatusResult' schemas: Room: type: object properties: rate_code: type: string inv_code: type: string availability_update: type: boolean restrictions_update: type: boolean price_update: type: boolean pricing_type: type: string example: guest_based name: type: string description: type: string policy: type: string room_capacity: type: integer adult_capacity: type: integer is_master: type: boolean shared: type: boolean channel_codes: type: array items: type: string sales_currency: type: string sell_online: type: boolean UpdateResult: type: object properties: status: type: string enum: [ok, try_again] transaction_id: type: string StatusResult: type: object properties: status: type: string enum: [ok, error] message: type: string Reservation: type: object properties: reservation_id: type: integer hr_number: type: string channel: type: string state: type: string example: reserved guest: type: string total: type: number currency: type: string checkin_date: type: string format: date checkout_date: type: string format: date message_uid: type: string description: >- Unique ID of the delivery message, used with confirmReservationDelivery. Documented as appearing at the end of the reservation JSON; not shown in HotelRunner's abbreviated example response (modeled). x-endpointsModeled: - message_uid field position/shape Channel: type: object properties: name: type: string code: type: string in_progress: type: integer succeeded: type: integer failed: type: integer IdNameList: type: object additionalProperties: type: string description: >- Modeled as an id-to-name map per HotelRunner's own description of these endpoints ("id-name mapping"); HotelRunner's docs did not show a literal example payload for this endpoint.